Author: rharabien Date: Mon Dec 19 21:20:24 2011 New Revision: 54704
URL: http://svn.reactos.org/svn/reactos?rev=54704&view=rev Log: [SHELL32] - General code improvements
Modified: trunk/reactos/dll/win32/shell32/drive.cpp
Modified: trunk/reactos/dll/win32/shell32/drive.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/drive.cpp... ============================================================================== --- trunk/reactos/dll/win32/shell32/drive.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/drive.cpp [iso-8859-1] Mon Dec 19 21:20:24 2011 @@ -19,6 +19,7 @@ */
#include <precomp.h> +using namespace std;
#define MAX_PROPERTY_SHEET_PAGE 32
@@ -93,8 +94,6 @@ UINT Result; } FORMAT_DRIVE_CONTEXT, *PFORMAT_DRIVE_CONTEXT;
-BOOL InitializeFmifsLibrary(PFORMAT_DRIVE_CONTEXT pContext); -BOOL GetDefaultClusterSize(LPWSTR szFs, PDWORD pClusterSize, PULARGE_INTEGER TotalNumberOfBytes); EXTERN_C HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj); EXTERN_C HWND WINAPI DeviceCreateHardwarePageEx(HWND hWndParent, @@ -104,45 +103,30 @@
HPROPSHEETPAGE SH_CreatePropertySheetPage(LPCSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle);
-#define DRIVE_PROPERTY_PAGES (3) - static const GUID GUID_DEVCLASS_DISKDRIVE = {0x4d36e967L, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
-VOID -GetDriveNameWithLetter(LPWSTR szText, UINT Length, WCHAR Drive) -{ - WCHAR szDrive[] = {'C', ':', '\', 0}; - DWORD dwMaxComp, dwFileSys, TempLength = 0; +static VOID +GetDriveNameWithLetter(LPWSTR szText, UINT cchTextMax, WCHAR Drive) +{ + WCHAR szDrive[] = L"C:\"; + DWORD dwMaxComp, dwFileSys, cchText = 0;
szDrive[0] = Drive; - if (GetVolumeInformationW(szDrive, szText, Length, NULL, &dwMaxComp, &dwFileSys, NULL, 0)) - { - szText[Length-1] = L'\0'; - TempLength = wcslen(szText); - if (!TempLength) + if (GetVolumeInformationW(szDrive, szText, cchTextMax, NULL, &dwMaxComp, &dwFileSys, NULL, 0)) + { + cchText = wcslen(szText); + if (cchText == cchText) { /* load default volume label */ - TempLength = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, &szText[Length+1], (sizeof(szText) / sizeof(WCHAR)) - Length - 2); - } - } - if (TempLength + 4 < Length) - { - szText[TempLength] = L' '; - szText[TempLength+1] = L'('; - szText[TempLength+2] = szDrive[0]; - szText[TempLength+3] = L')'; - TempLength += 4; - } - - if (TempLength < Length) - szText[TempLength] = L'\0'; - else - szText[Length-1] = L'\0'; -} - - -VOID + cchText = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, &szText[cchTextMax+1], (sizeof(szText) / sizeof(WCHAR)) - cchTextMax - 2); + } + } + + StringCchPrintfW(szText + cchText, cchTextMax - cchText, L" (%c)", Drive); +} + +static VOID InitializeChkDskDialog(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) { WCHAR szText[100]; @@ -150,18 +134,15 @@ SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)pContext);
Length = GetWindowTextW(hwndDlg, szText, sizeof(szText) / sizeof(WCHAR)); - - GetDriveNameWithLetter(&szText[Length +1], (sizeof(szText) / sizeof(WCHAR)) - Length - 1, pContext->Drive); szText[Length] = L' '; - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; + GetDriveNameWithLetter(&szText[Length + 1], (sizeof(szText) / sizeof(WCHAR)) - Length - 1, pContext->Drive); SetWindowText(hwndDlg, szText); }
-HWND ChkdskDrvDialog = NULL; -BOOLEAN bChkdskSuccess = FALSE; - -BOOLEAN -NTAPI +static HWND ChkdskDrvDialog = NULL; +static BOOLEAN bChkdskSuccess = FALSE; + +static BOOLEAN NTAPI ChkdskCallback( IN CALLBACKCOMMAND Command, IN ULONG SubAction, @@ -195,552 +176,13 @@ return TRUE; }
-VOID -ChkDskNow(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) -{ - DWORD ClusterSize = 0, dwMaxComponentLength, FileSystemFlags; - WCHAR szFs[30]; - WCHAR szDrive[] = {'C', ':', '\', 0}; - WCHAR szVolumeLabel[40]; - ULARGE_INTEGER TotalNumberOfFreeBytes, FreeBytesAvailableUser; - BOOLEAN bCorrectErrors = FALSE, bScanDrive = FALSE; - - szDrive[0] = pContext->Drive; - if(!GetVolumeInformationW(szDrive, szVolumeLabel, sizeof(szVolumeLabel) / sizeof(WCHAR), NULL, &dwMaxComponentLength, &FileSystemFlags, szFs, sizeof(szFs) / sizeof(WCHAR))) - { - FIXME("failed to get drive fs type\n"); - return; - } - - if (!GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailableUser, &TotalNumberOfFreeBytes, NULL)) - { - FIXME("failed to get drive space type\n"); - return; - } - - if (!GetDefaultClusterSize(szFs, &ClusterSize, &TotalNumberOfFreeBytes)) - { - FIXME("invalid cluster size\n"); - return; - } - - if (SendDlgItemMessageW(hwndDlg, 14000, BM_GETCHECK, 0, 0) == BST_CHECKED) - bCorrectErrors = TRUE; - - if (SendDlgItemMessageW(hwndDlg, 14001, BM_GETCHECK, 0, 0) == BST_CHECKED) - bScanDrive = TRUE; - - ChkdskDrvDialog = hwndDlg; - bChkdskSuccess = FALSE; - SendDlgItemMessageW(hwndDlg, 14002, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); - pContext->Chkdsk(szDrive, szFs, bCorrectErrors, TRUE, FALSE, bScanDrive, NULL, NULL, ChkdskCallback); - - ChkdskDrvDialog = NULL; - pContext->Result = bChkdskSuccess; - bChkdskSuccess = FALSE; - -} - -INT_PTR -CALLBACK -ChkDskDlg( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - PFORMAT_DRIVE_CONTEXT pContext; - switch(uMsg) - { - case WM_INITDIALOG: - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); - InitializeChkDskDialog(hwndDlg, (PFORMAT_DRIVE_CONTEXT)lParam); - return TRUE; - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDCANCEL: - EndDialog(hwndDlg, 0); - break; - case IDOK: - pContext = (PFORMAT_DRIVE_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER); - ChkDskNow(hwndDlg, pContext); - break; - } - break; - } - - return FALSE; -} - - -static -ULONG -GetFreeBytesShare(ULONGLONG TotalNumberOfFreeBytes, ULONGLONG TotalNumberOfBytes) -{ - ULONGLONG Temp; - - if (TotalNumberOfFreeBytes == 0LL) - { - return 0; - } - - Temp = TotalNumberOfBytes / 100; - if (Temp >= TotalNumberOfFreeBytes) - { - return 1; - } - else - { - return (ULONG)(TotalNumberOfFreeBytes / Temp); - } -} - -static -void -PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT drawItem) -{ - HBRUSH hBrush; - - if (drawItem->CtlID == 14013) - { - hBrush = CreateSolidBrush(RGB(0, 0, 255)); - if (hBrush) - { - FillRect(drawItem->hDC, &drawItem->rcItem, hBrush); - DeleteObject((HGDIOBJ)hBrush); - } - } - else if (drawItem->CtlID == 14014) - { - hBrush = CreateSolidBrush(RGB(255, 0, 255)); - if (hBrush) - { - FillRect(drawItem->hDC, &drawItem->rcItem, hBrush); - DeleteObject((HGDIOBJ)hBrush); - } - } - else if (drawItem->CtlID == 14015) - { - HBRUSH hBlueBrush; - HBRUSH hMagBrush; - RECT rect; - LONG horzsize; - LONGLONG Result; - WCHAR szBuffer[20]; - - hBlueBrush = CreateSolidBrush(RGB(0, 0, 255)); - hMagBrush = CreateSolidBrush(RGB(255, 0, 255)); - - GetDlgItemTextW(hwndDlg, 14006, szBuffer, 20); - Result = _wtoi(szBuffer); - - CopyRect(&rect, &drawItem->rcItem); - horzsize = rect.right - rect.left; - Result = (Result * horzsize) / 100; - - rect.right = drawItem->rcItem.right - Result; - FillRect(drawItem->hDC, &rect, hBlueBrush); - rect.left = rect.right; - rect.right = drawItem->rcItem.right; - FillRect(drawItem->hDC, &rect, hMagBrush); - DeleteObject(hBlueBrush); - DeleteObject(hMagBrush); - } -} - -static -void -InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive) -{ - WCHAR szVolumeName[MAX_PATH+1] = {0}; - DWORD MaxComponentLength = 0; - DWORD FileSystemFlags = 0; - WCHAR FileSystemName[MAX_PATH+1] = {0}; - WCHAR szFormat[50]; - WCHAR szBuffer[128]; - BOOL ret; - UINT DriveType; - ULARGE_INTEGER FreeBytesAvailable; - ULARGE_INTEGER TotalNumberOfFreeBytes; - ULARGE_INTEGER TotalNumberOfBytes; - - ret = GetVolumeInformationW(szDrive, szVolumeName, MAX_PATH + 1, NULL, &MaxComponentLength, &FileSystemFlags, FileSystemName, MAX_PATH + 1); - if (ret) - { - /* set volume label */ - SetDlgItemTextW(hwndDlg, 14000, szVolumeName); - - /* set filesystem type */ - SetDlgItemTextW(hwndDlg, 14002, FileSystemName); - - } - - DriveType = GetDriveTypeW(szDrive); - if (DriveType == DRIVE_FIXED || DriveType == DRIVE_CDROM) - { - - if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) - { - WCHAR szResult[128]; - ULONG Result; - HANDLE hVolume; - DWORD BytesReturned = 0; - - swprintf(szResult, L"\\.\%c:", towupper(szDrive[0])); - hVolume = CreateFileW(szResult, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); - if (hVolume != INVALID_HANDLE_VALUE) - { - ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&TotalNumberOfBytes, sizeof(ULARGE_INTEGER), &BytesReturned, NULL); - if (ret && StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) - SetDlgItemTextW(hwndDlg, 14007, szResult); - - CloseHandle(hVolume); - } - - TRACE("szResult %s hVOlume %p ret %d LengthInformation %ul Bytesreturned %d\n", debugstr_w(szResult), hVolume, ret, TotalNumberOfBytes.QuadPart, BytesReturned); - - if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) - SetDlgItemTextW(hwndDlg, 14003, szResult); - - if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) - SetDlgItemTextW(hwndDlg, 14005, szResult); - - Result = GetFreeBytesShare(TotalNumberOfFreeBytes.QuadPart, TotalNumberOfBytes.QuadPart); - /* set free bytes percentage */ - swprintf(szResult, L"%02u%%", Result); - SetDlgItemTextW(hwndDlg, 14006, szResult); - /* store used share amount */ - Result = 100 - Result; - swprintf(szResult, L"%02u%%", Result); - SetDlgItemTextW(hwndDlg, 14004, szResult); - if (DriveType == DRIVE_FIXED) - { - if (LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szBuffer, sizeof(szBuffer) / sizeof(WCHAR))) - SetDlgItemTextW(hwndDlg, 14001, szBuffer); - } - else /* DriveType == DRIVE_CDROM) */ - { - if (LoadStringW(shell32_hInstance, IDS_DRIVE_CDROM, szBuffer, sizeof(szBuffer) / sizeof(WCHAR))) - SetDlgItemTextW(hwndDlg, 14001, szBuffer); - } - } - } - /* set drive description */ - GetDlgItemTextW(hwndDlg, 14009, szFormat, 50); - swprintf(szBuffer, szFormat, szDrive); - SetDlgItemTextW(hwndDlg, 14009, szBuffer); -} - - -INT_PTR -CALLBACK -DriveGeneralDlg( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - switch(uMsg) - { - case WM_INITDIALOG: - { - LPPROPSHEETPAGEW ppsp = (LPPROPSHEETPAGEW)lParam; - if (ppsp == NULL) - break; - - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam); - InitializeGeneralDriveDialog(hwndDlg, (LPWSTR)ppsp->lParam); - return TRUE; - } - case WM_DRAWITEM: - { - LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam; - - if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015) - { - PaintStaticControls(hwndDlg, drawItem); - return TRUE; - } - break; - } - - case WM_COMMAND: - if (LOWORD(wParam) == 14010) /* Disk Cleanup */ - { - UINT length; - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR wszPath[MAX_PATH]; - LPWSTR lpStr = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER); - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - if (!GetSystemDirectoryW(wszPath, MAX_PATH)) - break; - wcscat(wszPath, L"\cleanmgr.exe /D "); - length = wcslen(wszPath); - wszPath[length] = lpStr[0]; - wszPath[length+1] = L'\0'; - if (CreateProcessW(NULL, wszPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - break; - case WM_NOTIFY: - if (LOWORD(wParam) == 14000) - { - if (HIWORD(wParam) == EN_CHANGE) - { - PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - } - break; - } - else if (((LPNMHDR)lParam)->hwndFrom == GetParent(hwndDlg)) - { - /* Property Sheet */ - LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam; - - if (lppsn->hdr.code == PSN_APPLY) - { - LPWSTR lpstr = (LPWSTR)GetWindowLongPtr(hwndDlg, DWLP_USER); - WCHAR buf[256]; - - if (lpstr && GetDlgItemTextW(hwndDlg, 14000, buf, sizeof(buf) / sizeof(WCHAR))) - SetVolumeLabelW(lpstr, buf); - SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); - return TRUE; - } - } - break; - - default: - break; - } - - return FALSE; -} - -INT_PTR -CALLBACK -DriveExtraDlg( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR szPath[MAX_PATH + 10]; - WCHAR szArg[MAX_PATH]; - WCHAR * szDrive; - LPPROPSHEETPAGEW ppsp; - DWORD dwSize; - FORMAT_DRIVE_CONTEXT Context; - - switch (uMsg) - { - case WM_INITDIALOG: - ppsp = (LPPROPSHEETPAGEW)lParam; - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam); - return TRUE; - case WM_COMMAND: - ZeroMemory( &si, sizeof(si) ); - si.cb = sizeof(si); - ZeroMemory( &pi, sizeof(pi) ); - - szDrive = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER); - switch(LOWORD(wParam)) - { - case 14000: - if (InitializeFmifsLibrary(&Context)) - { - Context.Drive = szDrive[0]; - DialogBoxParamW(shell32_hInstance, L"CHKDSK_DLG", hwndDlg, ChkDskDlg, (LPARAM)&Context); - FreeLibrary(Context.hLibrary); - } - break; - case 14001: - dwSize = sizeof(szPath); - if (RegGetValueW(HKEY_LOCAL_MACHINE, - L"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\DefragPath", - NULL, - RRF_RT_REG_EXPAND_SZ, - NULL, - (PVOID)szPath, - &dwSize) == S_OK) - { - swprintf(szArg, szPath, szDrive[0]); - if (!GetSystemDirectoryW(szPath, MAX_PATH)) - break; - szDrive = PathAddBackslashW(szPath); - if (!szDrive) - break; - - wcscat(szDrive, L"mmc.exe"); - if (CreateProcessW(szPath, szArg, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - break; - case 14002: - dwSize = sizeof(szPath); - if (RegGetValueW(HKEY_LOCAL_MACHINE, - L"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\BackupPath", - NULL, - RRF_RT_REG_EXPAND_SZ, - NULL, - (PVOID)szPath, - &dwSize) == S_OK) - { - if (CreateProcessW(szPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - } - break; - } - return FALSE; -} - -INT_PTR -CALLBACK -DriveHardwareDlg( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - GUID Guids[1]; - Guids[0] = GUID_DEVCLASS_DISKDRIVE; - - UNREFERENCED_PARAMETER(lParam); - UNREFERENCED_PARAMETER(wParam); - - switch(uMsg) - { - case WM_INITDIALOG: - /* create the hardware page */ - DeviceCreateHardwarePageEx(hwndDlg, - Guids, - sizeof(Guids) / sizeof(Guids[0]), - HWPD_STANDARDLIST); - break; - } - - return FALSE; -} - -static -const -struct -{ - LPCSTR resname; - DLGPROC dlgproc; - UINT DriveType; -} PropPages[] = -{ - { "DRIVE_GENERAL_DLG", DriveGeneralDlg, -1}, - { "DRIVE_EXTRA_DLG", DriveExtraDlg, DRIVE_FIXED}, - { "DRIVE_HARDWARE_DLG", DriveHardwareDlg, -1}, -}; - -HRESULT -CALLBACK -AddPropSheetPageProc(HPROPSHEETPAGE hpage, LPARAM lParam) -{ - PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam; - if (ppsh != NULL && ppsh->nPages < MAX_PROPERTY_SHEET_PAGE) - { - ppsh->phpage[ppsh->nPages++] = hpage; - return TRUE; - } - return FALSE; -} - -BOOL -SH_ShowDriveProperties(WCHAR *drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *apidl) -{ - HPSXA hpsx = NULL; - HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE]; - PROPSHEETHEADERW psh; - HWND hwnd; - UINT i; - WCHAR szName[MAX_PATH+6]; - DWORD dwMaxComponent, dwFileSysFlags; - CComPtr<IDataObject> pDataObj; - UINT DriveType; - - ZeroMemory(&psh, sizeof(PROPSHEETHEADERW)); - psh.dwSize = sizeof(PROPSHEETHEADERW); - psh.dwFlags = 0; // FIXME: make it modeless - psh.hwndParent = NULL; - psh.nStartPage = 0; - psh.phpage = hpsp; - - if (GetVolumeInformationW(drive, szName, sizeof(szName) / sizeof(WCHAR), NULL, &dwMaxComponent, - &dwFileSysFlags, NULL, 0)) - { - psh.pszCaption = szName; - psh.dwFlags |= PSH_PROPTITLE; - if (!wcslen(szName)) - { - /* FIXME: check if disk is a really a local hdd */ - i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szName, sizeof(szName) / sizeof(WCHAR) - 6); - if (i > 0 && i < (sizeof(szName) / sizeof(WCHAR)) - 6) - wsprintf(szName + i, L" (%s)", drive); - } - } - - DriveType = GetDriveTypeW(drive); - for (i = 0; i < DRIVE_PROPERTY_PAGES; i++) - { - if (PropPages[i].DriveType == (UINT)-1 || PropPages[i].DriveType == DriveType) - { - HPROPSHEETPAGE hprop = SH_CreatePropertySheetPage(PropPages[i].resname, PropPages[i].dlgproc, (LPARAM)drive, NULL); - if (hprop) - { - hpsp[psh.nPages] = hprop; - psh.nPages++; - } - } - } - - if (SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (void **)&pDataObj) == S_OK) - { - hpsx = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, L"Drive", MAX_PROPERTY_SHEET_PAGE - DRIVE_PROPERTY_PAGES, pDataObj); - if (hpsx) - SHAddFromPropSheetExtArray(hpsx, (LPFNADDPROPSHEETPAGE)AddPropSheetPageProc, (LPARAM)&psh); - } - - hwnd = (HWND)PropertySheetW(&psh); - - if (hpsx) - SHDestroyPropSheetExtArray(hpsx); - - if (!hwnd) - return FALSE; - return TRUE; -} - -BOOL +static BOOL GetDefaultClusterSize(LPWSTR szFs, PDWORD pClusterSize, PULARGE_INTEGER TotalNumberOfBytes) { DWORD ClusterSize;
if (!wcsicmp(szFs, L"FAT16") || - !wcsicmp(szFs, L"FAT")) //REACTOS HACK + !wcsicmp(szFs, L"FAT")) //REACTOS HACK { if (TotalNumberOfBytes->QuadPart <= (16 * 1024 * 1024)) ClusterSize = 2048; @@ -798,11 +240,597 @@ return TRUE; }
+static VOID +ChkDskNow(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) +{ + DWORD ClusterSize = 0; + WCHAR szFs[30]; + WCHAR szDrive[] = L"C:\" + ULARGE_INTEGER TotalNumberOfFreeBytes, FreeBytesAvailableUser; + BOOLEAN bCorrectErrors = FALSE, bScanDrive = FALSE; + + szDrive[0] = pContext->Drive; + if(!GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, szFs, sizeof(szFs) / sizeof(WCHAR))) + { + FIXME("failed to get drive fs type\n"); + return; + } + + if (!GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailableUser, &TotalNumberOfFreeBytes, NULL)) + { + FIXME("failed to get drive space type\n"); + return; + } + + if (!GetDefaultClusterSize(szFs, &ClusterSize, &TotalNumberOfFreeBytes)) + { + FIXME("invalid cluster size\n"); + return; + } + + if (SendDlgItemMessageW(hwndDlg, 14000, BM_GETCHECK, 0, 0) == BST_CHECKED) + bCorrectErrors = TRUE; + + if (SendDlgItemMessageW(hwndDlg, 14001, BM_GETCHECK, 0, 0) == BST_CHECKED) + bScanDrive = TRUE; + + ChkdskDrvDialog = hwndDlg; + bChkdskSuccess = FALSE; + SendDlgItemMessageW(hwndDlg, 14002, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); + pContext->Chkdsk(szDrive, szFs, bCorrectErrors, TRUE, FALSE, bScanDrive, NULL, NULL, ChkdskCallback); + + ChkdskDrvDialog = NULL; + pContext->Result = bChkdskSuccess; + bChkdskSuccess = FALSE; +} + +static INT_PTR CALLBACK +ChkDskDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PFORMAT_DRIVE_CONTEXT pContext; + switch(uMsg) + { + case WM_INITDIALOG: + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); + InitializeChkDskDialog(hwndDlg, (PFORMAT_DRIVE_CONTEXT)lParam); + return TRUE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDCANCEL: + EndDialog(hwndDlg, 0); + break; + case IDOK: + pContext = (PFORMAT_DRIVE_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER); + ChkDskNow(hwndDlg, pContext); + break; + } + break; + } + + return FALSE; +} + +static +ULONG +GetFreeBytesShare(ULONGLONG TotalNumberOfFreeBytes, ULONGLONG TotalNumberOfBytes) +{ + ULONGLONG Temp; + + if (TotalNumberOfFreeBytes == 0LL) + { + return 0; + } + + Temp = TotalNumberOfBytes / 100; + if (Temp >= TotalNumberOfFreeBytes) + { + return 1; + } + else + { + return (ULONG)(TotalNumberOfFreeBytes / Temp); + } +} + +static VOID +PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT drawItem) +{ + HBRUSH hBrush; + + if (drawItem->CtlID == 14013) + { + hBrush = CreateSolidBrush(RGB(0, 0, 255)); + if (hBrush) + { + FillRect(drawItem->hDC, &drawItem->rcItem, hBrush); + DeleteObject((HGDIOBJ)hBrush); + } + } + else if (drawItem->CtlID == 14014) + { + hBrush = CreateSolidBrush(RGB(255, 0, 255)); + if (hBrush) + { + FillRect(drawItem->hDC, &drawItem->rcItem, hBrush); + DeleteObject((HGDIOBJ)hBrush); + } + } + else if (drawItem->CtlID == 14015) + { + HBRUSH hBlueBrush; + HBRUSH hMagBrush; + RECT rect; + LONG horzsize; + LONGLONG Result; + WCHAR szBuffer[20]; + + hBlueBrush = CreateSolidBrush(RGB(0, 0, 255)); + hMagBrush = CreateSolidBrush(RGB(255, 0, 255)); + + GetDlgItemTextW(hwndDlg, 14006, szBuffer, 20); + Result = _wtoi(szBuffer); + + CopyRect(&rect, &drawItem->rcItem); + horzsize = rect.right - rect.left; + Result = (Result * horzsize) / 100; + + rect.right = drawItem->rcItem.right - Result; + FillRect(drawItem->hDC, &rect, hBlueBrush); + rect.left = rect.right; + rect.right = drawItem->rcItem.right; + FillRect(drawItem->hDC, &rect, hMagBrush); + DeleteObject(hBlueBrush); + DeleteObject(hMagBrush); + } +} + +static +VOID +InitializeGeneralDriveDialog(HWND hwndDlg, WCHAR * szDrive) +{ + WCHAR szVolumeName[MAX_PATH+1] = {0}; + DWORD MaxComponentLength = 0; + DWORD FileSystemFlags = 0; + WCHAR FileSystemName[MAX_PATH+1] = {0}; + WCHAR szFormat[50]; + WCHAR szBuffer[128]; + BOOL ret; + UINT DriveType; + ULARGE_INTEGER FreeBytesAvailable; + ULARGE_INTEGER TotalNumberOfFreeBytes; + ULARGE_INTEGER TotalNumberOfBytes; + + ret = GetVolumeInformationW(szDrive, szVolumeName, MAX_PATH + 1, NULL, &MaxComponentLength, &FileSystemFlags, FileSystemName, MAX_PATH + 1); + if (ret) + { + /* set volume label */ + SetDlgItemTextW(hwndDlg, 14000, szVolumeName); + + /* set filesystem type */ + SetDlgItemTextW(hwndDlg, 14002, FileSystemName); + + } + + DriveType = GetDriveTypeW(szDrive); + if (DriveType == DRIVE_FIXED || DriveType == DRIVE_CDROM) + { + + if(GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) + { + WCHAR szResult[128]; + ULONG Result; + HANDLE hVolume; + DWORD BytesReturned = 0; + + swprintf(szResult, L"\\.\%c:", towupper(szDrive[0])); + hVolume = CreateFileW(szResult, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hVolume != INVALID_HANDLE_VALUE) + { + ret = DeviceIoControl(hVolume, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, (LPVOID)&TotalNumberOfBytes, sizeof(ULARGE_INTEGER), &BytesReturned, NULL); + if (ret && StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) + SetDlgItemTextW(hwndDlg, 14007, szResult); + + CloseHandle(hVolume); + } + + TRACE("szResult %s hVOlume %p ret %d LengthInformation %ul Bytesreturned %d\n", debugstr_w(szResult), hVolume, ret, TotalNumberOfBytes.QuadPart, BytesReturned); + + if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) + SetDlgItemTextW(hwndDlg, 14003, szResult); + + if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, szResult, sizeof(szResult) / sizeof(WCHAR))) + SetDlgItemTextW(hwndDlg, 14005, szResult); + + Result = GetFreeBytesShare(TotalNumberOfFreeBytes.QuadPart, TotalNumberOfBytes.QuadPart); + /* set free bytes percentage */ + swprintf(szResult, L"%02u%%", Result); + SetDlgItemTextW(hwndDlg, 14006, szResult); + /* store used share amount */ + Result = 100 - Result; + swprintf(szResult, L"%02u%%", Result); + SetDlgItemTextW(hwndDlg, 14004, szResult); + if (DriveType == DRIVE_FIXED) + { + if (LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szBuffer, sizeof(szBuffer) / sizeof(WCHAR))) + SetDlgItemTextW(hwndDlg, 14001, szBuffer); + } + else /* DriveType == DRIVE_CDROM) */ + { + if (LoadStringW(shell32_hInstance, IDS_DRIVE_CDROM, szBuffer, sizeof(szBuffer) / sizeof(WCHAR))) + SetDlgItemTextW(hwndDlg, 14001, szBuffer); + } + } + } + /* set drive description */ + GetDlgItemTextW(hwndDlg, 14009, szFormat, 50); + swprintf(szBuffer, szFormat, szDrive); + SetDlgItemTextW(hwndDlg, 14009, szBuffer); +} + +static INT_PTR CALLBACK +DriveGeneralDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + LPPROPSHEETPAGEW ppsp = (LPPROPSHEETPAGEW)lParam; + if (ppsp == NULL) + break; + + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam); + InitializeGeneralDriveDialog(hwndDlg, (LPWSTR)ppsp->lParam); + return TRUE; + } + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam; + + if (drawItem->CtlID >= 14013 && drawItem->CtlID <= 14015) + { + PaintStaticControls(hwndDlg, drawItem); + return TRUE; + } + break; + } + + case WM_COMMAND: + if (LOWORD(wParam) == 14010) /* Disk Cleanup */ + { + UINT cchSysPath; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR wszPath[MAX_PATH]; + LPWSTR pwszDrive = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER); + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + cchSysPath = GetSystemDirectoryW(wszPath, MAX_PATH); + if (!cchSysPath) + break; + StringCchPrintfW(wszPath + cchSysPath, _countof(wszPath) - cchSysPath, L"\cleanmgr.exe /D %s", pwszDrive); + if (CreateProcessW(NULL, wszPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + break; + case WM_NOTIFY: + if (LOWORD(wParam) == 14000) // Label + { + if (HIWORD(wParam) == EN_CHANGE) + { + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + } + break; + } + else if (((LPNMHDR)lParam)->hwndFrom == GetParent(hwndDlg)) + { + /* Property Sheet */ + LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam; + + if (lppsn->hdr.code == PSN_APPLY) + { + LPWSTR pwszDrive = (LPWSTR)GetWindowLongPtr(hwndDlg, DWLP_USER); + WCHAR wszBuf[256]; + + if (pwszDrive && GetDlgItemTextW(hwndDlg, 14000, wszBuf, sizeof(wszBuf) / sizeof(WCHAR))) + SetVolumeLabelW(pwszDrive, wszBuf); + SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); + return TRUE; + } + } + break; + + default: + break; + } + + return FALSE; +} + +static BOOL +InitializeFmifsLibrary(PFORMAT_DRIVE_CONTEXT pContext) +{ + INITIALIZE_FMIFS InitFmifs; + BOOLEAN ret; + HMODULE hLibrary; + + hLibrary = pContext->hLibrary = LoadLibraryW(L"fmifs.dll"); + if(!hLibrary) + { + ERR("failed to load fmifs.dll\n"); + return FALSE; + } + + InitFmifs = (INITIALIZE_FMIFS)GetProcAddress(hLibrary, "InitializeFmIfs"); + if (!InitFmifs) + { + ERR("InitializeFmIfs export is missing\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + ret = (*InitFmifs)(NULL, DLL_PROCESS_ATTACH, NULL); + if (!ret) + { + ERR("fmifs failed to initialize\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + pContext->QueryAvailableFileSystemFormat = (QUERY_AVAILABLEFSFORMAT)GetProcAddress(hLibrary, "QueryAvailableFileSystemFormat"); + if (!pContext->QueryAvailableFileSystemFormat) + { + ERR("QueryAvailableFileSystemFormat export is missing\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + pContext->FormatEx = (FORMAT_EX) GetProcAddress(hLibrary, "FormatEx"); + if (!pContext->FormatEx) + { + ERR("FormatEx export is missing\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + pContext->EnableVolumeCompression = (ENABLEVOLUMECOMPRESSION) GetProcAddress(hLibrary, "EnableVolumeCompression"); + if (!pContext->FormatEx) + { + ERR("EnableVolumeCompression export is missing\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + pContext->Chkdsk = (CHKDSK) GetProcAddress(hLibrary, "Chkdsk"); + if (!pContext->Chkdsk) + { + ERR("Chkdsk export is missing\n"); + FreeLibrary(hLibrary); + return FALSE; + } + + return TRUE; +} + +static INT_PTR CALLBACK +DriveExtraDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + LPPROPSHEETPAGEW ppsp = (LPPROPSHEETPAGEW)lParam; + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam); + return TRUE; + } + case WM_COMMAND: + { + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR szPath[MAX_PATH + 10]; + WCHAR szArg[MAX_PATH]; + WCHAR *szDrive; + DWORD dwSize; + FORMAT_DRIVE_CONTEXT Context; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + szDrive = (WCHAR*)GetWindowLongPtr(hwndDlg, DWLP_USER); + switch(LOWORD(wParam)) + { + case 14000: + if (InitializeFmifsLibrary(&Context)) + { + Context.Drive = szDrive[0]; + DialogBoxParamW(shell32_hInstance, L"CHKDSK_DLG", hwndDlg, ChkDskDlg, (LPARAM)&Context); + FreeLibrary(Context.hLibrary); + } + break; + case 14001: + dwSize = sizeof(szPath); + if (RegGetValueW(HKEY_LOCAL_MACHINE, + L"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\DefragPath", + NULL, + RRF_RT_REG_EXPAND_SZ, + NULL, + (PVOID)szPath, + &dwSize) == ERROR_SUCCESS) + { + swprintf(szArg, szPath, szDrive[0]); + if (!GetSystemDirectoryW(szPath, MAX_PATH)) + break; + szDrive = PathAddBackslashW(szPath); + if (!szDrive) + break; + + wcscat(szDrive, L"mmc.exe"); + if (CreateProcessW(szPath, szArg, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + break; + case 14002: + dwSize = sizeof(szPath); + if (RegGetValueW(HKEY_LOCAL_MACHINE, + L"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\BackupPath", + NULL, + RRF_RT_REG_EXPAND_SZ, + NULL, + (PVOID)szPath, + &dwSize) == ERROR_SUCCESS) + { + if (CreateProcessW(szPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + } + break; + } + } + return FALSE; +} + +static INT_PTR CALLBACK +DriveHardwareDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(wParam); + + switch(uMsg) + { + case WM_INITDIALOG: + { + GUID Guid = GUID_DEVCLASS_DISKDRIVE; + + /* create the hardware page */ + DeviceCreateHardwarePageEx(hwndDlg, &Guid, 1, HWPD_STANDARDLIST); + break; + } + } + + return FALSE; +} + +static HRESULT CALLBACK +AddPropSheetPageProc(HPROPSHEETPAGE hpage, LPARAM lParam) +{ + PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam; + if (ppsh != NULL && ppsh->nPages < MAX_PROPERTY_SHEET_PAGE) + { + ppsh->phpage[ppsh->nPages++] = hpage; + return TRUE; + } + return FALSE; +} + +typedef struct _DRIVE_PROP_PAGE +{ + LPCSTR resname; + DLGPROC dlgproc; + UINT DriveType; +} DRIVE_PROP_PAGE; + +BOOL +SH_ShowDriveProperties(WCHAR *pwszDrive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *apidl) +{ + HPSXA hpsx = NULL; + HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE]; + PROPSHEETHEADERW psh; + HWND hwnd; + UINT i, DriveType; + WCHAR wszName[256]; + CComPtr<IDataObject> pDataObj; + + static const DRIVE_PROP_PAGE PropPages[] = + { + { "DRIVE_GENERAL_DLG", DriveGeneralDlg, -1}, + { "DRIVE_EXTRA_DLG", DriveExtraDlg, DRIVE_FIXED}, + { "DRIVE_HARDWARE_DLG", DriveHardwareDlg, -1} + }; + + ZeroMemory(&psh, sizeof(PROPSHEETHEADERW)); + psh.dwSize = sizeof(PROPSHEETHEADERW); + psh.dwFlags = 0; // FIXME: make it modeless + psh.hwndParent = NULL; + psh.nStartPage = 0; + psh.phpage = hpsp; + + if (GetVolumeInformationW(pwszDrive, wszName, sizeof(wszName) / sizeof(WCHAR), NULL, NULL, NULL, NULL, 0)) + { + psh.pszCaption = wszName; + psh.dwFlags |= PSH_PROPTITLE; + if (wszName[0] == UNICODE_NULL) + { + /* FIXME: check if disk is a really a local hdd */ + i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, wszName, sizeof(wszName) / sizeof(WCHAR) - 6); + StringCchPrintf(wszName + i, sizeof(wszName) / sizeof(WCHAR) - i, L" (%s)", pwszDrive); + } + } + + DriveType = GetDriveTypeW(pwszDrive); + for (i = 0; i < _countof(PropPages); i++) + { + if (PropPages[i].DriveType == (UINT)-1 || PropPages[i].DriveType == DriveType) + { + HPROPSHEETPAGE hprop = SH_CreatePropertySheetPage(PropPages[i].resname, PropPages[i].dlgproc, (LPARAM)pwszDrive, NULL); + if (hprop) + { + hpsp[psh.nPages] = hprop; + psh.nPages++; + } + } + } + + if (SHCreateDataObject(pidlFolder, 1, apidl, NULL, IID_IDataObject, (void **)&pDataObj) == S_OK) + { + hpsx = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, L"Drive", MAX_PROPERTY_SHEET_PAGE - _countof(PropPages), pDataObj); + if (hpsx) + SHAddFromPropSheetExtArray(hpsx, (LPFNADDPROPSHEETPAGE)AddPropSheetPageProc, (LPARAM)&psh); + } + + hwnd = (HWND)PropertySheetW(&psh); + + if (hpsx) + SHDestroyPropSheetExtArray(hpsx); + + if (!hwnd) + return FALSE; + return TRUE; +} + +static VOID InsertDefaultClusterSizeForFs(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) { - WCHAR szFs[100] = {0}; - WCHAR szDrive[4] = { L'C', ':', '\', 0 }; + WCHAR wszBuf[100] = {0}; + WCHAR szDrive[] = L"C:\"; INT iSelIndex; ULARGE_INTEGER FreeBytesAvailableUser, TotalNumberOfBytes; DWORD ClusterSize; @@ -814,59 +842,56 @@ if (iSelIndex == CB_ERR) return;
- if (SendMessageW(hDlgCtrl, CB_GETLBTEXT, iSelIndex, (LPARAM)szFs) == CB_ERR) + if (SendMessageW(hDlgCtrl, CB_GETLBTEXT, iSelIndex, (LPARAM)wszBuf) == CB_ERR) return;
- szFs[(sizeof(szFs)/sizeof(WCHAR))-1] = L'\0'; szDrive[0] = pContext->Drive + 'A';
if (!GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailableUser, &TotalNumberOfBytes, NULL)) return;
- if (!wcsicmp(szFs, L"FAT16") || - !wcsicmp(szFs, L"FAT")) //REACTOS HACK - { - if (!GetDefaultClusterSize(szFs, &ClusterSize, &TotalNumberOfBytes)) + if (!wcsicmp(wszBuf, L"FAT16") || + !wcsicmp(wszBuf, L"FAT")) //REACTOS HACK + { + if (!GetDefaultClusterSize(wszBuf, &ClusterSize, &TotalNumberOfBytes)) { TRACE("FAT16 is not supported on hdd larger than 4G current %lu\n", TotalNumberOfBytes.QuadPart); SendMessageW(hDlgCtrl, CB_DELETESTRING, iSelIndex, 0); return; }
- if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, szFs, sizeof(szFs) / sizeof(WCHAR))) + if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, wszBuf, sizeof(wszBuf) / sizeof(WCHAR))) { hDlgCtrl = GetDlgItem(hwndDlg, 28680); - szFs[(sizeof(szFs)/sizeof(WCHAR))-1] = L'\0'; SendMessageW(hDlgCtrl, CB_RESETCONTENT, 0, 0); - lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)szFs); + lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)wszBuf); if (lIndex != CB_ERR) SendMessageW(hDlgCtrl, CB_SETITEMDATA, lIndex, (LPARAM)ClusterSize); SendMessageW(hDlgCtrl, CB_SETCURSEL, 0, 0); } } - else if (!wcsicmp(szFs, L"FAT32")) - { - if (!GetDefaultClusterSize(szFs, &ClusterSize, &TotalNumberOfBytes)) + else if (!wcsicmp(wszBuf, L"FAT32")) + { + if (!GetDefaultClusterSize(wszBuf, &ClusterSize, &TotalNumberOfBytes)) { TRACE("FAT32 is not supported on hdd larger than 32G current %lu\n", TotalNumberOfBytes.QuadPart); SendMessageW(hDlgCtrl, CB_DELETESTRING, iSelIndex, 0); return; }
- if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, szFs, sizeof(szFs) / sizeof(WCHAR))) + if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, wszBuf, sizeof(wszBuf) / sizeof(WCHAR))) { hDlgCtrl = GetDlgItem(hwndDlg, 28680); - szFs[(sizeof(szFs)/sizeof(WCHAR))-1] = L'\0'; SendMessageW(hDlgCtrl, CB_RESETCONTENT, 0, 0); - lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)szFs); + lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)wszBuf); if (lIndex != CB_ERR) SendMessageW(hDlgCtrl, CB_SETITEMDATA, lIndex, (LPARAM)ClusterSize); SendMessageW(hDlgCtrl, CB_SETCURSEL, 0, 0); } } - else if (!wcsicmp(szFs, L"NTFS")) - { - if (!GetDefaultClusterSize(szFs, &ClusterSize, &TotalNumberOfBytes)) + else if (!wcsicmp(wszBuf, L"NTFS")) + { + if (!GetDefaultClusterSize(wszBuf, &ClusterSize, &TotalNumberOfBytes)) { TRACE("NTFS is not supported on hdd larger than 2TB current %lu\n", TotalNumberOfBytes.QuadPart); SendMessageW(hDlgCtrl, CB_DELETESTRING, iSelIndex, 0); @@ -874,11 +899,10 @@ }
hDlgCtrl = GetDlgItem(hwndDlg, 28680); - if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, szFs, sizeof(szFs) / sizeof(WCHAR))) - { - szFs[(sizeof(szFs)/sizeof(WCHAR))-1] = L'\0'; + if (LoadStringW(shell32_hInstance, IDS_DEFAULT_CLUSTER_SIZE, wszBuf, sizeof(wszBuf) / sizeof(WCHAR))) + { SendMessageW(hDlgCtrl, CB_RESETCONTENT, 0, 0); - lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)szFs); + lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)wszBuf); if (lIndex != CB_ERR) SendMessageW(hDlgCtrl, CB_SETITEMDATA, lIndex, (LPARAM)ClusterSize); SendMessageW(hDlgCtrl, CB_SETCURSEL, 0, 0); @@ -887,9 +911,9 @@ for (lIndex = 0; lIndex < 4; lIndex++) { TotalNumberOfBytes.QuadPart = ClusterSize; - if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szFs, sizeof(szFs) / sizeof(WCHAR))) + if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, wszBuf, sizeof(wszBuf) / sizeof(WCHAR))) { - lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)szFs); + lIndex = SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)wszBuf); if (lIndex != CB_ERR) SendMessageW(hDlgCtrl, CB_SETITEMDATA, lIndex, (LPARAM)ClusterSize); } @@ -904,56 +928,40 @@ } }
-VOID +static VOID InitializeFormatDriveDlg(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext) { WCHAR szText[120]; - WCHAR szDrive[4] = { L'C', ':', '\', 0 }; - WCHAR szFs[30] = {0}; - INT Length, TempLength; - DWORD dwSerial, dwMaxComp, dwFileSys; + WCHAR szDrive[] = L"C:\"; + WCHAR szFs[30] = L""; + INT cchText; ULARGE_INTEGER FreeBytesAvailableUser, TotalNumberOfBytes; DWORD dwIndex, dwDefault; UCHAR uMinor, uMajor; BOOLEAN Latest; - HWND hDlgCtrl; - - Length = GetWindowTextW(hwndDlg, szText, sizeof(szText) / sizeof(WCHAR)); - if (Length < 0) - Length = 0; + HWND hwndFileSystems; + + cchText = GetWindowTextW(hwndDlg, szText, sizeof(szText) / sizeof(WCHAR) - 1); + if (cchText < 0) + cchText = 0; + szText[cchText++] = L' '; szDrive[0] = pContext->Drive + L'A'; - if (GetVolumeInformationW(szDrive, &szText[Length+1], (sizeof(szText) / sizeof(WCHAR)) - Length - 2, &dwSerial, &dwMaxComp, &dwFileSys, szFs, sizeof(szFs) / sizeof(WCHAR))) - { - szText[Length] = L' '; - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; - TempLength = wcslen(&szText[Length+1]); - if (!TempLength) + if (GetVolumeInformationW(szDrive, &szText[cchText], (sizeof(szText) / sizeof(WCHAR)) - cchText, NULL, NULL, NULL, szFs, sizeof(szFs) / sizeof(WCHAR))) + { + if (szText[cchText] == UNICODE_NULL) { /* load default volume label */ - TempLength = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, &szText[Length+1], (sizeof(szText) / sizeof(WCHAR)) - Length - 2); + cchText += LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, &szText[cchText], (sizeof(szText) / sizeof(WCHAR)) - cchText); } else { /* set volume label */ - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; - SetDlgItemTextW(hwndDlg, 28679, &szText[Length+1]); - } - Length += TempLength + 1; - } - - if ((DWORD)Length + 4 < (sizeof(szText) / sizeof(WCHAR))) - { - szText[Length] = L' '; - szText[Length+1] = L'('; - szText[Length+2] = szDrive[0]; - szText[Length+3] = L')'; - Length += 4; - } - - if ((DWORD)Length < (sizeof(szText) / sizeof(WCHAR))) - szText[Length] = L'\0'; - else - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; + SetDlgItemTextW(hwndDlg, 28679, &szText[cchText]); + cchText += wcslen(&szText[cchText]); + } + } + + StringCchPrintfW(szText + cchText, _countof(szText) - cchText, L" (%c)", szDrive[0]);
/* set window text */ SetWindowTextW(hwndDlg, szText); @@ -963,7 +971,6 @@ if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, szText, sizeof(szText) / sizeof(WCHAR))) { /* add drive capacity */ - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; SendDlgItemMessageW(hwndDlg, 28673, CB_ADDSTRING, 0, (LPARAM)szText); SendDlgItemMessageW(hwndDlg, 28673, CB_SETCURSEL, 0, (LPARAM)0); } @@ -978,15 +985,14 @@ /* enumerate all available filesystems */ dwIndex = 0; dwDefault = 0; - hDlgCtrl = GetDlgItem(hwndDlg, 28677); + hwndFileSystems = GetDlgItem(hwndDlg, 28677);
while(pContext->QueryAvailableFileSystemFormat(dwIndex, szText, &uMajor, &uMinor, &Latest)) { - szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; if (!wcsicmp(szText, szFs)) dwDefault = dwIndex;
- SendMessageW(hDlgCtrl, CB_ADDSTRING, 0, (LPARAM)szText); + SendMessageW(hwndFileSystems, CB_ADDSTRING, 0, (LPARAM)szText); dwIndex++; }
@@ -997,7 +1003,7 @@ }
/* select default filesys */ - SendMessageW(hDlgCtrl, CB_SETCURSEL, dwDefault, 0); + SendMessageW(hwndFileSystems, CB_SETCURSEL, dwDefault, 0); /* setup cluster combo */ InsertDefaultClusterSizeForFs(hwndDlg, pContext); /* hide progress control */ @@ -1007,8 +1013,7 @@ static HWND FormatDrvDialog = NULL; static BOOLEAN bSuccess = FALSE;
-BOOLEAN -NTAPI +static BOOLEAN NTAPI FormatExCB( IN CALLBACKCOMMAND Command, IN ULONG SubAction, @@ -1143,8 +1148,7 @@ } }
-INT_PTR -CALLBACK +static INT_PTR CALLBACK FormatDriveDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PFORMAT_DRIVE_CONTEXT pContext; @@ -1178,71 +1182,6 @@ return FALSE; }
-BOOL -InitializeFmifsLibrary(PFORMAT_DRIVE_CONTEXT pContext) -{ - INITIALIZE_FMIFS InitFmifs; - BOOLEAN ret; - HMODULE hLibrary; - - hLibrary = pContext->hLibrary = LoadLibraryW(L"fmifs.dll"); - if(!hLibrary) - { - ERR("failed to load fmifs.dll\n"); - return FALSE; - } - - InitFmifs = (INITIALIZE_FMIFS)GetProcAddress(hLibrary, "InitializeFmIfs"); - if (!InitFmifs) - { - ERR("InitializeFmIfs export is missing\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - ret = (*InitFmifs)(NULL, DLL_PROCESS_ATTACH, NULL); - if (!ret) - { - ERR("fmifs failed to initialize\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - pContext->QueryAvailableFileSystemFormat = (QUERY_AVAILABLEFSFORMAT)GetProcAddress(hLibrary, "QueryAvailableFileSystemFormat"); - if (!pContext->QueryAvailableFileSystemFormat) - { - ERR("QueryAvailableFileSystemFormat export is missing\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - pContext->FormatEx = (FORMAT_EX) GetProcAddress(hLibrary, "FormatEx"); - if (!pContext->FormatEx) - { - ERR("FormatEx export is missing\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - pContext->EnableVolumeCompression = (ENABLEVOLUMECOMPRESSION) GetProcAddress(hLibrary, "EnableVolumeCompression"); - if (!pContext->FormatEx) - { - ERR("EnableVolumeCompression export is missing\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - pContext->Chkdsk = (CHKDSK) GetProcAddress(hLibrary, "Chkdsk"); - if (!pContext->Chkdsk) - { - ERR("Chkdsk export is missing\n"); - FreeLibrary(hLibrary); - return FALSE; - } - - return TRUE; -} - /************************************************************************* * SHFormatDrive (SHELL32.@) */