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.cp…
==============================================================================
--- 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.@)
*/