ReactOS 0.4.16-dev-981-g80eb313
rpcserver.c
Go to the documentation of this file.
1/*
2 * ReactOS kernel
3 * Copyright (C) 2005 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19/*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS kernel
22 * FILE: base/services/umpnpmgr/rpcserver.c
23 * PURPOSE: RPC server
24 * PROGRAMMER: Eric Kohl (eric.kohl@reactos.org)
25 * Hervé Poussineau (hpoussin@reactos.org)
26 * Colin Finck (colin@reactos.org)
27 */
28
29/* INCLUDES *****************************************************************/
30
31#include "precomp.h"
32
33#define NDEBUG
34#include <debug.h>
35
36
37/* GLOBALS ******************************************************************/
38
39static WCHAR szRootDeviceInstanceID[] = L"HTREE\\ROOT\\0";
40
42
43/* FUNCTIONS *****************************************************************/
44
47{
49 BOOLEAN RegisteredProtSeq = FALSE;
50
51 UNREFERENCED_PARAMETER(lpParameter);
52
53 DPRINT("RpcServerThread() called\n");
54
56
57#if 0
58 /* 2k/XP/2k3-compatible protocol sequence/endpoint */
60 20,
61 L"\\pipe\\ntsvcs",
62 NULL); // Security descriptor
63 if (Status == RPC_S_OK)
64 RegisteredProtSeq = TRUE;
65 else
66 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
67#endif
68
69 /* Vista/7-compatible protocol sequence/endpoint */
71 20,
72 L"\\pipe\\plugplay",
73 NULL); // Security descriptor
74 if (Status == RPC_S_OK)
75 RegisteredProtSeq = TRUE;
76 else
77 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
78
79 /* Make sure there's a usable endpoint */
80 if (RegisteredProtSeq == FALSE)
81 return 0;
82
83 Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
84 NULL,
85 NULL);
86 if (Status != RPC_S_OK)
87 {
88 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
89 return 0;
90 }
91
93 20,
94 FALSE);
95 if (Status != RPC_S_OK)
96 {
97 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
98 return 0;
99 }
100
101 /* ROS HACK (this should never happen...) */
102 DPRINT1("*** Other devices won't be installed correctly. If something\n");
103 DPRINT1("*** doesn't work, try to reboot to get a new chance.\n");
104
105 DPRINT("RpcServerThread() done\n");
106
107 return 0;
108}
109
110
112{
114}
115
116
118{
120}
121
122
123static CONFIGRET WINAPI
125{
126 switch (Status)
127 {
130
132 return CR_INVALID_DATA;
133
135 return CR_NO_SUCH_DEVINST;
136
138 return CR_ACCESS_DENIED;
139
141 return CR_BUFFER_SMALL;
142
144 return CR_NO_SUCH_VALUE;
145
146 default:
147 return CR_FAILURE;
148 }
149}
150
151
152static VOID
153SplitDeviceInstanceID(IN LPWSTR pszDeviceInstanceID,
154 OUT LPWSTR pszEnumerator,
155 OUT LPWSTR pszDevice,
156 OUT LPWSTR pszInstance)
157{
158 WCHAR szLocalDeviceInstanceID[MAX_DEVICE_ID_LEN];
159 LPWSTR lpEnumerator = NULL;
160 LPWSTR lpDevice = NULL;
161 LPWSTR lpInstance = NULL;
162 LPWSTR ptr;
163
164 wcscpy(szLocalDeviceInstanceID, pszDeviceInstanceID);
165
166 *pszEnumerator = 0;
167 *pszDevice = 0;
168 *pszInstance = 0;
169
170 lpEnumerator = szLocalDeviceInstanceID;
171
172 ptr = wcschr(lpEnumerator, L'\\');
173 if (ptr != NULL)
174 {
175 *ptr = 0;
176 lpDevice = ++ptr;
177
178 ptr = wcschr(lpDevice, L'\\');
179 if (ptr != NULL)
180 {
181 *ptr = 0;
182 lpInstance = ++ptr;
183 }
184 }
185
186 if (lpEnumerator != NULL)
187 wcscpy(pszEnumerator, lpEnumerator);
188
189 if (lpDevice != NULL)
190 wcscpy(pszDevice, lpDevice);
191
192 if (lpInstance != NULL)
193 wcscpy(pszInstance, lpInstance);
194}
195
196
197static
200 _In_ LPWSTR pszDeviceID,
201 _In_ DWORD ulStatus,
202 _In_ DWORD ulProblem)
203{
204 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
207
208 DPRINT1("ClearDeviceStatus(%S 0x%lx 0x%lx)\n",
209 pszDeviceID, ulStatus, ulProblem);
210
212 pszDeviceID);
213 PlugPlayData.Operation = PNP_CLEAR_DEVICE_STATUS;
214 PlugPlayData.DeviceStatus = ulStatus;
215 PlugPlayData.DeviceProblem = ulProblem;
216
218 (PVOID)&PlugPlayData,
220 if (!NT_SUCCESS(Status))
222
223 return ret;
224}
225
226
227static
230 _In_ LPWSTR pszDeviceID,
231 _Out_ DWORD *pulStatus,
232 _Out_ DWORD *pulProblem)
233{
234 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
237
238 DPRINT("GetDeviceStatus(%S %p %p)\n",
239 pszDeviceID, pulStatus, pulProblem);
240
242 pszDeviceID);
243 PlugPlayData.Operation = PNP_GET_DEVICE_STATUS;
244
246 (PVOID)&PlugPlayData,
248 if (NT_SUCCESS(Status))
249 {
250 *pulStatus = PlugPlayData.DeviceStatus;
251 *pulProblem = PlugPlayData.DeviceProblem;
252 }
253 else
254 {
256 }
257
258 return ret;
259}
260
261
262static
265 _In_ LPWSTR pszDeviceID,
266 _In_ DWORD ulStatus,
267 _In_ DWORD ulProblem)
268{
269 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
272
273 DPRINT1("SetDeviceStatus(%S 0x%lx 0x%lx)\n",
274 pszDeviceID, ulStatus, ulProblem);
275
277 pszDeviceID);
278 PlugPlayData.Operation = PNP_SET_DEVICE_STATUS;
279 PlugPlayData.DeviceStatus = ulStatus;
280 PlugPlayData.DeviceProblem = ulProblem;
281
283 (PVOID)&PlugPlayData,
285 if (!NT_SUCCESS(Status))
287
288 return ret;
289}
290
291
292static
295 _In_ LPWSTR pszDeviceInstance,
296 _Inout_opt_ PPNP_VETO_TYPE pVetoType,
297 _Inout_opt_ LPWSTR pszVetoName,
298 _In_ DWORD ulNameLength)
299{
303
304 DPRINT1("DisableDeviceInstance(%S %p %p %lu)\n",
305 pszDeviceInstance, pVetoType, pszVetoName, ulNameLength);
306
307 RtlInitUnicodeString(&QueryRemoveData.DeviceInstance,
308 pszDeviceInstance);
309
310 QueryRemoveData.Flags = 0;
311 QueryRemoveData.VetoType = 0;
312 QueryRemoveData.VetoName = pszVetoName;
313 QueryRemoveData.NameLength = ulNameLength;
314
316 &QueryRemoveData,
319 {
321 }
323 {
324 if (pVetoType != NULL)
325 *pVetoType = QueryRemoveData.VetoType;
326
328 }
329 else if (!NT_SUCCESS(Status))
330 {
332 }
333
334 return ret;
335}
336
337
338static
339BOOL
341 _In_ PWSTR pszDeviceInstanceID)
342{
343 INT nPartLength[3] = {0, 0, 0};
344 INT nLength = 0, nParts = 0;
345 PWCHAR p;
346
347 DPRINT("IsValidDeviceInstanceID(%S)\n",
348 pszDeviceInstanceID);
349
350 if (pszDeviceInstanceID == NULL)
351 {
352 DPRINT("Device instance ID is NULL!\n");
353 return FALSE;
354 }
355
356 p = pszDeviceInstanceID;
357 while (*p != UNICODE_NULL)
358 {
359 if (*p == L'\\')
360 {
361 nParts++;
362 if (nParts >= 3)
363 {
364 DPRINT("Too many separators: %d\n", nParts);
365 return FALSE;
366 }
367 }
368 else
369 {
370 nPartLength[nParts]++;
371 }
372
373 nLength++;
375 {
376 DPRINT("Too long: %d\n", nLength);
377 return FALSE;
378 }
379
380 p++;
381 }
382
383 if (nParts != 2)
384 {
385 DPRINT("Invalid number of separtors: %d\n", nParts);
386 return FALSE;
387 }
388
389 if ((nPartLength[0] == 0) ||
390 (nPartLength[1] == 0) ||
391 (nPartLength[2] == 0))
392 {
393 DPRINT("Invalid part lengths: %d %d %d\n",
394 nPartLength[0], nPartLength[1], nPartLength[2]);
395 return FALSE;
396 }
397
398 DPRINT("Valid device instance ID!\n");
399
400 return TRUE;
401}
402
403
404static
405BOOL
407 _In_ PWSTR pszDeviceInstanceID)
408{
409 if (_wcsicmp(pszDeviceInstanceID, szRootDeviceInstanceID) == 0)
410 return TRUE;
411
412 return FALSE;
413}
414
415
416static
417BOOL
419 _In_ LPWSTR pszDeviceInstanceID)
420{
421 DWORD ulStatus, ulProblem;
422
423 return (GetDeviceStatus(pszDeviceInstanceID, &ulStatus, &ulProblem) == CR_SUCCESS);
424}
425
426
427static
430 _In_ LPCWSTR pszDeviceID,
431 _In_ DWORD ulLogConfType,
432 _Out_ PHKEY phKey)
433{
434 WCHAR szKeyName[MAX_PATH];
435 PCWSTR pszSubKeyName;
436 HKEY hInstanceKey;
437 DWORD dwError;
438
439 /* Build the full device instance key name */
440 wcscpy(szKeyName, L"System\\CurrentControlSet\\Enum\\");
441 wcscat(szKeyName, pszDeviceID);
442
443 /* Open the device instance key */
445 szKeyName,
446 0,
448 &hInstanceKey);
449 if (dwError != ERROR_SUCCESS)
450 return CR_INVALID_DEVINST;
451
452 switch (ulLogConfType)
453 {
454 case BOOT_LOG_CONF:
455 case BASIC_LOG_CONF:
456 pszSubKeyName = L"LogConf";
457 break;
458
459 case ALLOC_LOG_CONF:
461 pszSubKeyName = L"Control";
462 break;
463
464 default:
465 DPRINT1("Unsupported configuration type!\n");
466 return CR_FAILURE;
467 }
468
469 /* Create or open the LogConf key */
470 dwError = RegCreateKeyExW(hInstanceKey,
471 pszSubKeyName,
472 0,
473 NULL,
476 NULL,
477 phKey,
478 NULL);
479
480 /* Close the device instance key */
481 RegCloseKey(hInstanceKey);
482
483 if (dwError != ERROR_SUCCESS)
484 return CR_REGISTRY_ERROR;
485
486 return CR_SUCCESS;
487}
488
489
490static
493 _In_ HKEY hKey,
494 _In_ ULONG ulLogConfType,
495 _Out_ PULONG pulRegDataType,
496 _Out_ PULONG pulDataSize,
497 _Out_ LPBYTE *ppBuffer,
498 _In_ ULONG ulValueNameBufferSize,
499 _Out_opt_ LPWSTR pszValueNameBuffer)
500{
501 LPCWSTR pszValueName;
502
503 switch (ulLogConfType)
504 {
505 case BOOT_LOG_CONF:
506 pszValueName = L"BootConfig";
507 *pulRegDataType = REG_RESOURCE_LIST;
508 break;
509
510 case ALLOC_LOG_CONF:
511 pszValueName = L"AllocConfig";
512 *pulRegDataType = REG_RESOURCE_LIST;
513 break;
514
515 case FORCED_LOG_CONF:
516 pszValueName = L"ForcedConfig";
517 *pulRegDataType = REG_RESOURCE_LIST;
518 break;
519
521 pszValueName = L"FilteredConfigVector";
522 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
523 break;
524
525 case BASIC_LOG_CONF:
526 pszValueName = L"BasicConfigVector";
527 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
528 break;
529
531 pszValueName = L"OverrideConfigVector";
532 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
533 break;
534
535 default:
536 DPRINT1("Unsupported configuration type!\n");
537 return CR_FAILURE;
538 }
539
540 /* Return the selected configuration value name */
541 if ((ulValueNameBufferSize > 0) && (pszValueNameBuffer != NULL) &&
542 (wcslen(pszValueName) + 1 <= ulValueNameBufferSize))
543 wcscpy(pszValueNameBuffer, pszValueName);
544
545 /* Get the configuration data size */
547 pszValueName,
548 NULL,
549 NULL,
550 NULL,
551 pulDataSize) != ERROR_SUCCESS)
552 {
553 return CR_INVALID_LOG_CONF;
554 }
555
556 /* Allocate the buffer */
557 *ppBuffer = HeapAlloc(GetProcessHeap(), 0, *pulDataSize);
558 if (*ppBuffer == NULL)
559 {
560 return CR_OUT_OF_MEMORY;
561 }
562
563 /* Retrieve the configuration data */
565 pszValueName,
566 NULL,
567 NULL,
568 (LPBYTE)*ppBuffer,
569 pulDataSize) != ERROR_SUCCESS)
570 {
571 return CR_INVALID_LOG_CONF;
572 }
573
574 return CR_SUCCESS;
575}
576
577
578static
582{
583 PBYTE pNext = NULL;
584 ULONG ulLastIndex = 0;
585
586 if (pDescriptor == NULL)
587 return NULL;
588
589 /* Skip the full resource descriptor */
590 pNext = (LPBYTE)pDescriptor + sizeof(CM_FULL_RESOURCE_DESCRIPTOR);
591
592 /* Skip the partial resource descriptors */
593 pNext += (pDescriptor->PartialResourceList.Count - 1) *
595
596 /* Skip the device specific data, if present */
597 if (pDescriptor->PartialResourceList.Count > 0)
598 {
599 ulLastIndex = pDescriptor->PartialResourceList.Count - 1;
600
601 if (pDescriptor->PartialResourceList.PartialDescriptors[ulLastIndex].Type ==
603 {
604 pNext += pDescriptor->PartialResourceList.PartialDescriptors[ulLastIndex].
605 u.DeviceSpecificData.DataSize;
606 }
607 }
608
609 return (PCM_FULL_RESOURCE_DESCRIPTOR)pNext;
610}
611
612
613static
614BOOL
617{
619 HANDLE hToken;
620 PSID pInteractiveSid = NULL;
621 BOOL bInteractive = FALSE;
622 RPC_STATUS RpcStatus;
623
624 DPRINT("IsCallerInteractive(%p)\n", hBinding);
625
626 /* Allocate an interactive user sid */
628 1,
630 0, 0, 0, 0, 0, 0, 0,
631 &pInteractiveSid))
632 {
633 DPRINT1("AllocateAndInitializeSid failed\n");
634 return FALSE;
635 }
636
637 /* Impersonate the client */
638 RpcStatus = RpcImpersonateClient(hBinding);
639 if (RpcStatus != RPC_S_OK)
640 {
641 DPRINT1("RpcImpersonateClient failed (Status 0x%08lx)\n", RpcStatus);
642 goto done;
643 }
644
645 /* Open the thread token and check for interactive user membership */
647 {
648 CheckTokenMembership(hToken, pInteractiveSid, &bInteractive);
649 CloseHandle(hToken);
650 }
651
652 /* Revert the impersonation */
654
655done:
656 if (pInteractiveSid)
657 FreeSid(pInteractiveSid);
658
659 return bInteractive;
660}
661
662
663VOID
666 PNP_NOTIFY_HANDLE pHandle)
667{
668 DPRINT1("PNP_NOTIFY_HANDLE_rundown(%p)\n", pHandle);
669}
670
671
672/* PUBLIC FUNCTIONS **********************************************************/
673
674/* Function 0 */
675DWORD
676WINAPI
679{
681 return CR_SUCCESS;
682}
683
684
685/* Function 1 */
686DWORD
687WINAPI
690{
692 return CR_SUCCESS;
693}
694
695
696/* Function 2 */
697DWORD
698WINAPI
701 WORD *pVersion)
702{
704
705 DPRINT("PNP_GetVersion(%p %p)\n",
706 hBinding, pVersion);
707
708 *pVersion = CONFIGMG_VERSION;
709
710 return CR_SUCCESS;
711}
712
713
714/* Function 3 */
715DWORD
716WINAPI
719 DWORD *pulState,
720 DWORD ulFlags)
721{
723
724 DPRINT("PNP_GetGlobalState(%p %p 0x%08lx)\n",
725 hBinding, pulState, ulFlags);
726
727 if (ulFlags != 0)
728 return CR_INVALID_FLAG;
729
731
732 if (g_ShuttingDown)
734
735 return CR_SUCCESS;
736}
737
738
739/* Function 4 */
740DWORD
741WINAPI
744{
746
747 DPRINT("PNP_InitDetection(%p)\n",
748 hBinding);
749
750 return CR_SUCCESS;
751}
752
753
754/* Function 5 */
755DWORD
756WINAPI
759 BOOL Admin,
761{
764
766
767 DPRINT("PNP_ReportLogOn(%p %u, %u)\n",
768 hBinding, Admin, ProcessId);
769
770 /* Fail, if the caller is not an interactive user */
772 goto cleanup;
773
774 /* Get the users token */
776
777 if (!hProcess)
778 {
779 DPRINT1("OpenProcess failed with error %u\n", GetLastError());
780 goto cleanup;
781 }
782
783 if (hUserToken)
784 {
787 }
788
790 {
791 DPRINT1("OpenProcessToken failed with error %u\n", GetLastError());
792 goto cleanup;
793 }
794
795 /* Trigger the installer thread */
796 if (hInstallEvent)
798
800
801cleanup:
802 if (hProcess)
804
805 return ReturnValue;
806}
807
808
809/* Function 6 */
810DWORD
811WINAPI
814 LPWSTR pDeviceID,
815 DWORD ulFlags)
816{
818 HKEY hDeviceKey = NULL;
819
821 UNREFERENCED_PARAMETER(ulFlags);
822
823 DPRINT("PNP_ValidateDeviceInstance(%p %S 0x%08lx)\n",
824 hBinding, pDeviceID, ulFlags);
825
826 if (!IsValidDeviceInstanceID(pDeviceID))
827 return CR_INVALID_DEVINST;
828
830 pDeviceID,
831 0,
832 KEY_READ,
833 &hDeviceKey))
834 {
835 DPRINT("Could not open the Device Key!\n");
837 goto Done;
838 }
839
840 /* FIXME: add more tests */
841
842Done:
843 if (hDeviceKey != NULL)
844 RegCloseKey(hDeviceKey);
845
846 DPRINT("PNP_ValidateDeviceInstance() done (returns %lx)\n", ret);
847
848 return ret;
849}
850
851
852/* Function 7 */
853DWORD
854WINAPI
857 LPWSTR pDeviceID,
858 PNP_RPC_STRING_LEN ulLength)
859{
861
863
864 DPRINT("PNP_GetRootDeviceInstance(%p %S %lu)\n",
865 hBinding, pDeviceID, ulLength);
866
867 if (!pDeviceID)
868 {
870 goto Done;
871 }
872
873 if (ulLength < lstrlenW(szRootDeviceInstanceID) + 1)
874 {
876 goto Done;
877 }
878
879 lstrcpyW(pDeviceID,
881
882Done:
883 DPRINT("PNP_GetRootDeviceInstance() done (returns %lx)\n", ret);
884
885 return ret;
886}
887
888
889/* Function 8 */
890DWORD
891WINAPI
894 DWORD ulRelationship,
895 LPWSTR pDeviceID,
896 LPWSTR pRelatedDeviceId,
897 PNP_RPC_STRING_LEN *pulLength,
898 DWORD ulFlags)
899{
903
905 UNREFERENCED_PARAMETER(ulFlags);
906
907 DPRINT("PNP_GetRelatedDeviceInstance(%p %lu %S %p %p 0x%lx)\n",
908 hBinding, ulRelationship, pDeviceID, pRelatedDeviceId,
909 pulLength, ulFlags);
910
911 if (!IsValidDeviceInstanceID(pDeviceID))
912 return CR_INVALID_DEVINST;
913
914 if (ulRelationship == PNP_GET_PARENT_DEVICE_INSTANCE)
915 {
916 /* The root device does not have a parent */
917 if (IsRootDeviceInstanceID(pDeviceID))
918 return CR_NO_SUCH_DEVINST;
919
920 /* Return the root device for non existing devices */
921 if (!IsPresentDeviceInstanceID(pDeviceID))
922 {
923 if ((wcslen(szRootDeviceInstanceID) + 1) > *pulLength)
924 {
925 *pulLength = wcslen(szRootDeviceInstanceID) + 1;
926 return CR_BUFFER_SMALL;
927 }
928
929 wcscpy(pRelatedDeviceId, szRootDeviceInstanceID);
930 *pulLength = wcslen(szRootDeviceInstanceID) + 1;
931 return CR_SUCCESS;
932 }
933 }
934 else if (ulRelationship == PNP_GET_SIBLING_DEVICE_INSTANCE)
935 {
936 /* The root device does not have siblings */
937 if (IsRootDeviceInstanceID(pDeviceID))
938 return CR_NO_SUCH_DEVINST;
939 }
940
942 pDeviceID);
943
944 PlugPlayData.Relation = ulRelationship;
945
946 PlugPlayData.RelatedDeviceInstanceLength = *pulLength;
947 PlugPlayData.RelatedDeviceInstance = pRelatedDeviceId;
948
950 (PVOID)&PlugPlayData,
952 if (!NT_SUCCESS(Status))
953 {
955 }
956
957 DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);
958 if (ret == CR_SUCCESS)
959 {
960 DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance);
961 }
962
963 return ret;
964}
965
966
967/* Function 9 */
968DWORD
969WINAPI
972 DWORD ulBranch,
973 DWORD ulIndex,
975 PNP_RPC_STRING_LEN ulLength,
976 PNP_RPC_STRING_LEN *pulRequiredLen,
977 DWORD ulFlags)
978{
980 HKEY hKey;
981 DWORD dwError;
982
984 UNREFERENCED_PARAMETER(ulFlags);
985
986 DPRINT("PNP_EnumerateSubKeys(%p %lu %lu %p %lu %p 0x%08lx)\n",
987 hBinding, ulBranch, ulIndex, Buffer, ulLength,
988 pulRequiredLen, ulFlags);
989
990 switch (ulBranch)
991 {
992 case PNP_ENUMERATOR_SUBKEYS:
993 hKey = hEnumKey;
994 break;
995
996 case PNP_CLASS_SUBKEYS:
997 hKey = hClassKey;
998 break;
999
1000 default:
1001 return CR_FAILURE;
1002 }
1003
1004 *pulRequiredLen = ulLength;
1005 dwError = RegEnumKeyExW(hKey,
1006 ulIndex,
1007 Buffer,
1008 pulRequiredLen,
1009 NULL,
1010 NULL,
1011 NULL,
1012 NULL);
1013 if (dwError != ERROR_SUCCESS)
1014 {
1016 }
1017 else
1018 {
1019 (*pulRequiredLen)++;
1020 }
1021
1022 DPRINT("PNP_EnumerateSubKeys() done (returns %lx)\n", ret);
1023
1024 return ret;
1025}
1026
1027
1028static
1031 _In_ PWSTR pszDevice,
1032 _In_ DWORD ulFlags,
1033 _Inout_ PWSTR pszBuffer,
1034 _Inout_ PDWORD pulLength)
1035{
1039
1041 pszDevice);
1042
1044 {
1045 PlugPlayData.Relations = 3;
1046 }
1047 else if (ulFlags & CM_GETIDLIST_FILTER_POWERRELATIONS)
1048 {
1049 PlugPlayData.Relations = 2;
1050 }
1051 else if (ulFlags & CM_GETIDLIST_FILTER_REMOVALRELATIONS)
1052 {
1053 PlugPlayData.Relations = 1;
1054 }
1055 else if (ulFlags & CM_GETIDLIST_FILTER_EJECTRELATIONS)
1056 {
1057 PlugPlayData.Relations = 0;
1058 }
1059
1060 PlugPlayData.BufferSize = *pulLength * sizeof(WCHAR);
1061 PlugPlayData.Buffer = pszBuffer;
1062
1064 (PVOID)&PlugPlayData,
1066 if (NT_SUCCESS(Status))
1067 {
1068 *pulLength = PlugPlayData.BufferSize / sizeof(WCHAR);
1069 }
1070 else
1071 {
1073 }
1074
1075 return ret;
1076}
1077
1078
1079static
1082 _In_ PWSTR pszService,
1083 _Inout_ PWSTR pszBuffer,
1084 _Inout_ PDWORD pulLength)
1085{
1086 WCHAR szPathBuffer[512];
1087 WCHAR szName[16];
1088 HKEY hServicesKey = NULL, hServiceKey = NULL, hEnumKey = NULL;
1089 DWORD dwValues, dwSize, dwIndex, dwUsedLength, dwPathLength;
1090 DWORD dwError;
1091 PWSTR pPtr;
1093
1094 /* Open the device key */
1096 L"System\\CurrentControlSet\\Services",
1097 0,
1098 KEY_READ,
1099 &hServicesKey);
1100 if (dwError != ERROR_SUCCESS)
1101 {
1102 DPRINT("Failed to open the services key (Error %lu)\n", dwError);
1103 return CR_REGISTRY_ERROR;
1104 }
1105
1106 dwError = RegOpenKeyExW(hServicesKey,
1107 pszService,
1108 0,
1109 KEY_READ,
1110 &hServiceKey);
1111 if (dwError != ERROR_SUCCESS)
1112 {
1113 DPRINT("Failed to open the service key (Error %lu)\n", dwError);
1115 goto Done;
1116 }
1117
1118 dwError = RegOpenKeyExW(hServiceKey,
1119 L"Enum",
1120 0,
1121 KEY_READ,
1122 &hEnumKey);
1123 if (dwError != ERROR_SUCCESS)
1124 {
1125 DPRINT("Failed to open the service enum key (Error %lu)\n", dwError);
1127 goto Done;
1128 }
1129
1130 /* Retrieve the number of device instances */
1131 dwSize = sizeof(DWORD);
1132 dwError = RegQueryValueExW(hEnumKey,
1133 L"Count",
1134 NULL,
1135 NULL,
1136 (LPBYTE)&dwValues,
1137 &dwSize);
1138 if (dwError != ERROR_SUCCESS)
1139 {
1140 DPRINT("RegQueryValueExW failed (Error %lu)\n", dwError);
1141 dwValues = 1;
1142 }
1143
1144 DPRINT("dwValues %lu\n", dwValues);
1145
1146 dwUsedLength = 0;
1147 pPtr = pszBuffer;
1148
1149 for (dwIndex = 0; dwIndex < dwValues; dwIndex++)
1150 {
1151 wsprintf(szName, L"%lu", dwIndex);
1152
1153 dwSize = sizeof(szPathBuffer);
1154 dwError = RegQueryValueExW(hEnumKey,
1155 szName,
1156 NULL,
1157 NULL,
1158 (LPBYTE)szPathBuffer,
1159 &dwSize);
1160 if (dwError != ERROR_SUCCESS)
1161 break;
1162
1163 DPRINT("Path: %S\n", szPathBuffer);
1164
1165 dwPathLength = wcslen(szPathBuffer) + 1;
1166 if (dwUsedLength + dwPathLength + 1 > *pulLength)
1167 {
1169 break;
1170 }
1171
1172 wcscpy(pPtr, szPathBuffer);
1173 dwUsedLength += dwPathLength;
1174 pPtr += dwPathLength;
1175
1176 *pPtr = UNICODE_NULL;
1177 }
1178
1179Done:
1180 if (hEnumKey != NULL)
1182
1183 if (hServiceKey != NULL)
1184 RegCloseKey(hServiceKey);
1185
1186 if (hServicesKey != NULL)
1188
1189 if (ret == CR_SUCCESS)
1190 *pulLength = dwUsedLength + 1;
1191 else
1192 *pulLength = 0;
1193
1194 return ret;
1195}
1196
1197
1198static
1201 _In_ PWSTR pszDevice,
1202 _Inout_ PWSTR pszBuffer,
1203 _Inout_ PDWORD pulLength)
1204{
1205 WCHAR szInstanceBuffer[MAX_DEVICE_ID_LEN];
1206 WCHAR szPathBuffer[512];
1207 HKEY hDeviceKey;
1208 DWORD dwInstanceLength, dwPathLength, dwUsedLength;
1209 DWORD dwIndex, dwError;
1210 PWSTR pPtr;
1212
1213 /* Open the device key */
1214 dwError = RegOpenKeyExW(hEnumKey,
1215 pszDevice,
1216 0,
1218 &hDeviceKey);
1219 if (dwError != ERROR_SUCCESS)
1220 {
1221 DPRINT("Failed to open the device key (Error %lu)\n", dwError);
1222 return CR_REGISTRY_ERROR;
1223 }
1224
1225 dwUsedLength = 0;
1226 pPtr = pszBuffer;
1227
1228 for (dwIndex = 0; ; dwIndex++)
1229 {
1230 dwInstanceLength = MAX_DEVICE_ID_LEN;
1231 dwError = RegEnumKeyExW(hDeviceKey,
1232 dwIndex,
1233 szInstanceBuffer,
1234 &dwInstanceLength,
1235 NULL,
1236 NULL,
1237 NULL,
1238 NULL);
1239 if (dwError != ERROR_SUCCESS)
1240 break;
1241
1242 wsprintf(szPathBuffer, L"%s\\%s", pszDevice, szInstanceBuffer);
1243 DPRINT("Path: %S\n", szPathBuffer);
1244
1245 dwPathLength = wcslen(szPathBuffer) + 1;
1246 if (dwUsedLength + dwPathLength + 1 > *pulLength)
1247 {
1249 break;
1250 }
1251
1252 wcscpy(pPtr, szPathBuffer);
1253 dwUsedLength += dwPathLength;
1254 pPtr += dwPathLength;
1255
1256 *pPtr = UNICODE_NULL;
1257 }
1258
1259 RegCloseKey(hDeviceKey);
1260
1261 if (ret == CR_SUCCESS)
1262 *pulLength = dwUsedLength + 1;
1263 else
1264 *pulLength = 0;
1265
1266 return ret;
1267}
1268
1269
1272 _In_ PWSTR pszEnumerator,
1273 _Inout_ PWSTR pszBuffer,
1274 _Inout_ PDWORD pulLength)
1275{
1276 WCHAR szDeviceBuffer[MAX_DEVICE_ID_LEN];
1277 WCHAR szPathBuffer[512];
1278 HKEY hEnumeratorKey;
1279 PWSTR pPtr;
1280 DWORD dwIndex, dwDeviceLength, dwUsedLength, dwRemainingLength, dwPathLength;
1281 DWORD dwError;
1283
1284 /* Open the enumerator key */
1285 dwError = RegOpenKeyExW(hEnumKey,
1286 pszEnumerator,
1287 0,
1289 &hEnumeratorKey);
1290 if (dwError != ERROR_SUCCESS)
1291 {
1292 DPRINT("Failed to open the enumerator key (Error %lu)\n", dwError);
1293 return CR_REGISTRY_ERROR;
1294 }
1295
1296 dwUsedLength = 0;
1297 dwRemainingLength = *pulLength;
1298 pPtr = pszBuffer;
1299
1300 for (dwIndex = 0; ; dwIndex++)
1301 {
1302 dwDeviceLength = MAX_DEVICE_ID_LEN;
1303 dwError = RegEnumKeyExW(hEnumeratorKey,
1304 dwIndex,
1305 szDeviceBuffer,
1306 &dwDeviceLength,
1307 NULL,
1308 NULL,
1309 NULL,
1310 NULL);
1311 if (dwError != ERROR_SUCCESS)
1312 break;
1313
1314 wsprintf(szPathBuffer, L"%s\\%s", pszEnumerator, szDeviceBuffer);
1315 DPRINT("Path: %S\n", szPathBuffer);
1316
1317 dwPathLength = dwRemainingLength;
1318 ret = GetDeviceInstanceList(szPathBuffer,
1319 pPtr,
1320 &dwPathLength);
1321 if (ret != CR_SUCCESS)
1322 break;
1323
1324 dwUsedLength += dwPathLength - 1;
1325 dwRemainingLength -= dwPathLength - 1;
1326 pPtr += dwPathLength - 1;
1327 }
1328
1329 RegCloseKey(hEnumeratorKey);
1330
1331 if (ret == CR_SUCCESS)
1332 *pulLength = dwUsedLength + 1;
1333 else
1334 *pulLength = 0;
1335
1336 return ret;
1337}
1338
1339
1340static
1343 _Inout_ PWSTR pszBuffer,
1344 _Inout_ PDWORD pulLength)
1345{
1346 WCHAR szEnumeratorBuffer[MAX_DEVICE_ID_LEN];
1347 PWSTR pPtr;
1348 DWORD dwIndex, dwEnumeratorLength, dwUsedLength, dwRemainingLength, dwPathLength;
1349 DWORD dwError;
1351
1352 dwUsedLength = 0;
1353 dwRemainingLength = *pulLength;
1354 pPtr = pszBuffer;
1355
1356 for (dwIndex = 0; ; dwIndex++)
1357 {
1358 dwEnumeratorLength = MAX_DEVICE_ID_LEN;
1359 dwError = RegEnumKeyExW(hEnumKey,
1360 dwIndex,
1361 szEnumeratorBuffer,
1362 &dwEnumeratorLength,
1363 NULL, NULL, NULL, NULL);
1364 if (dwError != ERROR_SUCCESS)
1365 break;
1366
1367 dwPathLength = dwRemainingLength;
1368 ret = GetEnumeratorInstanceList(szEnumeratorBuffer,
1369 pPtr,
1370 &dwPathLength);
1371 if (ret != CR_SUCCESS)
1372 break;
1373
1374 dwUsedLength += dwPathLength - 1;
1375 dwRemainingLength -= dwPathLength - 1;
1376 pPtr += dwPathLength - 1;
1377 }
1378
1379 if (ret == CR_SUCCESS)
1380 *pulLength = dwUsedLength + 1;
1381 else
1382 *pulLength = 0;
1383
1384 return ret;
1385}
1386
1387
1388/* Function 10 */
1389DWORD
1390WINAPI
1393 LPWSTR pszFilter,
1394 LPWSTR Buffer,
1395 PNP_RPC_STRING_LEN *pulLength,
1396 DWORD ulFlags)
1397{
1398 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
1399 WCHAR szDevice[MAX_DEVICE_ID_LEN];
1400 WCHAR szInstance[MAX_DEVICE_ID_LEN];
1402
1403 DPRINT("PNP_GetDeviceList(%p %S %p %p 0x%08lx)\n",
1404 hBinding, pszFilter, Buffer, pulLength, ulFlags);
1405
1406 if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
1407 return CR_INVALID_FLAG;
1408
1409 if (pulLength == NULL)
1410 return CR_INVALID_POINTER;
1411
1412 if ((ulFlags != CM_GETIDLIST_FILTER_NONE) &&
1413 (pszFilter == NULL))
1414 return CR_INVALID_POINTER;
1415
1416 if (ulFlags &
1421 {
1422 ret = GetRelationsInstanceList(pszFilter,
1423 ulFlags,
1424 Buffer,
1425 pulLength);
1426 }
1427 else if (ulFlags & CM_GETIDLIST_FILTER_SERVICE)
1428 {
1429 ret = GetServiceInstanceList(pszFilter,
1430 Buffer,
1431 pulLength);
1432 }
1433 else if (ulFlags & CM_GETIDLIST_FILTER_ENUMERATOR)
1434 {
1435 SplitDeviceInstanceID(pszFilter,
1436 szEnumerator,
1437 szDevice,
1438 szInstance);
1439
1440 if (*szEnumerator != UNICODE_NULL && *szDevice != UNICODE_NULL)
1441 {
1442 ret = GetDeviceInstanceList(pszFilter,
1443 Buffer,
1444 pulLength);
1445 }
1446 else
1447 {
1448 ret = GetEnumeratorInstanceList(pszFilter,
1449 Buffer,
1450 pulLength);
1451 }
1452 }
1453 else /* CM_GETIDLIST_FILTER_NONE */
1454 {
1456 pulLength);
1457 }
1458
1459 return ret;
1460}
1461
1462
1463static
1466 _In_ PWSTR pszDevice,
1467 _In_ DWORD ulFlags,
1468 _Inout_ PDWORD pulLength)
1469{
1473
1475 pszDevice);
1476
1478 {
1479 PlugPlayData.Relations = 3;
1480 }
1481 else if (ulFlags & CM_GETIDLIST_FILTER_POWERRELATIONS)
1482 {
1483 PlugPlayData.Relations = 2;
1484 }
1485 else if (ulFlags & CM_GETIDLIST_FILTER_REMOVALRELATIONS)
1486 {
1487 PlugPlayData.Relations = 1;
1488 }
1489 else if (ulFlags & CM_GETIDLIST_FILTER_EJECTRELATIONS)
1490 {
1491 PlugPlayData.Relations = 0;
1492 }
1493
1494 PlugPlayData.BufferSize = 0;
1495 PlugPlayData.Buffer = NULL;
1496
1498 (PVOID)&PlugPlayData,
1500 if (NT_SUCCESS(Status))
1501 {
1502 *pulLength = PlugPlayData.BufferSize / sizeof(WCHAR);
1503 }
1504 else
1505 {
1507 }
1508
1509 return ret;
1510}
1511
1512
1513static
1516 _In_ PWSTR pszService,
1517 _Out_ PDWORD pulLength)
1518{
1519 HKEY hServicesKey = NULL, hServiceKey = NULL, hEnumKey = NULL;
1520 DWORD dwValues, dwMaxValueLength, dwSize;
1521 DWORD dwError;
1523
1524 /* Open the device key */
1526 L"System\\CurrentControlSet\\Services",
1527 0,
1528 KEY_READ,
1529 &hServicesKey);
1530 if (dwError != ERROR_SUCCESS)
1531 {
1532 DPRINT("Failed to open the services key (Error %lu)\n", dwError);
1533 return CR_REGISTRY_ERROR;
1534 }
1535
1536 dwError = RegOpenKeyExW(hServicesKey,
1537 pszService,
1538 0,
1539 KEY_READ,
1540 &hServiceKey);
1541 if (dwError != ERROR_SUCCESS)
1542 {
1543 DPRINT("Failed to open the service key (Error %lu)\n", dwError);
1545 goto Done;
1546 }
1547
1548 dwError = RegOpenKeyExW(hServiceKey,
1549 L"Enum",
1550 0,
1551 KEY_READ,
1552 &hEnumKey);
1553 if (dwError != ERROR_SUCCESS)
1554 {
1555 DPRINT("Failed to open the service enum key (Error %lu)\n", dwError);
1557 goto Done;
1558 }
1559
1560 /* Retrieve the number of device instances */
1561 dwSize = sizeof(DWORD);
1562 dwError = RegQueryValueExW(hEnumKey,
1563 L"Count",
1564 NULL,
1565 NULL,
1566 (LPBYTE)&dwValues,
1567 &dwSize);
1568 if (dwError != ERROR_SUCCESS)
1569 {
1570 DPRINT("RegQueryValueExW failed (Error %lu)\n", dwError);
1571 dwValues = 1;
1572 }
1573
1574 /* Retrieve the maximum instance name length */
1575 dwError = RegQueryInfoKeyW(hEnumKey,
1576 NULL,
1577 NULL,
1578 NULL,
1579 NULL,
1580 NULL,
1581 NULL,
1582 NULL,
1583 NULL,
1584 &dwMaxValueLength,
1585 NULL,
1586 NULL);
1587 if (dwError != ERROR_SUCCESS)
1588 {
1589 DPRINT("RegQueryInfoKeyW failed (Error %lu)\n", dwError);
1590 dwMaxValueLength = MAX_DEVICE_ID_LEN;
1591 }
1592
1593 DPRINT("dwValues %lu dwMaxValueLength %lu\n", dwValues, dwMaxValueLength / sizeof(WCHAR));
1594
1595 /* Return the largest possible buffer size */
1596 *pulLength = dwValues * dwMaxValueLength / sizeof(WCHAR) + 2;
1597
1598Done:
1599 if (hEnumKey != NULL)
1601
1602 if (hServiceKey != NULL)
1603 RegCloseKey(hServiceKey);
1604
1605 if (hServicesKey != NULL)
1607
1608 return ret;
1609}
1610
1611
1612static
1615 _In_ LPCWSTR pszDevice,
1616 _Out_ PULONG pulLength)
1617{
1618 HKEY hDeviceKey;
1619 DWORD dwSubKeys, dwMaxSubKeyLength;
1620 DWORD dwError;
1621
1622 /* Open the device key */
1623 dwError = RegOpenKeyExW(hEnumKey,
1624 pszDevice,
1625 0,
1626 KEY_READ,
1627 &hDeviceKey);
1628 if (dwError != ERROR_SUCCESS)
1629 {
1630 DPRINT("Failed to open the device key (Error %lu)\n", dwError);
1631 return CR_REGISTRY_ERROR;
1632 }
1633
1634 /* Retrieve the number of device instances and the maximum name length */
1635 dwError = RegQueryInfoKeyW(hDeviceKey,
1636 NULL,
1637 NULL,
1638 NULL,
1639 &dwSubKeys,
1640 &dwMaxSubKeyLength,
1641 NULL,
1642 NULL,
1643 NULL,
1644 NULL,
1645 NULL,
1646 NULL);
1647 if (dwError != ERROR_SUCCESS)
1648 {
1649 DPRINT("RegQueryInfoKeyW failed (Error %lu)\n", dwError);
1650 dwSubKeys = 0;
1651 dwMaxSubKeyLength = 0;
1652 }
1653
1654 /* Close the device key */
1655 RegCloseKey(hDeviceKey);
1656
1657 /* Return the largest possible buffer size */
1658 *pulLength = dwSubKeys * (wcslen(pszDevice) + 1 + dwMaxSubKeyLength + 1);
1659
1660 return CR_SUCCESS;
1661}
1662
1663
1664static
1667 _In_ LPCWSTR pszEnumerator,
1668 _Out_ PULONG pulLength)
1669{
1670 WCHAR szDeviceBuffer[MAX_DEVICE_ID_LEN];
1671 WCHAR szPathBuffer[512];
1672 HKEY hEnumeratorKey;
1673 DWORD dwIndex, dwDeviceLength, dwBufferLength;
1674 DWORD dwError;
1676
1677 *pulLength = 0;
1678
1679 /* Open the enumerator key */
1680 dwError = RegOpenKeyExW(hEnumKey,
1681 pszEnumerator,
1682 0,
1684 &hEnumeratorKey);
1685 if (dwError != ERROR_SUCCESS)
1686 {
1687 DPRINT("Failed to open the enumerator key (Error %lu)\n", dwError);
1688 return CR_REGISTRY_ERROR;
1689 }
1690
1691 for (dwIndex = 0; ; dwIndex++)
1692 {
1693 dwDeviceLength = MAX_DEVICE_ID_LEN;
1694 dwError = RegEnumKeyExW(hEnumeratorKey,
1695 dwIndex,
1696 szDeviceBuffer,
1697 &dwDeviceLength,
1698 NULL,
1699 NULL,
1700 NULL,
1701 NULL);
1702 if (dwError != ERROR_SUCCESS)
1703 break;
1704
1705 wsprintf(szPathBuffer, L"%s\\%s", pszEnumerator, szDeviceBuffer);
1706 DPRINT("Path: %S\n", szPathBuffer);
1707
1708 ret = GetDeviceInstanceListSize(szPathBuffer, &dwBufferLength);
1709 if (ret != CR_SUCCESS)
1710 {
1711 *pulLength = 0;
1712 break;
1713 }
1714
1715 *pulLength += dwBufferLength;
1716 }
1717
1718 /* Close the enumerator key */
1719 RegCloseKey(hEnumeratorKey);
1720
1721 return ret;
1722}
1723
1724
1725static
1728 _Out_ PULONG pulLength)
1729{
1730 WCHAR szEnumeratorBuffer[MAX_DEVICE_ID_LEN];
1731 DWORD dwIndex, dwEnumeratorLength, dwBufferLength;
1732 DWORD dwError;
1734
1735 for (dwIndex = 0; ; dwIndex++)
1736 {
1737 dwEnumeratorLength = MAX_DEVICE_ID_LEN;
1738 dwError = RegEnumKeyExW(hEnumKey,
1739 dwIndex,
1740 szEnumeratorBuffer,
1741 &dwEnumeratorLength,
1742 NULL, NULL, NULL, NULL);
1743 if (dwError != ERROR_SUCCESS)
1744 break;
1745
1746 /* Get the size of all device instances for the enumerator */
1747 ret = GetEnumeratorInstanceListSize(szEnumeratorBuffer,
1748 &dwBufferLength);
1749 if (ret != CR_SUCCESS)
1750 break;
1751
1752 *pulLength += dwBufferLength;
1753 }
1754
1755 return ret;
1756}
1757
1758
1759/* Function 11 */
1760DWORD
1761WINAPI
1764 LPWSTR pszFilter,
1765 PNP_RPC_BUFFER_SIZE *pulLength,
1766 DWORD ulFlags)
1767{
1768 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
1769 WCHAR szDevice[MAX_DEVICE_ID_LEN];
1770 WCHAR szInstance[MAX_DEVICE_ID_LEN];
1772
1773 DPRINT("PNP_GetDeviceListSize(%p %S %p 0x%08lx)\n",
1774 hBinding, pszFilter, pulLength, ulFlags);
1775
1776 if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
1777 return CR_INVALID_FLAG;
1778
1779 if (pulLength == NULL)
1780 return CR_INVALID_POINTER;
1781
1782 if ((ulFlags != CM_GETIDLIST_FILTER_NONE) &&
1783 (pszFilter == NULL))
1784 return CR_INVALID_POINTER;
1785
1786 *pulLength = 0;
1787
1788 if (ulFlags &
1793 {
1795 ulFlags,
1796 pulLength);
1797 }
1798 else if (ulFlags & CM_GETIDLIST_FILTER_SERVICE)
1799 {
1800 ret = GetServiceInstanceListSize(pszFilter,
1801 pulLength);
1802 }
1803 else if (ulFlags & CM_GETIDLIST_FILTER_ENUMERATOR)
1804 {
1805 SplitDeviceInstanceID(pszFilter,
1806 szEnumerator,
1807 szDevice,
1808 szInstance);
1809
1810 if (*szEnumerator != UNICODE_NULL && *szDevice != UNICODE_NULL)
1811 {
1812 ret = GetDeviceInstanceListSize(pszFilter,
1813 pulLength);
1814 }
1815 else
1816 {
1818 pulLength);
1819 }
1820 }
1821 else /* CM_GETIDLIST_FILTER_NONE */
1822 {
1823 ret = GetAllInstanceListSize(pulLength);
1824 }
1825
1826 /* Add one character for the terminating double UNICODE_NULL */
1827 if (ret == CR_SUCCESS)
1828 (*pulLength) += 1;
1829
1830 return ret;
1831}
1832
1833
1834/* Function 12 */
1835DWORD
1836WINAPI
1839 LPWSTR pszDeviceID,
1840 DWORD *pulDepth,
1841 DWORD ulFlags)
1842{
1843 PLUGPLAY_CONTROL_DEPTH_DATA PlugPlayData;
1846
1848 UNREFERENCED_PARAMETER(ulFlags);
1849
1850 DPRINT("PNP_GetDepth(%p %S %p 0x%08lx)\n",
1851 hBinding, pszDeviceID, pulDepth, ulFlags);
1852
1853 if (!IsValidDeviceInstanceID(pszDeviceID))
1854 return CR_INVALID_DEVINST;
1855
1857 pszDeviceID);
1858
1860 (PVOID)&PlugPlayData,
1862 if (NT_SUCCESS(Status))
1863 {
1864 *pulDepth = PlugPlayData.Depth;
1865 }
1866 else
1867 {
1869 }
1870
1871 DPRINT("PNP_GetDepth() done (returns %lx)\n", ret);
1872
1873 return ret;
1874}
1875
1876
1877/* Function 13 */
1878DWORD
1879WINAPI
1882 LPWSTR pDeviceID,
1883 DWORD ulProperty,
1884 DWORD *pulRegDataType,
1885 BYTE *Buffer,
1886 PNP_PROP_SIZE *pulTransferLen,
1887 PNP_PROP_SIZE *pulLength,
1888 DWORD ulFlags)
1889{
1890 PLUGPLAY_CONTROL_PROPERTY_DATA PlugPlayData;
1892 LPWSTR lpValueName = NULL;
1893 HKEY hKey = NULL;
1894 LONG lError;
1896
1898
1899 DPRINT("PNP_GetDeviceRegProp(%p %S %lu %p %p %p %p 0x%08lx)\n",
1900 hBinding, pDeviceID, ulProperty, pulRegDataType, Buffer,
1901 pulTransferLen, pulLength, ulFlags);
1902
1903 if (pulTransferLen == NULL || pulLength == NULL)
1904 {
1906 goto done;
1907 }
1908
1909 if (ulFlags != 0)
1910 {
1912 goto done;
1913 }
1914
1915 /* Check pDeviceID */
1916 if (!IsValidDeviceInstanceID(pDeviceID))
1917 {
1919 goto done;
1920 }
1921
1922 if (*pulLength < *pulTransferLen)
1923 *pulLength = *pulTransferLen;
1924
1925 *pulTransferLen = 0;
1926
1927 switch (ulProperty)
1928 {
1929 case CM_DRP_DEVICEDESC:
1930 lpValueName = L"DeviceDesc";
1931 break;
1932
1933 case CM_DRP_HARDWAREID:
1934 lpValueName = L"HardwareID";
1935 break;
1936
1938 lpValueName = L"CompatibleIDs";
1939 break;
1940
1941 case CM_DRP_SERVICE:
1942 lpValueName = L"Service";
1943 break;
1944
1945 case CM_DRP_CLASS:
1946 lpValueName = L"Class";
1947 break;
1948
1949 case CM_DRP_CLASSGUID:
1950 lpValueName = L"ClassGUID";
1951 break;
1952
1953 case CM_DRP_DRIVER:
1954 lpValueName = L"Driver";
1955 break;
1956
1957 case CM_DRP_CONFIGFLAGS:
1958 lpValueName = L"ConfigFlags";
1959 break;
1960
1961 case CM_DRP_MFG:
1962 lpValueName = L"Mfg";
1963 break;
1964
1966 lpValueName = L"FriendlyName";
1967 break;
1968
1970 lpValueName = L"LocationInformation";
1971 break;
1972
1975 *pulRegDataType = REG_SZ;
1976 break;
1977
1979 lpValueName = L"Capabilities";
1980 break;
1981
1982 case CM_DRP_UI_NUMBER:
1983 PlugPlayData.Property = PNP_PROPERTY_UI_NUMBER;
1984 break;
1985
1987 lpValueName = L"UpperFilters";
1988 break;
1989
1991 lpValueName = L"LowerFilters";
1992 break;
1993
1994 case CM_DRP_BUSTYPEGUID:
1995 PlugPlayData.Property = PNP_PROPERTY_BUSTYPEGUID;
1996 *pulRegDataType = REG_BINARY;
1997 break;
1998
2000 PlugPlayData.Property = PNP_PROPERTY_LEGACYBUSTYPE;
2001 *pulRegDataType = REG_DWORD;
2002 break;
2003
2004 case CM_DRP_BUSNUMBER:
2005 PlugPlayData.Property = PNP_PROPERTY_BUSNUMBER;
2006 *pulRegDataType = REG_DWORD;
2007 break;
2008
2011 *pulRegDataType = REG_SZ;
2012 break;
2013
2014 case CM_DRP_SECURITY:
2015 lpValueName = L"Security";
2016 break;
2017
2018 case CM_DRP_DEVTYPE:
2019 lpValueName = L"DeviceType";
2020 break;
2021
2022 case CM_DRP_EXCLUSIVE:
2023 lpValueName = L"Exclusive";
2024 break;
2025
2027 lpValueName = L"DeviceCharacteristics";
2028 break;
2029
2030 case CM_DRP_ADDRESS:
2031 PlugPlayData.Property = PNP_PROPERTY_ADDRESS;
2032 *pulRegDataType = REG_DWORD;
2033 break;
2034
2036 lpValueName = L"UINumberDescFormat";
2037 break;
2038
2040 PlugPlayData.Property = PNP_PROPERTY_POWER_DATA;
2041 *pulRegDataType = REG_BINARY;
2042 break;
2043
2046 *pulRegDataType = REG_DWORD;
2047 break;
2048
2051 *pulRegDataType = REG_DWORD;
2052 break;
2053
2055 lpValueName = L"RemovalPolicy";
2056 *pulRegDataType = REG_DWORD;
2057 break;
2058
2060 PlugPlayData.Property = PNP_PROPERTY_INSTALL_STATE;
2061 *pulRegDataType = REG_DWORD;
2062 break;
2063
2064#if (WINVER >= _WIN32_WINNT_WS03)
2067 *pulRegDataType = REG_MULTI_SZ;
2068 break;
2069#endif
2070
2071#if (WINVER >= _WIN32_WINNT_WIN7)
2073 PlugPlayData.Property = PNP_PROPERTY_CONTAINERID;
2074 *pulRegDataType = REG_SZ;
2075 break;
2076#endif
2077
2078 default:
2080 goto done;
2081 }
2082
2083 DPRINT("Value name: %S\n", lpValueName);
2084
2085 if (lpValueName)
2086 {
2087 /* Retrieve information from the Registry */
2088 lError = RegOpenKeyExW(hEnumKey,
2089 pDeviceID,
2090 0,
2092 &hKey);
2093 if (lError != ERROR_SUCCESS)
2094 {
2095 hKey = NULL;
2096 *pulLength = 0;
2098 goto done;
2099 }
2100
2101 lError = RegQueryValueExW(hKey,
2102 lpValueName,
2103 NULL,
2104 pulRegDataType,
2105 Buffer,
2106 pulLength);
2107 if (lError != ERROR_SUCCESS)
2108 {
2109 if (lError == ERROR_MORE_DATA)
2110 {
2112 }
2113 else
2114 {
2115 *pulLength = 0;
2117 }
2118 }
2119 }
2120 else
2121 {
2122 /* Retrieve information from the Device Node */
2124 pDeviceID);
2125 PlugPlayData.Buffer = Buffer;
2126 PlugPlayData.BufferSize = *pulLength;
2127
2129 (PVOID)&PlugPlayData,
2131 if (NT_SUCCESS(Status))
2132 {
2133 *pulLength = PlugPlayData.BufferSize;
2134 }
2135 else
2136 {
2138 }
2139 }
2140
2141done:
2142 if (pulTransferLen)
2143 *pulTransferLen = (ret == CR_SUCCESS) ? *pulLength : 0;
2144
2145 if (hKey != NULL)
2147
2148 DPRINT("PNP_GetDeviceRegProp() done (returns %lx)\n", ret);
2149
2150 return ret;
2151}
2152
2153
2154/* Function 14 */
2155DWORD
2156WINAPI
2159 LPWSTR pDeviceId,
2160 DWORD ulProperty,
2161 DWORD ulDataType,
2162 BYTE *Buffer,
2163 PNP_PROP_SIZE ulLength,
2164 DWORD ulFlags)
2165{
2167 LPWSTR lpValueName = NULL;
2168 HKEY hKey = 0;
2169
2171 UNREFERENCED_PARAMETER(ulFlags);
2172
2173 DPRINT("PNP_SetDeviceRegProp(%p %S %lu %lu %p %lu 0x%08lx)\n",
2174 hBinding, pDeviceId, ulProperty, ulDataType, Buffer,
2175 ulLength, ulFlags);
2176
2177 if (!IsValidDeviceInstanceID(pDeviceId))
2178 return CR_INVALID_DEVINST;
2179
2180 switch (ulProperty)
2181 {
2182 case CM_DRP_DEVICEDESC:
2183 lpValueName = L"DeviceDesc";
2184 break;
2185
2186 case CM_DRP_HARDWAREID:
2187 lpValueName = L"HardwareID";
2188 break;
2189
2191 lpValueName = L"CompatibleIDs";
2192 break;
2193
2194 case CM_DRP_SERVICE:
2195 lpValueName = L"Service";
2196 break;
2197
2198 case CM_DRP_CLASS:
2199 lpValueName = L"Class";
2200 break;
2201
2202 case CM_DRP_CLASSGUID:
2203 lpValueName = L"ClassGUID";
2204 break;
2205
2206 case CM_DRP_DRIVER:
2207 lpValueName = L"Driver";
2208 break;
2209
2210 case CM_DRP_CONFIGFLAGS:
2211 lpValueName = L"ConfigFlags";
2212 break;
2213
2214 case CM_DRP_MFG:
2215 lpValueName = L"Mfg";
2216 break;
2217
2219 lpValueName = L"FriendlyName";
2220 break;
2221
2223 lpValueName = L"LocationInformation";
2224 break;
2225
2227 lpValueName = L"UpperFilters";
2228 break;
2229
2231 lpValueName = L"LowerFilters";
2232 break;
2233
2234 case CM_DRP_SECURITY:
2235 lpValueName = L"Security";
2236 break;
2237
2238 case CM_DRP_DEVTYPE:
2239 lpValueName = L"DeviceType";
2240 break;
2241
2242 case CM_DRP_EXCLUSIVE:
2243 lpValueName = L"Exclusive";
2244 break;
2245
2247 lpValueName = L"DeviceCharacteristics";
2248 break;
2249
2251 lpValueName = L"UINumberDescFormat";
2252 break;
2253
2255 lpValueName = L"RemovalPolicy";
2256 break;
2257
2258 default:
2259 return CR_INVALID_PROPERTY;
2260 }
2261
2262 DPRINT("Value name: %S\n", lpValueName);
2263
2265 pDeviceId,
2266 0,
2268 &hKey))
2269 return CR_INVALID_DEVNODE;
2270
2271 if (ulLength == 0)
2272 {
2274 lpValueName))
2276 }
2277 else
2278 {
2279 if (RegSetValueExW(hKey,
2280 lpValueName,
2281 0,
2282 ulDataType,
2283 Buffer,
2284 ulLength))
2286 }
2287
2289
2290 DPRINT("PNP_SetDeviceRegProp() done (returns %lx)\n", ret);
2291
2292 return ret;
2293}
2294
2295
2296/* Function 15 */
2297DWORD
2298WINAPI
2301 LPWSTR pDeviceId,
2302 LPWSTR pszClassInstance,
2303 PNP_RPC_STRING_LEN ulLength)
2304{
2305 WCHAR szClassGuid[40];
2306 WCHAR szClassInstance[5];
2307 HKEY hDeviceClassKey = NULL;
2308 HKEY hClassInstanceKey;
2309 ULONG ulTransferLength, ulDataLength;
2310 DWORD dwDataType, dwDisposition, i;
2311 DWORD dwError;
2313
2314 DPRINT("PNP_GetClassInstance(%p %S %p %lu)\n",
2315 hBinding, pDeviceId, pszClassInstance, ulLength);
2316
2317 if (!IsValidDeviceInstanceID(pDeviceId))
2318 return CR_INVALID_DEVINST;
2319
2320 ulTransferLength = ulLength;
2322 pDeviceId,
2324 &dwDataType,
2325 (BYTE *)pszClassInstance,
2326 &ulTransferLength,
2327 &ulLength,
2328 0);
2329 if (ret == CR_SUCCESS)
2330 return ret;
2331
2332 ulTransferLength = sizeof(szClassGuid);
2333 ulDataLength = sizeof(szClassGuid);
2335 pDeviceId,
2337 &dwDataType,
2338 (BYTE *)szClassGuid,
2339 &ulTransferLength,
2340 &ulDataLength,
2341 0);
2342 if (ret != CR_SUCCESS)
2343 {
2344 DPRINT1("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret);
2345 goto done;
2346 }
2347
2348 dwError = RegOpenKeyExW(hClassKey,
2349 szClassGuid,
2350 0,
2351 KEY_READ,
2352 &hDeviceClassKey);
2353 if (dwError != ERROR_SUCCESS)
2354 {
2355 DPRINT1("RegOpenKeyExW() failed (Error %lu)\n", dwError);
2356 ret = CR_FAILURE;
2357 goto done;
2358 }
2359
2360 for (i = 0; i < 10000; i++)
2361 {
2362 wsprintf(szClassInstance, L"%04lu", i);
2363
2364 dwError = RegCreateKeyExW(hDeviceClassKey,
2365 szClassInstance,
2366 0,
2367 NULL,
2370 NULL,
2371 &hClassInstanceKey,
2372 &dwDisposition);
2373 if (dwError == ERROR_SUCCESS)
2374 {
2375 RegCloseKey(hClassInstanceKey);
2376
2377 if (dwDisposition == REG_CREATED_NEW_KEY)
2378 {
2379 wsprintf(pszClassInstance,
2380 L"%s\\%s",
2381 szClassGuid,
2382 szClassInstance);
2383
2384 ulDataLength = (wcslen(pszClassInstance) + 1) * sizeof(WCHAR);
2386 pDeviceId,
2388 REG_SZ,
2389 (BYTE *)pszClassInstance,
2390 ulDataLength,
2391 0);
2392 if (ret != CR_SUCCESS)
2393 {
2394 DPRINT1("PNP_SetDeviceRegProp() failed (Error %lu)\n", ret);
2395 RegDeleteKeyW(hDeviceClassKey,
2396 szClassInstance);
2397 }
2398
2399 break;
2400 }
2401 }
2402 }
2403
2404done:
2405 if (hDeviceClassKey != NULL)
2406 RegCloseKey(hDeviceClassKey);
2407
2408 return ret;
2409}
2410
2411
2412/* Function 16 */
2413DWORD
2414WINAPI
2417 LPWSTR pszSubKey,
2418 DWORD samDesired,
2419 DWORD ulFlags)
2420{
2421 HKEY hDeviceKey = NULL, hParametersKey = NULL;
2422 DWORD dwError;
2424
2426 UNREFERENCED_PARAMETER(samDesired);
2427
2428 DPRINT("PNP_CreateKey(%p %S 0x%lx 0x%08lx)\n",
2429 hBinding, pszSubKey, samDesired, ulFlags);
2430
2431 if (ulFlags != 0)
2432 return CR_INVALID_FLAG;
2433
2434 if (!IsValidDeviceInstanceID(pszSubKey))
2435 return CR_INVALID_DEVINST;
2436
2437 dwError = RegOpenKeyExW(hEnumKey,
2438 pszSubKey,
2439 0,
2440 KEY_WRITE,
2441 &hDeviceKey);
2442 if (dwError != ERROR_SUCCESS)
2443 {
2445 goto done;
2446 }
2447
2448 dwError = RegCreateKeyExW(hDeviceKey,
2449 L"Device Parameters",
2450 0,
2451 NULL,
2454 NULL,
2455 &hParametersKey,
2456 NULL);
2457 if (dwError != ERROR_SUCCESS)
2458 {
2460 goto done;
2461 }
2462
2463 /* FIXME: Set key security */
2464
2465done:
2466 if (hParametersKey != NULL)
2467 RegCloseKey(hParametersKey);
2468
2469 if (hDeviceKey != NULL)
2470 RegCloseKey(hDeviceKey);
2471
2472 return ret;
2473}
2474
2475
2476/* Function 17 */
2477DWORD
2478WINAPI
2481 LPWSTR pszDeviceID,
2482 LPWSTR pszParentKey,
2483 LPWSTR pszChildKey,
2484 DWORD ulFlags)
2485{
2488}
2489
2490
2491/* Function 18 */
2492DWORD
2493WINAPI
2496 DWORD *pulClassCount,
2497 DWORD ulFlags)
2498{
2499 HKEY hKey;
2500 DWORD dwError;
2501
2503 UNREFERENCED_PARAMETER(ulFlags);
2504
2505 DPRINT("PNP_GetClassCount(%p %p 0x%08lx)\n",
2506 hBinding, pulClassCount, ulFlags);
2507
2510 0,
2512 &hKey);
2513 if (dwError != ERROR_SUCCESS)
2514 return CR_INVALID_DATA;
2515
2516 dwError = RegQueryInfoKeyW(hKey,
2517 NULL,
2518 NULL,
2519 NULL,
2520 pulClassCount,
2521 NULL,
2522 NULL,
2523 NULL,
2524 NULL,
2525 NULL,
2526 NULL,
2527 NULL);
2529 if (dwError != ERROR_SUCCESS)
2530 return CR_INVALID_DATA;
2531
2532 return CR_SUCCESS;
2533}
2534
2535
2536/* Function 19 */
2537DWORD
2538WINAPI
2541 LPWSTR pszClassGuid,
2542 LPWSTR Buffer,
2543 PNP_RPC_STRING_LEN *pulLength,
2544 DWORD ulFlags)
2545{
2546 WCHAR szKeyName[MAX_PATH];
2548 HKEY hKey;
2549 DWORD dwSize;
2550
2552 UNREFERENCED_PARAMETER(ulFlags);
2553
2554 DPRINT("PNP_GetClassName(%p %S %p %p 0x%08lx)\n",
2555 hBinding, pszClassGuid, Buffer, pulLength, ulFlags);
2556
2557 lstrcpyW(szKeyName, L"System\\CurrentControlSet\\Control\\Class\\");
2558 if (lstrlenW(pszClassGuid) + 1 < sizeof(szKeyName)/sizeof(WCHAR)-(lstrlenW(szKeyName) * sizeof(WCHAR)))
2559 lstrcatW(szKeyName, pszClassGuid);
2560 else
2561 return CR_INVALID_DATA;
2562
2564 szKeyName,
2565 0,
2567 &hKey))
2568 return CR_REGISTRY_ERROR;
2569
2570 dwSize = *pulLength * sizeof(WCHAR);
2572 L"Class",
2573 NULL,
2574 NULL,
2575 (LPBYTE)Buffer,
2576 &dwSize))
2577 {
2578 *pulLength = 0;
2580 }
2581 else
2582 {
2583 *pulLength = dwSize / sizeof(WCHAR);
2584 }
2585
2587
2588 DPRINT("PNP_GetClassName() done (returns %lx)\n", ret);
2589
2590 return ret;
2591}
2592
2593
2594/* Function 20 */
2595DWORD
2596WINAPI
2599 LPWSTR pszClassGuid,
2600 DWORD ulFlags)
2601{
2603
2605
2606 DPRINT("PNP_DeleteClassKey(%p %S 0x%08lx)\n",
2607 hBinding, pszClassGuid, ulFlags);
2608
2609 if (ulFlags & CM_DELETE_CLASS_SUBKEYS)
2610 {
2611 if (SHDeleteKeyW(hClassKey, pszClassGuid) != ERROR_SUCCESS)
2613 }
2614 else
2615 {
2616 if (RegDeleteKeyW(hClassKey, pszClassGuid) != ERROR_SUCCESS)
2618 }
2619
2620 DPRINT("PNP_DeleteClassKey() done (returns %lx)\n", ret);
2621
2622 return ret;
2623}
2624
2625
2626/* Function 21 */
2627DWORD
2628WINAPI
2631 LPWSTR pszInterfaceDevice,
2632 GUID *AliasInterfaceGuid,
2633 LPWSTR pszAliasInterfaceDevice,
2634 PNP_RPC_STRING_LEN *pulLength,
2635 PNP_RPC_STRING_LEN *pulTransferLen,
2636 DWORD ulFlags)
2637{
2640}
2641
2642
2643/* Function 22 */
2644DWORD
2645WINAPI
2649 LPWSTR pszDeviceID,
2650 BYTE *Buffer,
2651 PNP_RPC_BUFFER_SIZE *pulLength,
2652 DWORD ulFlags)
2653{
2657
2659
2660 DPRINT("PNP_GetInterfaceDeviceList(%p %p %S %p %p 0x%08lx)\n",
2661 hBinding, InterfaceGuid, pszDeviceID, Buffer, pulLength, ulFlags);
2662
2663 if (!IsValidDeviceInstanceID(pszDeviceID))
2664 return CR_INVALID_DEVINST;
2665
2667 pszDeviceID);
2668
2669 PlugPlayData.Flags = ulFlags;
2670 PlugPlayData.FilterGuid = InterfaceGuid;
2671 PlugPlayData.Buffer = Buffer;
2672 PlugPlayData.BufferSize = *pulLength;
2673
2675 (PVOID)&PlugPlayData,
2677 if (NT_SUCCESS(Status))
2678 {
2679 *pulLength = PlugPlayData.BufferSize;
2680 }
2681 else
2682 {
2684 }
2685
2686 DPRINT("PNP_GetInterfaceDeviceList() done (returns %lx)\n", ret);
2687 return ret;
2688}
2689
2690
2691/* Function 23 */
2692DWORD
2693WINAPI
2696 PNP_RPC_BUFFER_SIZE *pulLen,
2698 LPWSTR pszDeviceID,
2699 DWORD ulFlags)
2700{
2704
2706
2707 DPRINT("PNP_GetInterfaceDeviceListSize(%p %p %p %S 0x%08lx)\n",
2708 hBinding, pulLen, InterfaceGuid, pszDeviceID, ulFlags);
2709
2710 if (!IsValidDeviceInstanceID(pszDeviceID))
2711 return CR_INVALID_DEVINST;
2712
2714 pszDeviceID);
2715
2716 PlugPlayData.FilterGuid = InterfaceGuid;
2717 PlugPlayData.Buffer = NULL;
2718 PlugPlayData.BufferSize = 0;
2719 PlugPlayData.Flags = ulFlags;
2720
2722 (PVOID)&PlugPlayData,
2724 if (NT_SUCCESS(Status))
2725 {
2726 *pulLen = PlugPlayData.BufferSize;
2727 }
2728 else
2729 {
2731 }
2732
2733 DPRINT("PNP_GetInterfaceDeviceListSize() done (returns %lx)\n", ret);
2734 return ret;
2735}
2736
2737
2738/* Function 24 */
2739DWORD
2740WINAPI
2743 LPWSTR pszDeviceID,
2745 LPWSTR pszReference,
2746 LPWSTR pszSymLink,
2747 PNP_RPC_STRING_LEN *pulLength,
2748 PNP_RPC_STRING_LEN *pulTransferLen,
2749 DWORD ulFlags)
2750{
2753}
2754
2755
2756/* Function 25 */
2757DWORD
2758WINAPI
2761 LPWSTR pszInterfaceDevice,
2762 DWORD ulFlags)
2763{
2766}
2767
2768
2769/* Function 26 */
2770DWORD
2771WINAPI
2774 LPWSTR pszClassGuid,
2775 DWORD ulProperty,
2776 DWORD *pulRegDataType,
2777 BYTE *Buffer,
2778 PNP_RPC_STRING_LEN *pulTransferLen,
2779 PNP_RPC_STRING_LEN *pulLength,
2780 DWORD ulFlags)
2781{
2783 LPWSTR lpValueName = NULL;
2784 HKEY hInstKey = NULL;
2785 HKEY hPropKey = NULL;
2786 LONG lError;
2787
2789
2790 DPRINT("PNP_GetClassRegProp(%p %S %lu %p %p %p %p 0x%08lx)\n",
2791 hBinding, pszClassGuid, ulProperty, pulRegDataType,
2792 Buffer, pulTransferLen, pulLength, ulFlags);
2793
2794 if (pulTransferLen == NULL || pulLength == NULL)
2795 {
2797 goto done;
2798 }
2799
2800 if (ulFlags != 0)
2801 {
2803 goto done;
2804 }
2805
2806 if (*pulLength < *pulTransferLen)
2807 *pulLength = *pulTransferLen;
2808
2809 *pulTransferLen = 0;
2810
2811 switch (ulProperty)
2812 {
2813 case CM_CRP_SECURITY:
2814 lpValueName = L"Security";
2815 break;
2816
2817 case CM_CRP_DEVTYPE:
2818 lpValueName = L"DeviceType";
2819 break;
2820
2821 case CM_CRP_EXCLUSIVE:
2822 lpValueName = L"Exclusive";
2823 break;
2824
2826 lpValueName = L"DeviceCharacteristics";
2827 break;
2828
2829 default:
2831 goto done;
2832 }
2833
2834 DPRINT("Value name: %S\n", lpValueName);
2835
2836 lError = RegOpenKeyExW(hClassKey,
2837 pszClassGuid,
2838 0,
2839 KEY_READ,
2840 &hInstKey);
2841 if (lError != ERROR_SUCCESS)
2842 {
2843 *pulLength = 0;
2845 goto done;
2846 }
2847
2848 lError = RegOpenKeyExW(hInstKey,
2849 L"Properties",
2850 0,
2851 KEY_READ,
2852 &hPropKey);
2853 if (lError != ERROR_SUCCESS)
2854 {
2855 *pulLength = 0;
2857 goto done;
2858 }
2859
2860 lError = RegQueryValueExW(hPropKey,
2861 lpValueName,
2862 NULL,
2863 pulRegDataType,
2864 Buffer,
2865 pulLength);
2866 if (lError != ERROR_SUCCESS)
2867 {
2868 if (lError == ERROR_MORE_DATA)
2869 {
2871 }
2872 else
2873 {
2874 *pulLength = 0;
2876 }
2877 }
2878
2879done:
2880 if (ret == CR_SUCCESS)
2881 *pulTransferLen = *pulLength;
2882
2883 if (hPropKey != NULL)
2884 RegCloseKey(hPropKey);
2885
2886 if (hInstKey != NULL)
2887 RegCloseKey(hInstKey);
2888
2889 DPRINT("PNP_GetClassRegProp() done (returns %lx)\n", ret);
2890
2891 return ret;
2892}
2893
2894
2895/* Function 27 */
2896DWORD
2897WINAPI
2900 LPWSTR pszClassGuid,
2901 DWORD ulProperty,
2902 DWORD ulDataType,
2903 BYTE *Buffer,
2904 PNP_PROP_SIZE ulLength,
2905 DWORD ulFlags)
2906{
2908 LPWSTR lpValueName = NULL;
2909 HKEY hInstKey = 0;
2910 HKEY hPropKey = 0;
2911 LONG lError;
2912
2914
2915 DPRINT("PNP_SetClassRegProp(%p %S %lu %lu %p %lu 0x%08lx)\n",
2916 hBinding, pszClassGuid, ulProperty, ulDataType,
2917 Buffer, ulLength, ulFlags);
2918
2919 if (ulFlags != 0)
2920 return CR_INVALID_FLAG;
2921
2922 switch (ulProperty)
2923 {
2924 case CM_CRP_SECURITY:
2925 lpValueName = L"Security";
2926 break;
2927
2928 case CM_CRP_DEVTYPE:
2929 lpValueName = L"DeviceType";
2930 break;
2931
2932 case CM_CRP_EXCLUSIVE:
2933 lpValueName = L"Exclusive";
2934 break;
2935
2937 lpValueName = L"DeviceCharacteristics";
2938 break;
2939
2940 default:
2941 return CR_INVALID_PROPERTY;
2942 }
2943
2944 lError = RegOpenKeyExW(hClassKey,
2945 pszClassGuid,
2946 0,
2947 KEY_WRITE,
2948 &hInstKey);
2949 if (lError != ERROR_SUCCESS)
2950 {
2952 goto done;
2953 }
2954
2955 /* FIXME: Set security descriptor */
2956 lError = RegCreateKeyExW(hInstKey,
2957 L"Properties",
2958 0,
2959 NULL,
2962 NULL,
2963 &hPropKey,
2964 NULL);
2965 if (lError != ERROR_SUCCESS)
2966 {
2968 goto done;
2969 }
2970
2971 if (ulLength == 0)
2972 {
2973 if (RegDeleteValueW(hPropKey,
2974 lpValueName))
2976 }
2977 else
2978 {
2979 if (RegSetValueExW(hPropKey,
2980 lpValueName,
2981 0,
2982 ulDataType,
2983 Buffer,
2984 ulLength))
2986 }
2987
2988done:
2989 if (hPropKey != NULL)
2990 RegCloseKey(hPropKey);
2991
2992 if (hInstKey != NULL)
2993 RegCloseKey(hInstKey);
2994
2995 return ret;
2996}
2997
2998
2999static
3002 _In_ LPWSTR pszDeviceID,
3003 _In_ BOOL bPhantomDevice)
3004{
3005 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
3006 WCHAR szDevice[MAX_DEVICE_ID_LEN];
3007 WCHAR szInstance[MAX_DEVICE_ID_LEN];
3008 HKEY hKeyEnumerator;
3009 HKEY hKeyDevice;
3010 HKEY hKeyInstance;
3011 HKEY hKeyControl;
3012 LONG lError;
3013
3014 /* Split the instance ID */
3015 SplitDeviceInstanceID(pszDeviceID,
3016 szEnumerator,
3017 szDevice,
3018 szInstance);
3019
3020 /* Open or create the enumerator key */
3021 lError = RegCreateKeyExW(hEnumKey,
3022 szEnumerator,
3023 0,
3024 NULL,
3027 NULL,
3028 &hKeyEnumerator,
3029 NULL);
3030 if (lError != ERROR_SUCCESS)
3031 {
3032 return CR_REGISTRY_ERROR;
3033 }
3034
3035 /* Open or create the device key */
3036 lError = RegCreateKeyExW(hKeyEnumerator,
3037 szDevice,
3038 0,
3039 NULL,
3042 NULL,
3043 &hKeyDevice,
3044 NULL);
3045
3046 /* Close the enumerator key */
3047 RegCloseKey(hKeyEnumerator);
3048
3049 if (lError != ERROR_SUCCESS)
3050 {
3051 return CR_REGISTRY_ERROR;
3052 }
3053
3054 /* Try to open the instance key and fail if it exists */
3055 lError = RegOpenKeyExW(hKeyDevice,
3056 szInstance,
3057 0,
3059 &hKeyInstance);
3060 if (lError == ERROR_SUCCESS)
3061 {
3062 DPRINT1("Instance %S already exists!\n", szInstance);
3063 RegCloseKey(hKeyInstance);
3064 RegCloseKey(hKeyDevice);
3066 }
3067
3068 /* Create a new instance key */
3069 lError = RegCreateKeyExW(hKeyDevice,
3070 szInstance,
3071 0,
3072 NULL,
3075 NULL,
3076 &hKeyInstance,
3077 NULL);
3078
3079 /* Close the device key */
3080 RegCloseKey(hKeyDevice);
3081
3082 if (lError != ERROR_SUCCESS)
3083 {
3084 return CR_REGISTRY_ERROR;
3085 }
3086
3087 if (bPhantomDevice)
3088 {
3089 DWORD dwPhantomValue = 1;
3090 RegSetValueExW(hKeyInstance,
3091 L"Phantom",
3092 0,
3093 REG_DWORD,
3094 (PBYTE)&dwPhantomValue,
3095 sizeof(dwPhantomValue));
3096 }
3097
3098 /* Create the 'Control' sub key */
3099 lError = RegCreateKeyExW(hKeyInstance,
3100 L"Control",
3101 0,
3102 NULL,
3105 NULL,
3106 &hKeyControl,
3107 NULL);
3108 if (lError == ERROR_SUCCESS)
3109 {
3110 RegCloseKey(hKeyControl);
3111 }
3112
3113 RegCloseKey(hKeyInstance);
3114
3115 return (lError == ERROR_SUCCESS) ? CR_SUCCESS : CR_REGISTRY_ERROR;
3116}
3117
3118
3119static
3122 _Inout_ LPWSTR pszDeviceID,
3123 _In_ PNP_RPC_STRING_LEN ulLength)
3124{
3125 WCHAR szGeneratedInstance[MAX_DEVICE_ID_LEN];
3126 HKEY hKey;
3127 DWORD dwInstanceNumber;
3128 DWORD dwError = ERROR_SUCCESS;
3130
3131 /* Fail, if the device name contains backslashes */
3132 if (wcschr(pszDeviceID, L'\\') != NULL)
3133 return CR_INVALID_DEVICE_ID;
3134
3135 /* Generated ID is: Root<Device ID><Instance number> */
3136 dwInstanceNumber = 0;
3137 while (dwError == ERROR_SUCCESS)
3138 {
3139 if (dwInstanceNumber >= 10000)
3140 return CR_FAILURE;
3141
3142 swprintf(szGeneratedInstance, L"Root\\%ls\\%04lu",
3143 pszDeviceID, dwInstanceNumber);
3144
3145 /* Try to open the enum key of the device instance */
3146 dwError = RegOpenKeyEx(hEnumKey, szGeneratedInstance, 0, KEY_QUERY_VALUE, &hKey);
3147 if (dwError == ERROR_SUCCESS)
3148 {
3150 dwInstanceNumber++;
3151 }
3152 }
3153
3154 /* pszDeviceID is an out parameter too for generated IDs */
3155 if (wcslen(szGeneratedInstance) > ulLength)
3156 {
3158 }
3159 else
3160 {
3161 wcscpy(pszDeviceID, szGeneratedInstance);
3162 }
3163
3164 return ret;
3165}
3166
3167
3168/* Function 28 */
3169DWORD
3170WINAPI
3173 LPWSTR pszDeviceID,
3174 LPWSTR pszParentDeviceID,
3175 PNP_RPC_STRING_LEN ulLength,
3176 DWORD ulFlags)
3177{
3179 HKEY hKey = NULL;
3180 DWORD dwSize, dwPhantom;
3183
3184 DPRINT("PNP_CreateDevInst(%p %S %S %lu 0x%08lx)\n",
3185 hBinding, pszParentDeviceID, pszDeviceID, ulLength, ulFlags);
3186
3187 if (ulFlags & ~CM_CREATE_DEVNODE_BITS)
3188 return CR_INVALID_FLAG;
3189
3190 if (pszDeviceID == NULL || pszParentDeviceID == NULL)
3191 return CR_INVALID_POINTER;
3192
3193 /* Fail, if the parent device is not the root device */
3194 if (!IsRootDeviceInstanceID(pszParentDeviceID))
3195 return CR_INVALID_DEVINST;
3196
3197 if (ulFlags & CM_CREATE_DEVNODE_GENERATE_ID)
3198 {
3199 ret = GenerateDeviceID(pszDeviceID,
3200 ulLength);
3201 if (ret != CR_SUCCESS)
3202 return ret;
3203 }
3204
3205 /* Try to open the device instance key */
3206 RegOpenKeyEx(hEnumKey, pszDeviceID, 0, KEY_READ | KEY_WRITE, &hKey);
3207
3208 if (ulFlags & CM_CREATE_DEVNODE_PHANTOM)
3209 {
3210 /* Fail, if the device already exists */
3211 if (hKey != NULL)
3212 {
3214 goto done;
3215 }
3216
3217 /* Create the phantom device instance */
3218 ret = CreateDeviceInstance(pszDeviceID, TRUE);
3219 }
3220 else
3221 {
3222 /* Fail, if the device exists and is present */
3223 if ((hKey != NULL) && (IsPresentDeviceInstanceID(pszDeviceID)))
3224 {
3226 goto done;
3227 }
3228
3229 /* If it does not already exist ... */
3230 if (hKey == NULL)
3231 {
3232 /* Create the device instance */
3233 ret = CreateDeviceInstance(pszDeviceID, FALSE);
3234
3235 /* Open the device instance key */
3236 RegOpenKeyEx(hEnumKey, pszDeviceID, 0, KEY_READ | KEY_WRITE, &hKey);
3237 }
3238
3239 /* Create a device node for the device */
3240 RtlInitUnicodeString(&ControlData.DeviceInstance, pszDeviceID);
3242 &ControlData,
3243 sizeof(ControlData));
3244 if (!NT_SUCCESS(Status))
3245 {
3246 ret = CR_FAILURE;
3247 goto done;
3248 }
3249
3250 /* If the device is a phantom device, turn it into a normal device */
3251 if (hKey != NULL)
3252 {
3253 dwPhantom = 0;
3254 dwSize = sizeof(DWORD);
3255 RegQueryValueEx(hKey, L"Phantom", NULL, NULL, (PBYTE)&dwPhantom, &dwSize);
3256
3257 if (dwPhantom != 0)
3258 RegDeleteValue(hKey, L"Phantom");
3259 }
3260 }
3261
3262done:
3263 if (hKey)
3265
3266 DPRINT("PNP_CreateDevInst() done (returns %lx)\n", ret);
3267
3268 return ret;
3269}
3270
3271
3272static CONFIGRET
3274 _In_ LPWSTR pszDeviceInstance,
3275 _In_ DWORD ulMinorAction)
3276{
3278 HKEY hDeviceKey = NULL;
3279 DWORD dwDisableCount, dwSize;
3280 DWORD ulStatus, ulProblem;
3281 DWORD dwError;
3284
3285 DPRINT1("SetupDeviceInstance(%S 0x%08lx)\n",
3286 pszDeviceInstance, ulMinorAction);
3287
3288 if (IsRootDeviceInstanceID(pszDeviceInstance))
3289 return CR_INVALID_DEVINST;
3290
3291 if (ulMinorAction & ~CM_SETUP_BITS)
3292 return CR_INVALID_FLAG;
3293
3294 if ((ulMinorAction == CM_SETUP_DOWNLOAD) ||
3295 (ulMinorAction == CM_SETUP_WRITE_LOG_CONFS))
3296 return CR_SUCCESS;
3297
3298 dwError = RegOpenKeyExW(hEnumKey,
3299 pszDeviceInstance,
3300 0,
3301 KEY_READ,
3302 &hDeviceKey);
3303 if (dwError != ERROR_SUCCESS)
3304 return CR_INVALID_DEVNODE;
3305
3306 dwSize = sizeof(dwDisableCount);
3307 dwError = RegQueryValueExW(hDeviceKey,
3308 L"DisableCount",
3309 NULL,
3310 NULL,
3311 (LPBYTE)&dwDisableCount,
3312 &dwSize);
3313 if ((dwError == ERROR_SUCCESS) &&
3314 (dwDisableCount > 0))
3315 {
3316 goto done;
3317 }
3318
3319 GetDeviceStatus(pszDeviceInstance,
3320 &ulStatus,
3321 &ulProblem);
3322
3323 if (ulStatus & DN_STARTED)
3324 {
3325 goto done;
3326 }
3327
3328 if (ulStatus & DN_HAS_PROBLEM)
3329 {
3330 ret = ClearDeviceStatus(pszDeviceInstance,
3332 ulProblem);
3333 }
3334
3335 if (ret != CR_SUCCESS)
3336 goto done;
3337
3338 /* Start the device */
3340 pszDeviceInstance);
3342 &ControlData,
3344 if (!NT_SUCCESS(Status))
3346
3347done:
3348 if (hDeviceKey != NULL)
3349 RegCloseKey(hDeviceKey);
3350
3351 return ret;
3352}
3353
3354
3355static CONFIGRET
3357 _In_ LPWSTR pszDeviceInstance)
3358{
3362
3363 DPRINT("Enable device instance %S\n", pszDeviceInstance);
3364
3365 RtlInitUnicodeString(&ControlData.DeviceInstance, pszDeviceInstance);
3366 Status = NtPlugPlayControl(PlugPlayControlStartDevice, &ControlData, sizeof(ControlData));
3367 if (!NT_SUCCESS(Status))
3369
3370 return ret;
3371}
3372
3373
3374static CONFIGRET
3376 _In_ LPWSTR pszDeviceInstance,
3377 _In_ ULONG ulMinorAction)
3378{
3379 PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA EnumerateDeviceData;
3382
3383 DPRINT1("ReenumerateDeviceInstance(%S 0x%08lx)\n",
3384 pszDeviceInstance, ulMinorAction);
3385
3386 if (ulMinorAction & ~CM_REENUMERATE_BITS)
3387 return CR_INVALID_FLAG;
3388
3389 if (ulMinorAction & CM_REENUMERATE_RETRY_INSTALLATION)
3390 {
3391 DPRINT1("CM_REENUMERATE_RETRY_INSTALLATION not implemented!\n");
3392 }
3393
3394 RtlInitUnicodeString(&EnumerateDeviceData.DeviceInstance,
3395 pszDeviceInstance);
3396 EnumerateDeviceData.Flags = 0;
3397
3399 &EnumerateDeviceData,
3401 if (!NT_SUCCESS(Status))
3403
3404 return ret;
3405}
3406
3407
3408/* Function 29 */
3409DWORD
3410WINAPI
3413 DWORD ulMajorAction,
3414 DWORD ulMinorAction,
3415 LPWSTR pszDeviceInstance1,
3416 LPWSTR pszDeviceInstance2)
3417{
3419
3421
3422 DPRINT("PNP_DeviceInstanceAction(%p %lu 0x%08lx %S %S)\n",
3423 hBinding, ulMajorAction, ulMinorAction,
3424 pszDeviceInstance1, pszDeviceInstance2);
3425
3426 switch (ulMajorAction)
3427 {
3428 case PNP_DEVINST_SETUP:
3429 ret = SetupDeviceInstance(pszDeviceInstance1,
3430 ulMinorAction);
3431 break;
3432
3433 case PNP_DEVINST_ENABLE:
3434 ret = EnableDeviceInstance(pszDeviceInstance1);
3435 break;
3436
3437 case PNP_DEVINST_REENUMERATE:
3438 ret = ReenumerateDeviceInstance(pszDeviceInstance1,
3439 ulMinorAction);
3440 break;
3441
3442 default:
3443 DPRINT1("Unknown device action %lu: not implemented\n", ulMajorAction);
3445 }
3446
3447 DPRINT("PNP_DeviceInstanceAction() done (returns %lx)\n", ret);
3448
3449 return ret;
3450}
3451
3452
3453/* Function 30 */
3454DWORD
3455WINAPI
3458 LPWSTR pDeviceID,
3459 DWORD *pulStatus,
3460 DWORD *pulProblem,
3461 DWORD ulFlags)
3462{
3463 DWORD ulDataType, ulTransferLength, ulLength;
3464 DWORD ulCapabilities, ulConfigFlags;
3465 CONFIGRET ret;
3466
3468 UNREFERENCED_PARAMETER(ulFlags);
3469
3470 DPRINT("PNP_GetDeviceStatus(%p %S %p %p 0x%08lx)\n",
3471 hBinding, pDeviceID, pulStatus, pulProblem, ulFlags);
3472
3473 if (ulFlags != 0)
3474 return CR_INVALID_FLAG;
3475
3476 if ((pulStatus == NULL) || (pulProblem == NULL))
3477 return CR_INVALID_POINTER;
3478
3479 if (!IsValidDeviceInstanceID(pDeviceID))
3480 return CR_INVALID_DEVINST;
3481
3482 ret = GetDeviceStatus(pDeviceID, pulStatus, pulProblem);
3483 if (ret != CR_SUCCESS)
3484 return ret;
3485
3486 /* Check for DN_REMOVABLE */
3487 ulTransferLength = sizeof(ulCapabilities);
3488 ulLength = sizeof(ulCapabilities);
3490 pDeviceID,
3492 &ulDataType,
3493 (PBYTE)&ulCapabilities,
3494 &ulTransferLength,
3495 &ulLength,
3496 0);
3497 if (ret != CR_SUCCESS)
3498 ulCapabilities = 0;
3499
3500 if (ulCapabilities & CM_DEVCAP_REMOVABLE)
3501 *pulStatus |= DN_REMOVABLE;
3502
3503 /* Check for DN_MANUAL */
3504 ulTransferLength = sizeof(ulConfigFlags);
3505 ulLength = sizeof(ulConfigFlags);
3507 pDeviceID,
3509 &ulDataType,
3510 (PBYTE)&ulConfigFlags,
3511 &ulTransferLength,
3512 &ulLength,
3513 0);
3514 if (ret != CR_SUCCESS)
3515 ulConfigFlags = 0;
3516
3517 if (ulConfigFlags & CONFIGFLAG_MANUAL_INSTALL)
3518 *pulStatus |= DN_MANUAL;
3519
3520 /* Check for failed install */
3521 if (((*pulStatus & DN_HAS_PROBLEM) == 0) && (ulConfigFlags & CONFIGFLAG_FAILEDINSTALL))
3522 {
3523 *pulStatus |= DN_HAS_PROBLEM;
3524 *pulProblem = CM_PROB_FAILED_INSTALL;
3525 }
3526
3527 return CR_SUCCESS;
3528}
3529
3530
3531/* Function 31 */
3532DWORD
3533WINAPI
3536 LPWSTR pDeviceID,
3537 DWORD ulProblem,
3538 DWORD ulFlags)
3539{
3540 ULONG ulOldStatus, ulOldProblem;
3542
3544
3545 DPRINT1("PNP_SetDeviceProblem(%p %S %lu 0x%08lx)\n",
3546 hBinding, pDeviceID, ulProblem, ulFlags);
3547
3548 if (ulFlags & ~CM_SET_DEVNODE_PROBLEM_BITS)
3549 return CR_INVALID_FLAG;
3550
3551 if (!IsValidDeviceInstanceID(pDeviceID))
3552 return CR_INVALID_DEVINST;
3553
3554 ret = GetDeviceStatus(pDeviceID,
3555 &ulOldStatus,
3556 &ulOldProblem);
3557 if (ret != CR_SUCCESS)
3558 return ret;
3559
3560 if (((ulFlags & CM_SET_DEVNODE_PROBLEM_OVERRIDE) == 0) &&
3561 (ulOldProblem != 0) &&
3562 (ulOldProblem != ulProblem))
3563 {
3564 return CR_FAILURE;
3565 }
3566
3567 if (ulProblem == 0)
3568 {
3569 ret = ClearDeviceStatus(pDeviceID,
3571 ulOldProblem);
3572 }
3573 else
3574 {
3575 ret = SetDeviceStatus(pDeviceID,
3577 ulProblem);
3578 }
3579
3580 return ret;
3581}
3582
3583
3584/* Function 32 */
3585DWORD
3586WINAPI
3589 LPWSTR pDeviceID,
3590 PPNP_VETO_TYPE pVetoType,
3591 LPWSTR pszVetoName,
3592 DWORD ulNameLength,
3593 DWORD ulFlags)
3594{
3596
3597 DPRINT1("PNP_DisableDevInst(%p %S %p %p %lu 0x%08lx)\n",
3598 hBinding, pDeviceID, pVetoType, pszVetoName, ulNameLength, ulFlags);
3599
3600 if (ulFlags & ~CM_DISABLE_BITS)
3601 return CR_INVALID_FLAG;
3602
3603 if (!IsValidDeviceInstanceID(pDeviceID) ||
3604 IsRootDeviceInstanceID(pDeviceID))
3605 return CR_INVALID_DEVINST;
3606
3607 return DisableDeviceInstance(pDeviceID,
3608 pVetoType,
3609 pszVetoName,
3610 ulNameLength);
3611}
3612
3613
3614/* Function 33 */
3615DWORD
3616WINAPI
3619 LPWSTR pDeviceID,
3620 DWORD ulFlags)
3621{
3624}
3625
3626
3627static BOOL
3629 LPWSTR lpDeviceId)
3630{
3631 LPWSTR lpPtr;
3633
3634 lpPtr = lpDeviceIdList;
3635 while (*lpPtr != 0)
3636 {
3637 dwLength = wcslen(lpPtr);
3638 if (0 == _wcsicmp(lpPtr, lpDeviceId))
3639 return TRUE;
3640
3641 lpPtr += (dwLength + 1);
3642 }
3643
3644 return FALSE;
3645}
3646
3647
3648static VOID
3649AppendDeviceId(LPWSTR lpDeviceIdList,
3650 LPDWORD lpDeviceIdListSize,
3651 LPWSTR lpDeviceId)
3652{
3653 DWORD dwLen;
3654 DWORD dwPos;
3655
3656 dwLen = wcslen(lpDeviceId);
3657 dwPos = (*lpDeviceIdListSize / sizeof(WCHAR)) - 1;
3658
3659 wcscpy(&lpDeviceIdList[dwPos], lpDeviceId);
3660
3661 dwPos += (dwLen + 1);
3662
3663 lpDeviceIdList[dwPos] = 0;
3664
3665 *lpDeviceIdListSize = dwPos * sizeof(WCHAR);
3666}
3667
3668
3669/* Function 34 */
3670DWORD
3671WINAPI
3674 LPWSTR pszDeviceID,
3675 LPWSTR pszID,
3676 DWORD ulFlags)
3677{
3679 HKEY hDeviceKey;
3680 LPWSTR pszSubKey;
3681 DWORD dwDeviceIdListSize;
3682 DWORD dwNewDeviceIdSize;
3683 WCHAR * pszDeviceIdList = NULL;
3684
3686
3687 DPRINT("PNP_AddID(%p %S %S 0x%08lx)\n",
3688 hBinding, pszDeviceID, pszID, ulFlags);
3689
3691 pszDeviceID,
3692 0,
3694 &hDeviceKey) != ERROR_SUCCESS)
3695 {
3696 DPRINT("Failed to open the device key!\n");
3697 return CR_INVALID_DEVNODE;
3698 }
3699
3700 pszSubKey = (ulFlags & CM_ADD_ID_COMPATIBLE) ? L"CompatibleIDs" : L"HardwareID";
3701
3702 if (RegQueryValueExW(hDeviceKey,
3703 pszSubKey,
3704 NULL,
3705 NULL,
3706 NULL,
3707 &dwDeviceIdListSize) != ERROR_SUCCESS)
3708 {
3709 DPRINT("Failed to query the desired ID string!\n");
3711 goto Done;
3712 }
3713
3714 dwNewDeviceIdSize = lstrlenW(pszDeviceID);
3715 if (!dwNewDeviceIdSize)
3716 {
3718 goto Done;
3719 }
3720
3721 dwDeviceIdListSize += (dwNewDeviceIdSize + 2) * sizeof(WCHAR);
3722
3723 pszDeviceIdList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwDeviceIdListSize);
3724 if (!pszDeviceIdList)
3725 {
3726 DPRINT("Failed to allocate memory for the desired ID string!\n");
3728 goto Done;
3729 }
3730
3731 if (RegQueryValueExW(hDeviceKey,
3732 pszSubKey,
3733 NULL,
3734 NULL,
3735 (LPBYTE)pszDeviceIdList,
3736 &dwDeviceIdListSize) != ERROR_SUCCESS)
3737 {
3738 DPRINT("Failed to query the desired ID string!\n");
3740 goto Done;
3741 }
3742
3743 /* Check whether the device ID is already in use */
3744 if (CheckForDeviceId(pszDeviceIdList, pszDeviceID))
3745 {
3746 DPRINT("Device ID was found in the ID string!\n");
3747 ret = CR_SUCCESS;
3748 goto Done;
3749 }
3750
3751 /* Append the Device ID */
3752 AppendDeviceId(pszDeviceIdList, &dwDeviceIdListSize, pszID);
3753
3754 if (RegSetValueExW(hDeviceKey,
3755 pszSubKey,
3756 0,
3758 (LPBYTE)pszDeviceIdList,
3759 dwDeviceIdListSize) != ERROR_SUCCESS)
3760 {
3761 DPRINT("Failed to set the desired ID string!\n");
3763 }
3764
3765Done:
3766 RegCloseKey(hDeviceKey);
3767 if (pszDeviceIdList)
3768 HeapFree(GetProcessHeap(), 0, pszDeviceIdList);
3769
3770 DPRINT("PNP_AddID() done (returns %lx)\n", ret);
3771
3772 return ret;
3773}
3774
3775
3776/* Function 35 */
3777DWORD
3778WINAPI
3781 LPWSTR pszDeviceID,
3782 DWORD ulFlags)
3783{
3784 DPRINT("PNP_RegisterDriver(%p %S 0x%lx)\n",
3785 hBinding, pszDeviceID, ulFlags);
3786
3787 if (ulFlags & ~CM_REGISTER_DEVICE_DRIVER_BITS)
3788 return CR_INVALID_FLAG;
3789
3790 if (!IsValidDeviceInstanceID(pszDeviceID))
3791 return CR_INVALID_DEVINST;
3792
3793 SetDeviceStatus(pszDeviceID, 0, 0);
3794
3795 return CR_SUCCESS;
3796}
3797
3798
3799/* Function 36 */
3800DWORD
3801WINAPI
3804 LPWSTR pszDeviceID,
3805 PPNP_VETO_TYPE pVetoType,
3806 LPWSTR pszVetoName,
3807 DWORD ulNameLength,
3808 DWORD ulFlags)
3809{
3813
3814 DPRINT1("PNP_QueryRemove(%p %S %p %p %lu 0x%lx)\n",
3815 hBinding, pszDeviceID, pVetoType, pszVetoName,
3816 ulNameLength, ulFlags);
3817
3818 if (ulFlags & ~CM_REMOVE_BITS)
3819 return CR_INVALID_FLAG;
3820
3821 if (!IsValidDeviceInstanceID(pszDeviceID) ||
3822 IsRootDeviceInstanceID(pszDeviceID))
3823 return CR_INVALID_DEVINST;
3824
3825 if (pVetoType != NULL)
3826 *pVetoType = PNP_VetoTypeUnknown;
3827
3828 if (pszVetoName != NULL && ulNameLength > 0)
3829 *pszVetoName = UNICODE_NULL;
3830
3831 RtlZeroMemory(&PlugPlayData, sizeof(PlugPlayData));
3833 pszDeviceID);
3834 PlugPlayData.VetoName = pszVetoName;
3835 PlugPlayData.NameLength = ulNameLength;
3836// PlugPlayData.Flags =
3837
3839 &PlugPlayData,
3840 sizeof(PlugPlayData));
3841 if (!NT_SUCCESS(Status))
3843
3844 return ret;
3845}
3846
3847
3848/* Function 37 */
3849DWORD
3850WINAPI
3853 LPWSTR pszDeviceID,
3854 PPNP_VETO_TYPE pVetoType,
3855 LPWSTR pszVetoName,
3856 DWORD ulNameLength,
3857 DWORD ulFlags)
3858{
3862
3863 DPRINT1("PNP_RequestDeviceEject(%p %S %p %p %lu 0x%lx)\n",
3864 hBinding, pszDeviceID, pVetoType, pszVetoName,
3865 ulNameLength, ulFlags);
3866
3867 if (ulFlags != 0)
3868 return CR_INVALID_FLAG;
3869
3870 if (!IsValidDeviceInstanceID(pszDeviceID))
3871 return CR_INVALID_DEVINST;
3872
3873 if (pVetoType != NULL)
3874 *pVetoType = PNP_VetoTypeUnknown;
3875
3876 if (pszVetoName != NULL && ulNameLength > 0)
3877 *pszVetoName = UNICODE_NULL;
3878
3879 RtlZeroMemory(&PlugPlayData, sizeof(PlugPlayData));
3881 pszDeviceID);
3882 PlugPlayData.VetoName = pszVetoName;
3883 PlugPlayData.NameLength = ulNameLength;
3884// PlugPlayData.Flags =
3885
3887 &PlugPlayData,
3888 sizeof(PlugPlayData));
3889 if (!NT_SUCCESS(Status))
3891
3892 return ret;
3893}
3894
3895
3896/* Function 38 */
3898WINAPI
3901 BOOL *Present)
3902{
3903 HKEY hKey;
3904 DWORD dwType;
3905 DWORD dwValue;
3906 DWORD dwSize;
3908
3910
3911 DPRINT1("PNP_IsDockStationPresent(%p %p)\n",
3912 hBinding, Present);
3913
3914 *Present = FALSE;
3915
3917 L"CurrentDockInfo",
3918 0,
3919 KEY_READ,
3920 &hKey) != ERROR_SUCCESS)
3921 return CR_REGISTRY_ERROR;
3922
3923 dwSize = sizeof(DWORD);
3925 L"DockingState",
3926 NULL,
3927 &dwType,
3928 (LPBYTE)&dwValue,
3929 &dwSize) != ERROR_SUCCESS)
3931
3933
3934 if (ret == CR_SUCCESS)
3935 {
3936 if (dwType != REG_DWORD || dwSize != sizeof(DWORD))
3937 {
3939 }
3940 else if (dwValue != 0)
3941 {
3942 *Present = TRUE;
3943 }
3944 }
3945
3946 DPRINT1("PNP_IsDockStationPresent() done (returns %lx)\n", ret);
3947
3948 return ret;
3949}
3950
3951
3952/* Function 39 */
3953DWORD
3954WINAPI
3957{
3958 WCHAR szDockDeviceInstance[MAX_DEVICE_ID_LEN];
3961
3962 DPRINT("PNP_RequestEjectPC(%p)\n", hBinding);
3963
3964 /* Retrieve the dock device */
3965 DockData.DeviceInstanceLength = ARRAYSIZE(szDockDeviceInstance);
3966 DockData.DeviceInstance = szDockDeviceInstance;
3967
3969 &DockData,
3970 sizeof(DockData));
3971 if (!NT_SUCCESS(Status))
3972 return NtStatusToCrError(Status);
3973
3974 /* Eject the dock device */
3976 szDockDeviceInstance,
3977 NULL,
3978 NULL,
3979 0,
3980 0);
3981}
3982
3983
3984/* Function 40 */
3985DWORD
3986WINAPI
3989 DWORD ulAction,
3990 LPWSTR pDeviceID,
3991 DWORD ulConfig,
3992 DWORD *pulValue,
3993 PPNP_VETO_TYPE pVetoType,
3994 LPWSTR pszVetoName,
3995 DWORD ulNameLength,
3996 DWORD ulFlags)
3997{
3999 WCHAR szKeyName[MAX_PATH];
4000 HKEY hKey;
4001 HKEY hDeviceKey;
4002 DWORD dwSize;
4003
4005
4006 DPRINT("PNP_HwProfFlags() called\n");
4007
4008 if (!IsValidDeviceInstanceID(pDeviceID))
4009 return CR_INVALID_DEVINST;
4010
4011 if (ulConfig == 0)
4012 {
4013 wcscpy(szKeyName,
4014 L"System\\CurrentControlSet\\HardwareProfiles\\Current\\System\\CurrentControlSet\\Enum");
4015 }
4016 else
4017 {
4018 swprintf(szKeyName,
4019 L"System\\CurrentControlSet\\HardwareProfiles\\%04lu\\System\\CurrentControlSet\\Enum",
4020 ulConfig);
4021 }
4022
4024 szKeyName,
4025 0,
4027 &hKey) != ERROR_SUCCESS)
4028 return CR_REGISTRY_ERROR;
4029
4030 if (ulAction == PNP_GET_HWPROFFLAGS)
4031 {
4032 if (RegOpenKeyExW(hKey,
4033 pDeviceID,
4034 0,
4036 &hDeviceKey) != ERROR_SUCCESS)
4037 {
4038 *pulValue = 0;
4039 }
4040 else
4041 {
4042 dwSize = sizeof(DWORD);
4043 if (RegQueryValueExW(hDeviceKey,
4044 L"CSConfigFlags",
4045 NULL,
4046 NULL,
4047 (LPBYTE)pulValue,
4048 &dwSize) != ERROR_SUCCESS)
4049 {
4050 *pulValue = 0;
4051 }
4052
4053 RegCloseKey(hDeviceKey);
4054 }
4055 }
4056 else if (ulAction == PNP_SET_HWPROFFLAGS)
4057 {
4058 /* FIXME: not implemented yet */
4060 }
4061
4063
4064 return ret;
4065}
4066
4067
4068/* Function 41 */
4069DWORD
4070WINAPI
4073 DWORD ulIndex,
4074 HWPROFILEINFO *pHWProfileInfo,
4075 DWORD ulProfileInfoSize,
4076 DWORD ulFlags)
4077{
4078 WCHAR szProfileName[5];
4079 HKEY hKeyConfig = NULL;
4080 HKEY hKeyProfiles = NULL;
4081 HKEY hKeyProfile = NULL;
4082 DWORD dwDisposition;
4083 DWORD dwSize;
4084 LONG lError;
4086
4088
4089 DPRINT("PNP_GetHwProfInfo() called\n");
4090
4091 if (ulProfileInfoSize == 0)
4092 {
4094 goto done;
4095 }
4096
4097 if (ulFlags != 0)
4098 {
4100 goto done;
4101 }
4102
4103 /* Initialize the profile information */
4104 pHWProfileInfo->HWPI_ulHWProfile = 0;
4105 pHWProfileInfo->HWPI_szFriendlyName[0] = 0;
4106 pHWProfileInfo->HWPI_dwFlags = 0;
4107
4108 /* Open the 'IDConfigDB' key */
4110 L"System\\CurrentControlSet\\Control\\IDConfigDB",
4111 0,
4112 NULL,
4115 NULL,
4116 &hKeyConfig,
4117 &dwDisposition);
4118 if (lError != ERROR_SUCCESS)
4119 {
4121 goto done;
4122 }
4123
4124 /* Open the 'Hardware Profiles' subkey */
4125 lError = RegCreateKeyExW(hKeyConfig,
4126 L"Hardware Profiles",
4127 0,
4128 NULL,
4131 NULL,
4132 &hKeyProfiles,
4133 &dwDisposition);
4134 if (lError != ERROR_SUCCESS)
4135 {
4137 goto done;
4138 }
4139
4140 if (ulIndex == (ULONG)-1)
4141 {
4142 dwSize = sizeof(ULONG);
4143 lError = RegQueryValueExW(hKeyConfig,
4144 L"CurrentConfig",
4145 NULL,
4146 NULL,
4147 (LPBYTE)&pHWProfileInfo->HWPI_ulHWProfile,
4148 &dwSize);
4149 if (lError != ERROR_SUCCESS)
4150 {
4151 pHWProfileInfo->HWPI_ulHWProfile = 0;
4153 goto done;
4154 }
4155 }
4156 else
4157 {
4158 /* FIXME: not implemented yet */
4160 goto done;
4161 }
4162
4163 swprintf(szProfileName, L"%04lu", pHWProfileInfo->HWPI_ulHWProfile);
4164
4165 lError = RegOpenKeyExW(hKeyProfiles,
4166 szProfileName,
4167 0,
4169 &hKeyProfile);
4170 if (lError != ERROR_SUCCESS)
4171 {
4173 goto done;
4174 }
4175
4176 dwSize = sizeof(pHWProfileInfo->HWPI_szFriendlyName);
4177 lError = RegQueryValueExW(hKeyProfile,
4178 L"FriendlyName",
4179 NULL,
4180 NULL,
4181 (LPBYTE)&pHWProfileInfo->HWPI_szFriendlyName,
4182 &dwSize);
4183 if (lError != ERROR_SUCCESS)
4184 {
4186 goto done;
4187 }
4188
4189done:
4190 if (hKeyProfile != NULL)
4191 RegCloseKey(hKeyProfile);
4192
4193 if (hKeyProfiles != NULL)
4194 RegCloseKey(hKeyProfiles);
4195
4196 if (hKeyConfig != NULL)
4197 RegCloseKey(hKeyConfig);
4198
4199 return ret;
4200}
4201
4202
4203/* Function 42 */
4204DWORD
4205WINAPI
4208 LPWSTR pDeviceID,
4209 DWORD ulPriority,
4210 DWORD *pulLogConfTag,
4211 DWORD ulFlags)
4212{
4213 HKEY hConfigKey = NULL;
4214 DWORD RegDataType = 0;
4215 ULONG ulDataSize = 0, ulNewSize = 0;
4216 PBYTE pDataBuffer = NULL;
4217 WCHAR szValueNameBuffer[LOGCONF_NAME_BUFFER_SIZE];
4219
4220 DPRINT("PNP_AddEmptyLogConf(%p %S %lu %p 0x%08lx)\n",
4221 hBinding, pDeviceID, ulPriority, pulLogConfTag, ulFlags);
4222
4223 if (pulLogConfTag == NULL)
4224 return CR_INVALID_POINTER;
4225
4226 *pulLogConfTag = 0;
4227
4228 if (ulFlags & ~(LOG_CONF_BITS | PRIORITY_BIT))
4229 return CR_INVALID_FLAG;
4230
4231 if (!IsValidDeviceInstanceID(pDeviceID) || IsRootDeviceInstanceID(pDeviceID))
4232 return CR_INVALID_DEVNODE;
4233
4234 ret = OpenConfigurationKey(pDeviceID,
4235 ulFlags & LOG_CONF_BITS,
4236 &hConfigKey);
4237 if (ret != CR_SUCCESS)
4238 {
4239 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4241 goto done;
4242 }
4243
4244 ret = GetConfigurationData(hConfigKey,
4245 ulFlags & LOG_CONF_BITS,
4246 &RegDataType,
4247 &ulDataSize,
4248 &pDataBuffer,
4250 szValueNameBuffer);
4251
4252 if (ret != CR_SUCCESS || ulDataSize == 0)
4253 {
4254 ret = CR_SUCCESS;
4255
4256 if (RegDataType == REG_RESOURCE_LIST)
4257 {
4258 PCM_RESOURCE_LIST pResourceList = NULL;
4260
4261 /* Allocate a buffer for the new configuration */
4262 ulDataSize = sizeof(CM_RESOURCE_LIST) - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
4263 pDataBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulDataSize);
4264 if (pDataBuffer == NULL)
4265 {
4267 goto done;
4268 }
4269
4270 pResourceList = (PCM_RESOURCE_LIST)pDataBuffer;
4271 pResourceList->Count = 1;
4272
4273 pResource = (PCM_FULL_RESOURCE_DESCRIPTOR)&pResourceList->List[0];
4275 pResource->BusNumber = 0;
4276 pResource->PartialResourceList.Version = 1;
4277 pResource->PartialResourceList.Revision = 1;
4278 pResource->PartialResourceList.Count = 0;
4279 }
4280 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4281 {
4282 PIO_RESOURCE_REQUIREMENTS_LIST pRequirementsList = NULL;
4283 PIO_RESOURCE_LIST pResourceList = NULL;
4284
4285 ulDataSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
4286 pDataBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulDataSize);
4287 if (pDataBuffer == NULL)
4288 {
4290 goto done;
4291 }
4292
4293 pRequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)pDataBuffer;
4294 pRequirementsList->ListSize = ulDataSize;
4295 pRequirementsList->InterfaceType = InterfaceTypeUndefined;
4296 pRequirementsList->BusNumber = 0;
4297 pRequirementsList->SlotNumber = 0;
4298 pRequirementsList->AlternativeLists = 1;
4299
4300 pResourceList = (PIO_RESOURCE_LIST)&pRequirementsList->List[0];
4301 pResourceList->Version = 1;
4302 pResourceList->Revision = 1;
4303 pResourceList->Count = 1;
4304
4305 pResourceList->Descriptors[0].Option = IO_RESOURCE_PREFERRED;
4306 pResourceList->Descriptors[0].Type = CmResourceTypeConfigData;
4307 pResourceList->Descriptors[0].u.ConfigData.Priority = ulPriority;
4308 }
4309 else
4310 {
4311 ret = CR_FAILURE;
4312 goto done;
4313 }
4314 }
4315 else
4316 {
4317 if (RegDataType == REG_RESOURCE_LIST)
4318 {
4319 PCM_RESOURCE_LIST pResourceList = NULL;
4321 ULONG ulIndex;
4322
4323 /* Reallocate a larger buffer in order to add the new configuration */
4324 ulNewSize = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
4325 pDataBuffer = HeapReAlloc(GetProcessHeap(),
4326 0,
4327 pDataBuffer,
4328 ulDataSize + ulNewSize);
4329 if (pDataBuffer == NULL)
4330 {
4332 goto done;
4333 }
4334
4335 pResourceList = (PCM_RESOURCE_LIST)pDataBuffer;
4336
4337 /* Get a pointer to the new (uninitialized) resource descriptor */
4338 pResource = (PCM_FULL_RESOURCE_DESCRIPTOR)&pResourceList->List[0];
4339 for (ulIndex = 0; ulIndex < pResourceList->Count; ulIndex++)
4340 pResource = NextResourceDescriptor(pResource);
4341
4342 /* Initialize the new resource descriptor */
4343 pResourceList->Count++;
4345 pResource->BusNumber = 0;
4346 pResource->PartialResourceList.Version = 1;
4347 pResource->PartialResourceList.Revision = 1;
4348 pResource->PartialResourceList.Count = 0;
4349
4350 *pulLogConfTag = ulIndex;
4351 }
4352 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4353 {
4354 /* FIXME */
4355 }
4356 else
4357 {
4358 ret = CR_FAILURE;
4359 goto done;
4360 }
4361 }
4362
4363 /* Store the configuration */
4364 if (RegSetValueEx(hConfigKey,
4365 szValueNameBuffer,
4366 0,
4367 RegDataType,
4368 pDataBuffer,
4369 ulDataSize + ulNewSize) != ERROR_SUCCESS)
4370 {
4372 goto done;
4373 }
4374
4375done:
4376 if (pDataBuffer != NULL)
4377 HeapFree(GetProcessHeap(), 0, pDataBuffer);
4378
4379 if (hConfigKey != NULL)
4380 RegCloseKey(hConfigKey);
4381
4382 DPRINT("PNP_AddEmptyLogConf() returns %lu\n", ret);
4383
4384 return ret;
4385}
4386
4387
4388/* Function 43 */
4389DWORD
4390WINAPI
4393 LPWSTR pDeviceID,
4394 DWORD ulLogConfType,
4395 DWORD ulLogConfTag,
4396 DWORD ulFlags)
4397{
4398 HKEY hConfigKey = NULL;
4399 DWORD RegDataType = 0;
4400 ULONG ulDataSize = 0;
4401 LPBYTE pDataBuffer = NULL;
4402 WCHAR szValueNameBuffer[LOGCONF_NAME_BUFFER_SIZE];
4404
4405 DPRINT("PNP_FreeLogConf(%p %S %lu %lu 0x%08lx)\n",
4406 hBinding, pDeviceID, ulLogConfType, ulLogConfTag, ulFlags);
4407
4408 if (ulFlags != 0)
4409 return CR_INVALID_FLAG;
4410
4411 if (!IsValidDeviceInstanceID(pDeviceID))
4412 return CR_INVALID_DEVNODE;
4413
4414 ret = OpenConfigurationKey(pDeviceID,
4415 ulLogConfType,
4416 &hConfigKey);
4417 if (ret != CR_SUCCESS)
4418 {
4419 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4421 goto done;
4422 }
4423
4424 ret = GetConfigurationData(hConfigKey,
4425 ulLogConfType,
4426 &RegDataType,
4427 &ulDataSize,
4428 &pDataBuffer,
4430 szValueNameBuffer);
4431 if (ret != CR_SUCCESS)
4432 {
4434 goto done;
4435 }
4436
4437 if (RegDataType == REG_RESOURCE_LIST)
4438 {
4439 if (((PCM_RESOURCE_LIST)pDataBuffer)->Count <= 1)
4440 {
4441 /* Delete the key if there is only one or no configuration in the key */
4442 DPRINT("Delete value %S\n", szValueNameBuffer);
4443 RegDeleteValue(hConfigKey, szValueNameBuffer);
4444 }
4445 else
4446 {
4447 /* FIXME */
4448 }
4449 }
4450 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4451 {
4452 if (((PIO_RESOURCE_REQUIREMENTS_LIST)pDataBuffer)->AlternativeLists <= 1)
4453 {
4454 /* Delete the key if there is only one or no configuration in the key */
4455 DPRINT("Delete value %S\n", szValueNameBuffer);
4456 RegDeleteValue(hConfigKey, szValueNameBuffer);
4457 }
4458 else
4459 {
4460 /* FIXME */
4461 }
4462 }
4463 else
4464 {
4465 ret = CR_FAILURE;
4466 goto done;
4467 }
4468
4469done:
4470 if (pDataBuffer != NULL)
4471 HeapFree(GetProcessHeap(), 0, pDataBuffer);
4472
4473 if (hConfigKey != NULL)
4474 RegCloseKey(hConfigKey);
4475
4476 DPRINT("PNP_FreeLogConf() returns %lu\n", ret);
4477
4478 return ret;
4479}
4480
4481
4482/* Function 44 */
4483DWORD
4484WINAPI
4487 LPWSTR pDeviceID,
4488 DWORD ulLogConfType,
4489 DWORD *pulLogConfTag,
4490 DWORD ulFlags)
4491{
4492 HKEY hConfigKey = NULL;
4493 DWORD RegDataType = 0;
4494 ULONG ulDataSize = 0;
4495 LPBYTE lpData = NULL;
4497
4498 DPRINT("PNP_GetFirstLogConf(%p %S %lu %p 0x%08lx)\n",
4499 hBinding, pDeviceID, ulLogConfType, pulLogConfTag, ulFlags);
4500
4501 if (pulLogConfTag == NULL)
4502 return CR_INVALID_POINTER;
4503
4504 *pulLogConfTag = (DWORD)0;
4505
4506 if (ulFlags & ~LOG_CONF_BITS)
4507 return CR_INVALID_FLAG;
4508
4509 if (!IsValidDeviceInstanceID(pDeviceID))
4510 return CR_INVALID_DEVINST;
4511
4512 ret = OpenConfigurationKey(pDeviceID,
4513 ulLogConfType,
4514 &hConfigKey);
4515 if (ret != CR_SUCCESS)
4516 {
4517 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4519 goto done;
4520 }
4521
4522 ret = GetConfigurationData(hConfigKey,
4523 ulLogConfType,
4524 &RegDataType,
4525 &ulDataSize,
4526 &lpData,
4527 0,
4528 NULL);
4529 if (ret != CR_SUCCESS)
4530 {
4531 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4533 goto done;
4534 }
4535
4536 DPRINT1("Data size %lu\n", ulDataSize);
4537 if (ulDataSize == 0 || lpData == NULL)
4538 {
4539 DPRINT1("No config data available!\n");
4541 goto done;
4542 }
4543
4544 /* Get the first tag */
4545 if (RegDataType == REG_RESOURCE_LIST)
4546 {
4547 DPRINT("REG_RESOURCE_LIST->Count %lu\n", ((PCM_RESOURCE_LIST)lpData)->Count);
4548
4549 /* Fail, if we do not have any resource */
4550 if (((PCM_RESOURCE_LIST)lpData)->Count == 0)
4551 {
4552 DPRINT1("No resource descriptors!\n");
4554 goto done;
4555 }
4556 }
4557 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4558 {
4559 DPRINT("REG_RESOURCE_REQUIREMENTS_LIST->AlternativeLists %lu\n",
4560 ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists);
4561
4562 /* Fail, if we do not have any requirements */
4563 if (((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists == 0)
4564 {
4566 goto done;
4567 }
4568 }
4569
4570done:
4571 if (lpData != NULL)
4572 HeapFree(GetProcessHeap(), 0, lpData);
4573
4574 if (hConfigKey != NULL)
4575 RegCloseKey(hConfigKey);
4576
4577 DPRINT("PNP_GetFirstLogConf() returns %lu\n", ret);
4578
4579 return ret;
4580}
4581
4582
4583/* Function 45 */
4584DWORD
4585WINAPI
4588 LPWSTR pDeviceID,
4589 DWORD ulLogConfType,
4590 DWORD ulCurrentTag,
4591 DWORD *pulNextTag,
4592 DWORD ulFlags)
4593{
4594 HKEY hConfigKey = NULL;
4595 DWORD RegDataType = 0;
4596 ULONG ulDataSize = 0;
4597 LPBYTE lpData = NULL;
4599
4600 DPRINT("PNP_GetNextLogConf(%p %S %lu %ul %p 0x%08lx)\n",
4601 hBinding, pDeviceID, ulLogConfType, ulCurrentTag, pulNextTag, ulFlags);
4602
4603 if (pulNextTag == NULL)
4604 return CR_INVALID_POINTER;
4605
4606 *pulNextTag = (DWORD)0;
4607
4608 if (ulFlags != 0)
4609 return CR_INVALID_FLAG;
4610
4611 if (!IsValidDeviceInstanceID(pDeviceID))
4612 return CR_INVALID_DEVINST;
4613
4614 ret = OpenConfigurationKey(pDeviceID,
4615 ulLogConfType,
4616 &hConfigKey);
4617 if (ret != CR_SUCCESS)
4618 {
4619 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4621 goto done;
4622 }
4623
4624 ret = GetConfigurationData(hConfigKey,
4625 ulLogConfType,
4626 &RegDataType,
4627 &ulDataSize,
4628 &lpData,
4629 0,
4630 NULL);
4631 if (ret != CR_SUCCESS)
4632 {
4633 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4635 goto done;
4636 }
4637
4638 DPRINT("Data size %lu\n", ulDataSize);
4639
4640 if (ulDataSize == 0 || lpData == NULL)
4641 {
4642 DPRINT1("No config data available!\n");
4644 goto done;
4645 }
4646
4647 /* Check if the next entry is available */
4648 if (RegDataType == REG_RESOURCE_LIST)
4649 {
4650 DPRINT("REG_RESOURCE_LIST->Count %lu\n", ((PCM_RESOURCE_LIST)lpData)->Count);
4651
4652 /* Fail, if we are beyond the end of the list */
4653 if (ulCurrentTag >= ((PCM_RESOURCE_LIST)lpData)->Count)
4654 {
4656 goto done;
4657 }
4658
4659 /* Indicate that we reached the end of the list */
4660 if (ulCurrentTag == ((PCM_RESOURCE_LIST)lpData)->Count - 1)
4661 {
4663 goto done;
4664 }
4665 }
4666 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4667 {
4668 DPRINT("REG_RESOURCE_REQUIREMENTS_LIST->AlternativeLists %lu\n",
4669 ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists);
4670
4671 /* Fail, if we are beyond the end of the list */
4672 if (ulCurrentTag >= ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists)
4673 {
4675 goto done;
4676 }
4677
4678 /* Indicate that we reached the end of the list */
4679 if (ulCurrentTag == ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists - 1)
4680 {
4682 goto done;
4683 }
4684 }
4685
4686 /* Return the next tag value */
4687 *pulNextTag = ulCurrentTag + 1;
4688
4689done:
4690 if (lpData != NULL)
4691 HeapFree(GetProcessHeap(), 0, lpData);
4692
4693 if (hConfigKey != NULL)
4694 RegCloseKey(hConfigKey);
4695
4696 DPRINT("PNP_GetNextLogConf() returns %lu\n", ret);
4697
4698 return ret;
4699}
4700
4701
4702/* Function 46 */
4703DWORD
4704WINAPI
4707 LPWSTR pDeviceID,
4708 DWORD ulType,
4709 DWORD ulTag,
4710 DWORD *pPriority,
4711 DWORD ulFlags)
4712{
4715}
4716
4717
4718/* Function 47 */
4719DWORD
4720WINAPI
4723 LPWSTR pDeviceID,
4724 DWORD ulLogConfTag,
4725 DWORD ulLogConfType,
4726 RESOURCEID ResourceID,
4727 DWORD *pulResourceTag,
4728 BYTE *ResourceData,
4729 PNP_RPC_BUFFER_SIZE ResourceLen,
4730 DWORD ulFlags)
4731{
4734}
4735
4736
4737/* Function 48 */
4738DWORD
4739WINAPI
4742 LPWSTR pDeviceID,
4743 DWORD ulLogConfTag,
4744 DWORD ulLogConfType,
4745 RESOURCEID ResourceID,
4746 DWORD ulResourceTag,
4747 DWORD *pulPreviousResType,
4748 DWORD *pulPreviousResTag,
4749 DWORD ulFlags)
4750{
4753}
4754
4755
4756/* Function 49 */
4757DWORD
4758WINAPI
4761 LPWSTR pDeviceID,
4762 DWORD ulLogConfTag,
4763 DWORD ulLogConfType,
4764 RESOURCEID ResourceID,
4765 DWORD ulResourceTag,
4766 DWORD *pulNextResType,
4767 DWORD *pulNextResTag,
4768 DWORD ulFlags)
4769{
4770 HKEY hConfigKey = NULL;
4771 DWORD RegDataType = 0;
4772 ULONG ulDataSize = 0;
4773 LPBYTE lpData = NULL;
4775
4776 DPRINT1("PNP_GetNextResDes(%p %S 0x%lx %lu %lu %ul %p %p 0x%08lx)\n",
4777 hBinding, pDeviceID, ulLogConfTag, ulLogConfType, ResourceID,
4778 ulResourceTag, pulNextResType, pulNextResTag, ulFlags);
4779
4780 if (pulNextResType == NULL)
4781 return CR_INVALID_POINTER;
4782
4783 *pulNextResType = 0;
4784
4785 if (ulFlags != 0)
4786 return CR_INVALID_FLAG;
4787
4788 if (!IsValidDeviceInstanceID(pDeviceID))
4789 return CR_INVALID_DEVINST;
4790
4791 ret = OpenConfigurationKey(pDeviceID,
4792 ulLogConfType,
4793 &hConfigKey);
4794 if (ret != CR_SUCCESS)
4795 {
4796 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4798 goto done;
4799 }
4800
4801 ret = GetConfigurationData(hConfigKey,
4802 ulLogConfType,
4803 &RegDataType,
4804 &ulDataSize,
4805 &lpData,
4806 0,
4807 NULL);
4808 if (ret != CR_SUCCESS)
4809 {
4810 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4812 goto done;
4813 }
4814
4815 DPRINT1("Data size %lu\n", ulDataSize);
4816
4817 if (ulDataSize == 0 || lpData == NULL)
4818 {
4819 DPRINT1("No config data available!\n");
4821 goto done;
4822 }
4823
4824 /* Get the next resource descriptor */
4825 if (RegDataType == REG_RESOURCE_LIST)
4826 {
4827 DPRINT1("FIXME: REG_RESOURCE_LIST\n");
4828 /* FIXME */
4830 goto done;
4831 }
4832 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4833 {
4834 DPRINT1("FIXME: REG_RESOURCE_REQUIREMENTS_LIST\n");
4835 /* FIXME */
4837 goto done;
4838 }
4839
4840done:
4841 if (lpData != NULL)
4842 HeapFree(GetProcessHeap(), 0, lpData);
4843
4844 if (hConfigKey != NULL)
4845 RegCloseKey(hConfigKey);
4846
4847 DPRINT1("PNP_GetNextResDes() returns %lu\n", ret);
4848
4849 return ret;
4850}
4851
4852
4853/* Function 50 */
4854DWORD
4855WINAPI
4858 LPWSTR pDeviceID,
4859 DWORD ulLogConfTag,
4860 DWORD ulLogConfType,
4861 RESOURCEID ResourceID,
4862 DWORD ulResourceTag,
4863 BYTE *Buffer,
4864 PNP_RPC_BUFFER_SIZE BufferLen,
4865 DWORD ulFlags)
4866{
4869}
4870
4871
4872/* Function 51 */
4873DWORD
4874WINAPI
4877 LPWSTR pDeviceID,
4878 DWORD ulLogConfTag,
4879 DWORD ulLogConfType,
4880 RESOURCEID ResourceID,
4881 DWORD ulResourceTag,
4882 DWORD *pulSize,
4883 DWORD ulFlags)
4884{
4887}
4888
4889
4890/* Function 52 */
4891DWORD
4892WINAPI
4895 LPWSTR pDeviceID,
4896 DWORD ulLogConfTag,
4897 DWORD ulLogConfType,
4898 RESOURCEID CurrentResourceID,
4899 RESOURCEID NewResourceID,
4900 DWORD ulResourceTag,
4901 BYTE *ResourceData,
4902 PNP_RPC_BUFFER_SIZE ResourceLen,
4903 DWORD ulFlags)
4904{
4907}
4908
4909
4910/* Function 53 */
4911DWORD
4912WINAPI
4915 LPWSTR pDeviceID,
4916 RESOURCEID ResourceID,
4917 BYTE *ResourceData,
4918 PNP_RPC_BUFFER_SIZE ResourceLen,
4919 BOOL *pbConflictDetected,
4920 DWORD ulFlags)
4921{
4922 DPRINT("PNP_DetectResourceConflict()\n");
4923
4924 if (pbConflictDetected != NULL)
4925 *pbConflictDetected = FALSE;
4926
4928}
4929
4930
4931/* Function 54 */
4932DWORD
4933WINAPI
4936 LPWSTR pDeviceID,
4937 RESOURCEID ResourceID,
4938 BYTE *ResourceData,
4939 PNP_RPC_BUFFER_SIZE ResourceLen,
4940 BYTE *Buffer,
4941 PNP_RPC_BUFFER_SIZE BufferLen,
4942 DWORD ulFlags)
4943{
4946}
4947
4948
4949/* Function 55 */
4950DWORD
4951WINAPI
4954 DWORD ulHardwareProfile,
4955 DWORD ulFlags)
4956{
4958}
4959
4960
4961/* Function 56 */
4962DWORD
4963WINAPI
4966 BYTE *pData,
4967 DWORD DataLen,
4968 LPWSTR pDeviceID,
4969 RESOURCEID ResourceID,
4970 DWORD ulFlags)
4971{
4973}
4974
4975
4976/* Function 57 */
4977DWORD
4978WINAPI
4981 DWORD *pulSize,
4982 LPWSTR pDeviceID,
4983 RESOURCEID ResourceID,
4984 DWORD ulFlags)
4985{
4986 if (pulSize != NULL)
4987 *pulSize = 0;
4988
4990}
4991
4992
4993/* Function 58 */
4995WINAPI
4998 DWORD ulFlags)
4999{
5001}
5002
5003
5004/* Function 59 */
5005DWORD
5006WINAPI
5009 DWORD_PTR hRecipient,
5010 LPWSTR pszName,
5011 BYTE *pNotificationFilter,
5012 DWORD ulNotificationFilterSize,
5013 DWORD ulFlags,
5014 PNP_NOTIFY_HANDLE *pNotifyHandle,
5015 DWORD ulProcessId,
5016 DWORD *pulUnknown9)
5017{
5018 PDEV_BROADCAST_DEVICEINTERFACE_W pBroadcastDeviceInterface;
5019 PDEV_BROADCAST_HANDLE pBroadcastDeviceHandle;
5020 PNOTIFY_ENTRY pNotifyData = NULL;
5021
5022 DPRINT1("PNP_RegisterNotification(%p %p '%S' %p %lu 0x%lx %p %lx %p)\n",
5023 hBinding, hRecipient, pszName, pNotificationFilter,
5024 ulNotificationFilterSize, ulFlags, pNotifyHandle, ulProcessId, pulUnknown9);
5025
5026 if (pNotifyHandle == NULL)
5027 return CR_INVALID_POINTER;
5028
5029 *pNotifyHandle = NULL;
5030
5031 if (pNotificationFilter == NULL ||
5032 pulUnknown9 == NULL)
5033 return CR_INVALID_POINTER;
5034
5035 if (ulFlags & ~0x7)
5036 return CR_INVALID_FLAG;
5037
5038 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_HDR)) ||
5039 (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_size < sizeof(DEV_BROADCAST_HDR)))
5040 return CR_INVALID_DATA;
5041
5042 if (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
5043 {
5044 DPRINT1("DBT_DEVTYP_DEVICEINTERFACE\n");
5045 pBroadcastDeviceInterface = (PDEV_BROADCAST_DEVICEINTERFACE_W)pNotificationFilter;
5046
5047 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_DEVICEINTERFACE_W)) ||
5048 (pBroadcastDeviceInterface->dbcc_size < sizeof(DEV_BROADCAST_DEVICEINTERFACE_W)))
5049 return CR_INVALID_DATA;
5050
5052 if (pNotifyData == NULL)
5053 return CR_OUT_OF_MEMORY;
5054
5055 if (pszName != NULL)
5056 {
5057 pNotifyData->pszName = RtlAllocateHeap(GetProcessHeap(),
5059 (wcslen(pszName) + 1) * sizeof(WCHAR));
5060 if (pNotifyData->pszName == NULL)
5061 {
5062 RtlFreeHeap(GetProcessHeap(), 0, pNotifyData);
5063 return CR_OUT_OF_MEMORY;
5064 }
5065 }
5066
5067 /* Add the entry to the notification list */
5069
5070 DPRINT("pNotifyData: %p\n", pNotifyData);
5071 *pNotifyHandle = (PNP_NOTIFY_HANDLE)pNotifyData;
5072 }
5073 else if (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype == DBT_DEVTYP_HANDLE)
5074 {
5075 DPRINT1("DBT_DEVTYP_HANDLE\n");
5076 pBroadcastDeviceHandle = (PDEV_BROADCAST_HANDLE)pNotificationFilter;
5077
5078 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_HANDLE)) ||
5079 (pBroadcastDeviceHandle->dbch_size < sizeof(DEV_BROADCAST_HANDLE)))
5080 return CR_INVALID_DATA;
5081
5082 if (ulFlags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
5083 return CR_INVALID_FLAG;
5084 }
5085 else
5086 {
5087 DPRINT1("Invalid device type %lu\n", ((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype);
5088 return CR_INVALID_DATA;
5089 }
5090
5091 return CR_SUCCESS;
5092}
5093
5094
5095/* Function 60 */
5096DWORD
5097WINAPI
5100 PNP_NOTIFY_HANDLE *pNotifyHandle)
5101{
5103
5104 DPRINT1("PNP_UnregisterNotification(%p %p)\n",
5105 hBinding, pNotifyHandle);
5106
5107 pEntry = (PNOTIFY_ENTRY)*pNotifyHandle;
5108 if (pEntry == NULL)
5109 return CR_INVALID_DATA;
5110
5111 RemoveEntryList(&pEntry->ListEntry);
5112 if (pEntry->pszName)
5113 RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry->pszName);
5114 RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry);
5115 *pNotifyHandle = NULL;
5116
5117 return CR_SUCCESS;
5118}
5119
5120
5121/* Function 61 */
5122DWORD
5123WINAPI
5126 LPWSTR pDeviceID,
5127 LPWSTR CustomPropName,
5128 DWORD *pulRegDataType,
5129 BYTE *Buffer,
5130 PNP_RPC_STRING_LEN *pulTransferLen,
5131 PNP_RPC_STRING_LEN *pulLength,
5132 DWORD ulFlags)
5133{
5134 HKEY hDeviceKey = NULL;
5135 HKEY hParamKey = NULL;
5136 LONG lError;
5138
5140
5141 DPRINT("PNP_GetCustomDevProp() called\n");
5142
5143 if (pulTransferLen == NULL || pulLength == NULL)
5144 {
5146 goto done;
5147 }
5148
5149 if (ulFlags & ~CM_CUSTOMDEVPROP_BITS)
5150 {
5152 goto done;
5153 }
5154
5155 if (!IsValidDeviceInstanceID(pDeviceID))
5156 return CR_INVALID_DEVINST;
5157
5158 if (*pulLength < *pulTransferLen)
5159 *pulLength = *pulTransferLen;
5160
5161 *pulTransferLen = 0;
5162
5163 lError = RegOpenKeyExW(hEnumKey,
5164 pDeviceID,
5165 0,
5166 KEY_READ,
5167 &hDeviceKey);
5168 if (lError != ERROR_SUCCESS)
5169 {
5171 goto done;
5172 }
5173
5174 lError = RegOpenKeyExW(hDeviceKey,
5175 L"Device Parameters",
5176 0,
5177 KEY_READ,
5178 &hParamKey);
5179 if (lError != ERROR_SUCCESS)
5180 {
5182 goto done;
5183 }
5184
5185 lError = RegQueryValueExW(hParamKey,
5186 CustomPropName,
5187 NULL,
5188 pulRegDataType,
5189 Buffer,
5190 pulLength);
5191 if (lError != ERROR_SUCCESS)
5192 {
5193 if (lError == ERROR_MORE_DATA)
5194 {
5196 }
5197 else
5198 {
5199 *pulLength = 0;
5201 }
5202 }
5203
5204done:
5205 if (ret == CR_SUCCESS)
5206 *pulTransferLen = *pulLength;
5207
5208 if (hParamKey != NULL)
5209 RegCloseKey(hParamKey);
5210
5211 if (hDeviceKey != NULL)
5212 RegCloseKey(hDeviceKey);
5213
5214 DPRINT("PNP_GetCustomDevProp() done (returns %lx)\n", ret);
5215
5216 return ret;
5217}
5218
5219
5220/* Function 62 */
5221DWORD
5222WINAPI
5225 WORD *pwVersion)
5226{
5228
5229 *pwVersion = WINVER;
5230 return CR_SUCCESS;
5231}
5232
5233
5234/* Function 63 */
5235DWORD
5236WINAPI
5239 BYTE *Buffer,
5240 PNP_RPC_BUFFER_SIZE *pulTransferLen,
5241 PNP_RPC_BUFFER_SIZE *pulLength,
5242 DWORD ulFlags)
5243{
5246}
5247
5248
5249/* Function 64 */
5250DWORD
5251WINAPI
5254 DWORD *pulSSDIFlags,
5255 DWORD ulFlags)
5256{
5258
5259 DPRINT1("PNP_GetServerSideDeviceInstallFlags(%p %p %lu)\n",
5260 hBinding, pulSSDIFlags, ulFlags);
5261
5262 if (pulSSDIFlags == NULL)
5263 return CR_INVALID_POINTER;
5264
5265 if (ulFlags != 0)
5266 return CR_INVALID_FLAG;
5267
5268 /* FIXME */
5269 *pulSSDIFlags = 0;
5270
5271 return CR_SUCCESS;
5272}
5273
5274
5275/* Function 65 */
5276DWORD
5277WINAPI
5282 LPWSTR PropertyCultureName,
5283 PNP_PROP_COUNT *PropertyCount,
5284 PNP_PROP_COUNT *TransferLen,
5285 DEVPROPKEY *PropertyKeys,
5286 DWORD Flags)
5287{
5290}
5291
5292
5293/* Function 66 */
5294DWORD
5295WINAPI
5300 LPWSTR PropertyCultureName,
5301 const DEVPROPKEY *PropertyKey,
5303 PNP_PROP_SIZE *PropertySize,
5304 PNP_PROP_SIZE *TransferLen,
5306 DWORD Flags)
5307{
5310}
5311
5312
5313/* Function 67 */
5314DWORD
5315WINAPI
5320 LPWSTR PropertyCultureName,
5321 const DEVPROPKEY *PropertyKey,
5323 PNP_PROP_SIZE PropertySize,
5325 DWORD Flags)
5326{
5329}
5330
5331
5332/* Function 68 */
5333DWORD
5334WINAPI
5337{
5340}
5341
5342
5343/* Function 69 */
5344DWORD
5345WINAPI
5348{
5351}
5352
5353
5354/* Function 70 */
5355DWORD
5356WINAPI
5359{
5362}
5363
5364
5365/* Function 71 */
5366DWORD
5367WINAPI
5370{
5373}
5374
5375
5376/* Function 72 */
5377DWORD
5378WINAPI
5381{
5384}
5385
5386
5387/* Function 73 */
5388DWORD
5389WINAPI
5392 LPWSTR pszFilter,
5393 DWORD ulFlags)
5394{
5397}
5398
5399
5400/* Function 74 */
5401DWORD
5402WINAPI
5405{
5408}
unsigned char BOOLEAN
UINT32 void void ** ReturnValue
Definition: acevents.h:216
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
HANDLE hInstallEvent
Definition: install.c:40
HANDLE hUserToken
Definition: install.c:39
#define LOGCONF_NAME_BUFFER_SIZE
Definition: precomp.h:36
struct NOTIFY_ENTRY * PNOTIFY_ENTRY
HKEY hEnumKey
Definition: umpnpmgr.c:44
BOOL g_ShuttingDown
Definition: umpnpmgr.c:47
HKEY hClassKey
Definition: umpnpmgr.c:45
DWORD WINAPI PNP_RegisterServiceNotification(handle_t hBinding)
Definition: rpcserver.c:5379
DWORD WINAPI PNP_GetVersion(handle_t hBinding, WORD *pVersion)
Definition: rpcserver.c:699
DWORD WINAPI PNP_GetInterfaceDeviceList(handle_t hBinding, GUID *InterfaceGuid, LPWSTR pszDeviceID, BYTE *Buffer, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:2646
DWORD WINAPI PNP_SetHwProf(handle_t hBinding, DWORD ulHardwareProfile, DWORD ulFlags)
Definition: rpcserver.c:4952
DWORD WINAPI PNP_UnregisterNotification(handle_t hBinding, PNP_NOTIFY_HANDLE *pNotifyHandle)
Definition: rpcserver.c:5098
static CONFIGRET GetDeviceInstanceListSize(_In_ LPCWSTR pszDevice, _Out_ PULONG pulLength)
Definition: rpcserver.c:1614
DWORD WINAPI PNP_InstallDevInst(handle_t hBinding)
Definition: rpcserver.c:5335
DWORD WINAPI PNP_DriverStoreDeleteDriverPackage(handle_t hBinding)
Definition: rpcserver.c:5368
static CONFIGRET GetServiceInstanceListSize(_In_ PWSTR pszService, _Out_ PDWORD pulLength)
Definition: rpcserver.c:1515
DWORD WINAPI PNP_QueryResConfList(handle_t hBinding, LPWSTR pDeviceID, RESOURCEID ResourceID, BYTE *ResourceData, PNP_RPC_BUFFER_SIZE ResourceLen, BYTE *Buffer, PNP_RPC_BUFFER_SIZE BufferLen, DWORD ulFlags)
Definition: rpcserver.c:4934
DWORD WINAPI PNP_Connect(handle_t hBinding)
Definition: rpcserver.c:688
DWORD WINAPI PNP_GetRelatedDeviceInstance(handle_t hBinding, DWORD ulRelationship, LPWSTR pDeviceID, LPWSTR pRelatedDeviceId, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:892
DWORD WINAPI PNP_EnumerateSubKeys(handle_t hBinding, DWORD ulBranch, DWORD ulIndex, LPWSTR Buffer, PNP_RPC_STRING_LEN ulLength, PNP_RPC_STRING_LEN *pulRequiredLen, DWORD ulFlags)
Definition: rpcserver.c:970
DWORD WINAPI PNP_SetActiveService(handle_t hBinding, LPWSTR pszFilter, DWORD ulFlags)
Definition: rpcserver.c:5390
DWORD WINAPI PNP_UnregisterDeviceClassAssociation(handle_t hBinding, LPWSTR pszInterfaceDevice, DWORD ulFlags)
Definition: rpcserver.c:2759
DWORD WINAPI PNP_DetectResourceConflict(handle_t hBinding, LPWSTR pDeviceID, RESOURCEID ResourceID, BYTE *ResourceData, PNP_RPC_BUFFER_SIZE ResourceLen, BOOL *pbConflictDetected, DWORD ulFlags)
Definition: rpcserver.c:4913
static CONFIGRET WINAPI NtStatusToCrError(NTSTATUS Status)
Definition: rpcserver.c:124
DWORD WINAPI PNP_GetDeviceListSize(handle_t hBinding, LPWSTR pszFilter, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1762
DWORD WINAPI PNP_InitDetection(handle_t hBinding)
Definition: rpcserver.c:742
DWORD WINAPI PNP_AddEmptyLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulPriority, DWORD *pulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4206
DWORD WINAPI PNP_ApplyPowerSettings(handle_t hBinding)
Definition: rpcserver.c:5346
DWORD WINAPI PNP_GetClassCount(handle_t hBinding, DWORD *pulClassCount, DWORD ulFlags)
Definition: rpcserver.c:2494
DWORD WINAPI PNP_GetClassRegProp(handle_t hBinding, LPWSTR pszClassGuid, DWORD ulProperty, DWORD *pulRegDataType, BYTE *Buffer, PNP_RPC_STRING_LEN *pulTransferLen, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:2772
DWORD WINAPI PNP_GetServerSideDeviceInstallFlags(handle_t hBinding, DWORD *pulSSDIFlags, DWORD ulFlags)
Definition: rpcserver.c:5252
DWORD WINAPI PNP_FreeLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD ulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4391
LIST_ENTRY NotificationListHead
Definition: rpcserver.c:41
DWORD WINAPI PNP_GetDeviceRegProp(handle_t hBinding, LPWSTR pDeviceID, DWORD ulProperty, DWORD *pulRegDataType, BYTE *Buffer, PNP_PROP_SIZE *pulTransferLen, PNP_PROP_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1880
DWORD WINAPI PNP_GetBlockedDriverInfo(handle_t hBinding, BYTE *Buffer, PNP_RPC_BUFFER_SIZE *pulTransferLen, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:5237
DWORD WINAPI PNP_GetInterfaceDeviceListSize(handle_t hBinding, PNP_RPC_BUFFER_SIZE *pulLen, GUID *InterfaceGuid, LPWSTR pszDeviceID, DWORD ulFlags)
Definition: rpcserver.c:2694
static WCHAR szRootDeviceInstanceID[]
Definition: rpcserver.c:39
DWORD WINAPI PNP_UninstallDevInst(handle_t hBinding, LPWSTR pDeviceID, DWORD ulFlags)
Definition: rpcserver.c:3617
static VOID AppendDeviceId(LPWSTR lpDeviceIdList, LPDWORD lpDeviceIdListSize, LPWSTR lpDeviceId)
Definition: rpcserver.c:3649
DWORD WINAPI PNP_GetDeviceStatus(handle_t hBinding, LPWSTR pDeviceID, DWORD *pulStatus, DWORD *pulProblem, DWORD ulFlags)
Definition: rpcserver.c:3456
DWORD WINAPI PNP_GetClassInstance(handle_t hBinding, LPWSTR pDeviceId, LPWSTR pszClassInstance, PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:2299
static BOOL CheckForDeviceId(LPWSTR lpDeviceIdList, LPWSTR lpDeviceId)
Definition: rpcserver.c:3628
DWORD WINAPI PNP_DeviceInstanceAction(handle_t hBinding, DWORD ulMajorAction, DWORD ulMinorAction, LPWSTR pszDeviceInstance1, LPWSTR pszDeviceInstance2)
Definition: rpcserver.c:3411
static CONFIGRET GetAllInstanceListSize(_Out_ PULONG pulLength)
Definition: rpcserver.c:1727
VOID __RPC_USER PNP_NOTIFY_HANDLE_rundown(PNP_NOTIFY_HANDLE pHandle)
Definition: rpcserver.c:665
DWORD WINAPI PNP_RegisterDriver(handle_t hBinding, LPWSTR pszDeviceID, DWORD ulFlags)
Definition: rpcserver.c:3779
static CONFIGRET GenerateDeviceID(_Inout_ LPWSTR pszDeviceID, _In_ PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:3121
DWORD WINAPI PNP_GetDepth(handle_t hBinding, LPWSTR pszDeviceID, DWORD *pulDepth, DWORD ulFlags)
Definition: rpcserver.c:1837
DWORD WINAPI PNP_HwProfFlags(handle_t hBinding, DWORD ulAction, LPWSTR pDeviceID, DWORD ulConfig, DWORD *pulValue, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3987
static CONFIGRET SetDeviceStatus(_In_ LPWSTR pszDeviceID, _In_ DWORD ulStatus, _In_ DWORD ulProblem)
Definition: rpcserver.c:264
DWORD WINAPI PNP_DisableDevInst(handle_t hBinding, LPWSTR pDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3587
static CONFIGRET OpenConfigurationKey(_In_ LPCWSTR pszDeviceID, _In_ DWORD ulLogConfType, _Out_ PHKEY phKey)
Definition: rpcserver.c:429
DWORD WINAPI PNP_GetClassName(handle_t hBinding, LPWSTR pszClassGuid, LPWSTR Buffer, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:2539
DWORD WINAPI PNP_RequestDeviceEject(handle_t hBinding, LPWSTR pszDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3851
DWORD WINAPI PNP_GetObjectProp(handle_t hBinding, LPWSTR ObjectName, DWORD ObjectType, LPWSTR PropertyCultureName, const DEVPROPKEY *PropertyKey, DEVPROPTYPE *PropertyType, PNP_PROP_SIZE *PropertySize, PNP_PROP_SIZE *TransferLen, BYTE *PropertyBuffer, DWORD Flags)
Definition: rpcserver.c:5296
DWORD WINAPI PNP_GetLogConfPriority(handle_t hBinding, LPWSTR pDeviceID, DWORD ulType, DWORD ulTag, DWORD *pPriority, DWORD ulFlags)
Definition: rpcserver.c:4705
static CONFIGRET SetupDeviceInstance(_In_ LPWSTR pszDeviceInstance, _In_ DWORD ulMinorAction)
Definition: rpcserver.c:3273
DWORD WINAPI PNP_GetObjectPropKeys(handle_t hBinding, LPWSTR ObjectName, DWORD ObjectType, LPWSTR PropertyCultureName, PNP_PROP_COUNT *PropertyCount, PNP_PROP_COUNT *TransferLen, DEVPROPKEY *PropertyKeys, DWORD Flags)
Definition: rpcserver.c:5278
DWORD WINAPI PNP_GetInterfaceDeviceAlias(handle_t hBinding, LPWSTR pszInterfaceDevice, GUID *AliasInterfaceGuid, LPWSTR pszAliasInterfaceDevice, PNP_RPC_STRING_LEN *pulLength, PNP_RPC_STRING_LEN *pulTransferLen, DWORD ulFlags)
Definition: rpcserver.c:2629
static PCM_FULL_RESOURCE_DESCRIPTOR NextResourceDescriptor(_In_ PCM_FULL_RESOURCE_DESCRIPTOR pDescriptor)
Definition: rpcserver.c:580
static CONFIGRET GetDeviceStatus(_In_ LPWSTR pszDeviceID, _Out_ DWORD *pulStatus, _Out_ DWORD *pulProblem)
Definition: rpcserver.c:229
DWORD WINAPI RpcServerThread(LPVOID lpParameter)
Definition: rpcserver.c:46
static CONFIGRET GetDeviceInstanceList(_In_ PWSTR pszDevice, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1200
CONFIGRET GetEnumeratorInstanceList(_In_ PWSTR pszEnumerator, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1271
static CONFIGRET ClearDeviceStatus(_In_ LPWSTR pszDeviceID, _In_ DWORD ulStatus, _In_ DWORD ulProblem)
Definition: rpcserver.c:199
DWORD WINAPI PNP_RequestEjectPC(handle_t hBinding)
Definition: rpcserver.c:3955
DWORD WINAPI PNP_DeleteServiceDevices(handle_t hBinding)
Definition: rpcserver.c:5403
DWORD WINAPI PNP_CreateDevInst(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszParentDeviceID, PNP_RPC_STRING_LEN ulLength, DWORD ulFlags)
Definition: rpcserver.c:3171
static CONFIGRET GetRelationsInstanceList(_In_ PWSTR pszDevice, _In_ DWORD ulFlags, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1030
DWORD WINAPI PNP_SetDeviceRegProp(handle_t hBinding, LPWSTR pDeviceId, DWORD ulProperty, DWORD ulDataType, BYTE *Buffer, PNP_PROP_SIZE ulLength, DWORD ulFlags)
Definition: rpcserver.c:2157
static CONFIGRET GetAllInstanceList(_Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1342
DWORD WINAPI PNP_AddID(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszID, DWORD ulFlags)
Definition: rpcserver.c:3672
DWORD WINAPI PNP_QueryRemove(handle_t hBinding, LPWSTR pszDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3802
DWORD WINAPI PNP_GetFirstLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD *pulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4485
static BOOL IsPresentDeviceInstanceID(_In_ LPWSTR pszDeviceInstanceID)
Definition: rpcserver.c:418
DWORD WINAPI PNP_SetClassRegProp(handle_t hBinding, LPWSTR pszClassGuid, DWORD ulProperty, DWORD ulDataType, BYTE *Buffer, PNP_PROP_SIZE ulLength, DWORD ulFlags)
Definition: rpcserver.c:2898
static VOID SplitDeviceInstanceID(IN LPWSTR pszDeviceInstanceID, OUT LPWSTR pszEnumerator, OUT LPWSTR pszDevice, OUT LPWSTR pszInstance)
Definition: rpcserver.c:153
DWORD WINAPI PNP_GetNextLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD ulCurrentTag, DWORD *pulNextTag, DWORD ulFlags)
Definition: rpcserver.c:4586
DWORD WINAPI PNP_GetGlobalState(handle_t hBinding, DWORD *pulState, DWORD ulFlags)
Definition: rpcserver.c:717
CONFIGRET WINAPI PNP_IsDockStationPresent(handle_t hBinding, BOOL *Present)
Definition: rpcserver.c:3899
DWORD WINAPI PNP_RegisterNotification(handle_t hBinding, DWORD_PTR hRecipient, LPWSTR pszName, BYTE *pNotificationFilter, DWORD ulNotificationFilterSize, DWORD ulFlags, PNP_NOTIFY_HANDLE *pNotifyHandle, DWORD ulProcessId, DWORD *pulUnknown9)
Definition: rpcserver.c:5007
DWORD WINAPI PNP_GetHwProfInfo(handle_t hBinding, DWORD ulIndex, HWPROFILEINFO *pHWProfileInfo, DWORD ulProfileInfoSize, DWORD ulFlags)
Definition: rpcserver.c:4071
DWORD WINAPI PNP_FreeResDes(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD ulResourceTag, DWORD *pulPreviousResType, DWORD *pulPreviousResTag, DWORD ulFlags)
Definition: rpcserver.c:4740
DWORD WINAPI PNP_AddResDes(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD *pulResourceTag, BYTE *ResourceData, PNP_RPC_BUFFER_SIZE ResourceLen, DWORD ulFlags)
Definition: rpcserver.c:4721
DWORD WINAPI PNP_SetDeviceProblem(handle_t hBinding, LPWSTR pDeviceID, DWORD ulProblem, DWORD ulFlags)
Definition: rpcserver.c:3534
CONFIGRET WINAPI PNP_RunDetection(handle_t hBinding, DWORD ulFlags)
Definition: rpcserver.c:4996
static CONFIGRET ReenumerateDeviceInstance(_In_ LPWSTR pszDeviceInstance, _In_ ULONG ulMinorAction)
Definition: rpcserver.c:3375
static CONFIGRET GetServiceInstanceList(_In_ PWSTR pszService, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1081
DWORD WINAPI PNP_CreateKey(handle_t hBinding, LPWSTR pszSubKey, DWORD samDesired, DWORD ulFlags)
Definition: rpcserver.c:2415
DWORD WINAPI PNP_GetResDesDataSize(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD ulResourceTag, DWORD *pulSize, DWORD ulFlags)
Definition: rpcserver.c:4875
DWORD WINAPI PNP_GetRootDeviceInstance(handle_t hBinding, LPWSTR pDeviceID, PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:855
DWORD WINAPI PNP_GetDeviceList(handle_t hBinding, LPWSTR pszFilter, LPWSTR Buffer, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1391
DWORD WINAPI PNP_SetObjectProp(handle_t hBinding, LPWSTR ObjectName, DWORD ObjectType, LPWSTR PropertyCultureName, const DEVPROPKEY *PropertyKey, DEVPROPTYPE PropertyType, PNP_PROP_SIZE PropertySize, BYTE *PropertyBuffer, DWORD Flags)
Definition: rpcserver.c:5316
static BOOL IsCallerInteractive(_In_ handle_t hBinding)
Definition: rpcserver.c:615
static CONFIGRET GetRelationsInstanceListSize(_In_ PWSTR pszDevice, _In_ DWORD ulFlags, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1465
static CONFIGRET EnableDeviceInstance(_In_ LPWSTR pszDeviceInstance)
Definition: rpcserver.c:3356
DWORD WINAPI PNP_GetCustomDevProp(handle_t hBinding, LPWSTR pDeviceID, LPWSTR CustomPropName, DWORD *pulRegDataType, BYTE *Buffer, PNP_RPC_STRING_LEN *pulTransferLen, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:5124
DWORD WINAPI PNP_DeleteRegistryKey(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszParentKey, LPWSTR pszChildKey, DWORD ulFlags)
Definition: rpcserver.c:2479
DWORD WINAPI PNP_Disconnect(handle_t hBinding)
Definition: rpcserver.c:677
DWORD WINAPI PNP_QueryArbitratorFreeData(handle_t hBinding, BYTE *pData, DWORD DataLen, LPWSTR pDeviceID, RESOURCEID ResourceID, DWORD ulFlags)
Definition: rpcserver.c:4964
static CONFIGRET DisableDeviceInstance(_In_ LPWSTR pszDeviceInstance, _Inout_opt_ PPNP_VETO_TYPE pVetoType, _Inout_opt_ LPWSTR pszVetoName, _In_ DWORD ulNameLength)
Definition: rpcserver.c:294
DWORD WINAPI PNP_ReportLogOn(handle_t hBinding, BOOL Admin, DWORD ProcessId)
Definition: rpcserver.c:757
static BOOL IsRootDeviceInstanceID(_In_ PWSTR pszDeviceInstanceID)
Definition: rpcserver.c:406
DWORD WINAPI PNP_GetNextResDes(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD ulResourceTag, DWORD *pulNextResType, DWORD *pulNextResTag, DWORD ulFlags)
Definition: rpcserver.c:4759
DWORD WINAPI PNP_GetResDesData(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD ulResourceTag, BYTE *Buffer, PNP_RPC_BUFFER_SIZE BufferLen, DWORD ulFlags)
Definition: rpcserver.c:4856
static CONFIGRET GetConfigurationData(_In_ HKEY hKey, _In_ ULONG ulLogConfType, _Out_ PULONG pulRegDataType, _Out_ PULONG pulDataSize, _Out_ LPBYTE *ppBuffer, _In_ ULONG ulValueNameBufferSize, _Out_opt_ LPWSTR pszValueNameBuffer)
Definition: rpcserver.c:492
DWORD WINAPI PNP_ValidateDeviceInstance(handle_t hBinding, LPWSTR pDeviceID, DWORD ulFlags)
Definition: rpcserver.c:812
DWORD WINAPI PNP_ModifyResDes(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID CurrentResourceID, RESOURCEID NewResourceID, DWORD ulResourceTag, BYTE *ResourceData, PNP_RPC_BUFFER_SIZE ResourceLen, DWORD ulFlags)
Definition: rpcserver.c:4893
DWORD WINAPI PNP_QueryArbitratorFreeSize(handle_t hBinding, DWORD *pulSize, LPWSTR pDeviceID, RESOURCEID ResourceID, DWORD ulFlags)
Definition: rpcserver.c:4979
static CONFIGRET GetEnumeratorInstanceListSize(_In_ LPCWSTR pszEnumerator, _Out_ PULONG pulLength)
Definition: rpcserver.c:1666
DWORD WINAPI PNP_DriverStoreAddDriverPackage(handle_t hBinding)
Definition: rpcserver.c:5357
DWORD WINAPI PNP_DeleteClassKey(handle_t hBinding, LPWSTR pszClassGuid, DWORD ulFlags)
Definition: rpcserver.c:2597
static BOOL IsValidDeviceInstanceID(_In_ PWSTR pszDeviceInstanceID)
Definition: rpcserver.c:340
DWORD WINAPI PNP_GetVersionInternal(handle_t hBinding, WORD *pwVersion)
Definition: rpcserver.c:5223
static CONFIGRET CreateDeviceInstance(_In_ LPWSTR pszDeviceID, _In_ BOOL bPhantomDevice)
Definition: rpcserver.c:3001
DWORD WINAPI PNP_RegisterDeviceClassAssociation(handle_t hBinding, LPWSTR pszDeviceID, GUID *InterfaceGuid, LPWSTR pszReference, LPWSTR pszSymLink, PNP_RPC_STRING_LEN *pulLength, PNP_RPC_STRING_LEN *pulTransferLen, DWORD ulFlags)
Definition: rpcserver.c:2741
static HANDLE hServicesKey
Definition: devinst.c:21
static SID_IDENTIFIER_AUTHORITY NtAuthority
Definition: security.c:40
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
#define RegCloseKey(hKey)
Definition: registry.h:49
@ PNP_VetoTypeUnknown
Definition: cfg.h:180
#define DN_REMOVABLE
Definition: cfg.h:132
#define DN_HAS_PROBLEM
Definition: cfg.h:128
#define DN_STARTED
Definition: cfg.h:121
#define DN_MANUAL
Definition: cfg.h:122
#define CM_PROB_FAILED_INSTALL
Definition: cfg.h:58
enum _PNP_VETO_TYPE * PPNP_VETO_TYPE
#define CM_DRP_BUSNUMBER
Definition: cfgmgr32.h:703
#define CM_REGISTER_DEVICE_DRIVER_BITS
Definition: cfgmgr32.h:798
#define CM_DRP_LOCATION_INFORMATION
Definition: cfgmgr32.h:689
#define CM_DRP_CONFIGFLAGS
Definition: cfgmgr32.h:686
#define CR_INVALID_PROPERTY
Definition: cfgmgr32.h:899
#define FILTERED_LOG_CONF
Definition: cfgmgr32.h:597
#define CM_SETUP_DOWNLOAD
Definition: cfgmgr32.h:821
#define CM_CUSTOMDEVPROP_BITS
Definition: cfgmgr32.h:836
#define CR_INVALID_DATA
Definition: cfgmgr32.h:877
#define CM_DRP_REMOVAL_POLICY
Definition: cfgmgr32.h:719
#define CM_DRP_ENUMERATOR_NAME
Definition: cfgmgr32.h:704
#define CM_ADD_ID_COMPATIBLE
Definition: cfgmgr32.h:615
#define BASIC_LOG_CONF
Definition: cfgmgr32.h:596
#define CM_DRP_REMOVAL_POLICY_HW_DEFAULT
Definition: cfgmgr32.h:720
#define CR_INVALID_DEVICE_ID
Definition: cfgmgr32.h:876
#define CM_DRP_BUSTYPEGUID
Definition: cfgmgr32.h:701
#define CR_NO_MORE_LOG_CONF
Definition: cfgmgr32.h:859
#define CR_OUT_OF_MEMORY
Definition: cfgmgr32.h:844
#define CR_INVALID_LOG_CONF
Definition: cfgmgr32.h:850
#define CM_GETIDLIST_FILTER_BITS
Definition: cfgmgr32.h:669
#define CM_DRP_LOWERFILTERS
Definition: cfgmgr32.h:697
#define CM_DRP_SECURITY
Definition: cfgmgr32.h:705
#define CM_SET_DEVNODE_PROBLEM_BITS
Definition: cfgmgr32.h:808
#define CM_CRP_DEVTYPE
Definition: cfgmgr32.h:710
#define CM_DRP_MFG
Definition: cfgmgr32.h:687
#define CM_DRP_EXCLUSIVE
Definition: cfgmgr32.h:711
#define CM_DRP_DRIVER
Definition: cfgmgr32.h:685
#define CR_NO_SUCH_DEVINST
Definition: cfgmgr32.h:858
#define CM_GETIDLIST_FILTER_REMOVALRELATIONS
Definition: cfgmgr32.h:658
#define CM_SETUP_BITS
Definition: cfgmgr32.h:828
#define CM_DRP_LOCATION_PATHS
Definition: cfgmgr32.h:725
#define CM_DRP_REMOVAL_POLICY_OVERRIDE
Definition: cfgmgr32.h:721
#define CM_DRP_CAPABILITIES
Definition: cfgmgr32.h:691
#define CM_DRP_UPPERFILTERS
Definition: cfgmgr32.h:693
#define CR_FAILURE
Definition: cfgmgr32.h:865
#define CM_SETUP_WRITE_LOG_CONFS
Definition: cfgmgr32.h:822
#define CM_DRP_CLASSGUID
Definition: cfgmgr32.h:684
#define CONFIGMG_VERSION
Definition: cfgmgr32.h:64
#define CM_DRP_COMPATIBLEIDS
Definition: cfgmgr32.h:678
ULONG RESOURCEID
Definition: cfgmgr32.h:96
#define CR_INVALID_DEVINST
Definition: cfgmgr32.h:848
#define CM_DRP_DEVICEDESC
Definition: cfgmgr32.h:676
#define LOG_CONF_BITS
Definition: cfgmgr32.h:603
#define CM_REENUMERATE_BITS
Definition: cfgmgr32.h:793
#define CM_DRP_CLASS
Definition: cfgmgr32.h:683
#define CM_GETIDLIST_FILTER_EJECTRELATIONS
Definition: cfgmgr32.h:657
#define CM_REENUMERATE_RETRY_INSTALLATION
Definition: cfgmgr32.h:790
#define CM_CRP_SECURITY
Definition: cfgmgr32.h:706
#define PRIORITY_BIT
Definition: cfgmgr32.h:607
#define CR_ACCESS_DENIED
Definition: cfgmgr32.h:897
#define BOOT_LOG_CONF
Definition: cfgmgr32.h:599
#define CM_DRP_LEGACYBUSTYPE
Definition: cfgmgr32.h:702
#define CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
Definition: cfgmgr32.h:690
#define CR_INVALID_FLAG
Definition: cfgmgr32.h:846
#define CM_SET_DEVNODE_PROBLEM_OVERRIDE
Definition: cfgmgr32.h:807
#define CM_DRP_DEVTYPE
Definition: cfgmgr32.h:709
#define CM_DELETE_CLASS_SUBKEYS
Definition: cfgmgr32.h:635
#define CM_GLOBAL_STATE_SERVICES_AVAILABLE
Definition: cfgmgr32.h:910
#define CM_GETIDLIST_FILTER_ENUMERATOR
Definition: cfgmgr32.h:655
#define CR_ALREADY_SUCH_DEVINST
Definition: cfgmgr32.h:862
#define CM_GLOBAL_STATE_CAN_DO_UI
Definition: cfgmgr32.h:908
#define CM_GETIDLIST_FILTER_BUSRELATIONS
Definition: cfgmgr32.h:660
#define CM_DRP_FRIENDLYNAME
Definition: cfgmgr32.h:688
#define CM_DRP_INSTALL_STATE
Definition: cfgmgr32.h:722
#define CM_DRP_UI_NUMBER
Definition: cfgmgr32.h:692
#define OVERRIDE_LOG_CONF
Definition: cfgmgr32.h:601
#define ALLOC_LOG_CONF
Definition: cfgmgr32.h:598
#define CM_DRP_CHARACTERISTICS
Definition: cfgmgr32.h:713
#define CR_NO_SUCH_DEVNODE
Definition: cfgmgr32.h:857
#define CM_CRP_EXCLUSIVE
Definition: cfgmgr32.h:712
#define CM_CREATE_DEVNODE_BITS
Definition: cfgmgr32.h:624
#define CM_DRP_BASE_CONTAINERID
Definition: cfgmgr32.h:728
#define CR_BUFFER_SMALL
Definition: cfgmgr32.h:872
#define CM_GETIDLIST_FILTER_POWERRELATIONS
Definition: cfgmgr32.h:659
#define FORCED_LOG_CONF
Definition: cfgmgr32.h:600
#define CR_CALL_NOT_IMPLEMENTED
Definition: cfgmgr32.h:898
#define CM_DEVCAP_REMOVABLE
Definition: cfgmgr32.h:737
#define CM_CREATE_DEVNODE_GENERATE_ID
Definition: cfgmgr32.h:622
RETURN_TYPE CONFIGRET
Definition: cfgmgr32.h:74
#define CM_DRP_UI_NUMBER_DESC_FORMAT
Definition: cfgmgr32.h:716
#define CR_INVALID_POINTER
Definition: cfgmgr32.h:845
#define CM_GETIDLIST_FILTER_SERVICE
Definition: cfgmgr32.h:656
#define CR_SUCCESS
Definition: cfgmgr32.h:842
#define CM_DRP_ADDRESS
Definition: cfgmgr32.h:715
#define CR_NO_SUCH_VALUE
Definition: cfgmgr32.h:883
#define CM_CRP_CHARACTERISTICS
Definition: cfgmgr32.h:714
#define CM_CREATE_DEVNODE_PHANTOM
Definition: cfgmgr32.h:621
#define CM_GLOBAL_STATE_SHUTTING_DOWN
Definition: cfgmgr32.h:911
#define CM_REMOVE_BITS
Definition: cfgmgr32.h:780
#define CM_GETIDLIST_FILTER_NONE
Definition: cfgmgr32.h:654
#define CM_DRP_DEVICE_POWER_DATA
Definition: cfgmgr32.h:718
#define CM_DRP_HARDWAREID
Definition: cfgmgr32.h:677
#define CR_NO_SUCH_REGISTRY_KEY
Definition: cfgmgr32.h:892
#define CM_DISABLE_BITS
Definition: cfgmgr32.h:652
#define CM_DRP_SERVICE
Definition: cfgmgr32.h:680
#define CR_INVALID_DEVNODE
Definition: cfgmgr32.h:847
#define CR_REGISTRY_ERROR
Definition: cfgmgr32.h:875
#define CR_REMOVE_VETOED
Definition: cfgmgr32.h:869
Definition: bufpool.h:45
wcscat
wcscpy
handle_t hBinding
Definition: ctx_c.c:54
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define DBT_DEVTYP_HANDLE
Definition: dbt.h:25
struct _DEV_BROADCAST_DEVICEINTERFACE_W DEV_BROADCAST_DEVICEINTERFACE_W
struct _DEV_BROADCAST_HANDLE DEV_BROADCAST_HANDLE
#define DBT_DEVTYP_DEVICEINTERFACE
Definition: dbt.h:24
struct _DEV_BROADCAST_HANDLE * PDEV_BROADCAST_HANDLE
struct _DEV_BROADCAST_DEVICEINTERFACE_W * PDEV_BROADCAST_DEVICEINTERFACE_W
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_SUCCESS
Definition: deptool.c:10
#define MAX_DEVICE_ID_LEN
Definition: devaction.c:40
ULONG DEVPROPTYPE
Definition: devpropdef.h:24
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
BOOL WINAPI CheckTokenMembership(IN HANDLE ExistingTokenHandle, IN PSID SidToCheck, OUT PBOOL IsMember)
Definition: token.c:21
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:674
BOOL WINAPI OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, HANDLE *TokenHandle)
Definition: security.c:336
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:698
#define CloseHandle
Definition: compat.h:739
#define wcschr
Definition: compat.h:17
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapReAlloc
Definition: compat.h:734
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrcpyW
Definition: compat.h:749
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
static DWORD DWORD * dwLength
Definition: fusion.c:86
static void cleanup(void)
Definition: main.c:1335
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1227
DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1546
#define swprintf
Definition: precomp.h:40
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
Definition: fatprocs.h:2712
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
_In_ WDFDEVICE _In_ PWDF_DEVICE_INTERFACE_PROPERTY_DATA _In_ ULONG _Out_ PVOID _Out_ PULONG _Out_ PDEVPROPTYPE PropertyType
FxAutoRegKey hKey
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
Status
Definition: gdiplustypes.h:25
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
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
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 * u
Definition: glfuncs.h:240
struct _CM_FULL_RESOURCE_DESCRIPTOR CM_FULL_RESOURCE_DESCRIPTOR
struct _CM_FULL_RESOURCE_DESCRIPTOR * PCM_FULL_RESOURCE_DESCRIPTOR
struct _CM_RESOURCE_LIST CM_RESOURCE_LIST
#define CmResourceTypeConfigData
Definition: hwresource.cpp:130
struct _CM_RESOURCE_LIST * PCM_RESOURCE_LIST
#define CmResourceTypeDeviceSpecific
Definition: hwresource.cpp:127
@ InterfaceTypeUndefined
Definition: hwresource.cpp:136
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define for
Definition: utility.h:88
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
ObjectType
Definition: metafile.c:81
#define PNP_PROPERTY_UI_NUMBER
Definition: cmtypes.h:34
#define PNP_SET_DEVICE_STATUS
Definition: cmtypes.h:60
#define PNP_PROPERTY_REMOVAL_POLICY
Definition: cmtypes.h:40
#define PNP_PROPERTY_POWER_DATA
Definition: cmtypes.h:39
#define PNP_PROPERTY_ENUMERATOR_NAME
Definition: cmtypes.h:43
#define PNP_PROPERTY_PHYSICAL_DEVICE_OBJECT_NAME
Definition: cmtypes.h:35
@ PlugPlayControlEnumerateDevice
Definition: cmtypes.h:209
@ PlugPlayControlProperty
Definition: cmtypes.h:219
@ PlugPlayControlQueryDeviceRelations
Definition: cmtypes.h:225
@ PlugPlayControlGetRelatedDevice
Definition: cmtypes.h:221
@ PlugPlayControlDeviceStatus
Definition: cmtypes.h:223
@ PlugPlayControlQueryAndRemoveDevice
Definition: cmtypes.h:215
@ PlugPlayControlGetDeviceDepth
Definition: cmtypes.h:224
@ PlugPlayControlInitializeDevice
Definition: cmtypes.h:212
@ PlugPlayControlGetInterfaceDeviceList
Definition: cmtypes.h:218
@ PlugPlayControlStartDevice
Definition: cmtypes.h:213
@ PlugPlayControlRetrieveDock
Definition: cmtypes.h:228
#define PNP_PROPERTY_INSTALL_STATE
Definition: cmtypes.h:45
#define PNP_PROPERTY_LOCATION_PATHS
Definition: cmtypes.h:46
#define PNP_PROPERTY_REMOVAL_POLICY_HARDWARE_DEFAULT
Definition: cmtypes.h:44
#define PNP_CLEAR_DEVICE_STATUS
Definition: cmtypes.h:61
#define PNP_PROPERTY_LEGACYBUSTYPE
Definition: cmtypes.h:37
#define PNP_GET_DEVICE_STATUS
Definition: cmtypes.h:59
#define PNP_PROPERTY_BUSTYPEGUID
Definition: cmtypes.h:36
#define PNP_PROPERTY_ADDRESS
Definition: cmtypes.h:42
#define PNP_PROPERTY_BUSNUMBER
Definition: cmtypes.h:38
#define PNP_PROPERTY_CONTAINERID
Definition: cmtypes.h:47
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
int Count
Definition: noreturn.cpp:7
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_READ
Definition: nt_native.h:1023
#define PROCESS_ALL_ACCESS
Definition: nt_native.h:1324
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1018
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define REG_CREATED_NEW_KEY
Definition: nt_native.h:1084
#define REG_RESOURCE_LIST
Definition: nt_native.h:1502
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define REG_MULTI_SZ
Definition: nt_native.h:1501
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1019
#define REG_RESOURCE_REQUIREMENTS_LIST
Definition: nt_native.h:1504
#define KEY_WRITE
Definition: nt_native.h:1031
#define DWORD
Definition: nt_native.h:44
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define STATUS_PLUGPLAY_QUERY_VETOED
Definition: ntstatus.h:219
#define L(x)
Definition: ntvdm.h:50
BYTE * PBYTE
Definition: pedump.c:66
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
NTSTATUS NTAPI NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass, IN OUT PVOID Buffer, IN ULONG BufferLength)
Definition: plugplay.c:1494
unsigned long PNP_PROP_COUNT
Definition: pnp.idl:32
unsigned long PNP_RPC_BUFFER_SIZE
Definition: pnp.idl:34
void * PNP_NOTIFY_HANDLE
Definition: pnp.idl:7
unsigned long PNP_RPC_STRING_LEN
Definition: pnp.idl:33
unsigned long PNP_PROP_SIZE
Definition: pnp.idl:31
static const WCHAR szName[]
Definition: powrprof.c:45
#define CONFIGFLAG_MANUAL_INSTALL
Definition: regstr.h:392
#define CONFIGFLAG_FAILEDINSTALL
Definition: regstr.h:396
#define REGSTR_PATH_CLASS
Definition: regstr.h:42
RPC_STATUS WINAPI RpcRevertToSelf(void)
Definition: rpc_binding.c:1463
RPC_STATUS WINAPI RpcImpersonateClient(RPC_BINDING_HANDLE BindingHandle)
Definition: rpc_binding.c:1056
RPC_STATUS WINAPI RpcServerListen(UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait)
Definition: rpc_server.c:1520
RPC_STATUS WINAPI RpcServerRegisterIf(RPC_IF_HANDLE IfSpec, UUID *MgrTypeUuid, RPC_MGR_EPV *MgrEpv)
Definition: rpc_server.c:1116
RPC_STATUS WINAPI RpcServerUseProtseqEpW(RPC_WSTR Protseq, UINT MaxCalls, RPC_WSTR Endpoint, LPVOID SecurityDescriptor)
Definition: rpc_server.c:927
#define RPC_S_OK
Definition: rpcnterr.h:22
#define REG_DWORD
Definition: sdbapi.c:596
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define midl_user_free
Definition: rpc.h:41
#define __RPC_FAR
Definition: rpc.h:52
long RPC_STATUS
Definition: rpc.h:48
#define __RPC_USER
Definition: rpc.h:61
#define midl_user_allocate
Definition: rpc.h:40
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:73
ULONG HWPI_ulHWProfile
Definition: cfgmgr32.h:554
CHAR HWPI_szFriendlyName[MAX_PROFILE_LEN]
Definition: cfgmgr32.h:555
DWORD HWPI_dwFlags
Definition: cfgmgr32.h:556
Definition: precomp.h:45
PWSTR pszName
Definition: precomp.h:47
LIST_ENTRY ListEntry
Definition: precomp.h:46
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: hwresource.cpp:160
CM_FULL_RESOURCE_DESCRIPTOR List[1]
Definition: hwresource.cpp:165
union _IO_RESOURCE_DESCRIPTOR::@2131 u
struct _IO_RESOURCE_DESCRIPTOR::@2131::@2139 ConfigData
IO_RESOURCE_DESCRIPTOR Descriptors[1]
Definition: iotypes.h:2737
INTERFACE_TYPE InterfaceType
Definition: iotypes.h:2742
IO_RESOURCE_LIST List[1]
Definition: iotypes.h:2747
Definition: typedefs.h:120
UNICODE_STRING DeviceInstance
Definition: cmtypes.h:525
UNICODE_STRING DeviceInstance
Definition: cmtypes.h:534
UNICODE_STRING DeviceInstance
Definition: cmtypes.h:507
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define WINVER
Definition: targetver.h:11
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
_In_z_ PCWSTR _In_ ULONG ulType
Definition: ntuser.h:43
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID PropertyBuffer
Definition: wdfdevice.h:4437
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
_In_ DWORD nLength
Definition: wincon.h:473
_In_ ULONG _In_ ULONG ulTag
Definition: winddi.h:3942
_Check_return_ _Out_ PULONG pulSize
Definition: winddi.h:2120
#define WINAPI
Definition: msvc.h:6
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_CONFIG
Definition: winreg.h:15
#define RegOpenKeyEx
Definition: winreg.h:520
#define RegSetValueEx
Definition: winreg.h:533
#define RegQueryValueEx
Definition: winreg.h:524
#define RegDeleteValue
Definition: winreg.h:508
#define wsprintf
Definition: winuser.h:5885
static const GUID InterfaceGuid
Definition: wlanapi.c:25
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
_In_ CONST DEVPROPKEY * PropertyKey
Definition: iofuncs.h:2414
struct _IO_RESOURCE_LIST * PIO_RESOURCE_LIST
#define IO_RESOURCE_PREFERRED
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST
struct _IO_RESOURCE_REQUIREMENTS_LIST IO_RESOURCE_REQUIREMENTS_LIST
#define TOKEN_DUPLICATE
Definition: setypes.h:926
#define SECURITY_INTERACTIVE_RID
Definition: setypes.h:559
#define TOKEN_QUERY
Definition: setypes.h:928
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define TOKEN_ASSIGN_PRIMARY
Definition: setypes.h:925
__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