ReactOS 0.4.16-dev-1308-gbf734eb
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";
41
44
45/* FUNCTIONS *****************************************************************/
46
49{
51 BOOLEAN RegisteredProtSeq = FALSE;
52
53 UNREFERENCED_PARAMETER(lpParameter);
54
55 DPRINT("RpcServerThread() called\n");
56
59
60#if 0
61 /* 2k/XP/2k3-compatible protocol sequence/endpoint */
63 20,
64 L"\\pipe\\ntsvcs",
65 NULL); // Security descriptor
66 if (Status == RPC_S_OK)
67 RegisteredProtSeq = TRUE;
68 else
69 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
70#endif
71
72 /* Vista/7-compatible protocol sequence/endpoint */
74 20,
75 L"\\pipe\\plugplay",
76 NULL); // Security descriptor
77 if (Status == RPC_S_OK)
78 RegisteredProtSeq = TRUE;
79 else
80 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
81
82 /* Make sure there's a usable endpoint */
83 if (RegisteredProtSeq == FALSE)
84 return 0;
85
86 Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
87 NULL,
88 NULL);
89 if (Status != RPC_S_OK)
90 {
91 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
92 return 0;
93 }
94
96 20,
97 FALSE);
98 if (Status != RPC_S_OK)
99 {
100 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
101 return 0;
102 }
103
104 /* ROS HACK (this should never happen...) */
105 DPRINT1("*** Other devices won't be installed correctly. If something\n");
106 DPRINT1("*** doesn't work, try to reboot to get a new chance.\n");
107
108 DPRINT("RpcServerThread() done\n");
109
110 return 0;
111}
112
113
115{
117}
118
119
121{
123}
124
125
126static CONFIGRET WINAPI
128{
129 switch (Status)
130 {
133
135 return CR_INVALID_DATA;
136
138 return CR_NO_SUCH_DEVINST;
139
141 return CR_ACCESS_DENIED;
142
144 return CR_BUFFER_SMALL;
145
147 return CR_NO_SUCH_VALUE;
148
149 default:
150 return CR_FAILURE;
151 }
152}
153
154
155static VOID
156SplitDeviceInstanceID(IN LPWSTR pszDeviceInstanceID,
157 OUT LPWSTR pszEnumerator,
158 OUT LPWSTR pszDevice,
159 OUT LPWSTR pszInstance)
160{
161 WCHAR szLocalDeviceInstanceID[MAX_DEVICE_ID_LEN];
162 LPWSTR lpEnumerator = NULL;
163 LPWSTR lpDevice = NULL;
164 LPWSTR lpInstance = NULL;
165 LPWSTR ptr;
166
167 wcscpy(szLocalDeviceInstanceID, pszDeviceInstanceID);
168
169 *pszEnumerator = 0;
170 *pszDevice = 0;
171 *pszInstance = 0;
172
173 lpEnumerator = szLocalDeviceInstanceID;
174
175 ptr = wcschr(lpEnumerator, L'\\');
176 if (ptr != NULL)
177 {
178 *ptr = 0;
179 lpDevice = ++ptr;
180
181 ptr = wcschr(lpDevice, L'\\');
182 if (ptr != NULL)
183 {
184 *ptr = 0;
185 lpInstance = ++ptr;
186 }
187 }
188
189 if (lpEnumerator != NULL)
190 wcscpy(pszEnumerator, lpEnumerator);
191
192 if (lpDevice != NULL)
193 wcscpy(pszDevice, lpDevice);
194
195 if (lpInstance != NULL)
196 wcscpy(pszInstance, lpInstance);
197}
198
199
200static
203 _In_ LPWSTR pszDeviceID,
204 _In_ DWORD ulStatus,
205 _In_ DWORD ulProblem)
206{
207 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
210
211 DPRINT1("ClearDeviceStatus(%S 0x%lx 0x%lx)\n",
212 pszDeviceID, ulStatus, ulProblem);
213
215 pszDeviceID);
216 PlugPlayData.Operation = PNP_CLEAR_DEVICE_STATUS;
217 PlugPlayData.DeviceStatus = ulStatus;
218 PlugPlayData.DeviceProblem = ulProblem;
219
221 (PVOID)&PlugPlayData,
223 if (!NT_SUCCESS(Status))
225
226 return ret;
227}
228
229
230static
233 _In_ LPWSTR pszDeviceID,
234 _Out_ DWORD *pulStatus,
235 _Out_ DWORD *pulProblem)
236{
237 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
240
241 DPRINT("GetDeviceStatus(%S %p %p)\n",
242 pszDeviceID, pulStatus, pulProblem);
243
245 pszDeviceID);
246 PlugPlayData.Operation = PNP_GET_DEVICE_STATUS;
247
249 (PVOID)&PlugPlayData,
251 if (NT_SUCCESS(Status))
252 {
253 *pulStatus = PlugPlayData.DeviceStatus;
254 *pulProblem = PlugPlayData.DeviceProblem;
255 }
256 else
257 {
259 }
260
261 return ret;
262}
263
264
265static
268 _In_ LPWSTR pszDeviceID,
269 _In_ DWORD ulStatus,
270 _In_ DWORD ulProblem)
271{
272 PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
275
276 DPRINT1("SetDeviceStatus(%S 0x%lx 0x%lx)\n",
277 pszDeviceID, ulStatus, ulProblem);
278
280 pszDeviceID);
281 PlugPlayData.Operation = PNP_SET_DEVICE_STATUS;
282 PlugPlayData.DeviceStatus = ulStatus;
283 PlugPlayData.DeviceProblem = ulProblem;
284
286 (PVOID)&PlugPlayData,
288 if (!NT_SUCCESS(Status))
290
291 return ret;
292}
293
294
295static
298 _In_ LPWSTR pszDeviceInstance,
299 _Inout_opt_ PPNP_VETO_TYPE pVetoType,
300 _Inout_opt_ LPWSTR pszVetoName,
301 _In_ DWORD ulNameLength)
302{
306
307 DPRINT1("DisableDeviceInstance(%S %p %p %lu)\n",
308 pszDeviceInstance, pVetoType, pszVetoName, ulNameLength);
309
310 RtlInitUnicodeString(&QueryRemoveData.DeviceInstance,
311 pszDeviceInstance);
312
313 QueryRemoveData.Flags = 0;
314 QueryRemoveData.VetoType = 0;
315 QueryRemoveData.VetoName = pszVetoName;
316 QueryRemoveData.NameLength = ulNameLength;
317
319 &QueryRemoveData,
322 {
324 }
326 {
327 if (pVetoType != NULL)
328 *pVetoType = QueryRemoveData.VetoType;
329
331 }
332 else if (!NT_SUCCESS(Status))
333 {
335 }
336
337 return ret;
338}
339
340
341static
342BOOL
344 _In_ PWSTR pszDeviceInstanceID)
345{
346 INT nPartLength[3] = {0, 0, 0};
347 INT nLength = 0, nParts = 0;
348 PWCHAR p;
349
350 DPRINT("IsValidDeviceInstanceID(%S)\n",
351 pszDeviceInstanceID);
352
353 if (pszDeviceInstanceID == NULL)
354 {
355 DPRINT("Device instance ID is NULL!\n");
356 return FALSE;
357 }
358
359 p = pszDeviceInstanceID;
360 while (*p != UNICODE_NULL)
361 {
362 if (*p == L'\\')
363 {
364 nParts++;
365 if (nParts >= 3)
366 {
367 DPRINT("Too many separators: %d\n", nParts);
368 return FALSE;
369 }
370 }
371 else
372 {
373 nPartLength[nParts]++;
374 }
375
376 nLength++;
378 {
379 DPRINT("Too long: %d\n", nLength);
380 return FALSE;
381 }
382
383 p++;
384 }
385
386 if (nParts != 2)
387 {
388 DPRINT("Invalid number of separtors: %d\n", nParts);
389 return FALSE;
390 }
391
392 if ((nPartLength[0] == 0) ||
393 (nPartLength[1] == 0) ||
394 (nPartLength[2] == 0))
395 {
396 DPRINT("Invalid part lengths: %d %d %d\n",
397 nPartLength[0], nPartLength[1], nPartLength[2]);
398 return FALSE;
399 }
400
401 DPRINT("Valid device instance ID!\n");
402
403 return TRUE;
404}
405
406
407static
408BOOL
410 _In_ PWSTR pszDeviceInstanceID)
411{
412 if (_wcsicmp(pszDeviceInstanceID, szRootDeviceInstanceID) == 0)
413 return TRUE;
414
415 return FALSE;
416}
417
418
419static
420BOOL
422 _In_ LPWSTR pszDeviceInstanceID)
423{
424 DWORD ulStatus, ulProblem;
425
426 return (GetDeviceStatus(pszDeviceInstanceID, &ulStatus, &ulProblem) == CR_SUCCESS);
427}
428
429
430static
433 _In_ LPCWSTR pszDeviceID,
434 _In_ DWORD ulLogConfType,
435 _Out_ PHKEY phKey)
436{
437 WCHAR szKeyName[MAX_PATH];
438 PCWSTR pszSubKeyName;
439 HKEY hInstanceKey;
440 DWORD dwError;
441
442 /* Build the full device instance key name */
443 wcscpy(szKeyName, L"System\\CurrentControlSet\\Enum\\");
444 wcscat(szKeyName, pszDeviceID);
445
446 /* Open the device instance key */
448 szKeyName,
449 0,
451 &hInstanceKey);
452 if (dwError != ERROR_SUCCESS)
453 return CR_INVALID_DEVINST;
454
455 switch (ulLogConfType)
456 {
457 case BOOT_LOG_CONF:
458 case BASIC_LOG_CONF:
459 pszSubKeyName = L"LogConf";
460 break;
461
462 case ALLOC_LOG_CONF:
464 pszSubKeyName = L"Control";
465 break;
466
467 default:
468 DPRINT1("Unsupported configuration type!\n");
469 return CR_FAILURE;
470 }
471
472 /* Create or open the LogConf key */
473 dwError = RegCreateKeyExW(hInstanceKey,
474 pszSubKeyName,
475 0,
476 NULL,
479 NULL,
480 phKey,
481 NULL);
482
483 /* Close the device instance key */
484 RegCloseKey(hInstanceKey);
485
486 if (dwError != ERROR_SUCCESS)
487 return CR_REGISTRY_ERROR;
488
489 return CR_SUCCESS;
490}
491
492
493static
496 _In_ HKEY hKey,
497 _In_ ULONG ulLogConfType,
498 _Out_ PULONG pulRegDataType,
499 _Out_ PULONG pulDataSize,
500 _Out_ LPBYTE *ppBuffer,
501 _In_ ULONG ulValueNameBufferSize,
502 _Out_opt_ LPWSTR pszValueNameBuffer)
503{
504 LPCWSTR pszValueName;
505
506 switch (ulLogConfType)
507 {
508 case BOOT_LOG_CONF:
509 pszValueName = L"BootConfig";
510 *pulRegDataType = REG_RESOURCE_LIST;
511 break;
512
513 case ALLOC_LOG_CONF:
514 pszValueName = L"AllocConfig";
515 *pulRegDataType = REG_RESOURCE_LIST;
516 break;
517
518 case FORCED_LOG_CONF:
519 pszValueName = L"ForcedConfig";
520 *pulRegDataType = REG_RESOURCE_LIST;
521 break;
522
524 pszValueName = L"FilteredConfigVector";
525 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
526 break;
527
528 case BASIC_LOG_CONF:
529 pszValueName = L"BasicConfigVector";
530 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
531 break;
532
534 pszValueName = L"OverrideConfigVector";
535 *pulRegDataType = REG_RESOURCE_REQUIREMENTS_LIST;
536 break;
537
538 default:
539 DPRINT1("Unsupported configuration type!\n");
540 return CR_FAILURE;
541 }
542
543 /* Return the selected configuration value name */
544 if ((ulValueNameBufferSize > 0) && (pszValueNameBuffer != NULL) &&
545 (wcslen(pszValueName) + 1 <= ulValueNameBufferSize))
546 wcscpy(pszValueNameBuffer, pszValueName);
547
548 /* Get the configuration data size */
550 pszValueName,
551 NULL,
552 NULL,
553 NULL,
554 pulDataSize) != ERROR_SUCCESS)
555 {
556 return CR_INVALID_LOG_CONF;
557 }
558
559 /* Allocate the buffer */
560 *ppBuffer = HeapAlloc(GetProcessHeap(), 0, *pulDataSize);
561 if (*ppBuffer == NULL)
562 {
563 return CR_OUT_OF_MEMORY;
564 }
565
566 /* Retrieve the configuration data */
568 pszValueName,
569 NULL,
570 NULL,
571 (LPBYTE)*ppBuffer,
572 pulDataSize) != ERROR_SUCCESS)
573 {
574 return CR_INVALID_LOG_CONF;
575 }
576
577 return CR_SUCCESS;
578}
579
580
581static
585{
586 PBYTE pNext = NULL;
587 ULONG ulLastIndex = 0;
588
589 if (pDescriptor == NULL)
590 return NULL;
591
592 /* Skip the full resource descriptor */
593 pNext = (LPBYTE)pDescriptor + sizeof(CM_FULL_RESOURCE_DESCRIPTOR);
594
595 /* Skip the partial resource descriptors */
596 pNext += (pDescriptor->PartialResourceList.Count - 1) *
598
599 /* Skip the device specific data, if present */
600 if (pDescriptor->PartialResourceList.Count > 0)
601 {
602 ulLastIndex = pDescriptor->PartialResourceList.Count - 1;
603
604 if (pDescriptor->PartialResourceList.PartialDescriptors[ulLastIndex].Type ==
606 {
607 pNext += pDescriptor->PartialResourceList.PartialDescriptors[ulLastIndex].
608 u.DeviceSpecificData.DataSize;
609 }
610 }
611
612 return (PCM_FULL_RESOURCE_DESCRIPTOR)pNext;
613}
614
615
616static
617BOOL
620{
622 HANDLE hToken;
623 PSID pInteractiveSid = NULL;
624 BOOL bInteractive = FALSE;
625 RPC_STATUS RpcStatus;
626
627 DPRINT("IsCallerInteractive(%p)\n", hBinding);
628
629 /* Allocate an interactive user sid */
631 1,
633 0, 0, 0, 0, 0, 0, 0,
634 &pInteractiveSid))
635 {
636 DPRINT1("AllocateAndInitializeSid failed\n");
637 return FALSE;
638 }
639
640 /* Impersonate the client */
641 RpcStatus = RpcImpersonateClient(hBinding);
642 if (RpcStatus != RPC_S_OK)
643 {
644 DPRINT1("RpcImpersonateClient failed (Status 0x%08lx)\n", RpcStatus);
645 goto done;
646 }
647
648 /* Open the thread token and check for interactive user membership */
650 {
651 CheckTokenMembership(hToken, pInteractiveSid, &bInteractive);
652 CloseHandle(hToken);
653 }
654
655 /* Revert the impersonation */
657
658done:
659 if (pInteractiveSid)
660 FreeSid(pInteractiveSid);
661
662 return bInteractive;
663}
664
665
666VOID
669 PNP_NOTIFY_HANDLE pHandle)
670{
671 DPRINT1("PNP_NOTIFY_HANDLE_rundown(%p)\n", pHandle);
672}
673
674
675/* PUBLIC FUNCTIONS **********************************************************/
676
677/* Function 0 */
678DWORD
679WINAPI
682{
684 return CR_SUCCESS;
685}
686
687
688/* Function 1 */
689DWORD
690WINAPI
693{
695 return CR_SUCCESS;
696}
697
698
699/* Function 2 */
700DWORD
701WINAPI
704 WORD *pVersion)
705{
707
708 DPRINT("PNP_GetVersion(%p %p)\n",
709 hBinding, pVersion);
710
711 *pVersion = CONFIGMG_VERSION;
712
713 return CR_SUCCESS;
714}
715
716
717/* Function 3 */
718DWORD
719WINAPI
722 DWORD *pulState,
723 DWORD ulFlags)
724{
726
727 DPRINT("PNP_GetGlobalState(%p %p 0x%08lx)\n",
728 hBinding, pulState, ulFlags);
729
730 if (ulFlags != 0)
731 return CR_INVALID_FLAG;
732
734
735 if (g_ShuttingDown)
737
738 return CR_SUCCESS;
739}
740
741
742/* Function 4 */
743DWORD
744WINAPI
747{
749
750 DPRINT("PNP_InitDetection(%p)\n",
751 hBinding);
752
753 return CR_SUCCESS;
754}
755
756
757/* Function 5 */
758DWORD
759WINAPI
762 BOOL Admin,
764{
767
769
770 DPRINT("PNP_ReportLogOn(%p %u, %u)\n",
771 hBinding, Admin, ProcessId);
772
773 /* Fail, if the caller is not an interactive user */
775 goto cleanup;
776
777 /* Get the users token */
779
780 if (!hProcess)
781 {
782 DPRINT1("OpenProcess failed with error %u\n", GetLastError());
783 goto cleanup;
784 }
785
786 if (hUserToken)
787 {
790 }
791
793 {
794 DPRINT1("OpenProcessToken failed with error %u\n", GetLastError());
795 goto cleanup;
796 }
797
798 /* Trigger the installer thread */
799 if (hInstallEvent)
801
803
804cleanup:
805 if (hProcess)
807
808 return ReturnValue;
809}
810
811
812/* Function 6 */
813DWORD
814WINAPI
817 LPWSTR pDeviceID,
818 DWORD ulFlags)
819{
821 HKEY hDeviceKey = NULL;
822
824 UNREFERENCED_PARAMETER(ulFlags);
825
826 DPRINT("PNP_ValidateDeviceInstance(%p %S 0x%08lx)\n",
827 hBinding, pDeviceID, ulFlags);
828
829 if (!IsValidDeviceInstanceID(pDeviceID))
830 return CR_INVALID_DEVINST;
831
833 pDeviceID,
834 0,
835 KEY_READ,
836 &hDeviceKey))
837 {
838 DPRINT("Could not open the Device Key!\n");
840 goto Done;
841 }
842
843 /* FIXME: add more tests */
844
845Done:
846 if (hDeviceKey != NULL)
847 RegCloseKey(hDeviceKey);
848
849 DPRINT("PNP_ValidateDeviceInstance() done (returns %lx)\n", ret);
850
851 return ret;
852}
853
854
855/* Function 7 */
856DWORD
857WINAPI
860 LPWSTR pDeviceID,
861 PNP_RPC_STRING_LEN ulLength)
862{
864
866
867 DPRINT("PNP_GetRootDeviceInstance(%p %S %lu)\n",
868 hBinding, pDeviceID, ulLength);
869
870 if (!pDeviceID)
871 {
873 goto Done;
874 }
875
876 if (ulLength < lstrlenW(szRootDeviceInstanceID) + 1)
877 {
879 goto Done;
880 }
881
882 lstrcpyW(pDeviceID,
884
885Done:
886 DPRINT("PNP_GetRootDeviceInstance() done (returns %lx)\n", ret);
887
888 return ret;
889}
890
891
892/* Function 8 */
893DWORD
894WINAPI
897 DWORD ulRelationship,
898 LPWSTR pDeviceID,
899 LPWSTR pRelatedDeviceId,
900 PNP_RPC_STRING_LEN *pulLength,
901 DWORD ulFlags)
902{
906
908 UNREFERENCED_PARAMETER(ulFlags);
909
910 DPRINT("PNP_GetRelatedDeviceInstance(%p %lu %S %p %p 0x%lx)\n",
911 hBinding, ulRelationship, pDeviceID, pRelatedDeviceId,
912 pulLength, ulFlags);
913
914 if (!IsValidDeviceInstanceID(pDeviceID))
915 return CR_INVALID_DEVINST;
916
917 if (ulRelationship == PNP_GET_PARENT_DEVICE_INSTANCE)
918 {
919 /* The root device does not have a parent */
920 if (IsRootDeviceInstanceID(pDeviceID))
921 return CR_NO_SUCH_DEVINST;
922
923 /* Return the root device for non existing devices */
924 if (!IsPresentDeviceInstanceID(pDeviceID))
925 {
926 if ((wcslen(szRootDeviceInstanceID) + 1) > *pulLength)
927 {
928 *pulLength = wcslen(szRootDeviceInstanceID) + 1;
929 return CR_BUFFER_SMALL;
930 }
931
932 wcscpy(pRelatedDeviceId, szRootDeviceInstanceID);
933 *pulLength = wcslen(szRootDeviceInstanceID) + 1;
934 return CR_SUCCESS;
935 }
936 }
937 else if (ulRelationship == PNP_GET_SIBLING_DEVICE_INSTANCE)
938 {
939 /* The root device does not have siblings */
940 if (IsRootDeviceInstanceID(pDeviceID))
941 return CR_NO_SUCH_DEVINST;
942 }
943
945 pDeviceID);
946
947 PlugPlayData.Relation = ulRelationship;
948
949 PlugPlayData.RelatedDeviceInstanceLength = *pulLength;
950 PlugPlayData.RelatedDeviceInstance = pRelatedDeviceId;
951
953 (PVOID)&PlugPlayData,
955 if (!NT_SUCCESS(Status))
956 {
958 }
959
960 DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);
961 if (ret == CR_SUCCESS)
962 {
963 DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance);
964 }
965
966 return ret;
967}
968
969
970/* Function 9 */
971DWORD
972WINAPI
975 DWORD ulBranch,
976 DWORD ulIndex,
978 PNP_RPC_STRING_LEN ulLength,
979 PNP_RPC_STRING_LEN *pulRequiredLen,
980 DWORD ulFlags)
981{
983 HKEY hKey;
984 DWORD dwError;
985
987 UNREFERENCED_PARAMETER(ulFlags);
988
989 DPRINT("PNP_EnumerateSubKeys(%p %lu %lu %p %lu %p 0x%08lx)\n",
990 hBinding, ulBranch, ulIndex, Buffer, ulLength,
991 pulRequiredLen, ulFlags);
992
993 switch (ulBranch)
994 {
995 case PNP_ENUMERATOR_SUBKEYS:
996 hKey = hEnumKey;
997 break;
998
999 case PNP_CLASS_SUBKEYS:
1000 hKey = hClassKey;
1001 break;
1002
1003 default:
1004 return CR_FAILURE;
1005 }
1006
1007 *pulRequiredLen = ulLength;
1008 dwError = RegEnumKeyExW(hKey,
1009 ulIndex,
1010 Buffer,
1011 pulRequiredLen,
1012 NULL,
1013 NULL,
1014 NULL,
1015 NULL);
1016 if (dwError != ERROR_SUCCESS)
1017 {
1019 }
1020 else
1021 {
1022 (*pulRequiredLen)++;
1023 }
1024
1025 DPRINT("PNP_EnumerateSubKeys() done (returns %lx)\n", ret);
1026
1027 return ret;
1028}
1029
1030
1031static
1034 _In_ PWSTR pszDevice,
1035 _In_ DWORD ulFlags,
1036 _Inout_ PWSTR pszBuffer,
1037 _Inout_ PDWORD pulLength)
1038{
1042
1044 pszDevice);
1045
1047 {
1048 PlugPlayData.Relations = 3;
1049 }
1050 else if (ulFlags & CM_GETIDLIST_FILTER_POWERRELATIONS)
1051 {
1052 PlugPlayData.Relations = 2;
1053 }
1054 else if (ulFlags & CM_GETIDLIST_FILTER_REMOVALRELATIONS)
1055 {
1056 PlugPlayData.Relations = 1;
1057 }
1058 else if (ulFlags & CM_GETIDLIST_FILTER_EJECTRELATIONS)
1059 {
1060 PlugPlayData.Relations = 0;
1061 }
1062
1063 PlugPlayData.BufferSize = *pulLength * sizeof(WCHAR);
1064 PlugPlayData.Buffer = pszBuffer;
1065
1067 (PVOID)&PlugPlayData,
1069 if (NT_SUCCESS(Status))
1070 {
1071 *pulLength = PlugPlayData.BufferSize / sizeof(WCHAR);
1072 }
1073 else
1074 {
1076 }
1077
1078 return ret;
1079}
1080
1081
1082static
1085 _In_ PWSTR pszService,
1086 _Inout_ PWSTR pszBuffer,
1087 _Inout_ PDWORD pulLength)
1088{
1089 WCHAR szPathBuffer[512];
1090 WCHAR szName[16];
1091 HKEY hServicesKey = NULL, hServiceKey = NULL, hEnumKey = NULL;
1092 DWORD dwValues, dwSize, dwIndex, dwUsedLength, dwPathLength;
1093 DWORD dwError;
1094 PWSTR pPtr;
1096
1097 /* Open the device key */
1099 L"System\\CurrentControlSet\\Services",
1100 0,
1101 KEY_READ,
1102 &hServicesKey);
1103 if (dwError != ERROR_SUCCESS)
1104 {
1105 DPRINT("Failed to open the services key (Error %lu)\n", dwError);
1106 return CR_REGISTRY_ERROR;
1107 }
1108
1109 dwError = RegOpenKeyExW(hServicesKey,
1110 pszService,
1111 0,
1112 KEY_READ,
1113 &hServiceKey);
1114 if (dwError != ERROR_SUCCESS)
1115 {
1116 DPRINT("Failed to open the service key (Error %lu)\n", dwError);
1118 goto Done;
1119 }
1120
1121 dwError = RegOpenKeyExW(hServiceKey,
1122 L"Enum",
1123 0,
1124 KEY_READ,
1125 &hEnumKey);
1126 if (dwError != ERROR_SUCCESS)
1127 {
1128 DPRINT("Failed to open the service enum key (Error %lu)\n", dwError);
1130 goto Done;
1131 }
1132
1133 /* Retrieve the number of device instances */
1134 dwSize = sizeof(DWORD);
1135 dwError = RegQueryValueExW(hEnumKey,
1136 L"Count",
1137 NULL,
1138 NULL,
1139 (LPBYTE)&dwValues,
1140 &dwSize);
1141 if (dwError != ERROR_SUCCESS)
1142 {
1143 DPRINT("RegQueryValueExW failed (Error %lu)\n", dwError);
1144 dwValues = 1;
1145 }
1146
1147 DPRINT("dwValues %lu\n", dwValues);
1148
1149 dwUsedLength = 0;
1150 pPtr = pszBuffer;
1151
1152 for (dwIndex = 0; dwIndex < dwValues; dwIndex++)
1153 {
1154 wsprintf(szName, L"%lu", dwIndex);
1155
1156 dwSize = sizeof(szPathBuffer);
1157 dwError = RegQueryValueExW(hEnumKey,
1158 szName,
1159 NULL,
1160 NULL,
1161 (LPBYTE)szPathBuffer,
1162 &dwSize);
1163 if (dwError != ERROR_SUCCESS)
1164 break;
1165
1166 DPRINT("Path: %S\n", szPathBuffer);
1167
1168 dwPathLength = wcslen(szPathBuffer) + 1;
1169 if (dwUsedLength + dwPathLength + 1 > *pulLength)
1170 {
1172 break;
1173 }
1174
1175 wcscpy(pPtr, szPathBuffer);
1176 dwUsedLength += dwPathLength;
1177 pPtr += dwPathLength;
1178
1179 *pPtr = UNICODE_NULL;
1180 }
1181
1182Done:
1183 if (hEnumKey != NULL)
1185
1186 if (hServiceKey != NULL)
1187 RegCloseKey(hServiceKey);
1188
1189 if (hServicesKey != NULL)
1191
1192 if (ret == CR_SUCCESS)
1193 *pulLength = dwUsedLength + 1;
1194 else
1195 *pulLength = 0;
1196
1197 return ret;
1198}
1199
1200
1201static
1204 _In_ PWSTR pszDevice,
1205 _Inout_ PWSTR pszBuffer,
1206 _Inout_ PDWORD pulLength)
1207{
1208 WCHAR szInstanceBuffer[MAX_DEVICE_ID_LEN];
1209 WCHAR szPathBuffer[512];
1210 HKEY hDeviceKey;
1211 DWORD dwInstanceLength, dwPathLength, dwUsedLength;
1212 DWORD dwIndex, dwError;
1213 PWSTR pPtr;
1215
1216 /* Open the device key */
1217 dwError = RegOpenKeyExW(hEnumKey,
1218 pszDevice,
1219 0,
1221 &hDeviceKey);
1222 if (dwError != ERROR_SUCCESS)
1223 {
1224 DPRINT("Failed to open the device key (Error %lu)\n", dwError);
1225 return CR_REGISTRY_ERROR;
1226 }
1227
1228 dwUsedLength = 0;
1229 pPtr = pszBuffer;
1230
1231 for (dwIndex = 0; ; dwIndex++)
1232 {
1233 dwInstanceLength = MAX_DEVICE_ID_LEN;
1234 dwError = RegEnumKeyExW(hDeviceKey,
1235 dwIndex,
1236 szInstanceBuffer,
1237 &dwInstanceLength,
1238 NULL,
1239 NULL,
1240 NULL,
1241 NULL);
1242 if (dwError != ERROR_SUCCESS)
1243 break;
1244
1245 wsprintf(szPathBuffer, L"%s\\%s", pszDevice, szInstanceBuffer);
1246 DPRINT("Path: %S\n", szPathBuffer);
1247
1248 dwPathLength = wcslen(szPathBuffer) + 1;
1249 if (dwUsedLength + dwPathLength + 1 > *pulLength)
1250 {
1252 break;
1253 }
1254
1255 wcscpy(pPtr, szPathBuffer);
1256 dwUsedLength += dwPathLength;
1257 pPtr += dwPathLength;
1258
1259 *pPtr = UNICODE_NULL;
1260 }
1261
1262 RegCloseKey(hDeviceKey);
1263
1264 if (ret == CR_SUCCESS)
1265 *pulLength = dwUsedLength + 1;
1266 else
1267 *pulLength = 0;
1268
1269 return ret;
1270}
1271
1272
1275 _In_ PWSTR pszEnumerator,
1276 _Inout_ PWSTR pszBuffer,
1277 _Inout_ PDWORD pulLength)
1278{
1279 WCHAR szDeviceBuffer[MAX_DEVICE_ID_LEN];
1280 WCHAR szPathBuffer[512];
1281 HKEY hEnumeratorKey;
1282 PWSTR pPtr;
1283 DWORD dwIndex, dwDeviceLength, dwUsedLength, dwRemainingLength, dwPathLength;
1284 DWORD dwError;
1286
1287 /* Open the enumerator key */
1288 dwError = RegOpenKeyExW(hEnumKey,
1289 pszEnumerator,
1290 0,
1292 &hEnumeratorKey);
1293 if (dwError != ERROR_SUCCESS)
1294 {
1295 DPRINT("Failed to open the enumerator key (Error %lu)\n", dwError);
1296 return CR_REGISTRY_ERROR;
1297 }
1298
1299 dwUsedLength = 0;
1300 dwRemainingLength = *pulLength;
1301 pPtr = pszBuffer;
1302
1303 for (dwIndex = 0; ; dwIndex++)
1304 {
1305 dwDeviceLength = MAX_DEVICE_ID_LEN;
1306 dwError = RegEnumKeyExW(hEnumeratorKey,
1307 dwIndex,
1308 szDeviceBuffer,
1309 &dwDeviceLength,
1310 NULL,
1311 NULL,
1312 NULL,
1313 NULL);
1314 if (dwError != ERROR_SUCCESS)
1315 break;
1316
1317 wsprintf(szPathBuffer, L"%s\\%s", pszEnumerator, szDeviceBuffer);
1318 DPRINT("Path: %S\n", szPathBuffer);
1319
1320 dwPathLength = dwRemainingLength;
1321 ret = GetDeviceInstanceList(szPathBuffer,
1322 pPtr,
1323 &dwPathLength);
1324 if (ret != CR_SUCCESS)
1325 break;
1326
1327 dwUsedLength += dwPathLength - 1;
1328 dwRemainingLength -= dwPathLength - 1;
1329 pPtr += dwPathLength - 1;
1330 }
1331
1332 RegCloseKey(hEnumeratorKey);
1333
1334 if (ret == CR_SUCCESS)
1335 *pulLength = dwUsedLength + 1;
1336 else
1337 *pulLength = 0;
1338
1339 return ret;
1340}
1341
1342
1343static
1346 _Inout_ PWSTR pszBuffer,
1347 _Inout_ PDWORD pulLength)
1348{
1349 WCHAR szEnumeratorBuffer[MAX_DEVICE_ID_LEN];
1350 PWSTR pPtr;
1351 DWORD dwIndex, dwEnumeratorLength, dwUsedLength, dwRemainingLength, dwPathLength;
1352 DWORD dwError;
1354
1355 dwUsedLength = 0;
1356 dwRemainingLength = *pulLength;
1357 pPtr = pszBuffer;
1358
1359 for (dwIndex = 0; ; dwIndex++)
1360 {
1361 dwEnumeratorLength = MAX_DEVICE_ID_LEN;
1362 dwError = RegEnumKeyExW(hEnumKey,
1363 dwIndex,
1364 szEnumeratorBuffer,
1365 &dwEnumeratorLength,
1366 NULL, NULL, NULL, NULL);
1367 if (dwError != ERROR_SUCCESS)
1368 break;
1369
1370 dwPathLength = dwRemainingLength;
1371 ret = GetEnumeratorInstanceList(szEnumeratorBuffer,
1372 pPtr,
1373 &dwPathLength);
1374 if (ret != CR_SUCCESS)
1375 break;
1376
1377 dwUsedLength += dwPathLength - 1;
1378 dwRemainingLength -= dwPathLength - 1;
1379 pPtr += dwPathLength - 1;
1380 }
1381
1382 if (ret == CR_SUCCESS)
1383 *pulLength = dwUsedLength + 1;
1384 else
1385 *pulLength = 0;
1386
1387 return ret;
1388}
1389
1390
1391/* Function 10 */
1392DWORD
1393WINAPI
1396 LPWSTR pszFilter,
1397 LPWSTR Buffer,
1398 PNP_RPC_STRING_LEN *pulLength,
1399 DWORD ulFlags)
1400{
1401 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
1402 WCHAR szDevice[MAX_DEVICE_ID_LEN];
1403 WCHAR szInstance[MAX_DEVICE_ID_LEN];
1405
1406 DPRINT("PNP_GetDeviceList(%p %S %p %p 0x%08lx)\n",
1407 hBinding, pszFilter, Buffer, pulLength, ulFlags);
1408
1409 if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
1410 return CR_INVALID_FLAG;
1411
1412 if (pulLength == NULL)
1413 return CR_INVALID_POINTER;
1414
1415 if ((ulFlags != CM_GETIDLIST_FILTER_NONE) &&
1416 (pszFilter == NULL))
1417 return CR_INVALID_POINTER;
1418
1419 if (ulFlags &
1424 {
1425 ret = GetRelationsInstanceList(pszFilter,
1426 ulFlags,
1427 Buffer,
1428 pulLength);
1429 }
1430 else if (ulFlags & CM_GETIDLIST_FILTER_SERVICE)
1431 {
1432 ret = GetServiceInstanceList(pszFilter,
1433 Buffer,
1434 pulLength);
1435 }
1436 else if (ulFlags & CM_GETIDLIST_FILTER_ENUMERATOR)
1437 {
1438 SplitDeviceInstanceID(pszFilter,
1439 szEnumerator,
1440 szDevice,
1441 szInstance);
1442
1443 if (*szEnumerator != UNICODE_NULL && *szDevice != UNICODE_NULL)
1444 {
1445 ret = GetDeviceInstanceList(pszFilter,
1446 Buffer,
1447 pulLength);
1448 }
1449 else
1450 {
1451 ret = GetEnumeratorInstanceList(pszFilter,
1452 Buffer,
1453 pulLength);
1454 }
1455 }
1456 else /* CM_GETIDLIST_FILTER_NONE */
1457 {
1459 pulLength);
1460 }
1461
1462 return ret;
1463}
1464
1465
1466static
1469 _In_ PWSTR pszDevice,
1470 _In_ DWORD ulFlags,
1471 _Inout_ PDWORD pulLength)
1472{
1476
1478 pszDevice);
1479
1481 {
1482 PlugPlayData.Relations = 3;
1483 }
1484 else if (ulFlags & CM_GETIDLIST_FILTER_POWERRELATIONS)
1485 {
1486 PlugPlayData.Relations = 2;
1487 }
1488 else if (ulFlags & CM_GETIDLIST_FILTER_REMOVALRELATIONS)
1489 {
1490 PlugPlayData.Relations = 1;
1491 }
1492 else if (ulFlags & CM_GETIDLIST_FILTER_EJECTRELATIONS)
1493 {
1494 PlugPlayData.Relations = 0;
1495 }
1496
1497 PlugPlayData.BufferSize = 0;
1498 PlugPlayData.Buffer = NULL;
1499
1501 (PVOID)&PlugPlayData,
1503 if (NT_SUCCESS(Status))
1504 {
1505 *pulLength = PlugPlayData.BufferSize / sizeof(WCHAR);
1506 }
1507 else
1508 {
1510 }
1511
1512 return ret;
1513}
1514
1515
1516static
1519 _In_ PWSTR pszService,
1520 _Out_ PDWORD pulLength)
1521{
1522 HKEY hServicesKey = NULL, hServiceKey = NULL, hEnumKey = NULL;
1523 DWORD dwValues, dwMaxValueLength, dwSize;
1524 DWORD dwError;
1526
1527 /* Open the device key */
1529 L"System\\CurrentControlSet\\Services",
1530 0,
1531 KEY_READ,
1532 &hServicesKey);
1533 if (dwError != ERROR_SUCCESS)
1534 {
1535 DPRINT("Failed to open the services key (Error %lu)\n", dwError);
1536 return CR_REGISTRY_ERROR;
1537 }
1538
1539 dwError = RegOpenKeyExW(hServicesKey,
1540 pszService,
1541 0,
1542 KEY_READ,
1543 &hServiceKey);
1544 if (dwError != ERROR_SUCCESS)
1545 {
1546 DPRINT("Failed to open the service key (Error %lu)\n", dwError);
1548 goto Done;
1549 }
1550
1551 dwError = RegOpenKeyExW(hServiceKey,
1552 L"Enum",
1553 0,
1554 KEY_READ,
1555 &hEnumKey);
1556 if (dwError != ERROR_SUCCESS)
1557 {
1558 DPRINT("Failed to open the service enum key (Error %lu)\n", dwError);
1560 goto Done;
1561 }
1562
1563 /* Retrieve the number of device instances */
1564 dwSize = sizeof(DWORD);
1565 dwError = RegQueryValueExW(hEnumKey,
1566 L"Count",
1567 NULL,
1568 NULL,
1569 (LPBYTE)&dwValues,
1570 &dwSize);
1571 if (dwError != ERROR_SUCCESS)
1572 {
1573 DPRINT("RegQueryValueExW failed (Error %lu)\n", dwError);
1574 dwValues = 1;
1575 }
1576
1577 /* Retrieve the maximum instance name length */
1578 dwError = RegQueryInfoKeyW(hEnumKey,
1579 NULL,
1580 NULL,
1581 NULL,
1582 NULL,
1583 NULL,
1584 NULL,
1585 NULL,
1586 NULL,
1587 &dwMaxValueLength,
1588 NULL,
1589 NULL);
1590 if (dwError != ERROR_SUCCESS)
1591 {
1592 DPRINT("RegQueryInfoKeyW failed (Error %lu)\n", dwError);
1593 dwMaxValueLength = MAX_DEVICE_ID_LEN;
1594 }
1595
1596 DPRINT("dwValues %lu dwMaxValueLength %lu\n", dwValues, dwMaxValueLength / sizeof(WCHAR));
1597
1598 /* Return the largest possible buffer size */
1599 *pulLength = dwValues * dwMaxValueLength / sizeof(WCHAR) + 2;
1600
1601Done:
1602 if (hEnumKey != NULL)
1604
1605 if (hServiceKey != NULL)
1606 RegCloseKey(hServiceKey);
1607
1608 if (hServicesKey != NULL)
1610
1611 return ret;
1612}
1613
1614
1615static
1618 _In_ LPCWSTR pszDevice,
1619 _Out_ PULONG pulLength)
1620{
1621 HKEY hDeviceKey;
1622 DWORD dwSubKeys, dwMaxSubKeyLength;
1623 DWORD dwError;
1624
1625 /* Open the device key */
1626 dwError = RegOpenKeyExW(hEnumKey,
1627 pszDevice,
1628 0,
1629 KEY_READ,
1630 &hDeviceKey);
1631 if (dwError != ERROR_SUCCESS)
1632 {
1633 DPRINT("Failed to open the device key (Error %lu)\n", dwError);
1634 return CR_REGISTRY_ERROR;
1635 }
1636
1637 /* Retrieve the number of device instances and the maximum name length */
1638 dwError = RegQueryInfoKeyW(hDeviceKey,
1639 NULL,
1640 NULL,
1641 NULL,
1642 &dwSubKeys,
1643 &dwMaxSubKeyLength,
1644 NULL,
1645 NULL,
1646 NULL,
1647 NULL,
1648 NULL,
1649 NULL);
1650 if (dwError != ERROR_SUCCESS)
1651 {
1652 DPRINT("RegQueryInfoKeyW failed (Error %lu)\n", dwError);
1653 dwSubKeys = 0;
1654 dwMaxSubKeyLength = 0;
1655 }
1656
1657 /* Close the device key */
1658 RegCloseKey(hDeviceKey);
1659
1660 /* Return the largest possible buffer size */
1661 *pulLength = dwSubKeys * (wcslen(pszDevice) + 1 + dwMaxSubKeyLength + 1);
1662
1663 return CR_SUCCESS;
1664}
1665
1666
1667static
1670 _In_ LPCWSTR pszEnumerator,
1671 _Out_ PULONG pulLength)
1672{
1673 WCHAR szDeviceBuffer[MAX_DEVICE_ID_LEN];
1674 WCHAR szPathBuffer[512];
1675 HKEY hEnumeratorKey;
1676 DWORD dwIndex, dwDeviceLength, dwBufferLength;
1677 DWORD dwError;
1679
1680 *pulLength = 0;
1681
1682 /* Open the enumerator key */
1683 dwError = RegOpenKeyExW(hEnumKey,
1684 pszEnumerator,
1685 0,
1687 &hEnumeratorKey);
1688 if (dwError != ERROR_SUCCESS)
1689 {
1690 DPRINT("Failed to open the enumerator key (Error %lu)\n", dwError);
1691 return CR_REGISTRY_ERROR;
1692 }
1693
1694 for (dwIndex = 0; ; dwIndex++)
1695 {
1696 dwDeviceLength = MAX_DEVICE_ID_LEN;
1697 dwError = RegEnumKeyExW(hEnumeratorKey,
1698 dwIndex,
1699 szDeviceBuffer,
1700 &dwDeviceLength,
1701 NULL,
1702 NULL,
1703 NULL,
1704 NULL);
1705 if (dwError != ERROR_SUCCESS)
1706 break;
1707
1708 wsprintf(szPathBuffer, L"%s\\%s", pszEnumerator, szDeviceBuffer);
1709 DPRINT("Path: %S\n", szPathBuffer);
1710
1711 ret = GetDeviceInstanceListSize(szPathBuffer, &dwBufferLength);
1712 if (ret != CR_SUCCESS)
1713 {
1714 *pulLength = 0;
1715 break;
1716 }
1717
1718 *pulLength += dwBufferLength;
1719 }
1720
1721 /* Close the enumerator key */
1722 RegCloseKey(hEnumeratorKey);
1723
1724 return ret;
1725}
1726
1727
1728static
1731 _Out_ PULONG pulLength)
1732{
1733 WCHAR szEnumeratorBuffer[MAX_DEVICE_ID_LEN];
1734 DWORD dwIndex, dwEnumeratorLength, dwBufferLength;
1735 DWORD dwError;
1737
1738 for (dwIndex = 0; ; dwIndex++)
1739 {
1740 dwEnumeratorLength = MAX_DEVICE_ID_LEN;
1741 dwError = RegEnumKeyExW(hEnumKey,
1742 dwIndex,
1743 szEnumeratorBuffer,
1744 &dwEnumeratorLength,
1745 NULL, NULL, NULL, NULL);
1746 if (dwError != ERROR_SUCCESS)
1747 break;
1748
1749 /* Get the size of all device instances for the enumerator */
1750 ret = GetEnumeratorInstanceListSize(szEnumeratorBuffer,
1751 &dwBufferLength);
1752 if (ret != CR_SUCCESS)
1753 break;
1754
1755 *pulLength += dwBufferLength;
1756 }
1757
1758 return ret;
1759}
1760
1761
1762/* Function 11 */
1763DWORD
1764WINAPI
1767 LPWSTR pszFilter,
1768 PNP_RPC_BUFFER_SIZE *pulLength,
1769 DWORD ulFlags)
1770{
1771 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
1772 WCHAR szDevice[MAX_DEVICE_ID_LEN];
1773 WCHAR szInstance[MAX_DEVICE_ID_LEN];
1775
1776 DPRINT("PNP_GetDeviceListSize(%p %S %p 0x%08lx)\n",
1777 hBinding, pszFilter, pulLength, ulFlags);
1778
1779 if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
1780 return CR_INVALID_FLAG;
1781
1782 if (pulLength == NULL)
1783 return CR_INVALID_POINTER;
1784
1785 if ((ulFlags != CM_GETIDLIST_FILTER_NONE) &&
1786 (pszFilter == NULL))
1787 return CR_INVALID_POINTER;
1788
1789 *pulLength = 0;
1790
1791 if (ulFlags &
1796 {
1798 ulFlags,
1799 pulLength);
1800 }
1801 else if (ulFlags & CM_GETIDLIST_FILTER_SERVICE)
1802 {
1803 ret = GetServiceInstanceListSize(pszFilter,
1804 pulLength);
1805 }
1806 else if (ulFlags & CM_GETIDLIST_FILTER_ENUMERATOR)
1807 {
1808 SplitDeviceInstanceID(pszFilter,
1809 szEnumerator,
1810 szDevice,
1811 szInstance);
1812
1813 if (*szEnumerator != UNICODE_NULL && *szDevice != UNICODE_NULL)
1814 {
1815 ret = GetDeviceInstanceListSize(pszFilter,
1816 pulLength);
1817 }
1818 else
1819 {
1821 pulLength);
1822 }
1823 }
1824 else /* CM_GETIDLIST_FILTER_NONE */
1825 {
1826 ret = GetAllInstanceListSize(pulLength);
1827 }
1828
1829 /* Add one character for the terminating double UNICODE_NULL */
1830 if (ret == CR_SUCCESS)
1831 (*pulLength) += 1;
1832
1833 return ret;
1834}
1835
1836
1837/* Function 12 */
1838DWORD
1839WINAPI
1842 LPWSTR pszDeviceID,
1843 DWORD *pulDepth,
1844 DWORD ulFlags)
1845{
1846 PLUGPLAY_CONTROL_DEPTH_DATA PlugPlayData;
1849
1851 UNREFERENCED_PARAMETER(ulFlags);
1852
1853 DPRINT("PNP_GetDepth(%p %S %p 0x%08lx)\n",
1854 hBinding, pszDeviceID, pulDepth, ulFlags);
1855
1856 if (!IsValidDeviceInstanceID(pszDeviceID))
1857 return CR_INVALID_DEVINST;
1858
1860 pszDeviceID);
1861
1863 (PVOID)&PlugPlayData,
1865 if (NT_SUCCESS(Status))
1866 {
1867 *pulDepth = PlugPlayData.Depth;
1868 }
1869 else
1870 {
1872 }
1873
1874 DPRINT("PNP_GetDepth() done (returns %lx)\n", ret);
1875
1876 return ret;
1877}
1878
1879
1880/* Function 13 */
1881DWORD
1882WINAPI
1885 LPWSTR pDeviceID,
1886 DWORD ulProperty,
1887 DWORD *pulRegDataType,
1888 BYTE *Buffer,
1889 PNP_PROP_SIZE *pulTransferLen,
1890 PNP_PROP_SIZE *pulLength,
1891 DWORD ulFlags)
1892{
1893 PLUGPLAY_CONTROL_PROPERTY_DATA PlugPlayData;
1895 LPWSTR lpValueName = NULL;
1896 HKEY hKey = NULL;
1897 LONG lError;
1899
1901
1902 DPRINT("PNP_GetDeviceRegProp(%p %S %lu %p %p %p %p 0x%08lx)\n",
1903 hBinding, pDeviceID, ulProperty, pulRegDataType, Buffer,
1904 pulTransferLen, pulLength, ulFlags);
1905
1906 if (pulTransferLen == NULL || pulLength == NULL)
1907 {
1909 goto done;
1910 }
1911
1912 if (ulFlags != 0)
1913 {
1915 goto done;
1916 }
1917
1918 /* Check pDeviceID */
1919 if (!IsValidDeviceInstanceID(pDeviceID))
1920 {
1922 goto done;
1923 }
1924
1925 if (*pulLength < *pulTransferLen)
1926 *pulLength = *pulTransferLen;
1927
1928 *pulTransferLen = 0;
1929
1930 switch (ulProperty)
1931 {
1932 case CM_DRP_DEVICEDESC:
1933 lpValueName = L"DeviceDesc";
1934 break;
1935
1936 case CM_DRP_HARDWAREID:
1937 lpValueName = L"HardwareID";
1938 break;
1939
1941 lpValueName = L"CompatibleIDs";
1942 break;
1943
1944 case CM_DRP_SERVICE:
1945 lpValueName = L"Service";
1946 break;
1947
1948 case CM_DRP_CLASS:
1949 lpValueName = L"Class";
1950 break;
1951
1952 case CM_DRP_CLASSGUID:
1953 lpValueName = L"ClassGUID";
1954 break;
1955
1956 case CM_DRP_DRIVER:
1957 lpValueName = L"Driver";
1958 break;
1959
1960 case CM_DRP_CONFIGFLAGS:
1961 lpValueName = L"ConfigFlags";
1962 break;
1963
1964 case CM_DRP_MFG:
1965 lpValueName = L"Mfg";
1966 break;
1967
1969 lpValueName = L"FriendlyName";
1970 break;
1971
1973 lpValueName = L"LocationInformation";
1974 break;
1975
1978 *pulRegDataType = REG_SZ;
1979 break;
1980
1982 lpValueName = L"Capabilities";
1983 break;
1984
1985 case CM_DRP_UI_NUMBER:
1986 PlugPlayData.Property = PNP_PROPERTY_UI_NUMBER;
1987 break;
1988
1990 lpValueName = L"UpperFilters";
1991 break;
1992
1994 lpValueName = L"LowerFilters";
1995 break;
1996
1997 case CM_DRP_BUSTYPEGUID:
1998 PlugPlayData.Property = PNP_PROPERTY_BUSTYPEGUID;
1999 *pulRegDataType = REG_BINARY;
2000 break;
2001
2003 PlugPlayData.Property = PNP_PROPERTY_LEGACYBUSTYPE;
2004 *pulRegDataType = REG_DWORD;
2005 break;
2006
2007 case CM_DRP_BUSNUMBER:
2008 PlugPlayData.Property = PNP_PROPERTY_BUSNUMBER;
2009 *pulRegDataType = REG_DWORD;
2010 break;
2011
2014 *pulRegDataType = REG_SZ;
2015 break;
2016
2017 case CM_DRP_SECURITY:
2018 lpValueName = L"Security";
2019 break;
2020
2021 case CM_DRP_DEVTYPE:
2022 lpValueName = L"DeviceType";
2023 break;
2024
2025 case CM_DRP_EXCLUSIVE:
2026 lpValueName = L"Exclusive";
2027 break;
2028
2030 lpValueName = L"DeviceCharacteristics";
2031 break;
2032
2033 case CM_DRP_ADDRESS:
2034 PlugPlayData.Property = PNP_PROPERTY_ADDRESS;
2035 *pulRegDataType = REG_DWORD;
2036 break;
2037
2039 lpValueName = L"UINumberDescFormat";
2040 break;
2041
2043 PlugPlayData.Property = PNP_PROPERTY_POWER_DATA;
2044 *pulRegDataType = REG_BINARY;
2045 break;
2046
2049 *pulRegDataType = REG_DWORD;
2050 break;
2051
2054 *pulRegDataType = REG_DWORD;
2055 break;
2056
2058 lpValueName = L"RemovalPolicy";
2059 *pulRegDataType = REG_DWORD;
2060 break;
2061
2063 PlugPlayData.Property = PNP_PROPERTY_INSTALL_STATE;
2064 *pulRegDataType = REG_DWORD;
2065 break;
2066
2067#if (WINVER >= _WIN32_WINNT_WS03)
2070 *pulRegDataType = REG_MULTI_SZ;
2071 break;
2072#endif
2073
2074#if (WINVER >= _WIN32_WINNT_WIN7)
2076 PlugPlayData.Property = PNP_PROPERTY_CONTAINERID;
2077 *pulRegDataType = REG_SZ;
2078 break;
2079#endif
2080
2081 default:
2083 goto done;
2084 }
2085
2086 DPRINT("Value name: %S\n", lpValueName);
2087
2088 if (lpValueName)
2089 {
2090 /* Retrieve information from the Registry */
2091 lError = RegOpenKeyExW(hEnumKey,
2092 pDeviceID,
2093 0,
2095 &hKey);
2096 if (lError != ERROR_SUCCESS)
2097 {
2098 hKey = NULL;
2099 *pulLength = 0;
2101 goto done;
2102 }
2103
2104 lError = RegQueryValueExW(hKey,
2105 lpValueName,
2106 NULL,
2107 pulRegDataType,
2108 Buffer,
2109 pulLength);
2110 if (lError != ERROR_SUCCESS)
2111 {
2112 if (lError == ERROR_MORE_DATA)
2113 {
2115 }
2116 else
2117 {
2118 *pulLength = 0;
2120 }
2121 }
2122 }
2123 else
2124 {
2125 /* Retrieve information from the Device Node */
2127 pDeviceID);
2128 PlugPlayData.Buffer = Buffer;
2129 PlugPlayData.BufferSize = *pulLength;
2130
2132 (PVOID)&PlugPlayData,
2134 if (NT_SUCCESS(Status))
2135 {
2136 *pulLength = PlugPlayData.BufferSize;
2137 }
2138 else
2139 {
2141 }
2142 }
2143
2144done:
2145 if (pulTransferLen)
2146 *pulTransferLen = (ret == CR_SUCCESS) ? *pulLength : 0;
2147
2148 if (hKey != NULL)
2150
2151 DPRINT("PNP_GetDeviceRegProp() done (returns %lx)\n", ret);
2152
2153 return ret;
2154}
2155
2156
2157/* Function 14 */
2158DWORD
2159WINAPI
2162 LPWSTR pDeviceId,
2163 DWORD ulProperty,
2164 DWORD ulDataType,
2165 BYTE *Buffer,
2166 PNP_PROP_SIZE ulLength,
2167 DWORD ulFlags)
2168{
2170 LPWSTR lpValueName = NULL;
2171 HKEY hKey = 0;
2172
2174 UNREFERENCED_PARAMETER(ulFlags);
2175
2176 DPRINT("PNP_SetDeviceRegProp(%p %S %lu %lu %p %lu 0x%08lx)\n",
2177 hBinding, pDeviceId, ulProperty, ulDataType, Buffer,
2178 ulLength, ulFlags);
2179
2180 if (!IsValidDeviceInstanceID(pDeviceId))
2181 return CR_INVALID_DEVINST;
2182
2183 switch (ulProperty)
2184 {
2185 case CM_DRP_DEVICEDESC:
2186 lpValueName = L"DeviceDesc";
2187 break;
2188
2189 case CM_DRP_HARDWAREID:
2190 lpValueName = L"HardwareID";
2191 break;
2192
2194 lpValueName = L"CompatibleIDs";
2195 break;
2196
2197 case CM_DRP_SERVICE:
2198 lpValueName = L"Service";
2199 break;
2200
2201 case CM_DRP_CLASS:
2202 lpValueName = L"Class";
2203 break;
2204
2205 case CM_DRP_CLASSGUID:
2206 lpValueName = L"ClassGUID";
2207 break;
2208
2209 case CM_DRP_DRIVER:
2210 lpValueName = L"Driver";
2211 break;
2212
2213 case CM_DRP_CONFIGFLAGS:
2214 lpValueName = L"ConfigFlags";
2215 break;
2216
2217 case CM_DRP_MFG:
2218 lpValueName = L"Mfg";
2219 break;
2220
2222 lpValueName = L"FriendlyName";
2223 break;
2224
2226 lpValueName = L"LocationInformation";
2227 break;
2228
2230 lpValueName = L"UpperFilters";
2231 break;
2232
2234 lpValueName = L"LowerFilters";
2235 break;
2236
2237 case CM_DRP_SECURITY:
2238 lpValueName = L"Security";
2239 break;
2240
2241 case CM_DRP_DEVTYPE:
2242 lpValueName = L"DeviceType";
2243 break;
2244
2245 case CM_DRP_EXCLUSIVE:
2246 lpValueName = L"Exclusive";
2247 break;
2248
2250 lpValueName = L"DeviceCharacteristics";
2251 break;
2252
2254 lpValueName = L"UINumberDescFormat";
2255 break;
2256
2258 lpValueName = L"RemovalPolicy";
2259 break;
2260
2261 default:
2262 return CR_INVALID_PROPERTY;
2263 }
2264
2265 DPRINT("Value name: %S\n", lpValueName);
2266
2268 pDeviceId,
2269 0,
2271 &hKey))
2272 return CR_INVALID_DEVNODE;
2273
2274 if (ulLength == 0)
2275 {
2277 lpValueName))
2279 }
2280 else
2281 {
2282 if (RegSetValueExW(hKey,
2283 lpValueName,
2284 0,
2285 ulDataType,
2286 Buffer,
2287 ulLength))
2289 }
2290
2292
2293 DPRINT("PNP_SetDeviceRegProp() done (returns %lx)\n", ret);
2294
2295 return ret;
2296}
2297
2298
2299/* Function 15 */
2300DWORD
2301WINAPI
2304 LPWSTR pDeviceId,
2305 LPWSTR pszClassInstance,
2306 PNP_RPC_STRING_LEN ulLength)
2307{
2308 WCHAR szClassGuid[40];
2309 WCHAR szClassInstance[5];
2310 HKEY hDeviceClassKey = NULL;
2311 HKEY hClassInstanceKey;
2312 ULONG ulTransferLength, ulDataLength;
2313 DWORD dwDataType, dwDisposition, i;
2314 DWORD dwError;
2316
2317 DPRINT("PNP_GetClassInstance(%p %S %p %lu)\n",
2318 hBinding, pDeviceId, pszClassInstance, ulLength);
2319
2320 if (!IsValidDeviceInstanceID(pDeviceId))
2321 return CR_INVALID_DEVINST;
2322
2323 ulTransferLength = ulLength;
2325 pDeviceId,
2327 &dwDataType,
2328 (BYTE *)pszClassInstance,
2329 &ulTransferLength,
2330 &ulLength,
2331 0);
2332 if (ret == CR_SUCCESS)
2333 return ret;
2334
2335 ulTransferLength = sizeof(szClassGuid);
2336 ulDataLength = sizeof(szClassGuid);
2338 pDeviceId,
2340 &dwDataType,
2341 (BYTE *)szClassGuid,
2342 &ulTransferLength,
2343 &ulDataLength,
2344 0);
2345 if (ret != CR_SUCCESS)
2346 {
2347 DPRINT1("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret);
2348 goto done;
2349 }
2350
2351 dwError = RegOpenKeyExW(hClassKey,
2352 szClassGuid,
2353 0,
2354 KEY_READ,
2355 &hDeviceClassKey);
2356 if (dwError != ERROR_SUCCESS)
2357 {
2358 DPRINT1("RegOpenKeyExW() failed (Error %lu)\n", dwError);
2359 ret = CR_FAILURE;
2360 goto done;
2361 }
2362
2363 for (i = 0; i < 10000; i++)
2364 {
2365 wsprintf(szClassInstance, L"%04lu", i);
2366
2367 dwError = RegCreateKeyExW(hDeviceClassKey,
2368 szClassInstance,
2369 0,
2370 NULL,
2373 NULL,
2374 &hClassInstanceKey,
2375 &dwDisposition);
2376 if (dwError == ERROR_SUCCESS)
2377 {
2378 RegCloseKey(hClassInstanceKey);
2379
2380 if (dwDisposition == REG_CREATED_NEW_KEY)
2381 {
2382 wsprintf(pszClassInstance,
2383 L"%s\\%s",
2384 szClassGuid,
2385 szClassInstance);
2386
2387 ulDataLength = (wcslen(pszClassInstance) + 1) * sizeof(WCHAR);
2389 pDeviceId,
2391 REG_SZ,
2392 (BYTE *)pszClassInstance,
2393 ulDataLength,
2394 0);
2395 if (ret != CR_SUCCESS)
2396 {
2397 DPRINT1("PNP_SetDeviceRegProp() failed (Error %lu)\n", ret);
2398 RegDeleteKeyW(hDeviceClassKey,
2399 szClassInstance);
2400 }
2401
2402 break;
2403 }
2404 }
2405 }
2406
2407done:
2408 if (hDeviceClassKey != NULL)
2409 RegCloseKey(hDeviceClassKey);
2410
2411 return ret;
2412}
2413
2414
2415/* Function 16 */
2416DWORD
2417WINAPI
2420 LPWSTR pszSubKey,
2421 DWORD samDesired,
2422 DWORD ulFlags)
2423{
2424 HKEY hDeviceKey = NULL, hParametersKey = NULL;
2425 DWORD dwError;
2427
2429 UNREFERENCED_PARAMETER(samDesired);
2430
2431 DPRINT("PNP_CreateKey(%p %S 0x%lx 0x%08lx)\n",
2432 hBinding, pszSubKey, samDesired, ulFlags);
2433
2434 if (ulFlags != 0)
2435 return CR_INVALID_FLAG;
2436
2437 if (!IsValidDeviceInstanceID(pszSubKey))
2438 return CR_INVALID_DEVINST;
2439
2440 dwError = RegOpenKeyExW(hEnumKey,
2441 pszSubKey,
2442 0,
2443 KEY_WRITE,
2444 &hDeviceKey);
2445 if (dwError != ERROR_SUCCESS)
2446 {
2448 goto done;
2449 }
2450
2451 dwError = RegCreateKeyExW(hDeviceKey,
2452 L"Device Parameters",
2453 0,
2454 NULL,
2457 NULL,
2458 &hParametersKey,
2459 NULL);
2460 if (dwError != ERROR_SUCCESS)
2461 {
2463 goto done;
2464 }
2465
2466 /* FIXME: Set key security */
2467
2468done:
2469 if (hParametersKey != NULL)
2470 RegCloseKey(hParametersKey);
2471
2472 if (hDeviceKey != NULL)
2473 RegCloseKey(hDeviceKey);
2474
2475 return ret;
2476}
2477
2478
2479/* Function 17 */
2480DWORD
2481WINAPI
2484 LPWSTR pszDeviceID,
2485 LPWSTR pszParentKey,
2486 LPWSTR pszChildKey,
2487 DWORD ulFlags)
2488{
2491}
2492
2493
2494/* Function 18 */
2495DWORD
2496WINAPI
2499 DWORD *pulClassCount,
2500 DWORD ulFlags)
2501{
2502 HKEY hKey;
2503 DWORD dwError;
2504
2506 UNREFERENCED_PARAMETER(ulFlags);
2507
2508 DPRINT("PNP_GetClassCount(%p %p 0x%08lx)\n",
2509 hBinding, pulClassCount, ulFlags);
2510
2513 0,
2515 &hKey);
2516 if (dwError != ERROR_SUCCESS)
2517 return CR_INVALID_DATA;
2518
2519 dwError = RegQueryInfoKeyW(hKey,
2520 NULL,
2521 NULL,
2522 NULL,
2523 pulClassCount,
2524 NULL,
2525 NULL,
2526 NULL,
2527 NULL,
2528 NULL,
2529 NULL,
2530 NULL);
2532 if (dwError != ERROR_SUCCESS)
2533 return CR_INVALID_DATA;
2534
2535 return CR_SUCCESS;
2536}
2537
2538
2539/* Function 19 */
2540DWORD
2541WINAPI
2544 LPWSTR pszClassGuid,
2545 LPWSTR Buffer,
2546 PNP_RPC_STRING_LEN *pulLength,
2547 DWORD ulFlags)
2548{
2549 WCHAR szKeyName[MAX_PATH];
2551 HKEY hKey;
2552 DWORD dwSize;
2553
2555 UNREFERENCED_PARAMETER(ulFlags);
2556
2557 DPRINT("PNP_GetClassName(%p %S %p %p 0x%08lx)\n",
2558 hBinding, pszClassGuid, Buffer, pulLength, ulFlags);
2559
2560 lstrcpyW(szKeyName, L"System\\CurrentControlSet\\Control\\Class\\");
2561 if (lstrlenW(pszClassGuid) + 1 < sizeof(szKeyName)/sizeof(WCHAR)-(lstrlenW(szKeyName) * sizeof(WCHAR)))
2562 lstrcatW(szKeyName, pszClassGuid);
2563 else
2564 return CR_INVALID_DATA;
2565
2567 szKeyName,
2568 0,
2570 &hKey))
2571 return CR_REGISTRY_ERROR;
2572
2573 dwSize = *pulLength * sizeof(WCHAR);
2575 L"Class",
2576 NULL,
2577 NULL,
2578 (LPBYTE)Buffer,
2579 &dwSize))
2580 {
2581 *pulLength = 0;
2583 }
2584 else
2585 {
2586 *pulLength = dwSize / sizeof(WCHAR);
2587 }
2588
2590
2591 DPRINT("PNP_GetClassName() done (returns %lx)\n", ret);
2592
2593 return ret;
2594}
2595
2596
2597/* Function 20 */
2598DWORD
2599WINAPI
2602 LPWSTR pszClassGuid,
2603 DWORD ulFlags)
2604{
2606
2608
2609 DPRINT("PNP_DeleteClassKey(%p %S 0x%08lx)\n",
2610 hBinding, pszClassGuid, ulFlags);
2611
2612 if (ulFlags & CM_DELETE_CLASS_SUBKEYS)
2613 {
2614 if (SHDeleteKeyW(hClassKey, pszClassGuid) != ERROR_SUCCESS)
2616 }
2617 else
2618 {
2619 if (RegDeleteKeyW(hClassKey, pszClassGuid) != ERROR_SUCCESS)
2621 }
2622
2623 DPRINT("PNP_DeleteClassKey() done (returns %lx)\n", ret);
2624
2625 return ret;
2626}
2627
2628
2629/* Function 21 */
2630DWORD
2631WINAPI
2634 LPWSTR pszInterfaceDevice,
2635 GUID *AliasInterfaceGuid,
2636 LPWSTR pszAliasInterfaceDevice,
2637 PNP_RPC_STRING_LEN *pulLength,
2638 PNP_RPC_STRING_LEN *pulTransferLen,
2639 DWORD ulFlags)
2640{
2644
2646
2647 DPRINT("PNP_GetInterfaceDeviceAlias(%p %S %p %p %p %p 0x%08lx)\n",
2648 hBinding, pszInterfaceDevice, AliasInterfaceGuid, pszAliasInterfaceDevice, pulLength,
2649 pulTransferLen, ulFlags);
2650
2651 if ((AliasInterfaceGuid == NULL) ||
2652 (pulLength == NULL))
2653 return CR_INVALID_POINTER;
2654
2655 if (ulFlags != 0)
2656 return CR_INVALID_FLAG;
2657
2659 &PlugPlayData,
2661 if (NT_SUCCESS(Status))
2662 {
2663 *pulLength = PlugPlayData.AliasSymbolicLinkNameLength;
2664 *pulTransferLen = *pulLength + 1;
2665 }
2666 else
2667 {
2668 *pulLength = 0;
2670 }
2671
2672 DPRINT("PNP_GetInterfaceDeviceAlias() done (returns %lx)\n", ret);
2673 return ret;
2674}
2675
2676
2677/* Function 22 */
2678DWORD
2679WINAPI
2683 LPWSTR pszDeviceID,
2684 BYTE *Buffer,
2685 PNP_RPC_BUFFER_SIZE *pulLength,
2686 DWORD ulFlags)
2687{
2691
2693
2694 DPRINT("PNP_GetInterfaceDeviceList(%p %p %S %p %p 0x%08lx)\n",
2695 hBinding, InterfaceGuid, pszDeviceID, Buffer, pulLength, ulFlags);
2696
2697 if (!IsValidDeviceInstanceID(pszDeviceID))
2698 return CR_INVALID_DEVINST;
2699
2701 pszDeviceID);
2702
2703 PlugPlayData.Flags = ulFlags;
2704 PlugPlayData.FilterGuid = InterfaceGuid;
2705 PlugPlayData.Buffer = Buffer;
2706 PlugPlayData.BufferSize = *pulLength;
2707
2709 (PVOID)&PlugPlayData,
2711 if (NT_SUCCESS(Status))
2712 {
2713 *pulLength = PlugPlayData.BufferSize;
2714 }
2715 else
2716 {
2718 }
2719
2720 DPRINT("PNP_GetInterfaceDeviceList() done (returns %lx)\n", ret);
2721 return ret;
2722}
2723
2724
2725/* Function 23 */
2726DWORD
2727WINAPI
2730 PNP_RPC_BUFFER_SIZE *pulLen,
2732 LPWSTR pszDeviceID,
2733 DWORD ulFlags)
2734{
2738
2740
2741 DPRINT("PNP_GetInterfaceDeviceListSize(%p %p %p %S 0x%08lx)\n",
2742 hBinding, pulLen, InterfaceGuid, pszDeviceID, ulFlags);
2743
2744 if (!IsValidDeviceInstanceID(pszDeviceID))
2745 return CR_INVALID_DEVINST;
2746
2748 pszDeviceID);
2749
2750 PlugPlayData.FilterGuid = InterfaceGuid;
2751 PlugPlayData.Buffer = NULL;
2752 PlugPlayData.BufferSize = 0;
2753 PlugPlayData.Flags = ulFlags;
2754
2756 (PVOID)&PlugPlayData,
2758 if (NT_SUCCESS(Status))
2759 {
2760 *pulLen = PlugPlayData.BufferSize;
2761 }
2762 else
2763 {
2765 }
2766
2767 DPRINT("PNP_GetInterfaceDeviceListSize() done (returns %lx)\n", ret);
2768 return ret;
2769}
2770
2771
2772/* Function 24 */
2773DWORD
2774WINAPI
2777 LPWSTR pszDeviceID,
2779 LPWSTR pszReference,
2780 LPWSTR pszSymLink,
2781 PNP_RPC_STRING_LEN *pulLength,
2782 PNP_RPC_STRING_LEN *pulTransferLen,
2783 DWORD ulFlags)
2784{
2787}
2788
2789
2790/* Function 25 */
2791DWORD
2792WINAPI
2795 LPWSTR pszInterfaceDevice,
2796 DWORD ulFlags)
2797{
2800}
2801
2802
2803/* Function 26 */
2804DWORD
2805WINAPI
2808 LPWSTR pszClassGuid,
2809 DWORD ulProperty,
2810 DWORD *pulRegDataType,
2811 BYTE *Buffer,
2812 PNP_RPC_STRING_LEN *pulTransferLen,
2813 PNP_RPC_STRING_LEN *pulLength,
2814 DWORD ulFlags)
2815{
2817 LPWSTR lpValueName = NULL;
2818 HKEY hInstKey = NULL;
2819 HKEY hPropKey = NULL;
2820 LONG lError;
2821
2823
2824 DPRINT("PNP_GetClassRegProp(%p %S %lu %p %p %p %p 0x%08lx)\n",
2825 hBinding, pszClassGuid, ulProperty, pulRegDataType,
2826 Buffer, pulTransferLen, pulLength, ulFlags);
2827
2828 if (pulTransferLen == NULL || pulLength == NULL)
2829 {
2831 goto done;
2832 }
2833
2834 if (ulFlags != 0)
2835 {
2837 goto done;
2838 }
2839
2840 if (*pulLength < *pulTransferLen)
2841 *pulLength = *pulTransferLen;
2842
2843 *pulTransferLen = 0;
2844
2845 switch (ulProperty)
2846 {
2847 case CM_CRP_SECURITY:
2848 lpValueName = L"Security";
2849 break;
2850
2851 case CM_CRP_DEVTYPE:
2852 lpValueName = L"DeviceType";
2853 break;
2854
2855 case CM_CRP_EXCLUSIVE:
2856 lpValueName = L"Exclusive";
2857 break;
2858
2860 lpValueName = L"DeviceCharacteristics";
2861 break;
2862
2863 default:
2865 goto done;
2866 }
2867
2868 DPRINT("Value name: %S\n", lpValueName);
2869
2870 lError = RegOpenKeyExW(hClassKey,
2871 pszClassGuid,
2872 0,
2873 KEY_READ,
2874 &hInstKey);
2875 if (lError != ERROR_SUCCESS)
2876 {
2877 *pulLength = 0;
2879 goto done;
2880 }
2881
2882 lError = RegOpenKeyExW(hInstKey,
2883 L"Properties",
2884 0,
2885 KEY_READ,
2886 &hPropKey);
2887 if (lError != ERROR_SUCCESS)
2888 {
2889 *pulLength = 0;
2891 goto done;
2892 }
2893
2894 lError = RegQueryValueExW(hPropKey,
2895 lpValueName,
2896 NULL,
2897 pulRegDataType,
2898 Buffer,
2899 pulLength);
2900 if (lError != ERROR_SUCCESS)
2901 {
2902 if (lError == ERROR_MORE_DATA)
2903 {
2905 }
2906 else
2907 {
2908 *pulLength = 0;
2910 }
2911 }
2912
2913done:
2914 if (ret == CR_SUCCESS)
2915 *pulTransferLen = *pulLength;
2916
2917 if (hPropKey != NULL)
2918 RegCloseKey(hPropKey);
2919
2920 if (hInstKey != NULL)
2921 RegCloseKey(hInstKey);
2922
2923 DPRINT("PNP_GetClassRegProp() done (returns %lx)\n", ret);
2924
2925 return ret;
2926}
2927
2928
2929/* Function 27 */
2930DWORD
2931WINAPI
2934 LPWSTR pszClassGuid,
2935 DWORD ulProperty,
2936 DWORD ulDataType,
2937 BYTE *Buffer,
2938 PNP_PROP_SIZE ulLength,
2939 DWORD ulFlags)
2940{
2942 LPWSTR lpValueName = NULL;
2943 HKEY hInstKey = 0;
2944 HKEY hPropKey = 0;
2945 LONG lError;
2946
2948
2949 DPRINT("PNP_SetClassRegProp(%p %S %lu %lu %p %lu 0x%08lx)\n",
2950 hBinding, pszClassGuid, ulProperty, ulDataType,
2951 Buffer, ulLength, ulFlags);
2952
2953 if (ulFlags != 0)
2954 return CR_INVALID_FLAG;
2955
2956 switch (ulProperty)
2957 {
2958 case CM_CRP_SECURITY:
2959 lpValueName = L"Security";
2960 break;
2961
2962 case CM_CRP_DEVTYPE:
2963 lpValueName = L"DeviceType";
2964 break;
2965
2966 case CM_CRP_EXCLUSIVE:
2967 lpValueName = L"Exclusive";
2968 break;
2969
2971 lpValueName = L"DeviceCharacteristics";
2972 break;
2973
2974 default:
2975 return CR_INVALID_PROPERTY;
2976 }
2977
2978 lError = RegOpenKeyExW(hClassKey,
2979 pszClassGuid,
2980 0,
2981 KEY_WRITE,
2982 &hInstKey);
2983 if (lError != ERROR_SUCCESS)
2984 {
2986 goto done;
2987 }
2988
2989 /* FIXME: Set security descriptor */
2990 lError = RegCreateKeyExW(hInstKey,
2991 L"Properties",
2992 0,
2993 NULL,
2996 NULL,
2997 &hPropKey,
2998 NULL);
2999 if (lError != ERROR_SUCCESS)
3000 {
3002 goto done;
3003 }
3004
3005 if (ulLength == 0)
3006 {
3007 if (RegDeleteValueW(hPropKey,
3008 lpValueName))
3010 }
3011 else
3012 {
3013 if (RegSetValueExW(hPropKey,
3014 lpValueName,
3015 0,
3016 ulDataType,
3017 Buffer,
3018 ulLength))
3020 }
3021
3022done:
3023 if (hPropKey != NULL)
3024 RegCloseKey(hPropKey);
3025
3026 if (hInstKey != NULL)
3027 RegCloseKey(hInstKey);
3028
3029 return ret;
3030}
3031
3032
3033static
3036 _In_ LPWSTR pszDeviceID,
3037 _In_ BOOL bPhantomDevice)
3038{
3039 WCHAR szEnumerator[MAX_DEVICE_ID_LEN];
3040 WCHAR szDevice[MAX_DEVICE_ID_LEN];
3041 WCHAR szInstance[MAX_DEVICE_ID_LEN];
3042 HKEY hKeyEnumerator;
3043 HKEY hKeyDevice;
3044 HKEY hKeyInstance;
3045 HKEY hKeyControl;
3046 LONG lError;
3047
3048 /* Split the instance ID */
3049 SplitDeviceInstanceID(pszDeviceID,
3050 szEnumerator,
3051 szDevice,
3052 szInstance);
3053
3054 /* Open or create the enumerator key */
3055 lError = RegCreateKeyExW(hEnumKey,
3056 szEnumerator,
3057 0,
3058 NULL,
3061 NULL,
3062 &hKeyEnumerator,
3063 NULL);
3064 if (lError != ERROR_SUCCESS)
3065 {
3066 return CR_REGISTRY_ERROR;
3067 }
3068
3069 /* Open or create the device key */
3070 lError = RegCreateKeyExW(hKeyEnumerator,
3071 szDevice,
3072 0,
3073 NULL,
3076 NULL,
3077 &hKeyDevice,
3078 NULL);
3079
3080 /* Close the enumerator key */
3081 RegCloseKey(hKeyEnumerator);
3082
3083 if (lError != ERROR_SUCCESS)
3084 {
3085 return CR_REGISTRY_ERROR;
3086 }
3087
3088 /* Try to open the instance key and fail if it exists */
3089 lError = RegOpenKeyExW(hKeyDevice,
3090 szInstance,
3091 0,
3093 &hKeyInstance);
3094 if (lError == ERROR_SUCCESS)
3095 {
3096 DPRINT1("Instance %S already exists!\n", szInstance);
3097 RegCloseKey(hKeyInstance);
3098 RegCloseKey(hKeyDevice);
3100 }
3101
3102 /* Create a new instance key */
3103 lError = RegCreateKeyExW(hKeyDevice,
3104 szInstance,
3105 0,
3106 NULL,
3109 NULL,
3110 &hKeyInstance,
3111 NULL);
3112
3113 /* Close the device key */
3114 RegCloseKey(hKeyDevice);
3115
3116 if (lError != ERROR_SUCCESS)
3117 {
3118 return CR_REGISTRY_ERROR;
3119 }
3120
3121 if (bPhantomDevice)
3122 {
3123 DWORD dwPhantomValue = 1;
3124 RegSetValueExW(hKeyInstance,
3125 L"Phantom",
3126 0,
3127 REG_DWORD,
3128 (PBYTE)&dwPhantomValue,
3129 sizeof(dwPhantomValue));
3130 }
3131
3132 /* Create the 'Control' sub key */
3133 lError = RegCreateKeyExW(hKeyInstance,
3134 L"Control",
3135 0,
3136 NULL,
3139 NULL,
3140 &hKeyControl,
3141 NULL);
3142 if (lError == ERROR_SUCCESS)
3143 {
3144 RegCloseKey(hKeyControl);
3145 }
3146
3147 RegCloseKey(hKeyInstance);
3148
3149 return (lError == ERROR_SUCCESS) ? CR_SUCCESS : CR_REGISTRY_ERROR;
3150}
3151
3152
3153static
3156 _Inout_ LPWSTR pszDeviceID,
3157 _In_ PNP_RPC_STRING_LEN ulLength)
3158{
3159 WCHAR szGeneratedInstance[MAX_DEVICE_ID_LEN];
3160 HKEY hKey;
3161 DWORD dwInstanceNumber;
3162 DWORD dwError = ERROR_SUCCESS;
3164
3165 /* Fail, if the device name contains backslashes */
3166 if (wcschr(pszDeviceID, L'\\') != NULL)
3167 return CR_INVALID_DEVICE_ID;
3168
3169 /* Generated ID is: Root<Device ID><Instance number> */
3170 dwInstanceNumber = 0;
3171 while (dwError == ERROR_SUCCESS)
3172 {
3173 if (dwInstanceNumber >= 10000)
3174 return CR_FAILURE;
3175
3176 swprintf(szGeneratedInstance, L"Root\\%ls\\%04lu",
3177 pszDeviceID, dwInstanceNumber);
3178
3179 /* Try to open the enum key of the device instance */
3180 dwError = RegOpenKeyEx(hEnumKey, szGeneratedInstance, 0, KEY_QUERY_VALUE, &hKey);
3181 if (dwError == ERROR_SUCCESS)
3182 {
3184 dwInstanceNumber++;
3185 }
3186 }
3187
3188 /* pszDeviceID is an out parameter too for generated IDs */
3189 if (wcslen(szGeneratedInstance) > ulLength)
3190 {
3192 }
3193 else
3194 {
3195 wcscpy(pszDeviceID, szGeneratedInstance);
3196 }
3197
3198 return ret;
3199}
3200
3201
3202/* Function 28 */
3203DWORD
3204WINAPI
3207 LPWSTR pszDeviceID,
3208 LPWSTR pszParentDeviceID,
3209 PNP_RPC_STRING_LEN ulLength,
3210 DWORD ulFlags)
3211{
3213 HKEY hKey = NULL;
3214 DWORD dwSize, dwPhantom;
3217
3218 DPRINT("PNP_CreateDevInst(%p %S %S %lu 0x%08lx)\n",
3219 hBinding, pszParentDeviceID, pszDeviceID, ulLength, ulFlags);
3220
3221 if (ulFlags & ~CM_CREATE_DEVNODE_BITS)
3222 return CR_INVALID_FLAG;
3223
3224 if (pszDeviceID == NULL || pszParentDeviceID == NULL)
3225 return CR_INVALID_POINTER;
3226
3227 /* Fail, if the parent device is not the root device */
3228 if (!IsRootDeviceInstanceID(pszParentDeviceID))
3229 return CR_INVALID_DEVINST;
3230
3231 if (ulFlags & CM_CREATE_DEVNODE_GENERATE_ID)
3232 {
3233 ret = GenerateDeviceID(pszDeviceID,
3234 ulLength);
3235 if (ret != CR_SUCCESS)
3236 return ret;
3237 }
3238
3239 /* Try to open the device instance key */
3240 RegOpenKeyEx(hEnumKey, pszDeviceID, 0, KEY_READ | KEY_WRITE, &hKey);
3241
3242 if (ulFlags & CM_CREATE_DEVNODE_PHANTOM)
3243 {
3244 /* Fail, if the device already exists */
3245 if (hKey != NULL)
3246 {
3248 goto done;
3249 }
3250
3251 /* Create the phantom device instance */
3252 ret = CreateDeviceInstance(pszDeviceID, TRUE);
3253 }
3254 else
3255 {
3256 /* Fail, if the device exists and is present */
3257 if ((hKey != NULL) && (IsPresentDeviceInstanceID(pszDeviceID)))
3258 {
3260 goto done;
3261 }
3262
3263 /* If it does not already exist ... */
3264 if (hKey == NULL)
3265 {
3266 /* Create the device instance */
3267 ret = CreateDeviceInstance(pszDeviceID, FALSE);
3268
3269 /* Open the device instance key */
3270 RegOpenKeyEx(hEnumKey, pszDeviceID, 0, KEY_READ | KEY_WRITE, &hKey);
3271 }
3272
3273 /* Create a device node for the device */
3274 RtlInitUnicodeString(&ControlData.DeviceInstance, pszDeviceID);
3276 &ControlData,
3277 sizeof(ControlData));
3278 if (!NT_SUCCESS(Status))
3279 {
3280 ret = CR_FAILURE;
3281 goto done;
3282 }
3283
3284 /* If the device is a phantom device, turn it into a normal device */
3285 if (hKey != NULL)
3286 {
3287 dwPhantom = 0;
3288 dwSize = sizeof(DWORD);
3289 RegQueryValueEx(hKey, L"Phantom", NULL, NULL, (PBYTE)&dwPhantom, &dwSize);
3290
3291 if (dwPhantom != 0)
3292 RegDeleteValue(hKey, L"Phantom");
3293 }
3294 }
3295
3296done:
3297 if (hKey)
3299
3300 DPRINT("PNP_CreateDevInst() done (returns %lx)\n", ret);
3301
3302 return ret;
3303}
3304
3305
3306static CONFIGRET
3308 _In_ LPWSTR pszDeviceInstance,
3309 _In_ DWORD ulMinorAction)
3310{
3312 HKEY hDeviceKey = NULL;
3313 DWORD dwDisableCount, dwSize;
3314 DWORD ulStatus, ulProblem;
3315 DWORD dwError;
3318
3319 DPRINT1("SetupDeviceInstance(%S 0x%08lx)\n",
3320 pszDeviceInstance, ulMinorAction);
3321
3322 if (IsRootDeviceInstanceID(pszDeviceInstance))
3323 return CR_INVALID_DEVINST;
3324
3325 if (ulMinorAction & ~CM_SETUP_BITS)
3326 return CR_INVALID_FLAG;
3327
3328 if ((ulMinorAction == CM_SETUP_DOWNLOAD) ||
3329 (ulMinorAction == CM_SETUP_WRITE_LOG_CONFS))
3330 return CR_SUCCESS;
3331
3332 dwError = RegOpenKeyExW(hEnumKey,
3333 pszDeviceInstance,
3334 0,
3335 KEY_READ,
3336 &hDeviceKey);
3337 if (dwError != ERROR_SUCCESS)
3338 return CR_INVALID_DEVNODE;
3339
3340 dwSize = sizeof(dwDisableCount);
3341 dwError = RegQueryValueExW(hDeviceKey,
3342 L"DisableCount",
3343 NULL,
3344 NULL,
3345 (LPBYTE)&dwDisableCount,
3346 &dwSize);
3347 if ((dwError == ERROR_SUCCESS) &&
3348 (dwDisableCount > 0))
3349 {
3350 goto done;
3351 }
3352
3353 GetDeviceStatus(pszDeviceInstance,
3354 &ulStatus,
3355 &ulProblem);
3356
3357 if (ulStatus & DN_STARTED)
3358 {
3359 goto done;
3360 }
3361
3362 if (ulStatus & DN_HAS_PROBLEM)
3363 {
3364 ret = ClearDeviceStatus(pszDeviceInstance,
3366 ulProblem);
3367 }
3368
3369 if (ret != CR_SUCCESS)
3370 goto done;
3371
3372 /* Start the device */
3374 pszDeviceInstance);
3376 &ControlData,
3378 if (!NT_SUCCESS(Status))
3380
3381done:
3382 if (hDeviceKey != NULL)
3383 RegCloseKey(hDeviceKey);
3384
3385 return ret;
3386}
3387
3388
3389static CONFIGRET
3391 _In_ LPWSTR pszDeviceInstance)
3392{
3396
3397 DPRINT("Enable device instance %S\n", pszDeviceInstance);
3398
3399 RtlInitUnicodeString(&ControlData.DeviceInstance, pszDeviceInstance);
3400 Status = NtPlugPlayControl(PlugPlayControlStartDevice, &ControlData, sizeof(ControlData));
3401 if (!NT_SUCCESS(Status))
3403
3404 return ret;
3405}
3406
3407
3408static CONFIGRET
3410 _In_ LPWSTR pszDeviceInstance,
3411 _In_ ULONG ulMinorAction)
3412{
3413 PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA EnumerateDeviceData;
3416
3417 DPRINT1("ReenumerateDeviceInstance(%S 0x%08lx)\n",
3418 pszDeviceInstance, ulMinorAction);
3419
3420 if (ulMinorAction & ~CM_REENUMERATE_BITS)
3421 return CR_INVALID_FLAG;
3422
3423 if (ulMinorAction & CM_REENUMERATE_RETRY_INSTALLATION)
3424 {
3425 DPRINT1("CM_REENUMERATE_RETRY_INSTALLATION not implemented!\n");
3426 }
3427
3428 RtlInitUnicodeString(&EnumerateDeviceData.DeviceInstance,
3429 pszDeviceInstance);
3430 EnumerateDeviceData.Flags = 0;
3431
3433 &EnumerateDeviceData,
3435 if (!NT_SUCCESS(Status))
3437
3438 return ret;
3439}
3440
3441
3442/* Function 29 */
3443DWORD
3444WINAPI
3447 DWORD ulMajorAction,
3448 DWORD ulMinorAction,
3449 LPWSTR pszDeviceInstance1,
3450 LPWSTR pszDeviceInstance2)
3451{
3453
3455
3456 DPRINT("PNP_DeviceInstanceAction(%p %lu 0x%08lx %S %S)\n",
3457 hBinding, ulMajorAction, ulMinorAction,
3458 pszDeviceInstance1, pszDeviceInstance2);
3459
3460 switch (ulMajorAction)
3461 {
3462 case PNP_DEVINST_SETUP:
3463 ret = SetupDeviceInstance(pszDeviceInstance1,
3464 ulMinorAction);
3465 break;
3466
3467 case PNP_DEVINST_ENABLE:
3468 ret = EnableDeviceInstance(pszDeviceInstance1);
3469 break;
3470
3471 case PNP_DEVINST_REENUMERATE:
3472 ret = ReenumerateDeviceInstance(pszDeviceInstance1,
3473 ulMinorAction);
3474 break;
3475
3476 default:
3477 DPRINT1("Unknown device action %lu: not implemented\n", ulMajorAction);
3479 }
3480
3481 DPRINT("PNP_DeviceInstanceAction() done (returns %lx)\n", ret);
3482
3483 return ret;
3484}
3485
3486
3487/* Function 30 */
3488DWORD
3489WINAPI
3492 LPWSTR pDeviceID,
3493 DWORD *pulStatus,
3494 DWORD *pulProblem,
3495 DWORD ulFlags)
3496{
3497 DWORD ulDataType, ulTransferLength, ulLength;
3498 DWORD ulCapabilities, ulConfigFlags;
3499 CONFIGRET ret;
3500
3502 UNREFERENCED_PARAMETER(ulFlags);
3503
3504 DPRINT("PNP_GetDeviceStatus(%p %S %p %p 0x%08lx)\n",
3505 hBinding, pDeviceID, pulStatus, pulProblem, ulFlags);
3506
3507 if (ulFlags != 0)
3508 return CR_INVALID_FLAG;
3509
3510 if ((pulStatus == NULL) || (pulProblem == NULL))
3511 return CR_INVALID_POINTER;
3512
3513 if (!IsValidDeviceInstanceID(pDeviceID))
3514 return CR_INVALID_DEVINST;
3515
3516 ret = GetDeviceStatus(pDeviceID, pulStatus, pulProblem);
3517 if (ret != CR_SUCCESS)
3518 return ret;
3519
3520 /* Check for DN_REMOVABLE */
3521 ulTransferLength = sizeof(ulCapabilities);
3522 ulLength = sizeof(ulCapabilities);
3524 pDeviceID,
3526 &ulDataType,
3527 (PBYTE)&ulCapabilities,
3528 &ulTransferLength,
3529 &ulLength,
3530 0);
3531 if (ret != CR_SUCCESS)
3532 ulCapabilities = 0;
3533
3534 if (ulCapabilities & CM_DEVCAP_REMOVABLE)
3535 *pulStatus |= DN_REMOVABLE;
3536
3537 /* Check for DN_MANUAL */
3538 ulTransferLength = sizeof(ulConfigFlags);
3539 ulLength = sizeof(ulConfigFlags);
3541 pDeviceID,
3543 &ulDataType,
3544 (PBYTE)&ulConfigFlags,
3545 &ulTransferLength,
3546 &ulLength,
3547 0);
3548 if (ret != CR_SUCCESS)
3549 ulConfigFlags = 0;
3550
3551 if (ulConfigFlags & CONFIGFLAG_MANUAL_INSTALL)
3552 *pulStatus |= DN_MANUAL;
3553
3554 /* Check for failed install */
3555 if (((*pulStatus & DN_HAS_PROBLEM) == 0) && (ulConfigFlags & CONFIGFLAG_FAILEDINSTALL))
3556 {
3557 *pulStatus |= DN_HAS_PROBLEM;
3558 *pulProblem = CM_PROB_FAILED_INSTALL;
3559 }
3560
3561 return CR_SUCCESS;
3562}
3563
3564
3565/* Function 31 */
3566DWORD
3567WINAPI
3570 LPWSTR pDeviceID,
3571 DWORD ulProblem,
3572 DWORD ulFlags)
3573{
3574 ULONG ulOldStatus, ulOldProblem;
3576
3578
3579 DPRINT1("PNP_SetDeviceProblem(%p %S %lu 0x%08lx)\n",
3580 hBinding, pDeviceID, ulProblem, ulFlags);
3581
3582 if (ulFlags & ~CM_SET_DEVNODE_PROBLEM_BITS)
3583 return CR_INVALID_FLAG;
3584
3585 if (!IsValidDeviceInstanceID(pDeviceID))
3586 return CR_INVALID_DEVINST;
3587
3588 ret = GetDeviceStatus(pDeviceID,
3589 &ulOldStatus,
3590 &ulOldProblem);
3591 if (ret != CR_SUCCESS)
3592 return ret;
3593
3594 if (((ulFlags & CM_SET_DEVNODE_PROBLEM_OVERRIDE) == 0) &&
3595 (ulOldProblem != 0) &&
3596 (ulOldProblem != ulProblem))
3597 {
3598 return CR_FAILURE;
3599 }
3600
3601 if (ulProblem == 0)
3602 {
3603 ret = ClearDeviceStatus(pDeviceID,
3605 ulOldProblem);
3606 }
3607 else
3608 {
3609 ret = SetDeviceStatus(pDeviceID,
3611 ulProblem);
3612 }
3613
3614 return ret;
3615}
3616
3617
3618/* Function 32 */
3619DWORD
3620WINAPI
3623 LPWSTR pDeviceID,
3624 PPNP_VETO_TYPE pVetoType,
3625 LPWSTR pszVetoName,
3626 DWORD ulNameLength,
3627 DWORD ulFlags)
3628{
3630
3631 DPRINT1("PNP_DisableDevInst(%p %S %p %p %lu 0x%08lx)\n",
3632 hBinding, pDeviceID, pVetoType, pszVetoName, ulNameLength, ulFlags);
3633
3634 if (ulFlags & ~CM_DISABLE_BITS)
3635 return CR_INVALID_FLAG;
3636
3637 if (!IsValidDeviceInstanceID(pDeviceID) ||
3638 IsRootDeviceInstanceID(pDeviceID))
3639 return CR_INVALID_DEVINST;
3640
3641 return DisableDeviceInstance(pDeviceID,
3642 pVetoType,
3643 pszVetoName,
3644 ulNameLength);
3645}
3646
3647
3648/* Function 33 */
3649DWORD
3650WINAPI
3653 LPWSTR pDeviceID,
3654 DWORD ulFlags)
3655{
3658}
3659
3660
3661static BOOL
3663 LPWSTR lpDeviceId)
3664{
3665 LPWSTR lpPtr;
3667
3668 lpPtr = lpDeviceIdList;
3669 while (*lpPtr != 0)
3670 {
3671 dwLength = wcslen(lpPtr);
3672 if (0 == _wcsicmp(lpPtr, lpDeviceId))
3673 return TRUE;
3674
3675 lpPtr += (dwLength + 1);
3676 }
3677
3678 return FALSE;
3679}
3680
3681
3682static VOID
3683AppendDeviceId(LPWSTR lpDeviceIdList,
3684 LPDWORD lpDeviceIdListSize,
3685 LPWSTR lpDeviceId)
3686{
3687 DWORD dwLen;
3688 DWORD dwPos;
3689
3690 dwLen = wcslen(lpDeviceId);
3691 dwPos = (*lpDeviceIdListSize / sizeof(WCHAR)) - 1;
3692
3693 wcscpy(&lpDeviceIdList[dwPos], lpDeviceId);
3694
3695 dwPos += (dwLen + 1);
3696
3697 lpDeviceIdList[dwPos] = 0;
3698
3699 *lpDeviceIdListSize = dwPos * sizeof(WCHAR);
3700}
3701
3702
3703/* Function 34 */
3704DWORD
3705WINAPI
3708 LPWSTR pszDeviceID,
3709 LPWSTR pszID,
3710 DWORD ulFlags)
3711{
3713 HKEY hDeviceKey;
3714 LPWSTR pszSubKey;
3715 DWORD dwDeviceIdListSize;
3716 DWORD dwNewDeviceIdSize;
3717 WCHAR * pszDeviceIdList = NULL;
3718
3720
3721 DPRINT("PNP_AddID(%p %S %S 0x%08lx)\n",
3722 hBinding, pszDeviceID, pszID, ulFlags);
3723
3725 pszDeviceID,
3726 0,
3728 &hDeviceKey) != ERROR_SUCCESS)
3729 {
3730 DPRINT("Failed to open the device key!\n");
3731 return CR_INVALID_DEVNODE;
3732 }
3733
3734 pszSubKey = (ulFlags & CM_ADD_ID_COMPATIBLE) ? L"CompatibleIDs" : L"HardwareID";
3735
3736 if (RegQueryValueExW(hDeviceKey,
3737 pszSubKey,
3738 NULL,
3739 NULL,
3740 NULL,
3741 &dwDeviceIdListSize) != ERROR_SUCCESS)
3742 {
3743 DPRINT("Failed to query the desired ID string!\n");
3745 goto Done;
3746 }
3747
3748 dwNewDeviceIdSize = lstrlenW(pszDeviceID);
3749 if (!dwNewDeviceIdSize)
3750 {
3752 goto Done;
3753 }
3754
3755 dwDeviceIdListSize += (dwNewDeviceIdSize + 2) * sizeof(WCHAR);
3756
3757 pszDeviceIdList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwDeviceIdListSize);
3758 if (!pszDeviceIdList)
3759 {
3760 DPRINT("Failed to allocate memory for the desired ID string!\n");
3762 goto Done;
3763 }
3764
3765 if (RegQueryValueExW(hDeviceKey,
3766 pszSubKey,
3767 NULL,
3768 NULL,
3769 (LPBYTE)pszDeviceIdList,
3770 &dwDeviceIdListSize) != ERROR_SUCCESS)
3771 {
3772 DPRINT("Failed to query the desired ID string!\n");
3774 goto Done;
3775 }
3776
3777 /* Check whether the device ID is already in use */
3778 if (CheckForDeviceId(pszDeviceIdList, pszDeviceID))
3779 {
3780 DPRINT("Device ID was found in the ID string!\n");
3781 ret = CR_SUCCESS;
3782 goto Done;
3783 }
3784
3785 /* Append the Device ID */
3786 AppendDeviceId(pszDeviceIdList, &dwDeviceIdListSize, pszID);
3787
3788 if (RegSetValueExW(hDeviceKey,
3789 pszSubKey,
3790 0,
3792 (LPBYTE)pszDeviceIdList,
3793 dwDeviceIdListSize) != ERROR_SUCCESS)
3794 {
3795 DPRINT("Failed to set the desired ID string!\n");
3797 }
3798
3799Done:
3800 RegCloseKey(hDeviceKey);
3801 if (pszDeviceIdList)
3802 HeapFree(GetProcessHeap(), 0, pszDeviceIdList);
3803
3804 DPRINT("PNP_AddID() done (returns %lx)\n", ret);
3805
3806 return ret;
3807}
3808
3809
3810/* Function 35 */
3811DWORD
3812WINAPI
3815 LPWSTR pszDeviceID,
3816 DWORD ulFlags)
3817{
3818 DPRINT("PNP_RegisterDriver(%p %S 0x%lx)\n",
3819 hBinding, pszDeviceID, ulFlags);
3820
3821 if (ulFlags & ~CM_REGISTER_DEVICE_DRIVER_BITS)
3822 return CR_INVALID_FLAG;
3823
3824 if (!IsValidDeviceInstanceID(pszDeviceID))
3825 return CR_INVALID_DEVINST;
3826
3827 SetDeviceStatus(pszDeviceID, 0, 0);
3828
3829 return CR_SUCCESS;
3830}
3831
3832
3833/* Function 36 */
3834DWORD
3835WINAPI
3838 LPWSTR pszDeviceID,
3839 PPNP_VETO_TYPE pVetoType,
3840 LPWSTR pszVetoName,
3841 DWORD ulNameLength,
3842 DWORD ulFlags)
3843{
3847
3848 DPRINT1("PNP_QueryRemove(%p %S %p %p %lu 0x%lx)\n",
3849 hBinding, pszDeviceID, pVetoType, pszVetoName,
3850 ulNameLength, ulFlags);
3851
3852 if (ulFlags & ~CM_REMOVE_BITS)
3853 return CR_INVALID_FLAG;
3854
3855 if (!IsValidDeviceInstanceID(pszDeviceID) ||
3856 IsRootDeviceInstanceID(pszDeviceID))
3857 return CR_INVALID_DEVINST;
3858
3859 if (pVetoType != NULL)
3860 *pVetoType = PNP_VetoTypeUnknown;
3861
3862 if (pszVetoName != NULL && ulNameLength > 0)
3863 *pszVetoName = UNICODE_NULL;
3864
3865 RtlZeroMemory(&PlugPlayData, sizeof(PlugPlayData));
3867 pszDeviceID);
3868 PlugPlayData.VetoName = pszVetoName;
3869 PlugPlayData.NameLength = ulNameLength;
3870// PlugPlayData.Flags =
3871
3873 &PlugPlayData,
3874 sizeof(PlugPlayData));
3875 if (!NT_SUCCESS(Status))
3877
3878 return ret;
3879}
3880
3881
3882/* Function 37 */
3883DWORD
3884WINAPI
3887 LPWSTR pszDeviceID,
3888 PPNP_VETO_TYPE pVetoType,
3889 LPWSTR pszVetoName,
3890 DWORD ulNameLength,
3891 DWORD ulFlags)
3892{
3896
3897 DPRINT1("PNP_RequestDeviceEject(%p %S %p %p %lu 0x%lx)\n",
3898 hBinding, pszDeviceID, pVetoType, pszVetoName,
3899 ulNameLength, ulFlags);
3900
3901 if (ulFlags != 0)
3902 return CR_INVALID_FLAG;
3903
3904 if (!IsValidDeviceInstanceID(pszDeviceID))
3905 return CR_INVALID_DEVINST;
3906
3907 if (pVetoType != NULL)
3908 *pVetoType = PNP_VetoTypeUnknown;
3909
3910 if (pszVetoName != NULL && ulNameLength > 0)
3911 *pszVetoName = UNICODE_NULL;
3912
3913 RtlZeroMemory(&PlugPlayData, sizeof(PlugPlayData));
3915 pszDeviceID);
3916 PlugPlayData.VetoName = pszVetoName;
3917 PlugPlayData.NameLength = ulNameLength;
3918// PlugPlayData.Flags =
3919
3921 &PlugPlayData,
3922 sizeof(PlugPlayData));
3923 if (!NT_SUCCESS(Status))
3925
3926 return ret;
3927}
3928
3929
3930/* Function 38 */
3932WINAPI
3935 BOOL *Present)
3936{
3937 HKEY hKey;
3938 DWORD dwType;
3939 DWORD dwValue;
3940 DWORD dwSize;
3942
3944
3945 DPRINT1("PNP_IsDockStationPresent(%p %p)\n",
3946 hBinding, Present);
3947
3948 *Present = FALSE;
3949
3951 L"CurrentDockInfo",
3952 0,
3953 KEY_READ,
3954 &hKey) != ERROR_SUCCESS)
3955 return CR_REGISTRY_ERROR;
3956
3957 dwSize = sizeof(DWORD);
3959 L"DockingState",
3960 NULL,
3961 &dwType,
3962 (LPBYTE)&dwValue,
3963 &dwSize) != ERROR_SUCCESS)
3965
3967
3968 if (ret == CR_SUCCESS)
3969 {
3970 if (dwType != REG_DWORD || dwSize != sizeof(DWORD))
3971 {
3973 }
3974 else if (dwValue != 0)
3975 {
3976 *Present = TRUE;
3977 }
3978 }
3979
3980 DPRINT1("PNP_IsDockStationPresent() done (returns %lx)\n", ret);
3981
3982 return ret;
3983}
3984
3985
3986/* Function 39 */
3987DWORD
3988WINAPI
3991{
3992 WCHAR szDockDeviceInstance[MAX_DEVICE_ID_LEN];
3995
3996 DPRINT("PNP_RequestEjectPC(%p)\n", hBinding);
3997
3998 /* Retrieve the dock device */
3999 DockData.DeviceInstanceLength = ARRAYSIZE(szDockDeviceInstance);
4000 DockData.DeviceInstance = szDockDeviceInstance;
4001
4003 &DockData,
4004 sizeof(DockData));
4005 if (!NT_SUCCESS(Status))
4006 return NtStatusToCrError(Status);
4007
4008 /* Eject the dock device */
4010 szDockDeviceInstance,
4011 NULL,
4012 NULL,
4013 0,
4014 0);
4015}
4016
4017
4018/* Function 40 */
4019DWORD
4020WINAPI
4023 DWORD ulAction,
4024 LPWSTR pDeviceID,
4025 DWORD ulConfig,
4026 DWORD *pulValue,
4027 PPNP_VETO_TYPE pVetoType,
4028 LPWSTR pszVetoName,
4029 DWORD ulNameLength,
4030 DWORD ulFlags)
4031{
4033 WCHAR szKeyName[MAX_PATH];
4034 HKEY hKey;
4035 HKEY hDeviceKey;
4036 DWORD dwSize;
4037
4039
4040 DPRINT("PNP_HwProfFlags() called\n");
4041
4042 if (!IsValidDeviceInstanceID(pDeviceID))
4043 return CR_INVALID_DEVINST;
4044
4045 if (ulConfig == 0)
4046 {
4047 wcscpy(szKeyName,
4048 L"System\\CurrentControlSet\\HardwareProfiles\\Current\\System\\CurrentControlSet\\Enum");
4049 }
4050 else
4051 {
4052 swprintf(szKeyName,
4053 L"System\\CurrentControlSet\\HardwareProfiles\\%04lu\\System\\CurrentControlSet\\Enum",
4054 ulConfig);
4055 }
4056
4058 szKeyName,
4059 0,
4061 &hKey) != ERROR_SUCCESS)
4062 return CR_REGISTRY_ERROR;
4063
4064 if (ulAction == PNP_GET_HWPROFFLAGS)
4065 {
4066 if (RegOpenKeyExW(hKey,
4067 pDeviceID,
4068 0,
4070 &hDeviceKey) != ERROR_SUCCESS)
4071 {
4072 *pulValue = 0;
4073 }
4074 else
4075 {
4076 dwSize = sizeof(DWORD);
4077 if (RegQueryValueExW(hDeviceKey,
4078 L"CSConfigFlags",
4079 NULL,
4080 NULL,
4081 (LPBYTE)pulValue,
4082 &dwSize) != ERROR_SUCCESS)
4083 {
4084 *pulValue = 0;
4085 }
4086
4087 RegCloseKey(hDeviceKey);
4088 }
4089 }
4090 else if (ulAction == PNP_SET_HWPROFFLAGS)
4091 {
4092 /* FIXME: not implemented yet */
4094 }
4095
4097
4098 return ret;
4099}
4100
4101
4102/* Function 41 */
4103DWORD
4104WINAPI
4107 DWORD ulIndex,
4108 HWPROFILEINFO *pHWProfileInfo,
4109 DWORD ulProfileInfoSize,
4110 DWORD ulFlags)
4111{
4112 WCHAR szProfileName[5];
4113 HKEY hKeyConfig = NULL;
4114 HKEY hKeyProfiles = NULL;
4115 HKEY hKeyProfile = NULL;
4116 DWORD dwDisposition;
4117 DWORD dwSize;
4118 LONG lError;
4120
4122
4123 DPRINT("PNP_GetHwProfInfo() called\n");
4124
4125 if (ulProfileInfoSize == 0)
4126 {
4128 goto done;
4129 }
4130
4131 if (ulFlags != 0)
4132 {
4134 goto done;
4135 }
4136
4137 /* Initialize the profile information */
4138 pHWProfileInfo->HWPI_ulHWProfile = 0;
4139 pHWProfileInfo->HWPI_szFriendlyName[0] = 0;
4140 pHWProfileInfo->HWPI_dwFlags = 0;
4141
4142 /* Open the 'IDConfigDB' key */
4144 L"System\\CurrentControlSet\\Control\\IDConfigDB",
4145 0,
4146 NULL,
4149 NULL,
4150 &hKeyConfig,
4151 &dwDisposition);
4152 if (lError != ERROR_SUCCESS)
4153 {
4155 goto done;
4156 }
4157
4158 /* Open the 'Hardware Profiles' subkey */
4159 lError = RegCreateKeyExW(hKeyConfig,
4160 L"Hardware Profiles",
4161 0,
4162 NULL,
4165 NULL,
4166 &hKeyProfiles,
4167 &dwDisposition);
4168 if (lError != ERROR_SUCCESS)
4169 {
4171 goto done;
4172 }
4173
4174 if (ulIndex == (ULONG)-1)
4175 {
4176 dwSize = sizeof(ULONG);
4177 lError = RegQueryValueExW(hKeyConfig,
4178 L"CurrentConfig",
4179 NULL,
4180 NULL,
4181 (LPBYTE)&pHWProfileInfo->HWPI_ulHWProfile,
4182 &dwSize);
4183 if (lError != ERROR_SUCCESS)
4184 {
4185 pHWProfileInfo->HWPI_ulHWProfile = 0;
4187 goto done;
4188 }
4189 }
4190 else
4191 {
4192 /* FIXME: not implemented yet */
4194 goto done;
4195 }
4196
4197 swprintf(szProfileName, L"%04lu", pHWProfileInfo->HWPI_ulHWProfile);
4198
4199 lError = RegOpenKeyExW(hKeyProfiles,
4200 szProfileName,
4201 0,
4203 &hKeyProfile);
4204 if (lError != ERROR_SUCCESS)
4205 {
4207 goto done;
4208 }
4209
4210 dwSize = sizeof(pHWProfileInfo->HWPI_szFriendlyName);
4211 lError = RegQueryValueExW(hKeyProfile,
4212 L"FriendlyName",
4213 NULL,
4214 NULL,
4215 (LPBYTE)&pHWProfileInfo->HWPI_szFriendlyName,
4216 &dwSize);
4217 if (lError != ERROR_SUCCESS)
4218 {
4220 goto done;
4221 }
4222
4223done:
4224 if (hKeyProfile != NULL)
4225 RegCloseKey(hKeyProfile);
4226
4227 if (hKeyProfiles != NULL)
4228 RegCloseKey(hKeyProfiles);
4229
4230 if (hKeyConfig != NULL)
4231 RegCloseKey(hKeyConfig);
4232
4233 return ret;
4234}
4235
4236
4237/* Function 42 */
4238DWORD
4239WINAPI
4242 LPWSTR pDeviceID,
4243 DWORD ulPriority,
4244 DWORD *pulLogConfTag,
4245 DWORD ulFlags)
4246{
4247 HKEY hConfigKey = NULL;
4248 DWORD RegDataType = 0;
4249 ULONG ulDataSize = 0, ulNewSize = 0;
4250 PBYTE pDataBuffer = NULL;
4251 WCHAR szValueNameBuffer[LOGCONF_NAME_BUFFER_SIZE];
4253
4254 DPRINT("PNP_AddEmptyLogConf(%p %S %lu %p 0x%08lx)\n",
4255 hBinding, pDeviceID, ulPriority, pulLogConfTag, ulFlags);
4256
4257 if (pulLogConfTag == NULL)
4258 return CR_INVALID_POINTER;
4259
4260 *pulLogConfTag = 0;
4261
4262 if (ulFlags & ~(LOG_CONF_BITS | PRIORITY_BIT))
4263 return CR_INVALID_FLAG;
4264
4265 if (!IsValidDeviceInstanceID(pDeviceID) || IsRootDeviceInstanceID(pDeviceID))
4266 return CR_INVALID_DEVNODE;
4267
4268 ret = OpenConfigurationKey(pDeviceID,
4269 ulFlags & LOG_CONF_BITS,
4270 &hConfigKey);
4271 if (ret != CR_SUCCESS)
4272 {
4273 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4275 goto done;
4276 }
4277
4278 ret = GetConfigurationData(hConfigKey,
4279 ulFlags & LOG_CONF_BITS,
4280 &RegDataType,
4281 &ulDataSize,
4282 &pDataBuffer,
4284 szValueNameBuffer);
4285
4286 if (ret != CR_SUCCESS || ulDataSize == 0)
4287 {
4288 ret = CR_SUCCESS;
4289
4290 if (RegDataType == REG_RESOURCE_LIST)
4291 {
4292 PCM_RESOURCE_LIST pResourceList = NULL;
4294
4295 /* Allocate a buffer for the new configuration */
4296 ulDataSize = sizeof(CM_RESOURCE_LIST) - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
4297 pDataBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulDataSize);
4298 if (pDataBuffer == NULL)
4299 {
4301 goto done;
4302 }
4303
4304 pResourceList = (PCM_RESOURCE_LIST)pDataBuffer;
4305 pResourceList->Count = 1;
4306
4307 pResource = (PCM_FULL_RESOURCE_DESCRIPTOR)&pResourceList->List[0];
4309 pResource->BusNumber = 0;
4310 pResource->PartialResourceList.Version = 1;
4311 pResource->PartialResourceList.Revision = 1;
4312 pResource->PartialResourceList.Count = 0;
4313 }
4314 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4315 {
4316 PIO_RESOURCE_REQUIREMENTS_LIST pRequirementsList = NULL;
4317 PIO_RESOURCE_LIST pResourceList = NULL;
4318
4319 ulDataSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
4320 pDataBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulDataSize);
4321 if (pDataBuffer == NULL)
4322 {
4324 goto done;
4325 }
4326
4327 pRequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)pDataBuffer;
4328 pRequirementsList->ListSize = ulDataSize;
4329 pRequirementsList->InterfaceType = InterfaceTypeUndefined;
4330 pRequirementsList->BusNumber = 0;
4331 pRequirementsList->SlotNumber = 0;
4332 pRequirementsList->AlternativeLists = 1;
4333
4334 pResourceList = (PIO_RESOURCE_LIST)&pRequirementsList->List[0];
4335 pResourceList->Version = 1;
4336 pResourceList->Revision = 1;
4337 pResourceList->Count = 1;
4338
4339 pResourceList->Descriptors[0].Option = IO_RESOURCE_PREFERRED;
4340 pResourceList->Descriptors[0].Type = CmResourceTypeConfigData;
4341 pResourceList->Descriptors[0].u.ConfigData.Priority = ulPriority;
4342 }
4343 else
4344 {
4345 ret = CR_FAILURE;
4346 goto done;
4347 }
4348 }
4349 else
4350 {
4351 if (RegDataType == REG_RESOURCE_LIST)
4352 {
4353 PCM_RESOURCE_LIST pResourceList = NULL;
4355 ULONG ulIndex;
4356
4357 /* Reallocate a larger buffer in order to add the new configuration */
4358 ulNewSize = sizeof(CM_FULL_RESOURCE_DESCRIPTOR) - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
4359 pDataBuffer = HeapReAlloc(GetProcessHeap(),
4360 0,
4361 pDataBuffer,
4362 ulDataSize + ulNewSize);
4363 if (pDataBuffer == NULL)
4364 {
4366 goto done;
4367 }
4368
4369 pResourceList = (PCM_RESOURCE_LIST)pDataBuffer;
4370
4371 /* Get a pointer to the new (uninitialized) resource descriptor */
4372 pResource = (PCM_FULL_RESOURCE_DESCRIPTOR)&pResourceList->List[0];
4373 for (ulIndex = 0; ulIndex < pResourceList->Count; ulIndex++)
4374 pResource = NextResourceDescriptor(pResource);
4375
4376 /* Initialize the new resource descriptor */
4377 pResourceList->Count++;
4379 pResource->BusNumber = 0;
4380 pResource->PartialResourceList.Version = 1;
4381 pResource->PartialResourceList.Revision = 1;
4382 pResource->PartialResourceList.Count = 0;
4383
4384 *pulLogConfTag = ulIndex;
4385 }
4386 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4387 {
4388 /* FIXME */
4389 }
4390 else
4391 {
4392 ret = CR_FAILURE;
4393 goto done;
4394 }
4395 }
4396
4397 /* Store the configuration */
4398 if (RegSetValueEx(hConfigKey,
4399 szValueNameBuffer,
4400 0,
4401 RegDataType,
4402 pDataBuffer,
4403 ulDataSize + ulNewSize) != ERROR_SUCCESS)
4404 {
4406 goto done;
4407 }
4408
4409done:
4410 if (pDataBuffer != NULL)
4411 HeapFree(GetProcessHeap(), 0, pDataBuffer);
4412
4413 if (hConfigKey != NULL)
4414 RegCloseKey(hConfigKey);
4415
4416 DPRINT("PNP_AddEmptyLogConf() returns %lu\n", ret);
4417
4418 return ret;
4419}
4420
4421
4422/* Function 43 */
4423DWORD
4424WINAPI
4427 LPWSTR pDeviceID,
4428 DWORD ulLogConfType,
4429 DWORD ulLogConfTag,
4430 DWORD ulFlags)
4431{
4432 HKEY hConfigKey = NULL;
4433 DWORD RegDataType = 0;
4434 ULONG ulDataSize = 0;
4435 LPBYTE pDataBuffer = NULL;
4436 WCHAR szValueNameBuffer[LOGCONF_NAME_BUFFER_SIZE];
4438
4439 DPRINT("PNP_FreeLogConf(%p %S %lu %lu 0x%08lx)\n",
4440 hBinding, pDeviceID, ulLogConfType, ulLogConfTag, ulFlags);
4441
4442 if (ulFlags != 0)
4443 return CR_INVALID_FLAG;
4444
4445 if (!IsValidDeviceInstanceID(pDeviceID))
4446 return CR_INVALID_DEVNODE;
4447
4448 ret = OpenConfigurationKey(pDeviceID,
4449 ulLogConfType,
4450 &hConfigKey);
4451 if (ret != CR_SUCCESS)
4452 {
4453 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4455 goto done;
4456 }
4457
4458 ret = GetConfigurationData(hConfigKey,
4459 ulLogConfType,
4460 &RegDataType,
4461 &ulDataSize,
4462 &pDataBuffer,
4464 szValueNameBuffer);
4465 if (ret != CR_SUCCESS)
4466 {
4468 goto done;
4469 }
4470
4471 if (RegDataType == REG_RESOURCE_LIST)
4472 {
4473 if (((PCM_RESOURCE_LIST)pDataBuffer)->Count <= 1)
4474 {
4475 /* Delete the key if there is only one or no configuration in the key */
4476 DPRINT("Delete value %S\n", szValueNameBuffer);
4477 RegDeleteValue(hConfigKey, szValueNameBuffer);
4478 }
4479 else
4480 {
4481 /* FIXME */
4482 }
4483 }
4484 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4485 {
4486 if (((PIO_RESOURCE_REQUIREMENTS_LIST)pDataBuffer)->AlternativeLists <= 1)
4487 {
4488 /* Delete the key if there is only one or no configuration in the key */
4489 DPRINT("Delete value %S\n", szValueNameBuffer);
4490 RegDeleteValue(hConfigKey, szValueNameBuffer);
4491 }
4492 else
4493 {
4494 /* FIXME */
4495 }
4496 }
4497 else
4498 {
4499 ret = CR_FAILURE;
4500 goto done;
4501 }
4502
4503done:
4504 if (pDataBuffer != NULL)
4505 HeapFree(GetProcessHeap(), 0, pDataBuffer);
4506
4507 if (hConfigKey != NULL)
4508 RegCloseKey(hConfigKey);
4509
4510 DPRINT("PNP_FreeLogConf() returns %lu\n", ret);
4511
4512 return ret;
4513}
4514
4515
4516/* Function 44 */
4517DWORD
4518WINAPI
4521 LPWSTR pDeviceID,
4522 DWORD ulLogConfType,
4523 DWORD *pulLogConfTag,
4524 DWORD ulFlags)
4525{
4526 HKEY hConfigKey = NULL;
4527 DWORD RegDataType = 0;
4528 ULONG ulDataSize = 0;
4529 LPBYTE lpData = NULL;
4531
4532 DPRINT("PNP_GetFirstLogConf(%p %S %lu %p 0x%08lx)\n",
4533 hBinding, pDeviceID, ulLogConfType, pulLogConfTag, ulFlags);
4534
4535 if (pulLogConfTag == NULL)
4536 return CR_INVALID_POINTER;
4537
4538 *pulLogConfTag = (DWORD)0;
4539
4540 if (ulFlags & ~LOG_CONF_BITS)
4541 return CR_INVALID_FLAG;
4542
4543 if (!IsValidDeviceInstanceID(pDeviceID))
4544 return CR_INVALID_DEVINST;
4545
4546 ret = OpenConfigurationKey(pDeviceID,
4547 ulLogConfType,
4548 &hConfigKey);
4549 if (ret != CR_SUCCESS)
4550 {
4551 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4553 goto done;
4554 }
4555
4556 ret = GetConfigurationData(hConfigKey,
4557 ulLogConfType,
4558 &RegDataType,
4559 &ulDataSize,
4560 &lpData,
4561 0,
4562 NULL);
4563 if (ret != CR_SUCCESS)
4564 {
4565 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4567 goto done;
4568 }
4569
4570 DPRINT1("Data size %lu\n", ulDataSize);
4571 if (ulDataSize == 0 || lpData == NULL)
4572 {
4573 DPRINT1("No config data available!\n");
4575 goto done;
4576 }
4577
4578 /* Get the first tag */
4579 if (RegDataType == REG_RESOURCE_LIST)
4580 {
4581 DPRINT("REG_RESOURCE_LIST->Count %lu\n", ((PCM_RESOURCE_LIST)lpData)->Count);
4582
4583 /* Fail, if we do not have any resource */
4584 if (((PCM_RESOURCE_LIST)lpData)->Count == 0)
4585 {
4586 DPRINT1("No resource descriptors!\n");
4588 goto done;
4589 }
4590 }
4591 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4592 {
4593 DPRINT("REG_RESOURCE_REQUIREMENTS_LIST->AlternativeLists %lu\n",
4594 ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists);
4595
4596 /* Fail, if we do not have any requirements */
4597 if (((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists == 0)
4598 {
4600 goto done;
4601 }
4602 }
4603
4604done:
4605 if (lpData != NULL)
4606 HeapFree(GetProcessHeap(), 0, lpData);
4607
4608 if (hConfigKey != NULL)
4609 RegCloseKey(hConfigKey);
4610
4611 DPRINT("PNP_GetFirstLogConf() returns %lu\n", ret);
4612
4613 return ret;
4614}
4615
4616
4617/* Function 45 */
4618DWORD
4619WINAPI
4622 LPWSTR pDeviceID,
4623 DWORD ulLogConfType,
4624 DWORD ulCurrentTag,
4625 DWORD *pulNextTag,
4626 DWORD ulFlags)
4627{
4628 HKEY hConfigKey = NULL;
4629 DWORD RegDataType = 0;
4630 ULONG ulDataSize = 0;
4631 LPBYTE lpData = NULL;
4633
4634 DPRINT("PNP_GetNextLogConf(%p %S %lu %ul %p 0x%08lx)\n",
4635 hBinding, pDeviceID, ulLogConfType, ulCurrentTag, pulNextTag, ulFlags);
4636
4637 if (pulNextTag == NULL)
4638 return CR_INVALID_POINTER;
4639
4640 *pulNextTag = (DWORD)0;
4641
4642 if (ulFlags != 0)
4643 return CR_INVALID_FLAG;
4644
4645 if (!IsValidDeviceInstanceID(pDeviceID))
4646 return CR_INVALID_DEVINST;
4647
4648 ret = OpenConfigurationKey(pDeviceID,
4649 ulLogConfType,
4650 &hConfigKey);
4651 if (ret != CR_SUCCESS)
4652 {
4653 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4655 goto done;
4656 }
4657
4658 ret = GetConfigurationData(hConfigKey,
4659 ulLogConfType,
4660 &RegDataType,
4661 &ulDataSize,
4662 &lpData,
4663 0,
4664 NULL);
4665 if (ret != CR_SUCCESS)
4666 {
4667 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4669 goto done;
4670 }
4671
4672 DPRINT("Data size %lu\n", ulDataSize);
4673
4674 if (ulDataSize == 0 || lpData == NULL)
4675 {
4676 DPRINT1("No config data available!\n");
4678 goto done;
4679 }
4680
4681 /* Check if the next entry is available */
4682 if (RegDataType == REG_RESOURCE_LIST)
4683 {
4684 DPRINT("REG_RESOURCE_LIST->Count %lu\n", ((PCM_RESOURCE_LIST)lpData)->Count);
4685
4686 /* Fail, if we are beyond the end of the list */
4687 if (ulCurrentTag >= ((PCM_RESOURCE_LIST)lpData)->Count)
4688 {
4690 goto done;
4691 }
4692
4693 /* Indicate that we reached the end of the list */
4694 if (ulCurrentTag == ((PCM_RESOURCE_LIST)lpData)->Count - 1)
4695 {
4697 goto done;
4698 }
4699 }
4700 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4701 {
4702 DPRINT("REG_RESOURCE_REQUIREMENTS_LIST->AlternativeLists %lu\n",
4703 ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists);
4704
4705 /* Fail, if we are beyond the end of the list */
4706 if (ulCurrentTag >= ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists)
4707 {
4709 goto done;
4710 }
4711
4712 /* Indicate that we reached the end of the list */
4713 if (ulCurrentTag == ((PIO_RESOURCE_REQUIREMENTS_LIST)lpData)->AlternativeLists - 1)
4714 {
4716 goto done;
4717 }
4718 }
4719
4720 /* Return the next tag value */
4721 *pulNextTag = ulCurrentTag + 1;
4722
4723done:
4724 if (lpData != NULL)
4725 HeapFree(GetProcessHeap(), 0, lpData);
4726
4727 if (hConfigKey != NULL)
4728 RegCloseKey(hConfigKey);
4729
4730 DPRINT("PNP_GetNextLogConf() returns %lu\n", ret);
4731
4732 return ret;
4733}
4734
4735
4736/* Function 46 */
4737DWORD
4738WINAPI
4741 LPWSTR pDeviceID,
4742 DWORD ulType,
4743 DWORD ulTag,
4744 DWORD *pPriority,
4745 DWORD ulFlags)
4746{
4749}
4750
4751
4752/* Function 47 */
4753DWORD
4754WINAPI
4757 LPWSTR pDeviceID,
4758 DWORD ulLogConfTag,
4759 DWORD ulLogConfType,
4760 RESOURCEID ResourceID,
4761 DWORD *pulResourceTag,
4762 BYTE *ResourceData,
4763 PNP_RPC_BUFFER_SIZE ResourceLen,
4764 DWORD ulFlags)
4765{
4768}
4769
4770
4771/* Function 48 */
4772DWORD
4773WINAPI
4776 LPWSTR pDeviceID,
4777 DWORD ulLogConfTag,
4778 DWORD ulLogConfType,
4779 RESOURCEID ResourceID,
4780 DWORD ulResourceTag,
4781 DWORD *pulPreviousResType,
4782 DWORD *pulPreviousResTag,
4783 DWORD ulFlags)
4784{
4787}
4788
4789
4790/* Function 49 */
4791DWORD
4792WINAPI
4795 LPWSTR pDeviceID,
4796 DWORD ulLogConfTag,
4797 DWORD ulLogConfType,
4798 RESOURCEID ResourceID,
4799 DWORD ulResourceTag,
4800 DWORD *pulNextResType,
4801 DWORD *pulNextResTag,
4802 DWORD ulFlags)
4803{
4804 HKEY hConfigKey = NULL;
4805 DWORD RegDataType = 0;
4806 ULONG ulDataSize = 0;
4807 LPBYTE lpData = NULL;
4809
4810 DPRINT1("PNP_GetNextResDes(%p %S 0x%lx %lu %lu %ul %p %p 0x%08lx)\n",
4811 hBinding, pDeviceID, ulLogConfTag, ulLogConfType, ResourceID,
4812 ulResourceTag, pulNextResType, pulNextResTag, ulFlags);
4813
4814 if (pulNextResType == NULL)
4815 return CR_INVALID_POINTER;
4816
4817 *pulNextResType = 0;
4818
4819 if (ulFlags != 0)
4820 return CR_INVALID_FLAG;
4821
4822 if (!IsValidDeviceInstanceID(pDeviceID))
4823 return CR_INVALID_DEVINST;
4824
4825 ret = OpenConfigurationKey(pDeviceID,
4826 ulLogConfType,
4827 &hConfigKey);
4828 if (ret != CR_SUCCESS)
4829 {
4830 DPRINT1("OpenConfigurationKey() failed (Error %lu)\n", ret);
4832 goto done;
4833 }
4834
4835 ret = GetConfigurationData(hConfigKey,
4836 ulLogConfType,
4837 &RegDataType,
4838 &ulDataSize,
4839 &lpData,
4840 0,
4841 NULL);
4842 if (ret != CR_SUCCESS)
4843 {
4844 DPRINT1("GetConfigurationData() failed (Error %lu)\n", ret);
4846 goto done;
4847 }
4848
4849 DPRINT1("Data size %lu\n", ulDataSize);
4850
4851 if (ulDataSize == 0 || lpData == NULL)
4852 {
4853 DPRINT1("No config data available!\n");
4855 goto done;
4856 }
4857
4858 /* Get the next resource descriptor */
4859 if (RegDataType == REG_RESOURCE_LIST)
4860 {
4861 DPRINT1("FIXME: REG_RESOURCE_LIST\n");
4862 /* FIXME */
4864 goto done;
4865 }
4866 else if (RegDataType == REG_RESOURCE_REQUIREMENTS_LIST)
4867 {
4868 DPRINT1("FIXME: REG_RESOURCE_REQUIREMENTS_LIST\n");
4869 /* FIXME */
4871 goto done;
4872 }
4873
4874done:
4875 if (lpData != NULL)
4876 HeapFree(GetProcessHeap(), 0, lpData);
4877
4878 if (hConfigKey != NULL)
4879 RegCloseKey(hConfigKey);
4880
4881 DPRINT1("PNP_GetNextResDes() returns %lu\n", ret);
4882
4883 return ret;
4884}
4885
4886
4887/* Function 50 */
4888DWORD
4889WINAPI
4892 LPWSTR pDeviceID,
4893 DWORD ulLogConfTag,
4894 DWORD ulLogConfType,
4895 RESOURCEID ResourceID,
4896 DWORD ulResourceTag,
4897 BYTE *Buffer,
4898 PNP_RPC_BUFFER_SIZE BufferLen,
4899 DWORD ulFlags)
4900{
4903}
4904
4905
4906/* Function 51 */
4907DWORD
4908WINAPI
4911 LPWSTR pDeviceID,
4912 DWORD ulLogConfTag,
4913 DWORD ulLogConfType,
4914 RESOURCEID ResourceID,
4915 DWORD ulResourceTag,
4916 DWORD *pulSize,
4917 DWORD ulFlags)
4918{
4921}
4922
4923
4924/* Function 52 */
4925DWORD
4926WINAPI
4929 LPWSTR pDeviceID,
4930 DWORD ulLogConfTag,
4931 DWORD ulLogConfType,
4932 RESOURCEID CurrentResourceID,
4933 RESOURCEID NewResourceID,
4934 DWORD ulResourceTag,
4935 BYTE *ResourceData,
4936 PNP_RPC_BUFFER_SIZE ResourceLen,
4937 DWORD ulFlags)
4938{
4941}
4942
4943
4944/* Function 53 */
4945DWORD
4946WINAPI
4949 LPWSTR pDeviceID,
4950 RESOURCEID ResourceID,
4951 BYTE *ResourceData,
4952 PNP_RPC_BUFFER_SIZE ResourceLen,
4953 BOOL *pbConflictDetected,
4954 DWORD ulFlags)
4955{
4956 DPRINT("PNP_DetectResourceConflict()\n");
4957
4958 if (pbConflictDetected != NULL)
4959 *pbConflictDetected = FALSE;
4960
4962}
4963
4964
4965/* Function 54 */
4966DWORD
4967WINAPI
4970 LPWSTR pDeviceID,
4971 RESOURCEID ResourceID,
4972 BYTE *ResourceData,
4973 PNP_RPC_BUFFER_SIZE ResourceLen,
4974 BYTE *Buffer,
4975 PNP_RPC_BUFFER_SIZE BufferLen,
4976 DWORD ulFlags)
4977{
4980}
4981
4982
4983/* Function 55 */
4984DWORD
4985WINAPI
4988 DWORD ulHardwareProfile,
4989 DWORD ulFlags)
4990{
4992}
4993
4994
4995/* Function 56 */
4996DWORD
4997WINAPI
5000 BYTE *pData,
5001 DWORD DataLen,
5002 LPWSTR pDeviceID,
5003 RESOURCEID ResourceID,
5004 DWORD ulFlags)
5005{
5007}
5008
5009
5010/* Function 57 */
5011DWORD
5012WINAPI
5015 DWORD *pulSize,
5016 LPWSTR pDeviceID,
5017 RESOURCEID ResourceID,
5018 DWORD ulFlags)
5019{
5020 if (pulSize != NULL)
5021 *pulSize = 0;
5022
5024}
5025
5026
5027/* Function 58 */
5029WINAPI
5032 DWORD ulFlags)
5033{
5035}
5036
5037
5038/* Function 59 */
5039DWORD
5040WINAPI
5043 DWORD_PTR hRecipient,
5044 LPWSTR pszName,
5045 BYTE *pNotificationFilter,
5046 DWORD ulNotificationFilterSize,
5047 DWORD ulFlags,
5048 PNP_NOTIFY_HANDLE *pNotifyHandle,
5049 DWORD ulProcessId,
5050 DWORD *pulUnknown9)
5051{
5052 PDEV_BROADCAST_DEVICEINTERFACE_W pBroadcastDeviceInterface;
5053 PDEV_BROADCAST_HANDLE pBroadcastDeviceHandle;
5054 PNOTIFY_ENTRY pNotifyData = NULL;
5056
5057 DPRINT1("PNP_RegisterNotification(%p %p '%S' %p %lu 0x%lx %p %lx %p)\n",
5058 hBinding, hRecipient, pszName, pNotificationFilter,
5059 ulNotificationFilterSize, ulFlags, pNotifyHandle, ulProcessId, pulUnknown9);
5060
5061 if (pNotifyHandle == NULL)
5062 return CR_INVALID_POINTER;
5063
5064 *pNotifyHandle = NULL;
5065
5066 if (pNotificationFilter == NULL ||
5067 pulUnknown9 == NULL)
5068 return CR_INVALID_POINTER;
5069
5070 if (ulFlags & ~0x7)
5071 return CR_INVALID_FLAG;
5072
5073 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_HDR)) ||
5074 (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_size < sizeof(DEV_BROADCAST_HDR)))
5075 return CR_INVALID_DATA;
5076
5077 if (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
5078 {
5079 DPRINT1("DBT_DEVTYP_DEVICEINTERFACE\n");
5080 pBroadcastDeviceInterface = (PDEV_BROADCAST_DEVICEINTERFACE_W)pNotificationFilter;
5081
5082 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_DEVICEINTERFACE_W)) ||
5083 (pBroadcastDeviceInterface->dbcc_size < sizeof(DEV_BROADCAST_DEVICEINTERFACE_W)))
5084 return CR_INVALID_DATA;
5085
5087 if (pNotifyData == NULL)
5088 {
5090 goto done;
5091 }
5092
5093 pNotifyData->dwType = CLASS_NOTIFICATION;
5094
5095 if (pszName != NULL)
5096 {
5097 pNotifyData->pszName = RtlAllocateHeap(GetProcessHeap(),
5099 (wcslen(pszName) + 1) * sizeof(WCHAR));
5100 if (pNotifyData->pszName == NULL)
5101 {
5103 goto done;
5104 }
5105
5106 wcscpy(pNotifyData->pszName, pszName);
5107 }
5108
5109 if ((ulFlags & DEVICE_NOTIFY_SERVICE_HANDLE) == DEVICE_NOTIFY_WINDOW_HANDLE)
5110 {
5111 pNotifyData->hRecipient = hRecipient;
5112 }
5113 else
5114 {
5115 DPRINT("Validate service: %S\n", pszName);
5117 pszName,
5118 (SERVICE_STATUS_HANDLE *)&pNotifyData->hRecipient) != ERROR_SUCCESS)
5119 {
5120 DPRINT1("I_ScValidatePnpService failed!\n");
5122 goto done;
5123 }
5124
5125 DPRINT("Service status handle: %p\n", pNotifyData->hRecipient);
5126 }
5127
5128 pNotifyData->ulFlags = ulFlags;
5129
5130 if ((ulFlags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) == 0)
5131 {
5132 CopyMemory(&pNotifyData->ClassGuid,
5133 &pBroadcastDeviceInterface->dbcc_classguid,
5134 sizeof(GUID));
5135 }
5136
5137 /* Add the entry to the notification list */
5141
5142 DPRINT("pNotifyData: %p\n", pNotifyData);
5143 *pNotifyHandle = (PNP_NOTIFY_HANDLE)pNotifyData;
5144 }
5145 else if (((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype == DBT_DEVTYP_HANDLE)
5146 {
5147 DPRINT1("DBT_DEVTYP_HANDLE\n");
5148 pBroadcastDeviceHandle = (PDEV_BROADCAST_HANDLE)pNotificationFilter;
5149
5150 if ((ulNotificationFilterSize < sizeof(DEV_BROADCAST_HANDLE)) ||
5151 (pBroadcastDeviceHandle->dbch_size < sizeof(DEV_BROADCAST_HANDLE)))
5152 {
5154 goto done;
5155 }
5156
5157 if (ulFlags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
5158 {
5160 goto done;
5161 }
5162
5163 /* FIXME */
5164 }
5165 else
5166 {
5167 DPRINT1("Invalid device type %lu\n", ((PDEV_BROADCAST_HDR)pNotificationFilter)->dbch_devicetype);
5169 }
5170
5171done:
5172 if (ret != CR_SUCCESS)
5173 {
5174 if (pNotifyData)
5175 {
5176 if (pNotifyData->pszName)
5177 RtlFreeHeap(GetProcessHeap(), 0, pNotifyData->pszName);
5178
5179 RtlFreeHeap(GetProcessHeap(), 0, pNotifyData);
5180 }
5181 }
5182
5183 return ret;
5184}
5185
5186
5187/* Function 60 */
5188DWORD
5189WINAPI
5192 PNP_NOTIFY_HANDLE *pNotifyHandle)
5193{
5195
5196 DPRINT1("PNP_UnregisterNotification(%p %p)\n",
5197 hBinding, pNotifyHandle);
5198
5199 pEntry = (PNOTIFY_ENTRY)*pNotifyHandle;
5200 if (pEntry == NULL)
5201 return CR_INVALID_DATA;
5202
5204 RemoveEntryList(&pEntry->ListEntry);
5206
5207 if (pEntry->pszName)
5208 RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry->pszName);
5209 RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry);
5210 *pNotifyHandle = NULL;
5211
5212 return CR_SUCCESS;
5213}
5214
5215
5216/* Function 61 */
5217DWORD
5218WINAPI
5221 LPWSTR pDeviceID,
5222 LPWSTR CustomPropName,
5223 DWORD *pulRegDataType,
5224 BYTE *Buffer,
5225 PNP_RPC_STRING_LEN *pulTransferLen,
5226 PNP_RPC_STRING_LEN *pulLength,
5227 DWORD ulFlags)
5228{
5229 HKEY hDeviceKey = NULL;
5230 HKEY hParamKey = NULL;
5231 LONG lError;
5233
5235
5236 DPRINT("PNP_GetCustomDevProp() called\n");
5237
5238 if (pulTransferLen == NULL || pulLength == NULL)
5239 {
5241 goto done;
5242 }
5243
5244 if (ulFlags & ~CM_CUSTOMDEVPROP_BITS)
5245 {
5247 goto done;
5248 }
5249
5250 if (!IsValidDeviceInstanceID(pDeviceID))
5251 return CR_INVALID_DEVINST;
5252
5253 if (*pulLength < *pulTransferLen)
5254 *pulLength = *pulTransferLen;
5255
5256 *pulTransferLen = 0;
5257
5258 lError = RegOpenKeyExW(hEnumKey,
5259 pDeviceID,
5260 0,
5261 KEY_READ,
5262 &hDeviceKey);
5263 if (lError != ERROR_SUCCESS)
5264 {
5266 goto done;
5267 }
5268
5269 lError = RegOpenKeyExW(hDeviceKey,
5270 L"Device Parameters",
5271 0,
5272 KEY_READ,
5273 &hParamKey);
5274 if (lError != ERROR_SUCCESS)
5275 {
5277 goto done;
5278 }
5279
5280 lError = RegQueryValueExW(hParamKey,
5281 CustomPropName,
5282 NULL,
5283 pulRegDataType,
5284 Buffer,
5285 pulLength);
5286 if (lError != ERROR_SUCCESS)
5287 {
5288 if (lError == ERROR_MORE_DATA)
5289 {
5291 }
5292 else
5293 {
5294 *pulLength = 0;
5296 }
5297 }
5298
5299done:
5300 if (ret == CR_SUCCESS)
5301 *pulTransferLen = *pulLength;
5302
5303 if (hParamKey != NULL)
5304 RegCloseKey(hParamKey);
5305
5306 if (hDeviceKey != NULL)
5307 RegCloseKey(hDeviceKey);
5308
5309 DPRINT("PNP_GetCustomDevProp() done (returns %lx)\n", ret);
5310
5311 return ret;
5312}
5313
5314
5315/* Function 62 */
5316DWORD
5317WINAPI
5320 WORD *pwVersion)
5321{
5323
5324 *pwVersion = WINVER;
5325 return CR_SUCCESS;
5326}
5327
5328
5329/* Function 63 */
5330DWORD
5331WINAPI
5334 BYTE *Buffer,
5335 PNP_RPC_BUFFER_SIZE *pulTransferLen,
5336 PNP_RPC_BUFFER_SIZE *pulLength,
5337 DWORD ulFlags)
5338{
5341}
5342
5343
5344/* Function 64 */
5345DWORD
5346WINAPI
5349 DWORD *pulSSDIFlags,
5350 DWORD ulFlags)
5351{
5353
5354 DPRINT1("PNP_GetServerSideDeviceInstallFlags(%p %p %lu)\n",
5355 hBinding, pulSSDIFlags, ulFlags);
5356
5357 if (pulSSDIFlags == NULL)
5358 return CR_INVALID_POINTER;
5359
5360 if (ulFlags != 0)
5361 return CR_INVALID_FLAG;
5362
5363 /* FIXME */
5364 *pulSSDIFlags = 0;
5365
5366 return CR_SUCCESS;
5367}
5368
5369
5370/* Function 65 */
5371DWORD
5372WINAPI
5377 LPWSTR PropertyCultureName,
5378 PNP_PROP_COUNT *PropertyCount,
5379 PNP_PROP_COUNT *TransferLen,
5380 DEVPROPKEY *PropertyKeys,
5381 DWORD Flags)
5382{
5385}
5386
5387
5388/* Function 66 */
5389DWORD
5390WINAPI
5395 LPWSTR PropertyCultureName,
5396 const DEVPROPKEY *PropertyKey,
5398 PNP_PROP_SIZE *PropertySize,
5399 PNP_PROP_SIZE *TransferLen,
5401 DWORD Flags)
5402{
5405}
5406
5407
5408/* Function 67 */
5409DWORD
5410WINAPI
5415 LPWSTR PropertyCultureName,
5416 const DEVPROPKEY *PropertyKey,
5418 PNP_PROP_SIZE PropertySize,
5420 DWORD Flags)
5421{
5424}
5425
5426
5427/* Function 68 */
5428DWORD
5429WINAPI
5432{
5435}
5436
5437
5438/* Function 69 */
5439DWORD
5440WINAPI
5443{
5446}
5447
5448
5449/* Function 70 */
5450DWORD
5451WINAPI
5454{
5457}
5458
5459
5460/* Function 71 */
5461DWORD
5462WINAPI
5465{
5468}
5469
5470
5471/* Function 72 */
5472DWORD
5473WINAPI
5476{
5479}
5480
5481
5482/* Function 73 */
5483DWORD
5484WINAPI
5487 LPWSTR pszFilter,
5488 DWORD ulFlags)
5489{
5492}
5493
5494
5495/* Function 74 */
5496DWORD
5497WINAPI
5500{
5503}
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
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:38
@ CLASS_NOTIFICATION
Definition: precomp.h:48
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:5474
DWORD WINAPI PNP_GetVersion(handle_t hBinding, WORD *pVersion)
Definition: rpcserver.c:702
DWORD WINAPI PNP_GetInterfaceDeviceList(handle_t hBinding, GUID *InterfaceGuid, LPWSTR pszDeviceID, BYTE *Buffer, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:2680
DWORD WINAPI PNP_SetHwProf(handle_t hBinding, DWORD ulHardwareProfile, DWORD ulFlags)
Definition: rpcserver.c:4986
DWORD WINAPI PNP_UnregisterNotification(handle_t hBinding, PNP_NOTIFY_HANDLE *pNotifyHandle)
Definition: rpcserver.c:5190
static CONFIGRET GetDeviceInstanceListSize(_In_ LPCWSTR pszDevice, _Out_ PULONG pulLength)
Definition: rpcserver.c:1617
DWORD WINAPI PNP_InstallDevInst(handle_t hBinding)
Definition: rpcserver.c:5430
DWORD WINAPI PNP_DriverStoreDeleteDriverPackage(handle_t hBinding)
Definition: rpcserver.c:5463
static CONFIGRET GetServiceInstanceListSize(_In_ PWSTR pszService, _Out_ PDWORD pulLength)
Definition: rpcserver.c:1518
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:4968
DWORD WINAPI PNP_Connect(handle_t hBinding)
Definition: rpcserver.c:691
DWORD WINAPI PNP_GetRelatedDeviceInstance(handle_t hBinding, DWORD ulRelationship, LPWSTR pDeviceID, LPWSTR pRelatedDeviceId, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:895
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:973
DWORD WINAPI PNP_SetActiveService(handle_t hBinding, LPWSTR pszFilter, DWORD ulFlags)
Definition: rpcserver.c:5485
LUID LoadDriverPrivilege
Definition: rpcserver.c:40
DWORD WINAPI PNP_UnregisterDeviceClassAssociation(handle_t hBinding, LPWSTR pszInterfaceDevice, DWORD ulFlags)
Definition: rpcserver.c:2793
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:4947
static CONFIGRET WINAPI NtStatusToCrError(NTSTATUS Status)
Definition: rpcserver.c:127
DWORD WINAPI PNP_GetDeviceListSize(handle_t hBinding, LPWSTR pszFilter, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1765
DWORD WINAPI PNP_InitDetection(handle_t hBinding)
Definition: rpcserver.c:745
DWORD WINAPI PNP_AddEmptyLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulPriority, DWORD *pulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4240
DWORD WINAPI PNP_ApplyPowerSettings(handle_t hBinding)
Definition: rpcserver.c:5441
DWORD WINAPI PNP_GetClassCount(handle_t hBinding, DWORD *pulClassCount, DWORD ulFlags)
Definition: rpcserver.c:2497
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:2806
DWORD WINAPI PNP_GetServerSideDeviceInstallFlags(handle_t hBinding, DWORD *pulSSDIFlags, DWORD ulFlags)
Definition: rpcserver.c:5347
DWORD WINAPI PNP_FreeLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD ulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4425
LIST_ENTRY NotificationListHead
Definition: rpcserver.c:42
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:1883
DWORD WINAPI PNP_GetBlockedDriverInfo(handle_t hBinding, BYTE *Buffer, PNP_RPC_BUFFER_SIZE *pulTransferLen, PNP_RPC_BUFFER_SIZE *pulLength, DWORD ulFlags)
Definition: rpcserver.c:5332
DWORD WINAPI PNP_GetInterfaceDeviceListSize(handle_t hBinding, PNP_RPC_BUFFER_SIZE *pulLen, GUID *InterfaceGuid, LPWSTR pszDeviceID, DWORD ulFlags)
Definition: rpcserver.c:2728
static WCHAR szRootDeviceInstanceID[]
Definition: rpcserver.c:39
DWORD WINAPI PNP_UninstallDevInst(handle_t hBinding, LPWSTR pDeviceID, DWORD ulFlags)
Definition: rpcserver.c:3651
static VOID AppendDeviceId(LPWSTR lpDeviceIdList, LPDWORD lpDeviceIdListSize, LPWSTR lpDeviceId)
Definition: rpcserver.c:3683
DWORD WINAPI PNP_GetDeviceStatus(handle_t hBinding, LPWSTR pDeviceID, DWORD *pulStatus, DWORD *pulProblem, DWORD ulFlags)
Definition: rpcserver.c:3490
DWORD WINAPI PNP_GetClassInstance(handle_t hBinding, LPWSTR pDeviceId, LPWSTR pszClassInstance, PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:2302
static BOOL CheckForDeviceId(LPWSTR lpDeviceIdList, LPWSTR lpDeviceId)
Definition: rpcserver.c:3662
DWORD WINAPI PNP_DeviceInstanceAction(handle_t hBinding, DWORD ulMajorAction, DWORD ulMinorAction, LPWSTR pszDeviceInstance1, LPWSTR pszDeviceInstance2)
Definition: rpcserver.c:3445
static CONFIGRET GetAllInstanceListSize(_Out_ PULONG pulLength)
Definition: rpcserver.c:1730
VOID __RPC_USER PNP_NOTIFY_HANDLE_rundown(PNP_NOTIFY_HANDLE pHandle)
Definition: rpcserver.c:668
DWORD WINAPI PNP_RegisterDriver(handle_t hBinding, LPWSTR pszDeviceID, DWORD ulFlags)
Definition: rpcserver.c:3813
static CONFIGRET GenerateDeviceID(_Inout_ LPWSTR pszDeviceID, _In_ PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:3155
DWORD WINAPI PNP_GetDepth(handle_t hBinding, LPWSTR pszDeviceID, DWORD *pulDepth, DWORD ulFlags)
Definition: rpcserver.c:1840
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:4021
static CONFIGRET SetDeviceStatus(_In_ LPWSTR pszDeviceID, _In_ DWORD ulStatus, _In_ DWORD ulProblem)
Definition: rpcserver.c:267
DWORD WINAPI PNP_DisableDevInst(handle_t hBinding, LPWSTR pDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3621
static CONFIGRET OpenConfigurationKey(_In_ LPCWSTR pszDeviceID, _In_ DWORD ulLogConfType, _Out_ PHKEY phKey)
Definition: rpcserver.c:432
DWORD WINAPI PNP_GetClassName(handle_t hBinding, LPWSTR pszClassGuid, LPWSTR Buffer, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:2542
RTL_RESOURCE NotificationListLock
Definition: rpcserver.c:43
DWORD WINAPI PNP_RequestDeviceEject(handle_t hBinding, LPWSTR pszDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3885
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:5391
DWORD WINAPI PNP_GetLogConfPriority(handle_t hBinding, LPWSTR pDeviceID, DWORD ulType, DWORD ulTag, DWORD *pPriority, DWORD ulFlags)
Definition: rpcserver.c:4739
static CONFIGRET SetupDeviceInstance(_In_ LPWSTR pszDeviceInstance, _In_ DWORD ulMinorAction)
Definition: rpcserver.c:3307
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:5373
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:2632
static PCM_FULL_RESOURCE_DESCRIPTOR NextResourceDescriptor(_In_ PCM_FULL_RESOURCE_DESCRIPTOR pDescriptor)
Definition: rpcserver.c:583
static CONFIGRET GetDeviceStatus(_In_ LPWSTR pszDeviceID, _Out_ DWORD *pulStatus, _Out_ DWORD *pulProblem)
Definition: rpcserver.c:232
DWORD WINAPI RpcServerThread(LPVOID lpParameter)
Definition: rpcserver.c:48
static CONFIGRET GetDeviceInstanceList(_In_ PWSTR pszDevice, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1203
CONFIGRET GetEnumeratorInstanceList(_In_ PWSTR pszEnumerator, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1274
static CONFIGRET ClearDeviceStatus(_In_ LPWSTR pszDeviceID, _In_ DWORD ulStatus, _In_ DWORD ulProblem)
Definition: rpcserver.c:202
DWORD WINAPI PNP_RequestEjectPC(handle_t hBinding)
Definition: rpcserver.c:3989
DWORD WINAPI PNP_DeleteServiceDevices(handle_t hBinding)
Definition: rpcserver.c:5498
DWORD WINAPI PNP_CreateDevInst(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszParentDeviceID, PNP_RPC_STRING_LEN ulLength, DWORD ulFlags)
Definition: rpcserver.c:3205
static CONFIGRET GetRelationsInstanceList(_In_ PWSTR pszDevice, _In_ DWORD ulFlags, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1033
DWORD WINAPI PNP_SetDeviceRegProp(handle_t hBinding, LPWSTR pDeviceId, DWORD ulProperty, DWORD ulDataType, BYTE *Buffer, PNP_PROP_SIZE ulLength, DWORD ulFlags)
Definition: rpcserver.c:2160
static CONFIGRET GetAllInstanceList(_Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1345
DWORD WINAPI PNP_AddID(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszID, DWORD ulFlags)
Definition: rpcserver.c:3706
DWORD WINAPI PNP_QueryRemove(handle_t hBinding, LPWSTR pszDeviceID, PPNP_VETO_TYPE pVetoType, LPWSTR pszVetoName, DWORD ulNameLength, DWORD ulFlags)
Definition: rpcserver.c:3836
DWORD WINAPI PNP_GetFirstLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD *pulLogConfTag, DWORD ulFlags)
Definition: rpcserver.c:4519
static BOOL IsPresentDeviceInstanceID(_In_ LPWSTR pszDeviceInstanceID)
Definition: rpcserver.c:421
DWORD WINAPI PNP_SetClassRegProp(handle_t hBinding, LPWSTR pszClassGuid, DWORD ulProperty, DWORD ulDataType, BYTE *Buffer, PNP_PROP_SIZE ulLength, DWORD ulFlags)
Definition: rpcserver.c:2932
static VOID SplitDeviceInstanceID(IN LPWSTR pszDeviceInstanceID, OUT LPWSTR pszEnumerator, OUT LPWSTR pszDevice, OUT LPWSTR pszInstance)
Definition: rpcserver.c:156
DWORD WINAPI PNP_GetNextLogConf(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfType, DWORD ulCurrentTag, DWORD *pulNextTag, DWORD ulFlags)
Definition: rpcserver.c:4620
DWORD WINAPI PNP_GetGlobalState(handle_t hBinding, DWORD *pulState, DWORD ulFlags)
Definition: rpcserver.c:720
CONFIGRET WINAPI PNP_IsDockStationPresent(handle_t hBinding, BOOL *Present)
Definition: rpcserver.c:3933
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:5041
DWORD WINAPI PNP_GetHwProfInfo(handle_t hBinding, DWORD ulIndex, HWPROFILEINFO *pHWProfileInfo, DWORD ulProfileInfoSize, DWORD ulFlags)
Definition: rpcserver.c:4105
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:4774
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:4755
DWORD WINAPI PNP_SetDeviceProblem(handle_t hBinding, LPWSTR pDeviceID, DWORD ulProblem, DWORD ulFlags)
Definition: rpcserver.c:3568
CONFIGRET WINAPI PNP_RunDetection(handle_t hBinding, DWORD ulFlags)
Definition: rpcserver.c:5030
static CONFIGRET ReenumerateDeviceInstance(_In_ LPWSTR pszDeviceInstance, _In_ ULONG ulMinorAction)
Definition: rpcserver.c:3409
static CONFIGRET GetServiceInstanceList(_In_ PWSTR pszService, _Inout_ PWSTR pszBuffer, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1084
DWORD WINAPI PNP_CreateKey(handle_t hBinding, LPWSTR pszSubKey, DWORD samDesired, DWORD ulFlags)
Definition: rpcserver.c:2418
DWORD WINAPI PNP_GetResDesDataSize(handle_t hBinding, LPWSTR pDeviceID, DWORD ulLogConfTag, DWORD ulLogConfType, RESOURCEID ResourceID, DWORD ulResourceTag, DWORD *pulSize, DWORD ulFlags)
Definition: rpcserver.c:4909
DWORD WINAPI PNP_GetRootDeviceInstance(handle_t hBinding, LPWSTR pDeviceID, PNP_RPC_STRING_LEN ulLength)
Definition: rpcserver.c:858
DWORD WINAPI PNP_GetDeviceList(handle_t hBinding, LPWSTR pszFilter, LPWSTR Buffer, PNP_RPC_STRING_LEN *pulLength, DWORD ulFlags)
Definition: rpcserver.c:1394
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:5411
static BOOL IsCallerInteractive(_In_ handle_t hBinding)
Definition: rpcserver.c:618
static CONFIGRET GetRelationsInstanceListSize(_In_ PWSTR pszDevice, _In_ DWORD ulFlags, _Inout_ PDWORD pulLength)
Definition: rpcserver.c:1468
static CONFIGRET EnableDeviceInstance(_In_ LPWSTR pszDeviceInstance)
Definition: rpcserver.c:3390
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:5219
DWORD WINAPI PNP_DeleteRegistryKey(handle_t hBinding, LPWSTR pszDeviceID, LPWSTR pszParentKey, LPWSTR pszChildKey, DWORD ulFlags)
Definition: rpcserver.c:2482
DWORD WINAPI PNP_Disconnect(handle_t hBinding)
Definition: rpcserver.c:680
DWORD WINAPI PNP_QueryArbitratorFreeData(handle_t hBinding, BYTE *pData, DWORD DataLen, LPWSTR pDeviceID, RESOURCEID ResourceID, DWORD ulFlags)
Definition: rpcserver.c:4998
static CONFIGRET DisableDeviceInstance(_In_ LPWSTR pszDeviceInstance, _Inout_opt_ PPNP_VETO_TYPE pVetoType, _Inout_opt_ LPWSTR pszVetoName, _In_ DWORD ulNameLength)
Definition: rpcserver.c:297
DWORD WINAPI PNP_ReportLogOn(handle_t hBinding, BOOL Admin, DWORD ProcessId)
Definition: rpcserver.c:760
static BOOL IsRootDeviceInstanceID(_In_ PWSTR pszDeviceInstanceID)
Definition: rpcserver.c:409
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:4793
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:4890
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:495
DWORD WINAPI PNP_ValidateDeviceInstance(handle_t hBinding, LPWSTR pDeviceID, DWORD ulFlags)
Definition: rpcserver.c:815
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:4927
DWORD WINAPI PNP_QueryArbitratorFreeSize(handle_t hBinding, DWORD *pulSize, LPWSTR pDeviceID, RESOURCEID ResourceID, DWORD ulFlags)
Definition: rpcserver.c:5013
static CONFIGRET GetEnumeratorInstanceListSize(_In_ LPCWSTR pszEnumerator, _Out_ PULONG pulLength)
Definition: rpcserver.c:1669
DWORD WINAPI PNP_DriverStoreAddDriverPackage(handle_t hBinding)
Definition: rpcserver.c:5452
DWORD WINAPI PNP_DeleteClassKey(handle_t hBinding, LPWSTR pszClassGuid, DWORD ulFlags)
Definition: rpcserver.c:2600
static BOOL IsValidDeviceInstanceID(_In_ PWSTR pszDeviceInstanceID)
Definition: rpcserver.c:343
DWORD WINAPI PNP_GetVersionInternal(handle_t hBinding, WORD *pwVersion)
Definition: rpcserver.c:5318
static CONFIGRET CreateDeviceInstance(_In_ LPWSTR pszDeviceID, _In_ BOOL bPhantomDevice)
Definition: rpcserver.c:3035
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:2775
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
#define SE_LOAD_DRIVER_PRIVILEGE
Definition: security.c:664
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
@ PlugPlayControlGetInterfaceDeviceAlias
Definition: cmtypes.h:222
@ 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
NTSYSAPI VOID NTAPI RtlInitializeResource(_In_ PRTL_RESOURCE Resource)
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
#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:329
#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
DWORD WINAPI I_ScValidatePnpService(_In_ LPCWSTR pszMachineName, _In_ LPCWSTR pszServiceName, _Out_ SERVICE_STATUS_HANDLE *phServiceStatus)
Definition: scm.c:1948
#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:54
NOTIFICATION_TYPE dwType
Definition: precomp.h:56
PWSTR pszName
Definition: precomp.h:57
DWORD ulFlags
Definition: precomp.h:59
LIST_ENTRY ListEntry
Definition: precomp.h:55
DWORD_PTR hRecipient
Definition: precomp.h:58
GUID ClassGuid
Definition: precomp.h:60
CM_PARTIAL_RESOURCE_LIST PartialResourceList
Definition: hwresource.cpp:160
CM_FULL_RESOURCE_DESCRIPTOR List[1]
Definition: hwresource.cpp:165
struct _IO_RESOURCE_DESCRIPTOR::@2169::@2177 ConfigData
union _IO_RESOURCE_DESCRIPTOR::@2169 u
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:534
UNICODE_STRING DeviceInstance
Definition: cmtypes.h:543
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
#define CopyMemory
Definition: winbase.h:1751
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
_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:5950
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:938
#define SECURITY_INTERACTIVE_RID
Definition: setypes.h:559
#define TOKEN_QUERY
Definition: setypes.h:940
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define TOKEN_ASSIGN_PRIMARY
Definition: setypes.h:937
__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