ReactOS 0.4.15-dev-8058-ga7cbb60
drvdefext.cpp
Go to the documentation of this file.
1/*
2 * Provides default drive shell extension
3 *
4 * Copyright 2005 Johannes Anderwald
5 * Copyright 2012 Rafal Harabien
6 * Copyright 2020 Katayama Hirofumi MZ
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include "precomp.h"
24
25#define _USE_MATH_DEFINES
26#include <math.h>
27#include <devguid.h>
28
29#define NTOS_MODE_USER
30#include <ndk/iofuncs.h>
31#include <ndk/obfuncs.h>
32
34
35typedef enum
36{
41
44 LPGUID lpGuids,
45 UINT uNumberOfGuids,
47UINT SH_FormatByteSize(LONGLONG cbSize, LPWSTR pwszResult, UINT cchResultMax);
48
49static VOID
50GetDriveNameWithLetter(LPWSTR pwszText, UINT cchTextMax, LPCWSTR pwszDrive)
51{
52 DWORD dwMaxComp, dwFileSys;
53 SIZE_T cchText = 0;
54
55 if (GetVolumeInformationW(pwszDrive, pwszText, cchTextMax, NULL, &dwMaxComp, &dwFileSys, NULL, 0))
56 {
57 cchText = wcslen(pwszText);
58 if (cchText == 0)
59 {
60 /* load default volume label */
61 cchText = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, pwszText, cchTextMax);
62 }
63 }
64
65 StringCchPrintfW(pwszText + cchText, cchTextMax - cchText, L" (%c:)", pwszDrive[0]);
66}
67
68static VOID
70{
71 WCHAR wszText[100];
73 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)pwszDrive);
74
75 Length = GetWindowTextW(hwndDlg, wszText, sizeof(wszText) / sizeof(WCHAR));
76 wszText[Length] = L' ';
77 GetDriveNameWithLetter(&wszText[Length + 1], (sizeof(wszText) / sizeof(WCHAR)) - Length - 1, pwszDrive);
78 SetWindowText(hwndDlg, wszText);
79}
80
83
84static BOOLEAN NTAPI
87 IN ULONG SubAction,
88 IN PVOID ActionInfo)
89{
90 PDWORD Progress;
91 PBOOLEAN pSuccess;
92 switch(Command)
93 {
94 case PROGRESS:
95 Progress = (PDWORD)ActionInfo;
97 break;
98 case DONE:
99 pSuccess = (PBOOLEAN)ActionInfo;
100 bChkdskSuccess = (*pSuccess);
101 break;
102
103 case VOLUMEINUSE:
105 case FSNOTSUPPORTED:
108 FIXME("\n");
109 break;
110
111 default:
112 break;
113 }
114
115 return TRUE;
116}
117
118static VOID
119ChkDskNow(HWND hwndDlg, LPCWSTR pwszDrive)
120{
121 //DWORD ClusterSize = 0;
122 WCHAR wszFs[30];
123 ULARGE_INTEGER TotalNumberOfFreeBytes, FreeBytesAvailableUser;
124 BOOLEAN bCorrectErrors = FALSE, bScanDrive = FALSE;
125
126 if(!GetVolumeInformationW(pwszDrive, NULL, 0, NULL, NULL, NULL, wszFs, _countof(wszFs)))
127 {
128 FIXME("failed to get drive fs type\n");
129 return;
130 }
131
132 if (!GetDiskFreeSpaceExW(pwszDrive, &FreeBytesAvailableUser, &TotalNumberOfFreeBytes, NULL))
133 {
134 FIXME("failed to get drive space type\n");
135 return;
136 }
137
138 /*if (!GetDefaultClusterSize(wszFs, &ClusterSize, &TotalNumberOfFreeBytes))
139 {
140 FIXME("invalid cluster size\n");
141 return;
142 }*/
143
144 if (SendDlgItemMessageW(hwndDlg, 14000, BM_GETCHECK, 0, 0) == BST_CHECKED)
145 bCorrectErrors = TRUE;
146
147 if (SendDlgItemMessageW(hwndDlg, 14001, BM_GETCHECK, 0, 0) == BST_CHECKED)
148 bScanDrive = TRUE;
149
150 hChkdskDrvDialog = hwndDlg;
152 SendDlgItemMessageW(hwndDlg, 14002, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
153 Chkdsk((LPWSTR)pwszDrive, (LPWSTR)wszFs, bCorrectErrors, TRUE, FALSE, bScanDrive, NULL, NULL, ChkdskCallback); // FIXME: casts
154
157}
158
159static INT_PTR CALLBACK
161 HWND hwndDlg,
162 UINT uMsg,
165{
166 switch(uMsg)
167 {
168 case WM_INITDIALOG:
171 return TRUE;
172 case WM_COMMAND:
173 switch(LOWORD(wParam))
174 {
175 case IDCANCEL:
176 EndDialog(hwndDlg, 0);
177 break;
178 case IDOK:
179 {
180 LPCWSTR pwszDrive = (LPCWSTR)GetWindowLongPtr(hwndDlg, DWLP_USER);
181 ChkDskNow(hwndDlg, pwszDrive);
182 break;
183 }
184 }
185 break;
186 }
187
188 return FALSE;
189}
190
191VOID
193{
194 HBRUSH hBrush;
195
196 if (pDrawItem->CtlID == 14013)
197 {
198 hBrush = CreateSolidBrush(RGB(0, 0, 255));
199 if (hBrush)
200 {
201 FillRect(pDrawItem->hDC, &pDrawItem->rcItem, hBrush);
202 DeleteObject((HGDIOBJ)hBrush);
203 }
204 }
205 else if (pDrawItem->CtlID == 14014)
206 {
207 hBrush = CreateSolidBrush(RGB(255, 0, 255));
208 if (hBrush)
209 {
210 FillRect(pDrawItem->hDC, &pDrawItem->rcItem, hBrush);
211 DeleteObject((HGDIOBJ)hBrush);
212 }
213 }
214 else if (pDrawItem->CtlID == 14015)
215 {
216 HBRUSH hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));
217 HBRUSH hMagBrush = CreateSolidBrush(RGB(255, 0, 255));
218 HBRUSH hbrOld;
219 HPEN hBlackPen = (HPEN)GetStockObject(BLACK_PEN);
220 HPEN hDarkBluePen = CreatePen(PS_SOLID, 1, RGB(0, 0, 128));
221 HPEN hDarkMagPen = CreatePen(PS_SOLID, 1, RGB(128, 0, 128));
222 HPEN hOldPen = (HPEN)SelectObject(pDrawItem->hDC, hDarkMagPen);
223 INT xCenter = (pDrawItem->rcItem.left + pDrawItem->rcItem.right) / 2;
224 INT yCenter = (pDrawItem->rcItem.top + pDrawItem->rcItem.bottom - 10) / 2;
225 INT cx = pDrawItem->rcItem.right - pDrawItem->rcItem.left;
226 INT cy = pDrawItem->rcItem.bottom - pDrawItem->rcItem.top - 10;
227 INT xRadial = xCenter + (INT)(cos(M_PI + m_FreeSpacePerc / 100.0f * M_PI * 2.0f) * cx / 2);
228 INT yRadial = yCenter - (INT)(sin(M_PI + m_FreeSpacePerc / 100.0f * M_PI * 2.0f) * cy / 2);
229
230 TRACE("FreeSpace %u a %f cx %d\n", m_FreeSpacePerc, M_PI+m_FreeSpacePerc / 100.0f * M_PI * 2.0f, cx);
231
232 for (INT x = pDrawItem->rcItem.left; x < pDrawItem->rcItem.right; ++x)
233 {
234 double cos_val = (x - xCenter) * 2.0f / cx;
235 INT y = yCenter + (INT)(sin(acos(cos_val)) * cy / 2) - 1;
236 HPEN hCenterPen;
237
238 if (m_FreeSpacePerc < 50 && x == xRadial)
239 SelectObject(pDrawItem->hDC, hDarkBluePen);
240
241 /* Temporarily change pens to draw edges */
242 if (x == pDrawItem->rcItem.left)
243 hCenterPen = (HPEN)SelectObject(pDrawItem->hDC, hBlackPen);
244 else if (x == pDrawItem->rcItem.right - 1)
245 SelectObject(pDrawItem->hDC, hBlackPen);
246
247 MoveToEx(pDrawItem->hDC, x, y, NULL);
248 LineTo(pDrawItem->hDC, x, y + 10);
249 SetPixel(pDrawItem->hDC, x, y + 10, RGB(0, 0, 0));
250
251 /* Restore fill section pens */
252 if (x == pDrawItem->rcItem.left)
253 SelectObject(pDrawItem->hDC, hCenterPen);
254 }
255
256 SelectObject(pDrawItem->hDC, hBlackPen);
257
258 if (m_FreeSpacePerc > 50)
259 {
260 hbrOld = (HBRUSH)SelectObject(pDrawItem->hDC, hMagBrush);
261
262 Ellipse(pDrawItem->hDC, pDrawItem->rcItem.left, pDrawItem->rcItem.top,
263 pDrawItem->rcItem.right, pDrawItem->rcItem.bottom - 10);
264
265 SelectObject(pDrawItem->hDC, hBlueBrush);
266
267 if (m_FreeSpacePerc < 100)
268 {
269 Pie(pDrawItem->hDC, pDrawItem->rcItem.left, pDrawItem->rcItem.top, pDrawItem->rcItem.right,
270 pDrawItem->rcItem.bottom - 10, xRadial, yRadial, pDrawItem->rcItem.left, yCenter);
271 }
272 }
273 else
274 {
275 hbrOld = (HBRUSH)SelectObject(pDrawItem->hDC, hBlueBrush);
276
277 Ellipse(pDrawItem->hDC, pDrawItem->rcItem.left, pDrawItem->rcItem.top,
278 pDrawItem->rcItem.right, pDrawItem->rcItem.bottom - 10);
279
280 SelectObject(pDrawItem->hDC, hMagBrush);
281
282 if (m_FreeSpacePerc > 0)
283 {
284 Pie(pDrawItem->hDC, pDrawItem->rcItem.left, pDrawItem->rcItem.top, pDrawItem->rcItem.right,
285 pDrawItem->rcItem.bottom - 10, pDrawItem->rcItem.left, yCenter, xRadial, yRadial);
286 }
287 }
288
289 SelectObject(pDrawItem->hDC, hbrOld);
290 SelectObject(pDrawItem->hDC, hOldPen);
291
292 DeleteObject(hBlueBrush);
293 DeleteObject(hMagBrush);
294 DeleteObject(hDarkBluePen);
295 DeleteObject(hDarkMagPen);
296 }
297}
298
299// https://stackoverflow.com/questions/3098696/get-information-about-disk-drives-result-on-windows7-32-bit-system/3100268#3100268
300static BOOL
301GetDriveTypeAndCharacteristics(HANDLE hDevice, DEVICE_TYPE *pDeviceType, ULONG *pCharacteristics)
302{
306
308 &DeviceInfo, sizeof(DeviceInfo),
310 if (Status == NO_ERROR)
311 {
312 *pDeviceType = DeviceInfo.DeviceType;
313 *pCharacteristics = DeviceInfo.Characteristics;
314 return TRUE;
315 }
316
317 return FALSE;
318}
319
321{
322 LPCWSTR RootPath = pszDriveRoot;
323 WCHAR szRoot[16], szDeviceName[16];
324 UINT uType;
325 HANDLE hDevice;
327 ULONG ulCharacteristics;
328 BOOL ret;
329
330 lstrcpynW(szRoot, RootPath, _countof(szRoot));
331
332 if (L'a' <= szRoot[0] && szRoot[0] <= 'z')
333 {
334 szRoot[0] += ('A' - 'a');
335 }
336
337 if ('A' <= szRoot[0] && szRoot[0] <= L'Z' &&
338 szRoot[1] == L':' && szRoot[2] == 0)
339 {
340 // 'C:' --> 'C:\'
341 szRoot[2] = L'\\';
342 szRoot[3] = 0;
343 }
344
345 if (!PathIsRootW(szRoot))
346 {
347 return FALSE;
348 }
349
350 uType = GetDriveTypeW(szRoot);
351 if (uType == DRIVE_REMOVABLE)
352 {
353 if (szRoot[0] == L'A' || szRoot[0] == L'B')
354 return TRUE;
355 }
356 else
357 {
358 return FALSE;
359 }
360
362 szDeviceName[4] = szRoot[0];
363 szDeviceName[5] = L':';
365
368 NULL, OPEN_EXISTING, 0, NULL);
369 if (hDevice == INVALID_HANDLE_VALUE)
370 {
371 return FALSE;
372 }
373
374 ret = FALSE;
375 if (GetDriveTypeAndCharacteristics(hDevice, &DeviceType, &ulCharacteristics))
376 {
377 if ((ulCharacteristics & FILE_FLOPPY_DISKETTE) == FILE_FLOPPY_DISKETTE)
378 ret = TRUE;
379 }
380
381 CloseHandle(hDevice);
382
383 return ret;
384}
385
387{
388 WCHAR szRoot[8];
389 MultiByteToWideChar(CP_ACP, 0, pszDriveRoot, -1, szRoot, _countof(szRoot));
390 return IsDriveFloppyW(szRoot);
391}
392
393VOID
395{
396 WCHAR wszVolumeName[MAX_PATH+1] = {0};
397 WCHAR wszFileSystem[MAX_PATH+1] = {0};
398 WCHAR wszBuf[128];
399 BOOL bRet;
400
401 bRet = GetVolumeInformationW(m_wszDrive, wszVolumeName, _countof(wszVolumeName), NULL, NULL, NULL, wszFileSystem, _countof(wszFileSystem));
402 if (bRet)
403 {
404 /* Set volume label and filesystem */
405 SetDlgItemTextW(hwndDlg, 14000, wszVolumeName);
406 SetDlgItemTextW(hwndDlg, 14002, wszFileSystem);
407 }
408 else
409 {
410 LoadStringW(shell32_hInstance, IDS_FS_UNKNOWN, wszFileSystem, _countof(wszFileSystem));
411 SetDlgItemTextW(hwndDlg, 14002, wszFileSystem);
412 }
413
414 /* Set drive type and icon */
416 UINT IconId, TypeStrId = 0;
417 switch (DriveType)
418 {
419 case DRIVE_REMOVABLE:
421 IconId = IDI_SHELL_3_14_FLOPPY;
422 else
423 IconId = IDI_SHELL_REMOVEABLE;
424 break;
425 case DRIVE_CDROM: IconId = IDI_SHELL_CDROM; TypeStrId = IDS_DRIVE_CDROM; break;
426 case DRIVE_REMOTE: IconId = IDI_SHELL_NETDRIVE; TypeStrId = IDS_DRIVE_NETWORK; break;
427 case DRIVE_RAMDISK: IconId = IDI_SHELL_RAMDISK; break;
428 default: IconId = IDI_SHELL_DRIVE; TypeStrId = IDS_DRIVE_FIXED;
429 }
430
432 {
433 /* volume label textbox */
434 SendMessage(GetDlgItem(hwndDlg, 14000), EM_SETREADONLY, TRUE, 0);
435
436 /* disk compression */
437 ShowWindow(GetDlgItem(hwndDlg, 14011), FALSE);
438
439 /* index */
440 ShowWindow(GetDlgItem(hwndDlg, 14012), FALSE);
441 }
442
444 if (hIcon)
445 SendDlgItemMessageW(hwndDlg, 14016, STM_SETICON, (WPARAM)hIcon, 0);
446 if (TypeStrId && LoadStringW(shell32_hInstance, TypeStrId, wszBuf, _countof(wszBuf)))
447 SetDlgItemTextW(hwndDlg, 14001, wszBuf);
448
449 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes;
450 if(GetDiskFreeSpaceExW(m_wszDrive, &FreeBytesAvailable, &TotalNumberOfBytes, NULL))
451 {
452 /* Init free space percentage used for drawing piechart */
453 m_FreeSpacePerc = (UINT)(FreeBytesAvailable.QuadPart * 100ull / TotalNumberOfBytes.QuadPart);
454
455 /* Used space */
456 if (SH_FormatByteSize(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, wszBuf, _countof(wszBuf)))
457 SetDlgItemTextW(hwndDlg, 14003, wszBuf);
458
459 if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart - FreeBytesAvailable.QuadPart, wszBuf, _countof(wszBuf)))
460 SetDlgItemTextW(hwndDlg, 14004, wszBuf);
461
462 /* Free space */
463 if (SH_FormatByteSize(FreeBytesAvailable.QuadPart, wszBuf, _countof(wszBuf)))
464 SetDlgItemTextW(hwndDlg, 14005, wszBuf);
465
466 if (StrFormatByteSizeW(FreeBytesAvailable.QuadPart, wszBuf, _countof(wszBuf)))
467 SetDlgItemTextW(hwndDlg, 14006, wszBuf);
468
469 /* Total space */
470 if (SH_FormatByteSize(TotalNumberOfBytes.QuadPart, wszBuf, _countof(wszBuf)))
471 SetDlgItemTextW(hwndDlg, 14007, wszBuf);
472
473 if (StrFormatByteSizeW(TotalNumberOfBytes.QuadPart, wszBuf, _countof(wszBuf)))
474 SetDlgItemTextW(hwndDlg, 14008, wszBuf);
475 }
476 else
477 {
478 m_FreeSpacePerc = 0;
479
480 if (SH_FormatByteSize(0, wszBuf, _countof(wszBuf)))
481 {
482 SetDlgItemTextW(hwndDlg, 14003, wszBuf);
483 SetDlgItemTextW(hwndDlg, 14005, wszBuf);
484 SetDlgItemTextW(hwndDlg, 14007, wszBuf);
485 }
486 if (StrFormatByteSizeW(0, wszBuf, _countof(wszBuf)))
487 {
488 SetDlgItemTextW(hwndDlg, 14004, wszBuf);
489 SetDlgItemTextW(hwndDlg, 14006, wszBuf);
490 SetDlgItemTextW(hwndDlg, 14008, wszBuf);
491 }
492 }
493
494 /* Set drive description */
495 WCHAR wszFormat[50];
496 GetDlgItemTextW(hwndDlg, 14009, wszFormat, _countof(wszFormat));
497 swprintf(wszBuf, wszFormat, m_wszDrive[0]);
498 SetDlgItemTextW(hwndDlg, 14009, wszBuf);
499
500 /* show disk cleanup button only for fixed drives */
501 ShowWindow(GetDlgItem(hwndDlg, 14010), DriveType == DRIVE_FIXED);
502}
503
506 HWND hwndDlg,
507 UINT uMsg,
510{
511 switch(uMsg)
512 {
513 case WM_INITDIALOG:
514 {
516 if (ppsp == NULL)
517 break;
518
519 CDrvDefExt *pDrvDefExt = reinterpret_cast<CDrvDefExt *>(ppsp->lParam);
520 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pDrvDefExt);
521 pDrvDefExt->InitGeneralPage(hwndDlg);
522 return TRUE;
523 }
524 case WM_DRAWITEM:
525 {
527
528 if (pDrawItem->CtlID >= 14013 && pDrawItem->CtlID <= 14015)
529 {
530 CDrvDefExt *pDrvDefExt = reinterpret_cast<CDrvDefExt *>(GetWindowLongPtr(hwndDlg, DWLP_USER));
531 pDrvDefExt->PaintStaticControls(hwndDlg, pDrawItem);
532 return TRUE;
533 }
534 break;
535 }
536 case WM_PAINT:
537 break;
538 case WM_COMMAND:
539 if (LOWORD(wParam) == 14010) /* Disk Cleanup */
540 {
541 CDrvDefExt *pDrvDefExt = reinterpret_cast<CDrvDefExt *>(GetWindowLongPtr(hwndDlg, DWLP_USER));
542 WCHAR wszBuf[256];
543 DWORD cbBuf = sizeof(wszBuf);
544
546 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\CleanupPath",
547 NULL,
549 NULL,
550 (PVOID)wszBuf,
551 &cbBuf) == ERROR_SUCCESS)
552 {
553 WCHAR wszCmd[MAX_PATH];
554
555 StringCbPrintfW(wszCmd, sizeof(wszCmd), wszBuf, pDrvDefExt->m_wszDrive[0]);
556
557 if (ShellExecuteW(hwndDlg, NULL, wszCmd, NULL, NULL, SW_SHOW) <= (HINSTANCE)32)
558 ERR("Failed to create cleanup process %ls\n", wszCmd);
559 }
560 }
561 else if (LOWORD(wParam) == 14000) /* Label */
562 {
563 if (HIWORD(wParam) == EN_CHANGE)
564 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
565 }
566 break;
567 case WM_NOTIFY:
568 if (((LPNMHDR)lParam)->hwndFrom == GetParent(hwndDlg))
569 {
570 /* Property Sheet */
572
573 if (lppsn->hdr.code == PSN_APPLY)
574 {
575 CDrvDefExt *pDrvDefExt = reinterpret_cast<CDrvDefExt *>(GetWindowLongPtr(hwndDlg, DWLP_USER));
576 WCHAR wszBuf[256];
577
578 if (GetDlgItemTextW(hwndDlg, 14000, wszBuf, _countof(wszBuf)))
579 SetVolumeLabelW(pDrvDefExt->m_wszDrive, wszBuf);
581 return TRUE;
582 }
583 }
584 break;
585
586 default:
587 break;
588 }
589
590 return FALSE;
591}
592
595 HWND hwndDlg,
596 UINT uMsg,
599{
600 switch (uMsg)
601 {
602 case WM_INITDIALOG:
603 {
605 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)ppsp->lParam);
606 return TRUE;
607 }
608 case WM_COMMAND:
609 {
610 WCHAR wszBuf[MAX_PATH];
611 DWORD cbBuf = sizeof(wszBuf);
612 CDrvDefExt *pDrvDefExt = reinterpret_cast<CDrvDefExt *>(GetWindowLongPtr(hwndDlg, DWLP_USER));
613
614 switch(LOWORD(wParam))
615 {
616 case 14000:
618 break;
619 case 14001:
621 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\DefragPath",
622 NULL,
624 NULL,
625 (PVOID)wszBuf,
626 &cbBuf) == ERROR_SUCCESS)
627 {
628 WCHAR wszCmd[MAX_PATH];
629
630 StringCbPrintfW(wszCmd, sizeof(wszCmd), wszBuf, pDrvDefExt->m_wszDrive[0]);
631
632 if (ShellExecuteW(hwndDlg, NULL, wszCmd, NULL, NULL, SW_SHOW) <= (HINSTANCE)32)
633 ERR("Failed to create defrag process %ls\n", wszCmd);
634 }
635 break;
636 case 14002:
638 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\BackupPath",
639 NULL,
641 NULL,
642 (PVOID)wszBuf,
643 &cbBuf) == ERROR_SUCCESS)
644 {
645 if (ShellExecuteW(hwndDlg, NULL, wszBuf, NULL, NULL, SW_SHOW) <= (HINSTANCE)32)
646 ERR("Failed to create backup process %ls\n", wszBuf);
647 }
648 }
649 break;
650 }
651 }
652 return FALSE;
653}
654
657 HWND hwndDlg,
658 UINT uMsg,
661{
664
665 switch(uMsg)
666 {
667 case WM_INITDIALOG:
668 {
669 GUID Guids[2];
670 Guids[0] = GUID_DEVCLASS_DISKDRIVE;
671 Guids[1] = GUID_DEVCLASS_CDROM;
672
673 /* create the hardware page */
675 break;
676 }
677 }
678
679 return FALSE;
680}
681
683{
684 m_wszDrive[0] = L'\0';
685}
686
688{
689
690}
691
694{
695 FORMATETC format;
696 STGMEDIUM stgm;
697 HRESULT hr;
698
699 TRACE("%p %p %p %p\n", this, pidlFolder, pDataObj, hkeyProgID);
700
701 if (!pDataObj)
702 return E_FAIL;
703
704 format.cfFormat = CF_HDROP;
705 format.ptd = NULL;
706 format.dwAspect = DVASPECT_CONTENT;
707 format.lindex = -1;
708 format.tymed = TYMED_HGLOBAL;
709
710 hr = pDataObj->GetData(&format, &stgm);
711 if (FAILED(hr))
712 return hr;
713
714 if (!DragQueryFileW((HDROP)stgm.hGlobal, 0, m_wszDrive, _countof(m_wszDrive)))
715 {
716 ERR("DragQueryFileW failed\n");
717 ReleaseStgMedium(&stgm);
718 return E_FAIL;
719 }
720
721 ReleaseStgMedium(&stgm);
722 TRACE("Drive properties %ls\n", m_wszDrive);
723
724 return S_OK;
725}
726
728CDrvDefExt::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
729{
731 return E_NOTIMPL;
732}
733
736{
738 return E_NOTIMPL;
739}
740
742CDrvDefExt::GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax)
743{
745 return E_NOTIMPL;
746}
747
750{
751 HPROPSHEETPAGE hPage;
752
755 (LPARAM)this,
756 NULL);
757 if (hPage)
758 pfnAddPage(hPage, lParam);
759
761 {
764 (LPARAM)this,
765 NULL);
766 if (hPage)
767 pfnAddPage(hPage, lParam);
768 }
769
771 {
774 (LPARAM)this,
775 NULL);
776 if (hPage)
777 pfnAddPage(hPage, lParam);
778 }
779
780 return S_OK;
781}
782
785{
787 return E_NOTIMPL;
788}
789
792{
794 return E_NOTIMPL;
795}
796
798CDrvDefExt::GetSite(REFIID iid, void **ppvSite)
799{
801 return E_NOTIMPL;
802}
UINT DriveType
unsigned char BOOLEAN
#define shell32_hInstance
UINT cchMax
_STLP_DECLSPEC complex< float > _STLP_CALL cos(const complex< float > &)
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
valarray< _Tp > acos(const valarray< _Tp > &__x)
Definition: _valarray.h:901
FORCEINLINE VOID SetPixel(_In_ ULONG Left, _In_ ULONG Top, _In_ UCHAR Color)
Definition: arm.h:55
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
#define CF_HDROP
Definition: constants.h:410
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define EXTERN_C
Definition: basetyps.h:12
#define FIXME(fmt,...)
Definition: debug.h:114
#define UNIMPLEMENTED
Definition: debug.h:118
#define ERR(fmt,...)
Definition: debug.h:113
static INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: drvdefext.cpp:505
VOID PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT pDrawItem)
Definition: drvdefext.cpp:192
STDMETHOD() GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
Definition: drvdefext.cpp:742
STDMETHOD() Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pDataObj, HKEY hkeyProgID) override
Definition: drvdefext.cpp:693
STDMETHOD() QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
Definition: drvdefext.cpp:728
static INT_PTR CALLBACK HardwarePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: drvdefext.cpp:656
UINT m_FreeSpacePerc
Definition: drvdefext.h:40
STDMETHOD() AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) override
Definition: drvdefext.cpp:749
static INT_PTR CALLBACK ExtraPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: drvdefext.cpp:594
STDMETHOD() SetSite(IUnknown *punk) override
Definition: drvdefext.cpp:791
STDMETHOD() InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override
Definition: drvdefext.cpp:735
STDMETHOD() GetSite(REFIID iid, void **ppvSite) override
Definition: drvdefext.cpp:798
WCHAR m_wszDrive[MAX_PATH]
Definition: drvdefext.h:39
VOID InitGeneralPage(HWND hwndDlg)
Definition: drvdefext.cpp:394
STDMETHOD() ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam) override
Definition: drvdefext.cpp:784
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NO_ERROR
Definition: dderror.h:5
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HWPAGE_DISPLAYMODE
Definition: main.h:23
@ HWPD_STANDARDLIST
Definition: main.h:24
HWND WINAPI DeviceCreateHardwarePageEx(HWND hWndParent, LPGUID lpGuids, UINT uNumberOfGuids, HWPAGE_DISPLAYMODE DisplayMode)
static const WCHAR szDeviceName[]
Definition: provider.c:56
#define DEVICE_TYPE
Definition: guid.c:10
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
UINT uFlags
Definition: api.c:59
#define CloseHandle
Definition: compat.h:739
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define CALLBACK
Definition: compat.h:35
#define MultiByteToWideChar
Definition: compat.h:110
#define FILE_SHARE_READ
Definition: compat.h:136
#define lstrcpynW
Definition: compat.h:738
VOID NTAPI Chkdsk(IN PWCHAR DriveRoot, IN PWCHAR Format, IN BOOLEAN CorrectErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PVOID Unused2, IN PVOID Unused3, IN PFMIFSCALLBACK Callback)
Definition: chkdsk.c:18
BOOL WINAPI GetDiskFreeSpaceExW(IN LPCWSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:342
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
BOOL WINAPI SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL)
Definition: volume.c:503
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
#define RRF_RT_REG_SZ
Definition: driver.c:575
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
Definition: path.c:1642
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2388
#define swprintf
Definition: precomp.h:40
HPROPSHEETPAGE SH_CreatePropertySheetPage(LPCSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
#define RGB(r, g, b)
Definition: precomp.h:71
HWPAGE_DISPLAYMODE
Definition: drvdefext.cpp:36
@ HWPD_STANDARDLIST
Definition: drvdefext.cpp:37
@ HWPD_LARGELIST
Definition: drvdefext.cpp:38
@ HWPD_MAX
Definition: drvdefext.cpp:39
static BOOL GetDriveTypeAndCharacteristics(HANDLE hDevice, DEVICE_TYPE *pDeviceType, ULONG *pCharacteristics)
Definition: drvdefext.cpp:301
static VOID ChkDskNow(HWND hwndDlg, LPCWSTR pwszDrive)
Definition: drvdefext.cpp:119
static HWND hChkdskDrvDialog
Definition: drvdefext.cpp:81
static VOID GetDriveNameWithLetter(LPWSTR pwszText, UINT cchTextMax, LPCWSTR pwszDrive)
Definition: drvdefext.cpp:50
UINT SH_FormatByteSize(LONGLONG cbSize, LPWSTR pwszResult, UINT cchResultMax)
Definition: filedefext.cpp:236
enum HWPAGE_DISPLAYMODE * PHWPAGE_DISPLAYMODE
static VOID InitializeChkDskDialog(HWND hwndDlg, LPCWSTR pwszDrive)
Definition: drvdefext.cpp:69
BOOL IsDriveFloppyA(LPCSTR pszDriveRoot)
Definition: drvdefext.cpp:386
EXTERN_C HWND WINAPI DeviceCreateHardwarePageEx(HWND hWndParent, LPGUID lpGuids, UINT uNumberOfGuids, HWPAGE_DISPLAYMODE DisplayMode)
BOOL IsDriveFloppyW(LPCWSTR pszDriveRoot)
Definition: drvdefext.cpp:320
static BOOLEAN bChkdskSuccess
Definition: drvdefext.cpp:82
static INT_PTR CALLBACK ChkDskDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: drvdefext.cpp:160
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
CALLBACKCOMMAND
Definition: fmifs.h:67
@ FSNOTSUPPORTED
Definition: fmifs.h:75
@ VOLUMEINUSE
Definition: fmifs.h:76
@ CLUSTERSIZETOOSMALL
Definition: fmifs.h:84
@ INSUFFICIENTRIGHTS
Definition: fmifs.h:74
@ PROGRESS
Definition: fmifs.h:68
@ FileFsDeviceInformation
Definition: from_kernel.h:222
pKey DeleteObject()
Status
Definition: gdiplustypes.h:25
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define DRIVE_CDROM
Definition: machpc98.h:119
#define M_PI
Definition: macros.h:263
DeviceType
Definition: mmdrv.h:42
static HICON
Definition: imagelist.c:84
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
HICON hIcon
Definition: msconfig.c:44
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define FILE_FLOPPY_DISKETTE
Definition: nt_native.h:809
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define L(x)
Definition: ntvdm.h:50
static VIDEODISPLAYMODE DisplayMode
Definition: pcvideo.c:117
#define LOWORD(l)
Definition: pedump.c:82
DWORD * PDWORD
Definition: pedump.c:68
#define INT
Definition: polytest.cpp:20
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define PSN_APPLY
Definition: prsht.h:117
#define PSNRET_NOERROR
Definition: prsht.h:129
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:327
struct _PSHNOTIFY * LPPSHNOTIFY
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define PBM_SETPOS
Definition: commctrl.h:2184
#define PBM_SETRANGE
Definition: commctrl.h:2183
#define REFIID
Definition: guiddef.h:118
#define WM_NOTIFY
Definition: richedit.h:61
#define DONE
Definition: rnr20lib.h:14
NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass)
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
HRESULT hr
Definition: shlfolder.c:183
#define IDD_DRIVE_TOOLS
Definition: shresdef.h:396
#define IDS_DRIVE_CDROM
Definition: shresdef.h:114
#define IDD_CHECK_DISK
Definition: shresdef.h:518
#define IDS_DRIVE_FIXED
Definition: shresdef.h:113
#define IDS_DRIVE_NETWORK
Definition: shresdef.h:115
#define IDS_FS_UNKNOWN
Definition: shresdef.h:118
#define IDI_SHELL_3_14_FLOPPY
Definition: shresdef.h:557
#define IDI_SHELL_NETDRIVE
Definition: shresdef.h:560
#define IDD_DRIVE_HARDWARE
Definition: shresdef.h:397
#define IDI_SHELL_CDROM
Definition: shresdef.h:562
#define IDI_SHELL_DRIVE
Definition: shresdef.h:559
#define IDI_SHELL_RAMDISK
Definition: shresdef.h:563
#define IDI_SHELL_REMOVEABLE
Definition: shresdef.h:558
#define IDD_DRIVE_PROPERTIES
Definition: shresdef.h:395
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
Definition: shell.h:41
LPARAM lParam
Definition: prsht.h:227
NMHDR hdr
Definition: prsht.h:330
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
UINT code
Definition: winuser.h:3159
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
int32_t INT_PTR
Definition: typedefs.h:64
unsigned char * PBOOLEAN
Definition: typedefs.h:53
int64_t LONGLONG
Definition: typedefs.h:68
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
PFMIFSCALLBACK ChkdskCallback
Definition: vfatlib.c:43
int ret
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
static HMENU hmenu
Definition: win.c:66
#define DRIVE_REMOTE
Definition: winbase.h:253
#define DRIVE_RAMDISK
Definition: winbase.h:255
#define DRIVE_FIXED
Definition: winbase.h:252
#define DRIVE_REMOVABLE
Definition: winbase.h:251
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
HGDIOBJ WINAPI GetStockObject(_In_ int)
BOOL WINAPI Ellipse(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
#define BLACK_PEN
Definition: wingdi.h:903
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define PS_SOLID
Definition: wingdi.h:586
BOOL WINAPI Pie(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int)
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define WM_PAINT
Definition: winuser.h:1620
struct tagDRAWITEMSTRUCT * LPDRAWITEMSTRUCT
#define EM_SETREADONLY
Definition: winuser.h:2015
#define DWLP_USER
Definition: winuser.h:872
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define STM_SETICON
Definition: winuser.h:2092
#define IDCANCEL
Definition: winuser.h:831
#define IMAGE_ICON
Definition: winuser.h:212
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define WM_COMMAND
Definition: winuser.h:1740
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define WM_INITDIALOG
Definition: winuser.h:1739
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:830
#define WM_DRAWITEM
Definition: winuser.h:1645
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
_In_ int cchText
Definition: winuser.h:4465
#define SendMessage
Definition: winuser.h:5843
#define LR_SHARED
Definition: winuser.h:1100
HWND WINAPI GetParent(_In_ HWND)
#define LoadImage
Definition: winuser.h:5815
#define DWLP_MSGRESULT
Definition: winuser.h:870
#define SW_SHOW
Definition: winuser.h:775
#define SetWindowText
Definition: winuser.h:5857
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define BST_CHECKED
Definition: winuser.h:197
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define BM_GETCHECK
Definition: winuser.h:1918
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define EN_CHANGE
Definition: winuser.h:2022
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185