[SHELL32]

- Fix exceptions when starting drive properties dialog

svn path=/trunk/; revision=54703
This commit is contained in:
Rafal Harabien 2011-12-19 20:08:33 +00:00
parent 2c53cb44ab
commit 3559384588

View file

@ -443,55 +443,56 @@ DriveGeneralDlg(
LPARAM lParam LPARAM lParam
) )
{ {
LPPROPSHEETPAGEW ppsp;
LPDRAWITEMSTRUCT drawItem;
STARTUPINFOW si;
PROCESS_INFORMATION pi;
WCHAR * lpstr;
WCHAR szPath[MAX_PATH];
UINT length;
LPPSHNOTIFY lppsn;
switch(uMsg) switch(uMsg)
{ {
case WM_INITDIALOG: case WM_INITDIALOG:
ppsp = (LPPROPSHEETPAGEW)lParam; {
LPPROPSHEETPAGEW ppsp = (LPPROPSHEETPAGEW)lParam;
if (ppsp == NULL) if (ppsp == NULL)
break; break;
lpstr = (WCHAR *)ppsp->lParam;
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lpstr); SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam);
InitializeGeneralDriveDialog(hwndDlg, lpstr); InitializeGeneralDriveDialog(hwndDlg, (LPWSTR)ppsp->lParam);
return TRUE; return TRUE;
}
case WM_DRAWITEM: case WM_DRAWITEM:
drawItem = (LPDRAWITEMSTRUCT)lParam; {
LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam;
if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015) if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015)
{ {
PaintStaticControls(hwndDlg, drawItem); PaintStaticControls(hwndDlg, drawItem);
return TRUE; return TRUE;
} }
break; break;
}
case WM_COMMAND: case WM_COMMAND:
if (LOWORD(wParam) == 14010) /* Disk Cleanup */ if (LOWORD(wParam) == 14010) /* Disk Cleanup */
{ {
lpstr = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER); UINT length;
STARTUPINFOW si;
PROCESS_INFORMATION pi;
WCHAR wszPath[MAX_PATH];
LPWSTR lpStr = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER);
ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si); si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&pi, sizeof(pi));
if (!GetSystemDirectoryW(szPath, MAX_PATH)) if (!GetSystemDirectoryW(wszPath, MAX_PATH))
break; break;
wcscat(szPath, L"\\cleanmgr.exe /D "); wcscat(wszPath, L"\\cleanmgr.exe /D ");
length = wcslen(szPath); length = wcslen(wszPath);
szPath[length] = lpstr[0]; wszPath[length] = lpStr[0];
szPath[length+1] = L'\0'; wszPath[length+1] = L'\0';
if (CreateProcessW(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) if (CreateProcessW(NULL, wszPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{ {
CloseHandle(pi.hProcess); CloseHandle(pi.hProcess);
CloseHandle(pi.hThread); CloseHandle(pi.hThread);
} }
break;
} }
break;
case WM_NOTIFY: case WM_NOTIFY:
lppsn = (LPPSHNOTIFY) lParam;
if (LOWORD(wParam) == 14000) if (LOWORD(wParam) == 14000)
{ {
if (HIWORD(wParam) == EN_CHANGE) if (HIWORD(wParam) == EN_CHANGE)
@ -500,24 +501,28 @@ DriveGeneralDlg(
} }
break; break;
} }
else if (((LPNMHDR)lParam)->hwndFrom == GetParent(hwndDlg))
{
/* Property Sheet */
LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam;
if (lppsn->hdr.code == PSN_APPLY) if (lppsn->hdr.code == PSN_APPLY)
{ {
lpstr = (LPWSTR)GetWindowLongPtr(hwndDlg, DWLP_USER); LPWSTR lpstr = (LPWSTR)GetWindowLongPtr(hwndDlg, DWLP_USER);
if (lpstr && GetDlgItemTextW(hwndDlg, 14000, szPath, sizeof(szPath) / sizeof(WCHAR))) WCHAR buf[256];
{
szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0'; if (lpstr && GetDlgItemTextW(hwndDlg, 14000, buf, sizeof(buf) / sizeof(WCHAR)))
SetVolumeLabelW(lpstr, szPath); SetVolumeLabelW(lpstr, buf);
}
SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE; return TRUE;
} }
}
break; break;
default: default:
break; break;
} }
return FALSE; return FALSE;
} }
@ -670,7 +675,7 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
HPSXA hpsx = NULL; HPSXA hpsx = NULL;
HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE]; HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE];
PROPSHEETHEADERW psh; PROPSHEETHEADERW psh;
BOOL ret; HWND hwnd;
UINT i; UINT i;
WCHAR szName[MAX_PATH+6]; WCHAR szName[MAX_PATH+6];
DWORD dwMaxComponent, dwFileSysFlags; DWORD dwMaxComponent, dwFileSysFlags;
@ -679,7 +684,7 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
ZeroMemory(&psh, sizeof(PROPSHEETHEADERW)); ZeroMemory(&psh, sizeof(PROPSHEETHEADERW));
psh.dwSize = sizeof(PROPSHEETHEADERW); psh.dwSize = sizeof(PROPSHEETHEADERW);
//psh.dwFlags = PSH_USECALLBACK | PSH_PROPTITLE; psh.dwFlags = 0; // FIXME: make it modeless
psh.hwndParent = NULL; psh.hwndParent = NULL;
psh.nStartPage = 0; psh.nStartPage = 0;
psh.phpage = hpsp; psh.phpage = hpsp;
@ -691,25 +696,17 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
psh.dwFlags |= PSH_PROPTITLE; psh.dwFlags |= PSH_PROPTITLE;
if (!wcslen(szName)) if (!wcslen(szName))
{ {
/* FIXME /* FIXME: check if disk is a really a local hdd */
* check if disk is a really a local hdd
*/
i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szName, sizeof(szName) / sizeof(WCHAR) - 6); i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szName, sizeof(szName) / sizeof(WCHAR) - 6);
if (i > 0 && i < (sizeof(szName) / sizeof(WCHAR)) - 6) if (i > 0 && i < (sizeof(szName) / sizeof(WCHAR)) - 6)
{ wsprintf(szName + i, L" (%s)", drive);
szName[i] = L' ';
szName[i+1] = L'(';
wcscpy(&szName[i+2], drive);
szName[i+4] = L')';
szName[i+5] = L'\0';
}
} }
} }
DriveType = GetDriveTypeW(drive); DriveType = GetDriveTypeW(drive);
for (i = 0; i < DRIVE_PROPERTY_PAGES; i++) for (i = 0; i < DRIVE_PROPERTY_PAGES; i++)
{ {
if (PropPages[i].DriveType == (UINT) - 1 || (PropPages[i].DriveType != (UINT) - 1 && PropPages[i].DriveType == DriveType)) if (PropPages[i].DriveType == (UINT)-1 || PropPages[i].DriveType == DriveType)
{ {
HPROPSHEETPAGE hprop = SH_CreatePropertySheetPage(PropPages[i].resname, PropPages[i].dlgproc, (LPARAM)drive, NULL); HPROPSHEETPAGE hprop = SH_CreatePropertySheetPage(PropPages[i].resname, PropPages[i].dlgproc, (LPARAM)drive, NULL);
if (hprop) if (hprop)
@ -724,19 +721,16 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
{ {
hpsx = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, L"Drive", MAX_PROPERTY_SHEET_PAGE - DRIVE_PROPERTY_PAGES, pDataObj); hpsx = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, L"Drive", MAX_PROPERTY_SHEET_PAGE - DRIVE_PROPERTY_PAGES, pDataObj);
if (hpsx) if (hpsx)
{
SHAddFromPropSheetExtArray(hpsx, (LPFNADDPROPSHEETPAGE)AddPropSheetPageProc, (LPARAM)&psh); SHAddFromPropSheetExtArray(hpsx, (LPFNADDPROPSHEETPAGE)AddPropSheetPageProc, (LPARAM)&psh);
} }
}
ret = PropertySheetW(&psh); hwnd = (HWND)PropertySheetW(&psh);
if (hpsx) if (hpsx)
SHDestroyPropSheetExtArray(hpsx); SHDestroyPropSheetExtArray(hpsx);
if (ret < 0) if (!hwnd)
return FALSE; return FALSE;
else
return TRUE; return TRUE;
} }
@ -804,7 +798,6 @@ GetDefaultClusterSize(LPWSTR szFs, PDWORD pClusterSize, PULARGE_INTEGER TotalNum
return TRUE; return TRUE;
} }
VOID VOID
InsertDefaultClusterSizeForFs(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) InsertDefaultClusterSizeForFs(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
{ {
@ -1011,9 +1004,8 @@ InitializeFormatDriveDlg(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
ShowWindow(GetDlgItem(hwndDlg, 28678), SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, 28678), SW_HIDE);
} }
HWND FormatDrvDialog = NULL; static HWND FormatDrvDialog = NULL;
BOOLEAN bSuccess = FALSE; static BOOLEAN bSuccess = FALSE;
BOOLEAN BOOLEAN
NTAPI NTAPI
@ -1050,10 +1042,6 @@ FormatExCB(
return TRUE; return TRUE;
} }
VOID VOID
FormatDrive(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) FormatDrive(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
{ {
@ -1155,7 +1143,6 @@ FormatDrive(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
} }
} }
INT_PTR INT_PTR
CALLBACK CALLBACK
FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
@ -1191,7 +1178,6 @@ FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE; return FALSE;
} }
BOOL BOOL
InitializeFmifsLibrary(PFORMAT_DRIVE_CONTEXT pContext) InitializeFmifsLibrary(PFORMAT_DRIVE_CONTEXT pContext)
{ {