ReactOS 0.4.15-dev-7788-g1ad9096
newdev.c
Go to the documentation of this file.
1/*
2 * New device installer (newdev.dll)
3 *
4 * Copyright 2005-2006 Hervé Poussineau (hpoussin@reactos.org)
5 * 2005 Christoph von Wittich (Christoph@ActiveVB.de)
6 * 2009 Colin Finck (colin@reactos.org)
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 Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "newdev_private.h"
24
25#include <stdio.h>
26#include <winnls.h>
27
28/* Global variables */
30
31static BOOL
33 IN PDEVINSTDATA DevInstData,
35 IN LPCWSTR InfFile OPTIONAL);
36
37/*
38* @implemented
39*/
43 IN LPCWSTR HardwareId,
44 IN LPCWSTR FullInfPath,
45 IN DWORD InstallFlags,
46 OUT PBOOL bRebootRequired OPTIONAL)
47{
48 DEVINSTDATA DevInstData;
49 DWORD i;
52 LPCWSTR CurrentHardwareId; /* Pointer into Buffer */
53 BOOL FoundHardwareId, FoundAtLeastOneDevice = FALSE;
54 BOOL ret = FALSE;
55
56 DevInstData.hDevInfo = INVALID_HANDLE_VALUE;
57
58 TRACE("UpdateDriverForPlugAndPlayDevicesW(%p %s %s 0x%x %p)\n",
59 hwndParent, debugstr_w(HardwareId), debugstr_w(FullInfPath), InstallFlags, bRebootRequired);
60
61 /* FIXME: InstallFlags bRebootRequired ignored! */
62
63 /* Check flags */
65 {
66 TRACE("Unknown flags: 0x%08lx\n", InstallFlags & ~(INSTALLFLAG_FORCE | INSTALLFLAG_READONLY | INSTALLFLAG_NONINTERACTIVE));
68 goto cleanup;
69 }
70
71 /* Enumerate all devices of the system */
73 if (DevInstData.hDevInfo == INVALID_HANDLE_VALUE)
74 goto cleanup;
75 DevInstData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
76 for (i = 0; ; i++)
77 {
78 if (!SetupDiEnumDeviceInfo(DevInstData.hDevInfo, i, &DevInstData.devInfoData))
79 {
81 {
82 TRACE("SetupDiEnumDeviceInfo() failed with error 0x%x\n", GetLastError());
83 goto cleanup;
84 }
85 /* This error was expected */
86 break;
87 }
88
89 /* Get Hardware ID */
91 Buffer = NULL;
92 BufferSize = 0;
94 DevInstData.hDevInfo,
95 &DevInstData.devInfoData,
97 NULL,
100 &BufferSize))
101 {
103 {
104 Buffer = NULL;
105 break;
106 }
108 {
109 TRACE("SetupDiGetDeviceRegistryPropertyW() failed with error 0x%x\n", GetLastError());
110 goto cleanup;
111 }
112 /* This error was expected */
115 if (!Buffer)
116 {
117 TRACE("HeapAlloc() failed\n", GetLastError());
119 goto cleanup;
120 }
121 }
122 if (Buffer == NULL)
123 continue;
124
125 /* Check if we match the given hardware ID */
126 FoundHardwareId = FALSE;
127 for (CurrentHardwareId = Buffer; *CurrentHardwareId != UNICODE_NULL; CurrentHardwareId += wcslen(CurrentHardwareId) + 1)
128 {
129 if (wcscmp(CurrentHardwareId, HardwareId) == 0)
130 {
131 FoundHardwareId = TRUE;
132 break;
133 }
134 }
135 if (!FoundHardwareId)
136 continue;
137
138 /* We need to try to update the driver of this device */
139
140 /* Get Instance ID */
142 Buffer = NULL;
143 if (SetupDiGetDeviceInstanceIdW(DevInstData.hDevInfo, &DevInstData.devInfoData, NULL, 0, &BufferSize))
144 {
145 /* Error, as the output buffer should be too small */
147 goto cleanup;
148 }
150 {
151 TRACE("SetupDiGetDeviceInstanceIdW() failed with error 0x%x\n", GetLastError());
152 goto cleanup;
153 }
154 else if ((Buffer = HeapAlloc(GetProcessHeap(), 0, BufferSize * sizeof(WCHAR))) == NULL)
155 {
156 TRACE("HeapAlloc() failed\n", GetLastError());
158 goto cleanup;
159 }
160 else if (!SetupDiGetDeviceInstanceIdW(DevInstData.hDevInfo, &DevInstData.devInfoData, Buffer, BufferSize, NULL))
161 {
162 TRACE("SetupDiGetDeviceInstanceIdW() failed with error 0x%x\n", GetLastError());
163 goto cleanup;
164 }
165 TRACE("Trying to update the driver of %s\n", debugstr_w(Buffer));
166
167 /* Search driver in the specified .inf file */
168 if (!SearchDriver(&DevInstData, NULL, FullInfPath))
169 {
170 TRACE("SearchDriver() failed with error 0x%x\n", GetLastError());
171 continue;
172 }
173
174 /* FIXME: HACK! We shouldn't check of ERROR_PRIVILEGE_NOT_HELD */
175 //if (!InstallCurrentDriver(&DevInstData))
177 {
178 TRACE("InstallCurrentDriver() failed with error 0x%x\n", GetLastError());
179 continue;
180 }
181
182 FoundAtLeastOneDevice = TRUE;
183 }
184
185 if (FoundAtLeastOneDevice)
186 {
188 ret = TRUE;
189 }
190 else
191 {
192 TRACE("No device found with HardwareID %s\n", debugstr_w(HardwareId));
194 }
195
196cleanup:
197 if (DevInstData.hDevInfo != INVALID_HANDLE_VALUE)
200 return ret;
201}
202
203/*
204* @implemented
205*/
209 IN LPCSTR HardwareId,
210 IN LPCSTR FullInfPath,
211 IN DWORD InstallFlags,
212 OUT PBOOL bRebootRequired OPTIONAL)
213{
214 BOOL Result;
215 LPWSTR HardwareIdW = NULL;
216 LPWSTR FullInfPathW = NULL;
217
218 int len = MultiByteToWideChar(CP_ACP, 0, HardwareId, -1, NULL, 0);
219 HardwareIdW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
220 if (!HardwareIdW)
221 {
223 return FALSE;
224 }
225 MultiByteToWideChar(CP_ACP, 0, HardwareId, -1, HardwareIdW, len);
226
227 len = MultiByteToWideChar(CP_ACP, 0, FullInfPath, -1, NULL, 0);
228 FullInfPathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
229 if (!FullInfPathW)
230 {
231 HeapFree(GetProcessHeap(), 0, HardwareIdW);
233 return FALSE;
234 }
235 MultiByteToWideChar(CP_ACP, 0, FullInfPath, -1, FullInfPathW, len);
236
239 HardwareIdW,
240 FullInfPathW,
241 InstallFlags,
242 bRebootRequired);
243
244 HeapFree(GetProcessHeap(), 0, HardwareIdW);
245 HeapFree(GetProcessHeap(), 0, FullInfPathW);
246
247 return Result;
248}
249
250/* Directory and InfFile MUST NOT be specified simultaneously */
251static BOOL
253 IN PDEVINSTDATA DevInstData,
255 IN LPCWSTR InfFile OPTIONAL)
256{
257 SP_DEVINSTALL_PARAMS_W DevInstallParams = {0,};
258 BOOL ret;
259
260 DevInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
261 if (!SetupDiGetDeviceInstallParamsW(DevInstData->hDevInfo, &DevInstData->devInfoData, &DevInstallParams))
262 {
263 TRACE("SetupDiGetDeviceInstallParams() failed with error 0x%x\n", GetLastError());
264 return FALSE;
265 }
266 DevInstallParams.FlagsEx |= DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
267
268 if (InfFile)
269 {
270 DevInstallParams.Flags |= DI_ENUMSINGLEINF;
271 wcsncpy(DevInstallParams.DriverPath, InfFile, MAX_PATH);
272 }
273 else if (Directory)
274 {
275 DevInstallParams.Flags &= ~DI_ENUMSINGLEINF;
276 wcsncpy(DevInstallParams.DriverPath, Directory, MAX_PATH);
277 }
278 else
279 {
280 DevInstallParams.Flags &= ~DI_ENUMSINGLEINF;
281 *DevInstallParams.DriverPath = '\0';
282 }
283
285 DevInstData->hDevInfo,
286 &DevInstData->devInfoData,
287 &DevInstallParams);
288 if (!ret)
289 {
290 TRACE("SetupDiSetDeviceInstallParams() failed with error 0x%x\n", GetLastError());
291 return FALSE;
292 }
293
295 DevInstData->hDevInfo,
296 &DevInstData->devInfoData,
298 if (!ret)
299 {
300 TRACE("SetupDiBuildDriverInfoList() failed with error 0x%x\n", GetLastError());
301 return FALSE;
302 }
303
304 DevInstData->drvInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
306 DevInstData->hDevInfo,
307 &DevInstData->devInfoData,
309 0,
310 &DevInstData->drvInfoData);
311 if (!ret)
312 {
314 return FALSE;
315 TRACE("SetupDiEnumDriverInfo() failed with error 0x%x\n", GetLastError());
316 return FALSE;
317 }
318
319 return TRUE;
320}
321
322static BOOL
324{
325 if(wcscmp(str, L".") && wcscmp(str, L"..")) return FALSE;
326 return TRUE;
327}
328
329static LPCWSTR
331{
332 LPCWSTR Dot;
333
334 Dot = wcsrchr(FileName, '.');
335 if (!Dot)
336 return L"";
337
338 return Dot;
339}
340
341static BOOL
343 IN PDEVINSTDATA DevInstData,
345{
347 WCHAR DirPath[MAX_PATH];
349 WCHAR FullPath[MAX_PATH];
350 WCHAR LastDirPath[MAX_PATH] = L"";
351 WCHAR PathWithPattern[MAX_PATH];
352 BOOL ok = TRUE;
353 BOOL retval = FALSE;
354 HANDLE hFindFile = INVALID_HANDLE_VALUE;
355
356 wcscpy(DirPath, Path);
357
358 if (DirPath[wcslen(DirPath) - 1] != '\\')
359 wcscat(DirPath, L"\\");
360
361 wcscpy(PathWithPattern, DirPath);
362 wcscat(PathWithPattern, L"*");
363
364 for (hFindFile = FindFirstFileW(PathWithPattern, &wfd);
365 ok && hFindFile != INVALID_HANDLE_VALUE;
366 ok = FindNextFileW(hFindFile, &wfd))
367 {
368
369 wcscpy(FileName, wfd.cFileName);
370 if (IsDots(FileName))
371 continue;
372
373 if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
374 {
375 /* Recursive search */
376 wcscpy(FullPath, DirPath);
377 wcscat(FullPath, FileName);
378 if (SearchDriverRecursive(DevInstData, FullPath))
379 {
380 retval = TRUE;
381 /* We continue the search for a better driver */
382 }
383 }
384 else
385 {
386 LPCWSTR pszExtension = GetFileExt(FileName);
387
388 if ((_wcsicmp(pszExtension, L".inf") == 0) && (wcscmp(LastDirPath, DirPath) != 0))
389 {
390 wcscpy(LastDirPath, DirPath);
391
392 if (wcslen(DirPath) > MAX_PATH)
393 /* Path is too long to be searched */
394 continue;
395
396 if (SearchDriver(DevInstData, DirPath, NULL))
397 {
398 retval = TRUE;
399 /* We continue the search for a better driver */
400 }
401
402 }
403 }
404 }
405
406 if (hFindFile != INVALID_HANDLE_VALUE)
407 FindClose(hFindFile);
408 return retval;
409}
410
411BOOL
413 _In_ PDEVINSTDATA DevInstData,
415{
416 return SearchDriverRecursive(DevInstData, pszDir);
417}
418
419BOOL
421 IN PDEVINSTDATA DevInstData)
422{
423 BOOL result;
424
425 /* Search in default location */
426 result = SearchDriver(DevInstData, NULL, NULL);
427
428 if (DevInstData->CustomSearchPath)
429 {
430 /* Search only in specified paths */
431 /* We need to check all specified directories to be
432 * sure to find the best driver for the device.
433 */
435 for (Path = DevInstData->CustomSearchPath; *Path != '\0'; Path += wcslen(Path) + 1)
436 {
437 TRACE("Search driver in %s\n", debugstr_w(Path));
438 if (wcslen(Path) == 2 && Path[1] == ':')
439 {
440 if (SearchDriverRecursive(DevInstData, Path))
441 result = TRUE;
442 }
443 else
444 {
445 if (SearchDriver(DevInstData, Path, NULL))
446 result = TRUE;
447 }
448 }
449 }
450
451 return result;
452}
453
454BOOL
456 IN PDEVINSTDATA DevInstData,
457 IN BOOL IncludeRemovableDevices,
458 IN BOOL IncludeCustomPath,
459 IN HWND hwndCombo OPTIONAL)
460{
461 WCHAR drive[] = {'?',':',0};
462 DWORD dwDrives = 0;
463 DWORD i;
464 UINT nType;
465 DWORD CustomTextLength = 0;
468
469 /* Calculate length needed to store the search paths */
470 if (IncludeRemovableDevices)
471 {
472 dwDrives = GetLogicalDrives();
473 for (drive[0] = 'A', i = 1; drive[0] <= 'Z'; drive[0]++, i <<= 1)
474 {
475 if (dwDrives & i)
476 {
477 nType = GetDriveTypeW(drive);
478 if (nType == DRIVE_REMOVABLE || nType == DRIVE_CDROM)
479 {
480 LengthNeeded += 3;
481 }
482 }
483 }
484 }
485 if (IncludeCustomPath)
486 {
487 CustomTextLength = 1 + ComboBox_GetTextLength(hwndCombo);
488 LengthNeeded += CustomTextLength;
489 }
490
491 /* Allocate space for search paths */
492 HeapFree(GetProcessHeap(), 0, DevInstData->CustomSearchPath);
493 DevInstData->CustomSearchPath = Buffer = HeapAlloc(
495 0,
496 (LengthNeeded + 1) * sizeof(WCHAR));
497 if (!Buffer)
498 {
499 TRACE("HeapAlloc() failed\n");
501 return FALSE;
502 }
503
504 /* Fill search paths */
505 if (IncludeRemovableDevices)
506 {
507 for (drive[0] = 'A', i = 1; drive[0] <= 'Z'; drive[0]++, i <<= 1)
508 {
509 if (dwDrives & i)
510 {
511 nType = GetDriveTypeW(drive);
512 if (nType == DRIVE_REMOVABLE || nType == DRIVE_CDROM)
513 {
514 Buffer += 1 + swprintf(Buffer, drive);
515 }
516 }
517 }
518 }
519 if (IncludeCustomPath)
520 {
521 Buffer += 1 + GetWindowTextW(hwndCombo, Buffer, CustomTextLength);
522 }
523 *Buffer = '\0';
524
525 return TRUE;
526}
527
528BOOL
530 IN PDEVINSTDATA DevInstData)
531{
532 BOOL ret;
533
534 TRACE("Installing driver %s: %s\n",
535 debugstr_w(DevInstData->drvInfoData.MfgName),
536 debugstr_w(DevInstData->drvInfoData.Description));
537
540 DevInstData->hDevInfo,
541 &DevInstData->devInfoData);
542 if (!ret)
543 {
544 TRACE("SetupDiCallClassInstaller(DIF_SELECTBESTCOMPATDRV) failed with error 0x%x\n", GetLastError());
545 return FALSE;
546 }
547
550 DevInstData->hDevInfo,
551 &DevInstData->devInfoData);
552 if (!ret)
553 {
554 TRACE("SetupDiCallClassInstaller(DIF_ALLOW_INSTALL) failed with error 0x%x\n", GetLastError());
555 return FALSE;
556 }
557
560 DevInstData->hDevInfo,
561 &DevInstData->devInfoData);
562 if (!ret)
563 {
564 TRACE("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_PREANALYZE) failed with error 0x%x\n", GetLastError());
565 return FALSE;
566 }
567
570 DevInstData->hDevInfo,
571 &DevInstData->devInfoData);
572 if (!ret)
573 {
574 TRACE("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_POSTANALYZE) failed with error 0x%x\n", GetLastError());
575 return FALSE;
576 }
577
580 DevInstData->hDevInfo,
581 &DevInstData->devInfoData);
582 if (!ret)
583 {
584 TRACE("SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES) failed with error 0x%x\n", GetLastError());
585 return FALSE;
586 }
587
590 DevInstData->hDevInfo,
591 &DevInstData->devInfoData);
592 if (!ret)
593 {
594 TRACE("SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS) failed with error 0x%x\n", GetLastError());
595 return FALSE;
596 }
597
600 DevInstData->hDevInfo,
601 &DevInstData->devInfoData);
602 if (!ret)
603 {
604 TRACE("SetupDiCallClassInstaller(DIF_INSTALLINTERFACES) failed with error 0x%x\n", GetLastError());
605 return FALSE;
606 }
607
610 DevInstData->hDevInfo,
611 &DevInstData->devInfoData);
612 if (!ret)
613 {
614 TRACE("SetupDiCallClassInstaller(DIF_INSTALLDEVICE) failed with error 0x%x\n", GetLastError());
615 return FALSE;
616 }
617
620 DevInstData->hDevInfo,
621 &DevInstData->devInfoData);
622 if (!ret)
623 {
624 TRACE("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_FINISHINSTALL) failed with error 0x%x\n", GetLastError());
625 return FALSE;
626 }
627
630 DevInstData->hDevInfo,
631 &DevInstData->devInfoData);
632 if (!ret)
633 {
634 TRACE("SetupDiCallClassInstaller(DIF_DESTROYPRIVATEDATA) failed with error 0x%x\n", GetLastError());
635 return FALSE;
636 }
637
638 return TRUE;
639}
640
641/*
642* @implemented
643*/
649 IN INT Show)
650{
651 PDEVINSTDATA DevInstData = NULL;
652 BOOL ret;
653 DWORD config_flags;
654 BOOL retval = FALSE;
655
656 TRACE("(%p, %p, %s, %d)\n", hWndParent, hInstance, debugstr_w(InstanceId), Show);
657
658 if (!IsUserAdmin())
659 {
660 /* XP kills the process... */
662 }
663
664 DevInstData = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVINSTDATA));
665 if (!DevInstData)
666 {
667 TRACE("HeapAlloc() failed\n");
669 goto cleanup;
670 }
671
672 /* Clear devinst data */
673 ZeroMemory(DevInstData, sizeof(DEVINSTDATA));
674 DevInstData->devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */
675
676 /* Fill devinst data */
678 if (DevInstData->hDevInfo == INVALID_HANDLE_VALUE)
679 {
680 TRACE("SetupDiCreateDeviceInfoListExW() failed with error 0x%x\n", GetLastError());
681 goto cleanup;
682 }
683
684 DevInstData->devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
686 DevInstData->hDevInfo,
688 NULL,
689 0, /* Open flags */
690 &DevInstData->devInfoData);
691 if (!ret)
692 {
693 TRACE("SetupDiOpenDeviceInfoW() failed with error 0x%x (InstanceId %s)\n",
695 DevInstData->devInfoData.cbSize = 0;
696 goto cleanup;
697 }
698
701 DevInstData->hDevInfo,
702 &DevInstData->devInfoData,
704 &DevInstData->regDataType,
705 NULL, 0,
706 &DevInstData->requiredSize);
707
708 if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData->regDataType == REG_SZ)
709 {
710 DevInstData->buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData->requiredSize);
711 if (!DevInstData->buffer)
712 {
713 TRACE("HeapAlloc() failed\n");
715 }
716 else
717 {
719 DevInstData->hDevInfo,
720 &DevInstData->devInfoData,
722 &DevInstData->regDataType,
723 DevInstData->buffer, DevInstData->requiredSize,
724 &DevInstData->requiredSize);
725 }
726 }
727 if (!ret)
728 {
729 TRACE("SetupDiGetDeviceRegistryProperty() failed with error 0x%x (InstanceId %s)\n",
731 goto cleanup;
732 }
733
735 DevInstData->hDevInfo,
736 &DevInstData->devInfoData,
738 NULL,
739 (BYTE *)&config_flags,
740 sizeof(config_flags),
741 NULL))
742 {
743 if (config_flags & CONFIGFLAG_FAILEDINSTALL)
744 {
745 /* The device is disabled */
746 TRACE("Device is disabled\n");
747 retval = TRUE;
748 goto cleanup;
749 }
750 }
751
752 TRACE("Installing %s (%s)\n", debugstr_w((PCWSTR)DevInstData->buffer), debugstr_w(InstanceId));
753
754 /* Search driver in default location and removable devices */
755 if (!PrepareFoldersToScan(DevInstData, FALSE, FALSE, NULL))
756 {
757 TRACE("PrepareFoldersToScan() failed with error 0x%lx\n", GetLastError());
758 goto cleanup;
759 }
760 if (ScanFoldersForDriver(DevInstData))
761 {
762 /* Driver found ; install it */
763 retval = InstallCurrentDriver(DevInstData);
764 TRACE("InstallCurrentDriver() returned %d\n", retval);
765 if (retval && Show != SW_HIDE)
766 {
767 /* Should we display the 'Need to reboot' page? */
768 SP_DEVINSTALL_PARAMS installParams;
769 installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
771 DevInstData->hDevInfo,
772 &DevInstData->devInfoData,
773 &installParams))
774 {
775 if (installParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
776 {
777 TRACE("Displaying 'Reboot' wizard page\n");
778 retval = DisplayWizard(DevInstData, hWndParent, IDD_NEEDREBOOT);
779 }
780 }
781 }
782 goto cleanup;
783 }
784 else if (Show == SW_HIDE)
785 {
786 /* We can't show the wizard. Fail the install */
787 TRACE("No wizard\n");
788 goto cleanup;
789 }
790
791 /* Prepare the wizard, and display it */
792 TRACE("Need to show install wizard\n");
793 retval = DisplayWizard(DevInstData, hWndParent, IDD_WELCOMEPAGE);
794
795cleanup:
796 if (DevInstData)
797 {
798 if (DevInstData->devInfoData.cbSize != 0)
799 {
800 if (!SetupDiDestroyDriverInfoList(DevInstData->hDevInfo, &DevInstData->devInfoData, SPDIT_COMPATDRIVER))
801 TRACE("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError());
802 }
803 if (DevInstData->hDevInfo != INVALID_HANDLE_VALUE)
804 {
805 if (!SetupDiDestroyDeviceInfoList(DevInstData->hDevInfo))
806 TRACE("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError());
807 }
808 HeapFree(GetProcessHeap(), 0, DevInstData->buffer);
809 HeapFree(GetProcessHeap(), 0, DevInstData);
810 }
811
812 return retval;
813}
814
815
816BOOL
817WINAPI
821 IN BOOL bUpdate,
822 OUT LPDWORD lpReboot,
824{
825 PDEVINSTDATA DevInstData = NULL;
826 BOOL ret;
827 BOOL retval = FALSE;
828
829 TRACE("InstllDevInstEx(%p, %s, %d, %p, %lx)\n",
830 hWndParent, debugstr_w(InstanceId), bUpdate, lpReboot, Unknown);
831
832 DevInstData = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVINSTDATA));
833 if (!DevInstData)
834 {
835 TRACE("HeapAlloc() failed\n");
837 goto cleanup;
838 }
839
840 /* Clear devinst data */
841 ZeroMemory(DevInstData, sizeof(DEVINSTDATA));
842 DevInstData->devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */
843 DevInstData->bUpdate = bUpdate;
844
845 /* Fill devinst data */
847 if (DevInstData->hDevInfo == INVALID_HANDLE_VALUE)
848 {
849 TRACE("SetupDiCreateDeviceInfoListExW() failed with error 0x%x\n", GetLastError());
850 goto cleanup;
851 }
852
853 DevInstData->devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
855 DevInstData->hDevInfo,
857 NULL,
858 0, /* Open flags */
859 &DevInstData->devInfoData);
860 if (!ret)
861 {
862 TRACE("SetupDiOpenDeviceInfoW() failed with error 0x%x (InstanceId %s)\n",
864 DevInstData->devInfoData.cbSize = 0;
865 goto cleanup;
866 }
867
870 DevInstData->hDevInfo,
871 &DevInstData->devInfoData,
873 &DevInstData->regDataType,
874 NULL, 0,
875 &DevInstData->requiredSize);
876
877 if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData->regDataType == REG_SZ)
878 {
879 DevInstData->buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData->requiredSize);
880 if (!DevInstData->buffer)
881 {
882 TRACE("HeapAlloc() failed\n");
884 }
885 else
886 {
888 DevInstData->hDevInfo,
889 &DevInstData->devInfoData,
891 &DevInstData->regDataType,
892 DevInstData->buffer, DevInstData->requiredSize,
893 &DevInstData->requiredSize);
894 }
895 }
896
897 if (!ret)
898 {
899 TRACE("SetupDiGetDeviceRegistryProperty() failed with error 0x%x (InstanceId %s)\n",
901 goto cleanup;
902 }
903
904 /* Prepare the wizard, and display it */
905 TRACE("Need to show install wizard\n");
906 retval = DisplayWizard(DevInstData, hWndParent, IDD_WELCOMEPAGE);
907
908cleanup:
909 if (DevInstData)
910 {
911 if (DevInstData->devInfoData.cbSize != 0)
912 {
913 if (!SetupDiDestroyDriverInfoList(DevInstData->hDevInfo, &DevInstData->devInfoData, SPDIT_COMPATDRIVER))
914 TRACE("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError());
915 }
916 if (DevInstData->hDevInfo != INVALID_HANDLE_VALUE)
917 {
918 if (!SetupDiDestroyDeviceInfoList(DevInstData->hDevInfo))
919 TRACE("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError());
920 }
921 HeapFree(GetProcessHeap(), 0, DevInstData->buffer);
922 HeapFree(GetProcessHeap(), 0, DevInstData);
923 }
924
925 return retval;
926}
927
928
929/*
930 * @implemented
931 */
932BOOL
933WINAPI
937 IN BOOL bUpdate,
938 OUT LPDWORD lpReboot)
939{
940 return InstallDevInstEx(hWndParent, InstanceId, bUpdate, lpReboot, 0);
941}
942
943
944/*
945* @implemented
946*/
949 IN HWND hWndOwner,
951 IN LPWSTR lpNamedPipeName,
952 IN INT Show)
953{
955 BOOL ShowWizard;
957 DWORD Value;
960 PWSTR InstallEventName = NULL;
962
963 /* Open the pipe */
964 hPipe = CreateFileW(lpNamedPipeName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
965
966 if(hPipe == INVALID_HANDLE_VALUE)
967 {
968 ERR("CreateFileW failed with error %u\n", GetLastError());
969 goto cleanup;
970 }
971
972 /* Read the data. Some is just included for compatibility with Windows right now and not yet used by ReactOS.
973 See umpnpmgr for more details. */
974 if(!ReadFile(hPipe, &Value, sizeof(Value), &BytesRead, NULL))
975 {
976 ERR("ReadFile failed with error %u\n", GetLastError());
977 goto cleanup;
978 }
979
980 InstallEventName = (PWSTR)HeapAlloc(GetProcessHeap(), 0, Value);
981
982 if(!ReadFile(hPipe, InstallEventName, Value, &BytesRead, NULL))
983 {
984 ERR("ReadFile failed with error %u\n", GetLastError());
985 goto cleanup;
986 }
987
988 /* I couldn't figure out what the following value means under Windows XP.
989 Therefore I used it in umpnpmgr to pass the ShowWizard variable. */
990 if(!ReadFile(hPipe, &ShowWizard, sizeof(ShowWizard), &BytesRead, NULL))
991 {
992 ERR("ReadFile failed with error %u\n", GetLastError());
993 goto cleanup;
994 }
995
996 /* Next one is again size in bytes of the following string */
997 if(!ReadFile(hPipe, &Value, sizeof(Value), &BytesRead, NULL))
998 {
999 ERR("ReadFile failed with error %u\n", GetLastError());
1000 goto cleanup;
1001 }
1002
1004
1005 if(!ReadFile(hPipe, DeviceInstance, Value, &BytesRead, NULL))
1006 {
1007 ERR("ReadFile failed with error %u\n", GetLastError());
1008 goto cleanup;
1009 }
1010
1012 if(!ReturnValue)
1013 {
1014 ERR("DevInstallW failed with error %lu\n", GetLastError());
1015 goto cleanup;
1016 }
1017
1018 hInstallEvent = CreateEventW(NULL, TRUE, FALSE, InstallEventName);
1019 if(!hInstallEvent)
1020 {
1021 TRACE("CreateEventW('%ls') failed with error %lu\n", InstallEventName, GetLastError());
1022 goto cleanup;
1023 }
1024
1027
1028cleanup:
1029 if(hPipe != INVALID_HANDLE_VALUE)
1030 CloseHandle(hPipe);
1031
1032 if(InstallEventName)
1033 HeapFree(GetProcessHeap(), 0, InstallEventName);
1034
1035 if(DeviceInstance)
1037
1038 return ReturnValue;
1039}
1040
1045 IN LPVOID lpReserved)
1046{
1048 {
1050
1052
1053 InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
1057 }
1058
1059 return TRUE;
1060}
PRTL_UNICODE_STRING_BUFFER Path
UINT32 void void ** ReturnValue
Definition: acevents.h:216
#define ok(value,...)
Definition: atltest.h:57
HANDLE hInstallEvent
Definition: install.c:40
DWORD dwReason
Definition: misc.cpp:154
#define ERR(fmt,...)
Definition: debug.h:110
HINSTANCE hInstance
Definition: charmap.c:19
Definition: bufpool.h:45
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
static HWND hwndParent
Definition: cryptui.c:300
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define BufferSize
Definition: mmc.h:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define wcsrchr
Definition: compat.h:16
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define MultiByteToWideChar
Definition: compat.h:110
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
static void cleanup(void)
Definition: main.c:1335
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1487
#define IDD_WELCOMEPAGE
Definition: resource.h:21
#define IDD_NEEDREBOOT
Definition: resource.h:27
HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, HWND hwndParent, PCWSTR MachineName, PVOID Reserved)
Definition: devinst.c:1259
BOOL WINAPI SetupDiSetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4558
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
Definition: devinst.c:1787
BOOL WINAPI SetupDiGetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4451
BOOL WINAPI SetupDiCallClassInstaller(DI_FUNCTION InstallFunction, HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:4024
BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize)
Definition: devinst.c:3224
HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *class, LPCWSTR enumstr, HWND parent, DWORD flags)
Definition: devinst.c:2292
BOOL WINAPI SetupDiOpenDeviceInfoW(IN HDEVINFO DeviceInfoSet, IN PCWSTR DeviceInstanceId, IN HWND hwndParent OPTIONAL, IN DWORD OpenFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
Definition: devinst.c:4774
BOOL WINAPI SetupDiGetDeviceInstanceIdW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PWSTR DeviceInstanceId, DWORD DeviceInstanceIdSize, PDWORD RequiredSize)
Definition: devinst.c:1907
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2893
BOOL WINAPI SetupDiBuildDriverInfoList(IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType)
Definition: driver.c:718
BOOL WINAPI SetupDiEnumDriverInfoW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_W DriverInfoData)
Definition: driver.c:1355
BOOL WINAPI SetupDiDestroyDriverInfoList(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN DWORD DriverType)
Definition: driver.c:1208
static const WCHAR DeviceInstance[]
Definition: interface.c:28
#define swprintf
Definition: precomp.h:40
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION _In_ ULONG _Out_opt_ PULONG LengthNeeded
Definition: fltkernel.h:1343
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
Definition: fsrtlfuncs.h:908
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
@ Unknown
Definition: i8042prt.h:114
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
#define DRIVE_CDROM
Definition: machpc98.h:119
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static VOID InitControls(HWND hwnd)
Definition: mplay32.c:303
#define _In_
Definition: ms_sal.h:308
unsigned int UINT
Definition: ndis.h:50
static BOOL IsUserAdmin(VOID)
Definition: netid.c:163
BOOL WINAPI DevInstallW(IN HWND hWndParent, IN HINSTANCE hInstance, IN LPCWSTR InstanceId, IN INT Show)
Definition: newdev.c:645
BOOL ScanFoldersForDriver(IN PDEVINSTDATA DevInstData)
Definition: newdev.c:420
BOOL PrepareFoldersToScan(IN PDEVINSTDATA DevInstData, IN BOOL IncludeRemovableDevices, IN BOOL IncludeCustomPath, IN HWND hwndCombo OPTIONAL)
Definition: newdev.c:455
BOOL WINAPI ClientSideInstallW(IN HWND hWndOwner, IN HINSTANCE hInstance, IN LPWSTR lpNamedPipeName, IN INT Show)
Definition: newdev.c:948
BOOL WINAPI InstallDevInstEx(IN HWND hWndParent, IN LPCWSTR InstanceId, IN BOOL bUpdate, OUT LPDWORD lpReboot, IN DWORD Unknown)
Definition: newdev.c:818
BOOL WINAPI UpdateDriverForPlugAndPlayDevicesA(IN HWND hwndParent, IN LPCSTR HardwareId, IN LPCSTR FullInfPath, IN DWORD InstallFlags, OUT PBOOL bRebootRequired OPTIONAL)
Definition: newdev.c:207
static BOOL IsDots(IN LPCWSTR str)
Definition: newdev.c:323
static BOOL SearchDriver(IN PDEVINSTDATA DevInstData, IN LPCWSTR Directory OPTIONAL, IN LPCWSTR InfFile OPTIONAL)
Definition: newdev.c:252
static BOOL SearchDriverRecursive(IN PDEVINSTDATA DevInstData, IN LPCWSTR Path)
Definition: newdev.c:342
BOOL WINAPI DllMain(IN HINSTANCE hInstance, IN DWORD dwReason, IN LPVOID lpReserved)
Definition: newdev.c:1042
BOOL InstallCurrentDriver(IN PDEVINSTDATA DevInstData)
Definition: newdev.c:529
static LPCWSTR GetFileExt(IN LPWSTR FileName)
Definition: newdev.c:330
BOOL WINAPI InstallDevInst(IN HWND hWndParent, IN LPCWSTR InstanceId, IN BOOL bUpdate, OUT LPDWORD lpReboot)
Definition: newdev.c:934
BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(IN HWND hwndParent, IN LPCWSTR HardwareId, IN LPCWSTR FullInfPath, IN DWORD InstallFlags, OUT PBOOL bRebootRequired OPTIONAL)
Definition: newdev.c:41
HINSTANCE hDllInstance
Definition: newdev.c:29
BOOL CheckBestDriver(_In_ PDEVINSTDATA DevInstData, _In_ PCWSTR pszDir)
Definition: newdev.c:412
#define INSTALLFLAG_NONINTERACTIVE
Definition: newdev.h:36
#define INSTALLFLAG_FORCE
Definition: newdev.h:34
#define INSTALLFLAG_READONLY
Definition: newdev.h:35
BOOL DisplayWizard(IN PDEVINSTDATA DevInstData, IN HWND hwndParent, IN UINT startPage)
Definition: wizard.c:1378
#define Dot(u, v)
Definition: normal.c:49
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
BYTE * PBYTE
Definition: pedump.c:66
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
#define ICC_PROGRESS_CLASS
Definition: commctrl.h:63
#define CONFIGFLAG_FAILEDINSTALL
Definition: regstr.h:396
const WCHAR * str
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define DI_NEEDRESTART
Definition: setupapi.h:53
#define SPDRP_DEVICEDESC
Definition: setupapi.h:507
#define DIF_INSTALLDEVICEFILES
Definition: setupapi.h:140
#define SetupDiGetDeviceInstallParams
Definition: setupapi.h:2599
SP_DEVINSTALL_PARAMS_A SP_DEVINSTALL_PARAMS
Definition: setupapi.h:1155
#define ERROR_NO_SUCH_DEVINST
Definition: setupapi.h:307
#define SetupDiGetDeviceRegistryProperty
Definition: setupapi.h:2603
#define DI_ENUMSINGLEINF
Definition: setupapi.h:62
SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA
Definition: setupapi.h:1054
#define DIF_REGISTER_COINSTALLERS
Definition: setupapi.h:153
#define DIF_INSTALLINTERFACES
Definition: setupapi.h:151
#define DIGCF_ALLCLASSES
Definition: setupapi.h:172
struct _SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS_W
#define DIF_NEWDEVICEWIZARD_PREANALYZE
Definition: setupapi.h:147
#define DIGCF_PRESENT
Definition: setupapi.h:171
#define DI_NEEDREBOOT
Definition: setupapi.h:54
#define DIF_INSTALLDEVICE
Definition: setupapi.h:121
#define DIF_ALLOW_INSTALL
Definition: setupapi.h:143
#define DIF_DESTROYPRIVATEDATA
Definition: setupapi.h:131
struct _SP_DEVINFO_DATA SP_DEVINFO_DATA
#define DI_FLAGSEX_ALLOWEXCLUDEDDRVS
Definition: setupapi.h:87
#define DIF_SELECTBESTCOMPATDRV
Definition: setupapi.h:142
#define SPDRP_CONFIGFLAGS
Definition: setupapi.h:517
#define SPDRP_HARDWAREID
Definition: setupapi.h:508
#define DIF_NEWDEVICEWIZARD_POSTANALYZE
Definition: setupapi.h:148
#define SPDIT_COMPATDRIVER
Definition: setupapi.h:506
#define DIF_NEWDEVICEWIZARD_FINISHINSTALL
Definition: setupapi.h:149
_In_ LPCSTR pszDir
Definition: shellapi.h:581
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
base for all directory entries
Definition: entries.h:138
SP_DEVINFO_DATA devInfoData
HDEVINFO hDevInfo
DWORD requiredSize
WCHAR DriverPath[MAX_PATH]
Definition: setupapi.h:900
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
#define OUT
Definition: typedefs.h:40
int ret
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetLogicalDrives(void)
Definition: disk.c:110
#define DRIVE_REMOVABLE
Definition: winbase.h:251
BOOL * PBOOL
Definition: windef.h:161
#define WINAPI
Definition: msvc.h:6
#define ComboBox_GetTextLength(hwndCtl)
Definition: windowsx.h:59
#define ERROR_GEN_FAILURE
Definition: winerror.h:134
#define ERROR_INVALID_FLAGS
Definition: winerror.h:583
#define ERROR_PRIVILEGE_NOT_HELD
Definition: winerror.h:796
#define SW_HIDE
Definition: winuser.h:768
#define SW_SHOWNOACTIVATE
Definition: winuser.h:774
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193