2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005, 2006 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "setupapi_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
26 /* Registry key and value names */
27 static const WCHAR Backslash
[] = {'\\', 0};
28 static const WCHAR Class
[] = {'C','l','a','s','s',0};
30 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
31 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
32 'C','o','n','t','r','o','l','\\',
33 'C','l','a','s','s',0};
35 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
36 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
37 'C','o','n','t','r','o','l','\\',
38 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
40 typedef struct _MACHINE_INFO
42 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
43 RPC_BINDING_HANDLE BindingHandle
;
44 HSTRING_TABLE StringTable
;
46 } MACHINE_INFO
, *PMACHINE_INFO
;
49 typedef struct _LOG_CONF_INFO
55 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
57 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
60 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
64 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
67 lstrcpyW(&String
[1], lpString
);
70 String
[MAX_GUID_STRING_LEN
- 2] = '}';
71 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
73 RpcStringFreeW(&lpString
);
80 RpcStatusToCmStatus(RPC_STATUS Status
)
86 /***********************************************************************
87 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
89 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
95 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
99 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
105 /***********************************************************************
106 * CMP_Init_Detection [SETUPAPI.@]
108 CONFIGRET WINAPI
CMP_Init_Detection(
111 RPC_BINDING_HANDLE BindingHandle
= NULL
;
114 TRACE("%lu\n", dwMagic
);
116 if (dwMagic
!= CMP_MAGIC
)
117 return CR_INVALID_DATA
;
119 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
124 ret
= PNP_InitDetection(BindingHandle
);
126 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
128 ret
= RpcStatusToCmStatus(RpcExceptionCode());
136 /***********************************************************************
137 * CMP_Report_LogOn [SETUPAPI.@]
139 CONFIGRET WINAPI
CMP_Report_LogOn(
143 RPC_BINDING_HANDLE BindingHandle
= NULL
;
144 CONFIGRET ret
= CR_SUCCESS
;
148 TRACE("%lu\n", dwMagic
);
150 if (dwMagic
!= CMP_MAGIC
)
151 return CR_INVALID_DATA
;
153 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
156 bAdmin
= IsUserAdmin();
158 for (i
= 0; i
< 30; i
++)
162 ret
= PNP_ReportLogOn(BindingHandle
,
166 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
168 ret
= RpcStatusToCmStatus(RpcExceptionCode());
172 if (ret
== CR_SUCCESS
)
182 /***********************************************************************
183 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
185 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
186 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
189 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
190 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
195 /***********************************************************************
196 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
198 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
199 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
200 ULONG ulFlags
, HMACHINE hMachine
)
202 RPC_BINDING_HANDLE BindingHandle
= NULL
;
203 HSTRING_TABLE StringTable
= NULL
;
204 ULONG ulLogConfTag
= 0;
206 PLOG_CONF_INFO pLogConfInfo
;
207 CONFIGRET ret
= CR_SUCCESS
;
209 FIXME("%p %p %lu %lx %p\n",
210 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
213 return CR_ACCESS_DENIED
;
215 if (plcLogConf
== NULL
)
216 return CR_INVALID_POINTER
;
219 return CR_INVALID_DEVINST
;
221 if (Priority
> 0xFFFF)
222 return CR_INVALID_PRIORITY
;
224 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
225 return CR_INVALID_FLAG
;
227 if (hMachine
!= NULL
)
229 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
230 if (BindingHandle
== NULL
)
233 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
234 if (StringTable
== 0)
239 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
243 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
244 if (lpDevInst
== NULL
)
245 return CR_INVALID_DEVNODE
;
249 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
250 &ulLogConfTag
, ulFlags
);
252 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
254 ret
= RpcStatusToCmStatus(RpcExceptionCode());
258 if (ret
== CR_SUCCESS
)
260 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
261 if (pLogConfInfo
== NULL
)
263 ret
= CR_OUT_OF_MEMORY
;
267 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
268 pLogConfInfo
->dnDevInst
= dnDevInst
;
269 pLogConfInfo
->ulFlags
= ulFlags
;
270 pLogConfInfo
->ulTag
= ulLogConfTag
;
272 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
282 /***********************************************************************
283 * CM_Add_IDA [SETUPAPI.@]
285 CONFIGRET WINAPI
CM_Add_IDA(
286 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
288 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
289 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
293 /***********************************************************************
294 * CM_Add_IDW [SETUPAPI.@]
296 CONFIGRET WINAPI
CM_Add_IDW(
297 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
299 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
300 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
304 /***********************************************************************
305 * CM_Add_ID_ExA [SETUPAPI.@]
307 CONFIGRET WINAPI
CM_Add_ID_ExA(
308 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
313 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
315 if (CaptureAndConvertAnsiArg(pszID
, &pszIDW
))
316 return CR_INVALID_DATA
;
318 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
326 /***********************************************************************
327 * CM_Add_ID_ExW [SETUPAPI.@]
329 CONFIGRET WINAPI
CM_Add_ID_ExW(
330 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
332 RPC_BINDING_HANDLE BindingHandle
= NULL
;
333 HSTRING_TABLE StringTable
= NULL
;
337 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
340 return CR_ACCESS_DENIED
;
343 return CR_INVALID_DEVINST
;
346 return CR_INVALID_POINTER
;
348 if (ulFlags
& ~CM_ADD_ID_BITS
)
349 return CR_INVALID_FLAG
;
351 if (hMachine
!= NULL
)
353 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
354 if (BindingHandle
== NULL
)
357 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
358 if (StringTable
== 0)
363 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
367 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
368 if (lpDevInst
== NULL
)
369 return CR_INVALID_DEVNODE
;
373 ret
= PNP_AddID(BindingHandle
,
378 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
380 ret
= RpcStatusToCmStatus(RpcExceptionCode());
388 /***********************************************************************
389 * CM_Connect_MachineA [SETUPAPI.@]
391 CONFIGRET WINAPI
CM_Connect_MachineA(
392 PCSTR UNCServerName
, PHMACHINE phMachine
)
397 TRACE("%s %p\n", UNCServerName
, phMachine
);
399 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
400 return CM_Connect_MachineW(NULL
, phMachine
);
402 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
403 return CR_INVALID_DATA
;
405 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
407 MyFree(pServerNameW
);
413 /***********************************************************************
414 * CM_Connect_MachineW [SETUPAPI.@]
416 CONFIGRET WINAPI
CM_Connect_MachineW(
417 PCWSTR UNCServerName
, PHMACHINE phMachine
)
419 PMACHINE_INFO pMachine
;
421 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
423 if (phMachine
== NULL
)
424 return CR_INVALID_POINTER
;
428 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
429 if (pMachine
== NULL
)
430 return CR_OUT_OF_MEMORY
;
432 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
434 pMachine
->bLocal
= TRUE
;
436 /* FIXME: store the computers name in pMachine->szMachineName */
438 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
439 &pMachine
->StringTable
))
441 HeapFree(GetProcessHeap(), 0, pMachine
);
447 pMachine
->bLocal
= FALSE
;
448 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
450 HeapFree(GetProcessHeap(), 0, pMachine
);
451 return CR_INVALID_MACHINENAME
;
453 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
455 pMachine
->StringTable
= StringTableInitialize();
456 if (pMachine
->StringTable
== NULL
)
458 HeapFree(GetProcessHeap(), 0, pMachine
);
462 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
464 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
466 StringTableDestroy(pMachine
->StringTable
);
467 HeapFree(GetProcessHeap(), 0, pMachine
);
468 return CR_INVALID_MACHINENAME
;
472 phMachine
= (PHMACHINE
)pMachine
;
478 /***********************************************************************
479 * CM_Create_DevNodeA [SETUPAPI.@]
481 CONFIGRET WINAPI
CM_Create_DevNodeA(
482 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
485 TRACE("%p %s %p %lx\n",
486 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
487 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
492 /***********************************************************************
493 * CM_Create_DevNodeW [SETUPAPI.@]
495 CONFIGRET WINAPI
CM_Create_DevNodeW(
496 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
499 TRACE("%p %s %p %lx\n",
500 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
501 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
506 /***********************************************************************
507 * CM_Create_DevNode_ExA [SETUPAPI.@]
509 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
510 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
511 ULONG ulFlags
, HANDLE hMachine
)
513 DEVINSTID_W pDeviceIDW
;
516 TRACE("%p %s %p %lx %p\n",
517 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
519 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
520 return CR_INVALID_DATA
;
522 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
531 /***********************************************************************
532 * CM_Create_DevNode_ExW [SETUPAPI.@]
534 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
535 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
536 ULONG ulFlags
, HANDLE hMachine
)
538 RPC_BINDING_HANDLE BindingHandle
= NULL
;
539 HSTRING_TABLE StringTable
= NULL
;
540 LPWSTR lpParentDevInst
;
541 CONFIGRET ret
= CR_SUCCESS
;
543 FIXME("%p %s %p %lx %p\n",
544 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
547 return CR_ACCESS_DENIED
;
549 if (pdnDevInst
== NULL
)
550 return CR_INVALID_POINTER
;
552 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0)
553 return CR_INVALID_DEVICE_ID
;
556 return CR_INVALID_DEVNODE
;
558 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
559 return CR_INVALID_FLAG
;
561 if (hMachine
!= NULL
)
563 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
564 if (BindingHandle
== NULL
)
567 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
568 if (StringTable
== 0)
573 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
577 lpParentDevInst
= StringTableStringFromId(StringTable
, dnParent
);
578 if (lpParentDevInst
== NULL
)
579 return CR_INVALID_DEVNODE
;
583 ret
= PNP_CreateDevInst(BindingHandle
,
589 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
591 ret
= RpcStatusToCmStatus(RpcExceptionCode());
595 if (ret
== CR_SUCCESS
)
597 *pdnDevInst
= StringTableAddString(StringTable
, pDeviceID
, 1);
598 if (*pdnDevInst
== 0)
599 ret
= CR_NO_SUCH_DEVNODE
;
606 /***********************************************************************
607 * CM_Delete_Class_Key [SETUPAPI.@]
609 CONFIGRET WINAPI
CM_Delete_Class_Key(
610 LPGUID ClassGuid
, ULONG ulFlags
)
612 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
613 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
617 /***********************************************************************
618 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
620 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
621 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
623 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
624 RPC_BINDING_HANDLE BindingHandle
= NULL
;
627 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
629 if (ClassGuid
== NULL
)
630 return CR_INVALID_POINTER
;
632 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
633 return CR_INVALID_FLAG
;
635 if (!GuidToString(ClassGuid
, szGuidString
))
636 return CR_INVALID_DATA
;
638 if (hMachine
!= NULL
)
640 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
641 if (BindingHandle
== NULL
)
646 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
652 ret
= PNP_DeleteClassKey(BindingHandle
,
656 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
658 ret
= RpcStatusToCmStatus(RpcExceptionCode());
666 /***********************************************************************
667 * CM_Delete_DevNode_Key [SETUPAPI.@]
669 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
670 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
672 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
673 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
678 /***********************************************************************
679 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
681 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
682 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
685 FIXME("%p %lu %lx %p\n",
686 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
688 return CR_CALL_NOT_IMPLEMENTED
;
692 /***********************************************************************
693 * CM_Disable_DevNode [SETUPAPI.@]
695 CONFIGRET WINAPI
CM_Disable_DevNode(
696 DEVINST dnDevInst
, ULONG ulFlags
)
698 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
699 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
703 /***********************************************************************
704 * CM_Disable_DevNode_Ex [SETUPAPI.@]
706 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
707 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
709 RPC_BINDING_HANDLE BindingHandle
= NULL
;
710 HSTRING_TABLE StringTable
= NULL
;
714 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
717 return CR_ACCESS_DENIED
;
720 return CR_INVALID_DEVINST
;
723 return CR_INVALID_FLAG
;
725 if (hMachine
!= NULL
)
727 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
728 if (BindingHandle
== NULL
)
731 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
732 if (StringTable
== 0)
737 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
741 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
742 if (lpDevInst
== NULL
)
743 return CR_INVALID_DEVNODE
;
747 ret
= PNP_DeviceInstanceAction(BindingHandle
,
753 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
755 ret
= RpcStatusToCmStatus(RpcExceptionCode());
763 /***********************************************************************
764 * CM_Disconnect_Machine [SETUPAPI.@]
766 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
768 PMACHINE_INFO pMachine
;
770 TRACE("%lx\n", hMachine
);
772 pMachine
= (PMACHINE_INFO
)hMachine
;
773 if (pMachine
== NULL
)
776 if (pMachine
->bLocal
== FALSE
)
778 if (pMachine
->StringTable
!= NULL
)
779 StringTableDestroy(pMachine
->StringTable
);
781 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
782 return CR_ACCESS_DENIED
;
785 HeapFree(GetProcessHeap(), 0, pMachine
);
791 /***********************************************************************
792 * CM_Enable_DevNode [SETUPAPI.@]
794 CONFIGRET WINAPI
CM_Enable_DevNode(
795 DEVINST dnDevInst
, ULONG ulFlags
)
797 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
798 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
802 /***********************************************************************
803 * CM_Enable_DevNode_Ex [SETUPAPI.@]
805 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
806 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
808 RPC_BINDING_HANDLE BindingHandle
= NULL
;
809 HSTRING_TABLE StringTable
= NULL
;
813 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
816 return CR_ACCESS_DENIED
;
819 return CR_INVALID_DEVINST
;
822 return CR_INVALID_FLAG
;
824 if (hMachine
!= NULL
)
826 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
827 if (BindingHandle
== NULL
)
830 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
831 if (StringTable
== 0)
836 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
840 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
841 if (lpDevInst
== NULL
)
842 return CR_INVALID_DEVNODE
;
846 ret
= PNP_DeviceInstanceAction(BindingHandle
,
852 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
854 ret
= RpcStatusToCmStatus(RpcExceptionCode());
862 /***********************************************************************
863 * CM_Enumerate_Classes [SETUPAPI.@]
865 CONFIGRET WINAPI
CM_Enumerate_Classes(
866 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
868 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
869 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
873 /***********************************************************************
874 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
876 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
877 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
879 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
880 RPC_BINDING_HANDLE BindingHandle
= NULL
;
881 CONFIGRET ret
= CR_SUCCESS
;
882 ULONG ulLength
= MAX_GUID_STRING_LEN
;
884 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
886 if (ClassGuid
== NULL
)
887 return CR_INVALID_POINTER
;
890 return CR_INVALID_FLAG
;
892 if (hMachine
!= NULL
)
894 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
895 if (BindingHandle
== NULL
)
900 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
906 ret
= PNP_EnumerateSubKeys(BindingHandle
,
914 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
916 ret
= RpcStatusToCmStatus(RpcExceptionCode());
920 if (ret
== CR_SUCCESS
)
923 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
925 /* Convert the buffer to a GUID */
926 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
934 /***********************************************************************
935 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
937 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
938 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
940 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
941 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
946 /***********************************************************************
947 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
949 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
950 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
952 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
953 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
958 /***********************************************************************
959 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
961 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
962 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
965 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
968 CONFIGRET ret
= CR_SUCCESS
;
970 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
973 if (Buffer
== NULL
|| pulLength
== NULL
)
974 return CR_INVALID_POINTER
;
977 return CR_INVALID_FLAG
;
979 ulOrigLength
= *pulLength
;
982 ulLength
= MAX_DEVICE_ID_LEN
;
983 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
985 if (ret
== CR_SUCCESS
)
987 if (WideCharToMultiByte(CP_ACP
,
997 *pulLength
= lstrlenA(Buffer
) + 1;
1004 /***********************************************************************
1005 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1007 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1008 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1011 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1014 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1017 if (Buffer
== NULL
|| pulLength
== NULL
)
1018 return CR_INVALID_POINTER
;
1021 return CR_INVALID_FLAG
;
1023 *Buffer
= UNICODE_NULL
;
1025 if (hMachine
!= NULL
)
1027 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1028 if (BindingHandle
== NULL
)
1033 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1039 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1040 PNP_ENUMERATOR_SUBKEYS
,
1047 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1049 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1057 /***********************************************************************
1058 * CM_Free_Log_Conf [SETUPAPI.@]
1060 CONFIGRET WINAPI
CM_Free_Log_Conf(
1061 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1063 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1064 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1068 /***********************************************************************
1069 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1071 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1072 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1074 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1075 HSTRING_TABLE StringTable
= NULL
;
1077 PLOG_CONF_INFO pLogConfInfo
;
1080 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1083 return CR_ACCESS_DENIED
;
1085 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1086 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1087 return CR_INVALID_LOG_CONF
;
1090 return CR_INVALID_FLAG
;
1092 if (hMachine
!= NULL
)
1094 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1095 if (BindingHandle
== NULL
)
1098 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1099 if (StringTable
== 0)
1104 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1108 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1109 if (lpDevInst
== NULL
)
1110 return CR_INVALID_DEVNODE
;
1114 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1115 pLogConfInfo
->ulTag
, 0);
1117 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1119 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1127 /***********************************************************************
1128 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1130 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1133 PLOG_CONF_INFO pLogConfInfo
;
1135 TRACE("%lx\n", lcLogConf
);
1137 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1138 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1139 return CR_INVALID_LOG_CONF
;
1141 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1147 /***********************************************************************
1148 * CM_Get_Child [SETUPAPI.@]
1150 CONFIGRET WINAPI
CM_Get_Child(
1151 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1153 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1154 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1158 /***********************************************************************
1159 * CM_Get_Child_Ex [SETUPAPI.@]
1161 CONFIGRET WINAPI
CM_Get_Child_Ex(
1162 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1164 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1165 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1166 HSTRING_TABLE StringTable
= NULL
;
1168 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1171 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1173 if (pdnDevInst
== NULL
)
1174 return CR_INVALID_POINTER
;
1177 return CR_INVALID_DEVINST
;
1180 return CR_INVALID_FLAG
;
1184 if (hMachine
!= NULL
)
1186 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1187 if (BindingHandle
== NULL
)
1190 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1191 if (StringTable
== 0)
1196 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1200 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1201 if (lpDevInst
== NULL
)
1202 return CR_INVALID_DEVNODE
;
1206 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1207 PNP_GET_CHILD_DEVICE_INSTANCE
,
1213 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1215 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1219 if (ret
!= CR_SUCCESS
)
1222 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1224 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1228 *pdnDevInst
= dwIndex
;
1234 /***********************************************************************
1235 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1237 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1238 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1240 TRACE("%p %p %p %lx\n",
1241 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1242 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1247 /***********************************************************************
1248 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1250 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1251 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1253 TRACE("%p %p %p %lx\n",
1254 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1255 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1260 /***********************************************************************
1261 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1263 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1264 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1267 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1268 CONFIGRET ret
= CR_SUCCESS
;
1272 TRACE("%p %p %p %lx %lx\n",
1273 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1275 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1276 return CR_INVALID_POINTER
;
1278 ulOrigLength
= *pulLength
;
1281 ulLength
= MAX_GUID_STRING_LEN
;
1282 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1284 if (ret
== CR_SUCCESS
)
1286 if (WideCharToMultiByte(CP_ACP
,
1296 *pulLength
= lstrlenA(pszKeyName
) + 1;
1303 /***********************************************************************
1304 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1306 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1307 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1310 TRACE("%p %p %p %lx %lx\n",
1311 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1313 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1314 return CR_INVALID_POINTER
;
1317 return CR_INVALID_FLAG
;
1319 if (*pulLength
< MAX_GUID_STRING_LEN
)
1322 return CR_BUFFER_SMALL
;
1325 if (!GuidToString(ClassGuid
, pszKeyName
))
1326 return CR_INVALID_DATA
;
1328 *pulLength
= MAX_GUID_STRING_LEN
;
1334 /***********************************************************************
1335 * CM_Get_Class_NameA [SETUPAPI.@]
1337 CONFIGRET WINAPI
CM_Get_Class_NameA(
1338 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1340 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1341 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1346 /***********************************************************************
1347 * CM_Get_Class_NameW [SETUPAPI.@]
1349 CONFIGRET WINAPI
CM_Get_Class_NameW(
1350 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1352 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1353 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1358 /***********************************************************************
1359 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1361 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1362 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1365 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1366 CONFIGRET ret
= CR_SUCCESS
;
1370 TRACE("%p %p %p %lx %lx\n",
1371 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1373 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1374 return CR_INVALID_POINTER
;
1376 ulOrigLength
= *pulLength
;
1379 ulLength
= MAX_CLASS_NAME_LEN
;
1380 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1382 if (ret
== CR_SUCCESS
)
1384 if (WideCharToMultiByte(CP_ACP
,
1394 *pulLength
= lstrlenA(Buffer
) + 1;
1401 /***********************************************************************
1402 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1405 CM_Get_Class_Name_ExW(
1406 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1409 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1410 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1413 TRACE("%p %p %p %lx %lx\n",
1414 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1416 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1417 return CR_INVALID_POINTER
;
1420 return CR_INVALID_FLAG
;
1422 if (!GuidToString(ClassGuid
, szGuidString
))
1423 return CR_INVALID_DATA
;
1425 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1427 if (hMachine
!= NULL
)
1429 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1430 if (BindingHandle
== NULL
)
1435 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1441 ret
= PNP_GetClassName(BindingHandle
,
1447 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1449 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1457 /***********************************************************************
1458 * CM_Get_Depth [SETUPAPI.@]
1460 CONFIGRET WINAPI
CM_Get_Depth(
1461 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1463 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1464 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1468 /***********************************************************************
1469 * CM_Get_Depth_Ex [SETUPAPI.@]
1471 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1472 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1474 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1475 HSTRING_TABLE StringTable
= NULL
;
1479 TRACE("%p %lx %lx %lx\n",
1480 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1482 if (pulDepth
== NULL
)
1483 return CR_INVALID_POINTER
;
1486 return CR_INVALID_DEVINST
;
1489 return CR_INVALID_FLAG
;
1491 if (hMachine
!= NULL
)
1493 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1494 if (BindingHandle
== NULL
)
1497 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1498 if (StringTable
== 0)
1503 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1507 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1508 if (lpDevInst
== NULL
)
1509 return CR_INVALID_DEVNODE
;
1513 ret
= PNP_GetDepth(BindingHandle
,
1518 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1520 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1528 /***********************************************************************
1529 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1531 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1532 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1533 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1535 TRACE("%lx %lu %p %p %p %lx\n",
1536 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1538 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1539 pulRegDataType
, Buffer
,
1540 pulLength
, ulFlags
, NULL
);
1544 /***********************************************************************
1545 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1547 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1548 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1549 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1551 TRACE("%lx %lu %p %p %p %lx\n",
1552 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1554 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1555 pulRegDataType
, Buffer
,
1556 pulLength
, ulFlags
, NULL
);
1560 /***********************************************************************
1561 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1563 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1564 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1565 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1569 ULONG RegDataType
= REG_NONE
;
1572 TRACE("%lx %lu %p %p %p %lx %lx\n",
1573 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1577 return CR_INVALID_POINTER
;
1579 LengthW
= *pulLength
* sizeof(WCHAR
);
1580 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1583 return CR_OUT_OF_MEMORY
;
1585 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1593 if (ret
== CR_SUCCESS
)
1595 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1597 /* Do W->A conversion */
1598 *pulLength
= WideCharToMultiByte(CP_ACP
,
1601 lstrlenW(BufferW
) + 1,
1606 if (*pulLength
== 0)
1611 /* Directly copy the value */
1612 if (LengthW
<= *pulLength
)
1613 memcpy(Buffer
, BufferW
, LengthW
);
1616 *pulLength
= LengthW
;
1617 ret
= CR_BUFFER_SMALL
;
1623 *pulRegDataType
= RegDataType
;
1625 HeapFree(GetProcessHeap(), 0, BufferW
);
1631 /***********************************************************************
1632 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1634 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1635 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1636 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1638 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1639 HSTRING_TABLE StringTable
= NULL
;
1640 CONFIGRET ret
= CR_SUCCESS
;
1642 ULONG ulDataType
= 0;
1643 ULONG ulTransferLength
= 0;
1645 TRACE("%lx %lu %p %p %p %lx %lx\n",
1646 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1650 return CR_INVALID_DEVNODE
;
1652 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1653 return CR_INVALID_PROPERTY
;
1655 /* pulRegDataType is optional */
1657 /* Buffer is optional */
1659 if (pulLength
== NULL
)
1660 return CR_INVALID_POINTER
;
1662 if (*pulLength
== 0)
1663 return CR_INVALID_POINTER
;
1666 return CR_INVALID_FLAG
;
1668 if (hMachine
!= NULL
)
1670 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1671 if (BindingHandle
== NULL
)
1674 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1675 if (StringTable
== 0)
1680 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1684 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1685 if (lpDevInst
== NULL
)
1686 return CR_INVALID_DEVNODE
;
1688 ulTransferLength
= *pulLength
;
1692 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1701 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1703 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1707 if (ret
== CR_SUCCESS
)
1709 if (pulRegDataType
!= NULL
)
1710 *pulRegDataType
= ulDataType
;
1717 /***********************************************************************
1718 * CM_Get_DevNode_Status [SETUPAPI.@]
1720 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1721 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1724 TRACE("%p %p %lx %lx\n",
1725 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1726 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1731 /***********************************************************************
1732 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1735 CM_Get_DevNode_Status_Ex(
1736 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1737 ULONG ulFlags
, HMACHINE hMachine
)
1739 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1740 HSTRING_TABLE StringTable
= NULL
;
1744 TRACE("%p %p %lx %lx %lx\n",
1745 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1747 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1748 return CR_INVALID_POINTER
;
1751 return CR_INVALID_DEVINST
;
1754 return CR_INVALID_FLAG
;
1756 if (hMachine
!= NULL
)
1758 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1759 if (BindingHandle
== NULL
)
1762 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1763 if (StringTable
== 0)
1768 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1772 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1773 if (lpDevInst
== NULL
)
1774 return CR_INVALID_DEVNODE
;
1778 ret
= PNP_GetDeviceStatus(BindingHandle
,
1784 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1786 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1794 /***********************************************************************
1795 * CM_Get_Device_IDA [SETUPAPI.@]
1797 CONFIGRET WINAPI
CM_Get_Device_IDA(
1798 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1800 TRACE("%lx %p %ld %ld\n",
1801 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1802 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1806 /***********************************************************************
1807 * CM_Get_Device_IDW [SETUPAPI.@]
1809 CONFIGRET WINAPI
CM_Get_Device_IDW(
1810 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1812 TRACE("%lx %p %ld %ld\n",
1813 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1814 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1818 /***********************************************************************
1819 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1821 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1822 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1825 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1826 CONFIGRET ret
= CR_SUCCESS
;
1828 FIXME("%lx %p %ld %ld %lx\n",
1829 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1832 return CR_INVALID_POINTER
;
1834 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1839 if (ret
== CR_SUCCESS
)
1841 if (WideCharToMultiByte(CP_ACP
,
1844 lstrlenW(szBufferW
) + 1,
1856 /***********************************************************************
1857 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1859 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1860 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1863 HSTRING_TABLE StringTable
= NULL
;
1865 TRACE("%lx %p %ld %ld %lx\n",
1866 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1869 return CR_INVALID_DEVINST
;
1872 return CR_INVALID_POINTER
;
1875 return CR_INVALID_FLAG
;
1877 if (hMachine
!= NULL
)
1879 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1880 if (StringTable
== NULL
)
1885 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1889 if (!StringTableStringFromIdEx(StringTable
,
1899 /***********************************************************************
1900 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1902 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1903 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1905 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1906 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1911 /***********************************************************************
1912 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1914 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1915 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1917 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1918 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1923 /***********************************************************************
1924 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1926 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1927 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1930 LPWSTR BufferW
= NULL
;
1931 LPWSTR pszFilterW
= NULL
;
1932 CONFIGRET ret
= CR_SUCCESS
;
1934 FIXME("%p %p %ld %ld %lx\n",
1935 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1937 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1938 if (BufferW
== NULL
)
1939 return CR_OUT_OF_MEMORY
;
1941 if (pszFilter
== NULL
)
1943 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1951 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1953 ret
= CR_INVALID_DEVICE_ID
;
1957 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1966 if (WideCharToMultiByte(CP_ACP
,
1969 lstrlenW(BufferW
) + 1,
1983 /***********************************************************************
1984 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1986 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1987 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1990 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1993 TRACE("%p %p %ld %ld %lx\n",
1994 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1996 if (Buffer
== NULL
|| BufferLen
== 0)
1997 return CR_INVALID_POINTER
;
1999 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2000 return CR_INVALID_FLAG
;
2002 if (hMachine
!= NULL
)
2004 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2005 if (BindingHandle
== NULL
)
2010 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2018 ret
= PNP_GetDeviceList(BindingHandle
,
2024 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2026 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2034 /***********************************************************************
2035 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2037 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2038 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2040 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2041 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2045 /***********************************************************************
2046 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2048 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2049 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2051 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2052 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2056 /***********************************************************************
2057 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2059 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2060 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2062 LPWSTR pszFilterW
= NULL
;
2063 CONFIGRET ret
= CR_SUCCESS
;
2065 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2067 if (pszFilter
== NULL
)
2069 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2076 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2077 return CR_INVALID_DEVICE_ID
;
2079 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2091 /***********************************************************************
2092 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2094 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2095 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2097 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2100 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2103 return CR_INVALID_POINTER
;
2105 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2106 return CR_INVALID_FLAG
;
2108 if (hMachine
!= NULL
)
2110 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2111 if (BindingHandle
== NULL
)
2116 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2124 ret
= PNP_GetDeviceListSize(BindingHandle
,
2129 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2131 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2139 /***********************************************************************
2140 * CM_Get_Device_ID_Size [SETUPAPI.@]
2142 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2143 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2145 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2146 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2150 /***********************************************************************
2151 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2153 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2154 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2156 HSTRING_TABLE StringTable
= NULL
;
2159 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2162 return CR_INVALID_POINTER
;
2165 return CR_INVALID_DEVINST
;
2168 return CR_INVALID_FLAG
;
2170 if (hMachine
!= NULL
)
2172 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2173 if (StringTable
== NULL
)
2178 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2182 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
2183 if (DeviceId
== NULL
)
2189 *pulLen
= lstrlenW(DeviceId
);
2195 /***********************************************************************
2196 * CM_Get_First_Log_Conf [SETUPAPI.@]
2198 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2199 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2201 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2202 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2206 /***********************************************************************
2207 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2209 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2210 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2212 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2213 HSTRING_TABLE StringTable
= NULL
;
2214 LPWSTR lpDevInst
= NULL
;
2215 CONFIGRET ret
= CR_SUCCESS
;
2217 PLOG_CONF_INFO pLogConfInfo
;
2219 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2222 return CR_INVALID_DEVINST
;
2224 if (ulFlags
& ~LOG_CONF_BITS
)
2225 return CR_INVALID_FLAG
;
2230 if (hMachine
!= NULL
)
2232 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2233 if (BindingHandle
== NULL
)
2236 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2237 if (StringTable
== 0)
2242 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2246 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2247 if (lpDevInst
== NULL
)
2248 return CR_INVALID_DEVNODE
;
2252 ret
= PNP_GetFirstLogConf(BindingHandle
,
2258 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2260 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2264 if (ret
!= CR_SUCCESS
)
2267 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2268 if (pLogConfInfo
== NULL
)
2269 return CR_OUT_OF_MEMORY
;
2271 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2272 pLogConfInfo
->dnDevInst
= dnDevInst
;
2273 pLogConfInfo
->ulFlags
= ulFlags
;
2274 pLogConfInfo
->ulTag
= ulTag
;
2276 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2282 /***********************************************************************
2283 * CM_Get_Global_State [SETUPAPI.@]
2285 CONFIGRET WINAPI
CM_Get_Global_State(
2286 PULONG pulState
, ULONG ulFlags
)
2288 TRACE("%p %lx\n", pulState
, ulFlags
);
2289 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2293 /***********************************************************************
2294 * CM_Get_Global_State_Ex [SETUPAPI.@]
2296 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2297 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2299 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2302 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2304 if (pulState
== NULL
)
2305 return CR_INVALID_POINTER
;
2308 return CR_INVALID_FLAG
;
2310 if (hMachine
!= NULL
)
2312 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2313 if (BindingHandle
== NULL
)
2318 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2324 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2326 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2328 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2336 /***********************************************************************
2337 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2339 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2340 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2343 TRACE("%s %lu %p %lx\n", szDevInstName
,
2344 ulHardwareProfile
, pulValue
, ulFlags
);
2346 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2347 pulValue
, ulFlags
, NULL
);
2351 /***********************************************************************
2352 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2354 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2355 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2358 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2359 ulHardwareProfile
, pulValue
, ulFlags
);
2361 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2362 pulValue
, ulFlags
, NULL
);
2366 /***********************************************************************
2367 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2369 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2370 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2371 ULONG ulFlags
, HMACHINE hMachine
)
2373 DEVINSTID_W pszDevIdW
= NULL
;
2374 CONFIGRET ret
= CR_SUCCESS
;
2376 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2377 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2379 if (szDevInstName
!= NULL
)
2381 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2382 return CR_INVALID_DEVICE_ID
;
2385 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2386 pulValue
, ulFlags
, hMachine
);
2388 if (pszDevIdW
!= NULL
)
2395 /***********************************************************************
2396 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2398 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2399 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2400 ULONG ulFlags
, HMACHINE hMachine
)
2402 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2405 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2406 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2408 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2409 return CR_INVALID_POINTER
;
2412 return CR_INVALID_FLAG
;
2414 /* FIXME: Check whether szDevInstName is valid */
2416 if (hMachine
!= NULL
)
2418 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2419 if (BindingHandle
== NULL
)
2424 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2430 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
2431 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
2433 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2435 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2443 /***********************************************************************
2444 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
2446 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
2447 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
2449 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
2450 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
2454 /***********************************************************************
2455 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
2457 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
2458 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
2461 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2462 HSTRING_TABLE StringTable
= NULL
;
2463 PLOG_CONF_INFO pLogConfInfo
;
2467 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
2469 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2470 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2471 return CR_INVALID_LOG_CONF
;
2473 if (pPriority
== NULL
)
2474 return CR_INVALID_POINTER
;
2477 return CR_INVALID_FLAG
;
2479 if (hMachine
!= NULL
)
2481 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2482 if (BindingHandle
== NULL
)
2485 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2486 if (StringTable
== 0)
2491 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2495 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2496 if (lpDevInst
== NULL
)
2497 return CR_INVALID_DEVNODE
;
2501 ret
= PNP_GetLogConfPriority(BindingHandle
,
2503 pLogConfInfo
->ulFlags
,
2504 pLogConfInfo
->ulTag
,
2508 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2510 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2518 /***********************************************************************
2519 * CM_Get_Next_Log_Conf [SETUPAPI.@]
2521 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
2522 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
2524 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
2525 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
2529 /***********************************************************************
2530 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
2532 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
2533 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
2536 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2537 HSTRING_TABLE StringTable
= NULL
;
2538 PLOG_CONF_INFO pLogConfInfo
;
2539 PLOG_CONF_INFO pNewLogConfInfo
;
2544 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
2549 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2550 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2551 return CR_INVALID_LOG_CONF
;
2554 return CR_INVALID_FLAG
;
2556 if (hMachine
!= NULL
)
2558 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2559 if (BindingHandle
== NULL
)
2562 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2563 if (StringTable
== 0)
2568 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2572 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2573 if (lpDevInst
== NULL
)
2574 return CR_INVALID_DEVNODE
;
2578 ret
= PNP_GetNextLogConf(BindingHandle
,
2580 pLogConfInfo
->ulFlags
,
2581 pLogConfInfo
->ulTag
,
2585 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2587 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2591 if (ret
!= CR_SUCCESS
)
2596 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2597 if (pNewLogConfInfo
== NULL
)
2598 return CR_OUT_OF_MEMORY
;
2600 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2601 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
2602 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
2603 pNewLogConfInfo
->ulTag
= ulNewTag
;
2605 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
2612 /***********************************************************************
2613 * CM_Get_Parent [SETUPAPI.@]
2615 CONFIGRET WINAPI
CM_Get_Parent(
2616 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2618 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2619 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2623 /***********************************************************************
2624 * CM_Get_Parent_Ex [SETUPAPI.@]
2626 CONFIGRET WINAPI
CM_Get_Parent_Ex(
2627 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2629 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2630 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2631 HSTRING_TABLE StringTable
= NULL
;
2633 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2636 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2638 if (pdnDevInst
== NULL
)
2639 return CR_INVALID_POINTER
;
2642 return CR_INVALID_DEVINST
;
2645 return CR_INVALID_FLAG
;
2649 if (hMachine
!= NULL
)
2651 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2652 if (BindingHandle
== NULL
)
2655 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2656 if (StringTable
== 0)
2661 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2665 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2666 if (lpDevInst
== NULL
)
2667 return CR_INVALID_DEVNODE
;
2671 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2672 PNP_GET_PARENT_DEVICE_INSTANCE
,
2678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2680 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2684 if (ret
!= CR_SUCCESS
)
2687 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2689 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2693 *pdnDevInst
= dwIndex
;
2699 /***********************************************************************
2700 * CM_Get_Sibling [SETUPAPI.@]
2702 CONFIGRET WINAPI
CM_Get_Sibling(
2703 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2705 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2706 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2710 /***********************************************************************
2711 * CM_Get_Sibling_Ex [SETUPAPI.@]
2713 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
2714 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2716 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2717 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2718 HSTRING_TABLE StringTable
= NULL
;
2720 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2723 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2725 if (pdnDevInst
== NULL
)
2726 return CR_INVALID_POINTER
;
2729 return CR_INVALID_DEVINST
;
2732 return CR_INVALID_FLAG
;
2736 if (hMachine
!= NULL
)
2738 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2739 if (BindingHandle
== NULL
)
2742 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2743 if (StringTable
== 0)
2748 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2752 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2753 if (lpDevInst
== NULL
)
2754 return CR_INVALID_DEVNODE
;
2758 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2759 PNP_GET_SIBLING_DEVICE_INSTANCE
,
2765 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2767 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2771 if (ret
!= CR_SUCCESS
)
2774 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2776 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2780 *pdnDevInst
= dwIndex
;
2786 /***********************************************************************
2787 * CM_Get_Version [SETUPAPI.@]
2789 WORD WINAPI
CM_Get_Version(VOID
)
2792 return CM_Get_Version_Ex(NULL
);
2796 /***********************************************************************
2797 * CM_Get_Version_Ex [SETUPAPI.@]
2799 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
2801 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2805 TRACE("%lx\n", hMachine
);
2807 if (hMachine
!= NULL
)
2809 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2810 if (BindingHandle
== NULL
)
2815 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2821 ret
= PNP_GetVersion(BindingHandle
, &Version
);
2823 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2825 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2829 if (ret
!= CR_SUCCESS
)
2836 /***********************************************************************
2837 * CM_Is_Dock_Station_Present [SETUPAPI.@]
2839 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
2842 TRACE("%p\n", pbPresent
);
2843 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
2847 /***********************************************************************
2848 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
2850 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
2851 PBOOL pbPresent
, HMACHINE hMachine
)
2853 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2856 TRACE("%p %lx\n", pbPresent
, hMachine
);
2858 if (pbPresent
== NULL
)
2859 return CR_INVALID_POINTER
;
2863 if (hMachine
!= NULL
)
2865 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2866 if (BindingHandle
== NULL
)
2871 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2877 ret
= PNP_IsDockStationPresent(BindingHandle
,
2880 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2882 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2890 /***********************************************************************
2891 * CM_Locate_DevNodeA [SETUPAPI.@]
2893 CONFIGRET WINAPI
CM_Locate_DevNodeA(
2894 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
2896 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
2897 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2901 /***********************************************************************
2902 * CM_Locate_DevNodeW [SETUPAPI.@]
2904 CONFIGRET WINAPI
CM_Locate_DevNodeW(
2905 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
2907 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
2908 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2912 /***********************************************************************
2913 * CM_Locate_DevNode_ExA [SETUPAPI.@]
2915 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
2916 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2918 DEVINSTID_W pDevIdW
= NULL
;
2919 CONFIGRET ret
= CR_SUCCESS
;
2921 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
2923 if (pDeviceID
!= NULL
)
2925 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
2926 return CR_INVALID_DEVICE_ID
;
2929 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
2931 if (pDevIdW
!= NULL
)
2938 /***********************************************************************
2939 * CM_Locate_DevNode_ExW [SETUPAPI.@]
2941 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
2942 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2944 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
2945 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2946 HSTRING_TABLE StringTable
= NULL
;
2947 CONFIGRET ret
= CR_SUCCESS
;
2949 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
2951 if (pdnDevInst
== NULL
)
2952 return CR_INVALID_POINTER
;
2954 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
2955 return CR_INVALID_FLAG
;
2957 if (hMachine
!= NULL
)
2959 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2960 if (BindingHandle
== NULL
)
2963 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2964 if (StringTable
== 0)
2969 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2973 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
2975 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
2981 /* Get the root device ID */
2982 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
2986 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2988 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2992 if (ret
!= CR_SUCCESS
)
2995 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
2999 /* Validate the device ID */
3000 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3004 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3006 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3010 if (ret
== CR_SUCCESS
)
3012 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3013 if (*pdnDevInst
== -1)
3021 /***********************************************************************
3022 * CM_Move_DevNode [SETUPAPI.@]
3024 CONFIGRET WINAPI
CM_Move_DevNode(
3025 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3027 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3028 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3032 /***********************************************************************
3033 * CM_Move_DevNode_Ex [SETUPAPI.@]
3035 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3036 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3039 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3040 HSTRING_TABLE StringTable
= NULL
;
3041 LPWSTR lpFromDevInst
;
3045 FIXME("%lx %lx %lx %lx\n",
3046 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3049 return CR_ACCESS_DENIED
;
3051 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3052 return CR_INVALID_DEVNODE
;
3055 return CR_INVALID_FLAG
;
3057 if (hMachine
!= NULL
)
3059 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3060 if (BindingHandle
== NULL
)
3063 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3064 if (StringTable
== 0)
3069 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3073 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
3074 if (lpFromDevInst
== NULL
)
3075 return CR_INVALID_DEVNODE
;
3077 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
3078 if (lpToDevInst
== NULL
)
3079 return CR_INVALID_DEVNODE
;
3083 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3089 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3091 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3099 /***********************************************************************
3100 * CM_Open_Class_KeyA [SETUPAPI.@]
3102 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3103 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3104 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3106 TRACE("%p %s %lx %lx %p %lx\n",
3107 debugstr_guid(pClassGuid
), pszClassName
,
3108 samDesired
, Disposition
, phkClass
, ulFlags
);
3110 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3111 Disposition
, phkClass
, ulFlags
, NULL
);
3115 /***********************************************************************
3116 * CM_Open_Class_KeyW [SETUPAPI.@]
3118 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3119 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3120 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3122 TRACE("%p %s %lx %lx %p %lx\n",
3123 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3124 samDesired
, Disposition
, phkClass
, ulFlags
);
3126 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3127 Disposition
, phkClass
, ulFlags
, NULL
);
3131 /***********************************************************************
3132 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3134 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3135 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3136 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3139 CONFIGRET rc
= CR_SUCCESS
;
3140 LPWSTR pszClassNameW
= NULL
;
3142 TRACE("%p %s %lx %lx %p %lx %lx\n",
3143 debugstr_guid(pClassGuid
), pszClassName
,
3144 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3146 if (pszClassName
!= NULL
)
3148 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3149 return CR_INVALID_DATA
;
3152 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3153 Disposition
, phkClass
, ulFlags
, hMachine
);
3155 if (pszClassNameW
!= NULL
)
3156 MyFree(pszClassNameW
);
3162 /***********************************************************************
3163 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3165 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3166 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3167 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3170 WCHAR szKeyName
[MAX_PATH
];
3171 LPWSTR lpGuidString
;
3172 DWORD dwDisposition
;
3176 TRACE("%p %s %lx %lx %p %lx %lx\n",
3177 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3178 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3180 /* Check Disposition and ulFlags */
3181 if ((Disposition
& ~RegDisposition_Bits
) ||
3182 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3183 return CR_INVALID_FLAG
;
3185 /* Check phkClass */
3186 if (phkClass
== NULL
)
3187 return CR_INVALID_POINTER
;
3191 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3192 pszClassName
!= NULL
)
3193 return CR_INVALID_DATA
;
3195 if (hMachine
== NULL
)
3197 hKey
= HKEY_LOCAL_MACHINE
;
3201 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3202 HKEY_LOCAL_MACHINE
, &hKey
))
3203 return CR_REGISTRY_ERROR
;
3206 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3208 lstrcpyW(szKeyName
, DeviceClasses
);
3212 lstrcpyW(szKeyName
, ControlClass
);
3215 if (pClassGuid
!= NULL
)
3217 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
3220 return CR_INVALID_DATA
;
3223 lstrcatW(szKeyName
, Backslash
);
3224 lstrcatW(szKeyName
, lpGuidString
);
3227 if (Disposition
== RegDisposition_OpenAlways
)
3229 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
3230 NULL
, phkClass
, &dwDisposition
);
3234 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
3239 if (pClassGuid
!= NULL
)
3240 RpcStringFreeW(&lpGuidString
);
3242 if (dwError
!= ERROR_SUCCESS
)
3245 return CR_NO_SUCH_REGISTRY_KEY
;
3248 if (pszClassName
!= NULL
)
3250 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
3251 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
3258 /***********************************************************************
3259 * CM_Open_DevNode_Key [SETUPAPI.@]
3261 CONFIGRET WINAPI
CM_Open_DevNode_Key(
3262 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3263 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
3265 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
3266 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
3267 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
3268 Disposition
, phkDevice
, ulFlags
, NULL
);
3272 /***********************************************************************
3273 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
3275 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
3276 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3277 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
3280 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
3281 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
3283 return CR_CALL_NOT_IMPLEMENTED
;
3287 /***********************************************************************
3288 * CM_Reenumerate_DevNode [SETUPAPI.@]
3290 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
3291 DEVINST dnDevInst
, ULONG ulFlags
)
3293 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
3294 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
3298 /***********************************************************************
3299 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
3302 CM_Reenumerate_DevNode_Ex(
3303 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3305 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3306 HSTRING_TABLE StringTable
= NULL
;
3310 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
3313 return CR_INVALID_DEVNODE
;
3315 if (ulFlags
& ~CM_REENUMERATE_BITS
)
3316 return CR_INVALID_FLAG
;
3318 if (hMachine
!= NULL
)
3320 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3321 if (BindingHandle
== NULL
)
3324 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3325 if (StringTable
== 0)
3330 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3334 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3335 if (lpDevInst
== NULL
)
3336 return CR_INVALID_DEVNODE
;
3340 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3341 PNP_DEVINST_REENUMERATE
,
3346 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3348 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3356 /***********************************************************************
3357 * CM_Request_Eject_PC [SETUPAPI.@]
3359 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
3362 return CM_Request_Eject_PC_Ex(NULL
);
3366 /***********************************************************************
3367 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
3369 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
3372 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3375 TRACE("%lx\n", hMachine
);
3377 if (hMachine
!= NULL
)
3379 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3380 if (BindingHandle
== NULL
)
3385 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3391 ret
= PNP_RequestEjectPC(BindingHandle
);
3393 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3395 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3403 /***********************************************************************
3404 * CM_Run_Detection [SETUPAPI.@]
3406 CONFIGRET WINAPI
CM_Run_Detection(
3409 TRACE("%lx\n", ulFlags
);
3410 return CM_Run_Detection_Ex(ulFlags
, NULL
);
3414 /***********************************************************************
3415 * CM_Run_Detection_Ex [SETUPAPI.@]
3417 CONFIGRET WINAPI
CM_Run_Detection_Ex(
3418 ULONG ulFlags
, HMACHINE hMachine
)
3420 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3423 TRACE("%lx %lx\n", ulFlags
, hMachine
);
3426 return CR_ACCESS_DENIED
;
3428 if (ulFlags
& ~CM_DETECT_BITS
)
3429 return CR_INVALID_FLAG
;
3431 if (hMachine
!= NULL
)
3433 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3434 if (BindingHandle
== NULL
)
3439 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3445 ret
= PNP_RunDetection(BindingHandle
,
3448 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3450 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3458 /***********************************************************************
3459 * CM_Set_DevNode_Problem [SETUPAPI.@]
3461 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
3462 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
3464 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
3465 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
3469 /***********************************************************************
3470 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
3472 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
3473 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
3475 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3476 HSTRING_TABLE StringTable
= NULL
;
3480 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
3483 return CR_INVALID_DEVNODE
;
3485 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
3486 return CR_INVALID_FLAG
;
3488 if (hMachine
!= NULL
)
3490 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3491 if (BindingHandle
== NULL
)
3494 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3495 if (StringTable
== 0)
3500 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3504 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3505 if (lpDevInst
== NULL
)
3506 return CR_INVALID_DEVNODE
;
3510 ret
= PNP_SetDeviceProblem(BindingHandle
,
3515 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3517 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3525 /***********************************************************************
3526 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
3528 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
3529 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3532 TRACE("%lx %lu %p %lx %lx\n",
3533 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3534 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3540 /***********************************************************************
3541 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
3543 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
3544 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3547 TRACE("%lx %lu %p %lx %lx\n",
3548 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3549 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3555 /***********************************************************************
3556 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
3558 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
3559 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3560 ULONG ulFlags
, HMACHINE hMachine
)
3562 CONFIGRET ret
= CR_SUCCESS
;
3566 FIXME("%lx %lu %p %lx %lx %lx\n",
3567 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3569 if (Buffer
== NULL
&& ulLength
!= 0)
3570 return CR_INVALID_POINTER
;
3574 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3583 /* Get property type */
3586 case CM_DRP_DEVICEDESC
:
3590 case CM_DRP_HARDWAREID
:
3591 ulType
= REG_MULTI_SZ
;
3594 case CM_DRP_COMPATIBLEIDS
:
3595 ulType
= REG_MULTI_SZ
;
3598 case CM_DRP_SERVICE
:
3606 case CM_DRP_CLASSGUID
:
3614 case CM_DRP_CONFIGFLAGS
:
3622 case CM_DRP_FRIENDLYNAME
:
3626 case CM_DRP_LOCATION_INFORMATION
:
3630 case CM_DRP_UPPERFILTERS
:
3631 ulType
= REG_MULTI_SZ
;
3634 case CM_DRP_LOWERFILTERS
:
3635 ulType
= REG_MULTI_SZ
;
3639 return CR_INVALID_PROPERTY
;
3642 /* Allocate buffer if needed */
3643 if (ulType
== REG_SZ
||
3644 ulType
== REG_MULTI_SZ
)
3646 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
3647 if (lpBuffer
== NULL
)
3649 ret
= CR_OUT_OF_MEMORY
;
3653 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
3654 ulLength
, lpBuffer
, ulLength
))
3661 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3664 ulLength
* sizeof(WCHAR
),
3673 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3681 ret
= CR_CALL_NOT_IMPLEMENTED
;
3688 /***********************************************************************
3689 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
3691 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
3692 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3693 ULONG ulFlags
, HMACHINE hMachine
)
3695 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3696 HSTRING_TABLE StringTable
= NULL
;
3701 TRACE("%lx %lu %p %lx %lx %lx\n",
3702 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3705 return CR_INVALID_DEVNODE
;
3707 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3708 return CR_INVALID_PROPERTY
;
3710 if (Buffer
!= NULL
&& ulLength
== 0)
3711 return CR_INVALID_POINTER
;
3714 return CR_INVALID_FLAG
;
3716 if (hMachine
!= NULL
)
3718 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3719 if (BindingHandle
== NULL
)
3722 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3723 if (StringTable
== 0)
3728 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3732 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3733 if (lpDevInst
== NULL
)
3734 return CR_INVALID_DEVNODE
;
3738 case CM_DRP_DEVICEDESC
:
3742 case CM_DRP_HARDWAREID
:
3743 ulType
= REG_MULTI_SZ
;
3746 case CM_DRP_COMPATIBLEIDS
:
3747 ulType
= REG_MULTI_SZ
;
3750 case CM_DRP_SERVICE
:
3758 case CM_DRP_CLASSGUID
:
3766 case CM_DRP_CONFIGFLAGS
:
3774 case CM_DRP_FRIENDLYNAME
:
3778 case CM_DRP_LOCATION_INFORMATION
:
3782 case CM_DRP_UPPERFILTERS
:
3783 ulType
= REG_MULTI_SZ
;
3786 case CM_DRP_LOWERFILTERS
:
3787 ulType
= REG_MULTI_SZ
;
3791 return CR_INVALID_PROPERTY
;
3796 ret
= PNP_SetDeviceRegProp(BindingHandle
,
3804 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3806 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3814 /***********************************************************************
3815 * CM_Set_HW_Prof [SETUPAPI.@]
3817 CONFIGRET WINAPI
CM_Set_HW_Prof(
3818 ULONG ulHardwareProfile
, ULONG ulFlags
)
3820 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
3821 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
3825 /***********************************************************************
3826 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
3828 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
3829 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
3831 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3834 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
3837 return CR_ACCESS_DENIED
;
3840 return CR_INVALID_FLAG
;
3842 if (hMachine
!= NULL
)
3844 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3845 if (BindingHandle
== NULL
)
3850 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3856 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
3858 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3860 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3868 /***********************************************************************
3869 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
3871 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
3872 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3875 TRACE("%s %lu %lu %lx\n", szDevInstName
,
3876 ulConfig
, ulValue
, ulFlags
);
3877 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
3882 /***********************************************************************
3883 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
3885 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
3886 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3889 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
3890 ulConfig
, ulValue
, ulFlags
);
3891 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
3896 /***********************************************************************
3897 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
3899 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
3900 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3901 ULONG ulFlags
, HMACHINE hMachine
)
3903 DEVINSTID_W pszDevIdW
= NULL
;
3904 CONFIGRET ret
= CR_SUCCESS
;
3906 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
3907 ulConfig
, ulValue
, ulFlags
, hMachine
);
3909 if (szDevInstName
!= NULL
)
3911 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3912 return CR_INVALID_DEVICE_ID
;
3915 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
3918 if (pszDevIdW
!= NULL
)
3925 /***********************************************************************
3926 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
3928 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
3929 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3930 ULONG ulFlags
, HMACHINE hMachine
)
3932 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3935 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
3936 ulConfig
, ulValue
, ulFlags
, hMachine
);
3938 if (szDevInstName
== NULL
)
3939 return CR_INVALID_POINTER
;
3941 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
3942 return CR_INVALID_FLAG
;
3944 /* FIXME: Check whether szDevInstName is valid */
3946 if (hMachine
!= NULL
)
3948 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3949 if (BindingHandle
== NULL
)
3954 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3960 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
3961 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
3963 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3965 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3973 /***********************************************************************
3974 * CM_Setup_DevNode [SETUPAPI.@]
3976 CONFIGRET WINAPI
CM_Setup_DevNode(
3977 DEVINST dnDevInst
, ULONG ulFlags
)
3979 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
3980 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
3984 /***********************************************************************
3985 * CM_Setup_DevNode_Ex [SETUPAPI.@]
3987 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
3988 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3990 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3991 HSTRING_TABLE StringTable
= NULL
;
3995 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
3998 return CR_ACCESS_DENIED
;
4001 return CR_INVALID_DEVNODE
;
4003 if (ulFlags
& ~CM_SETUP_BITS
)
4004 return CR_INVALID_FLAG
;
4006 if (hMachine
!= NULL
)
4008 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4009 if (BindingHandle
== NULL
)
4012 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4013 if (StringTable
== 0)
4018 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4022 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
4023 if (lpDevInst
== NULL
)
4024 return CR_INVALID_DEVNODE
;
4028 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4034 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4036 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4044 /***********************************************************************
4045 * CM_Uninstall_DevNode [SETUPAPI.@]
4047 CONFIGRET WINAPI
CM_Uninstall_DevNode(
4048 DEVINST dnPhantom
, ULONG ulFlags
)
4050 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
4051 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
4055 /***********************************************************************
4056 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
4058 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
4059 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
4061 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4062 HSTRING_TABLE StringTable
= NULL
;
4066 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
4069 return CR_INVALID_DEVNODE
;
4072 return CR_INVALID_FLAG
;
4074 if (hMachine
!= NULL
)
4076 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4077 if (BindingHandle
== NULL
)
4080 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4081 if (StringTable
== 0)
4086 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4090 lpDevInst
= StringTableStringFromId(StringTable
, dnPhantom
);
4091 if (lpDevInst
== NULL
)
4092 return CR_INVALID_DEVNODE
;
4096 ret
= PNP_UninstallDevInst(BindingHandle
,
4100 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4102 ret
= RpcStatusToCmStatus(RpcExceptionCode());