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