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
= pSetupIsUserAdmin();
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 * CMP_WaitServicesAvailable [SETUPAPI.@]
187 CMP_WaitServicesAvailable(HMACHINE hMachine
)
189 RPC_BINDING_HANDLE BindingHandle
= NULL
;
190 CONFIGRET ret
= CR_SUCCESS
;
193 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
198 ret
= PNP_GetVersion(BindingHandle
, &Version
);
200 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
202 ret
= RpcStatusToCmStatus(RpcExceptionCode());
210 /***********************************************************************
211 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
213 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
214 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
217 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
218 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
223 /***********************************************************************
224 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
226 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
227 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
228 ULONG ulFlags
, HMACHINE hMachine
)
230 RPC_BINDING_HANDLE BindingHandle
= NULL
;
231 HSTRING_TABLE StringTable
= NULL
;
232 ULONG ulLogConfTag
= 0;
234 PLOG_CONF_INFO pLogConfInfo
;
235 CONFIGRET ret
= CR_SUCCESS
;
237 FIXME("%p %p %lu %lx %p\n",
238 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
240 if (!pSetupIsUserAdmin())
241 return CR_ACCESS_DENIED
;
243 if (plcLogConf
== NULL
)
244 return CR_INVALID_POINTER
;
247 return CR_INVALID_DEVINST
;
249 if (Priority
> 0xFFFF)
250 return CR_INVALID_PRIORITY
;
252 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
253 return CR_INVALID_FLAG
;
255 if (hMachine
!= NULL
)
257 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
258 if (BindingHandle
== NULL
)
261 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
262 if (StringTable
== 0)
267 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
271 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
272 if (lpDevInst
== NULL
)
273 return CR_INVALID_DEVNODE
;
277 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
278 &ulLogConfTag
, ulFlags
);
280 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
282 ret
= RpcStatusToCmStatus(RpcExceptionCode());
286 if (ret
== CR_SUCCESS
)
288 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
289 if (pLogConfInfo
== NULL
)
291 ret
= CR_OUT_OF_MEMORY
;
295 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
296 pLogConfInfo
->dnDevInst
= dnDevInst
;
297 pLogConfInfo
->ulFlags
= ulFlags
;
298 pLogConfInfo
->ulTag
= ulLogConfTag
;
300 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
310 /***********************************************************************
311 * CM_Add_IDA [SETUPAPI.@]
313 CONFIGRET WINAPI
CM_Add_IDA(
314 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
316 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
317 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
321 /***********************************************************************
322 * CM_Add_IDW [SETUPAPI.@]
324 CONFIGRET WINAPI
CM_Add_IDW(
325 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
327 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
328 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
332 /***********************************************************************
333 * CM_Add_ID_ExA [SETUPAPI.@]
335 CONFIGRET WINAPI
CM_Add_ID_ExA(
336 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
341 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
343 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
344 return CR_INVALID_DATA
;
346 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
354 /***********************************************************************
355 * CM_Add_ID_ExW [SETUPAPI.@]
357 CONFIGRET WINAPI
CM_Add_ID_ExW(
358 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
360 RPC_BINDING_HANDLE BindingHandle
= NULL
;
361 HSTRING_TABLE StringTable
= NULL
;
365 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
367 if (!pSetupIsUserAdmin())
368 return CR_ACCESS_DENIED
;
371 return CR_INVALID_DEVINST
;
374 return CR_INVALID_POINTER
;
376 if (ulFlags
& ~CM_ADD_ID_BITS
)
377 return CR_INVALID_FLAG
;
379 if (hMachine
!= NULL
)
381 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
382 if (BindingHandle
== NULL
)
385 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
386 if (StringTable
== 0)
391 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
395 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
396 if (lpDevInst
== NULL
)
397 return CR_INVALID_DEVNODE
;
401 ret
= PNP_AddID(BindingHandle
,
406 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
408 ret
= RpcStatusToCmStatus(RpcExceptionCode());
416 /***********************************************************************
417 * CM_Add_Res_Des [SETUPAPI.@]
419 CONFIGRET WINAPI
CM_Add_Res_Des(
420 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
421 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
423 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
424 ResourceData
, ResourceLen
, ulFlags
);
425 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
426 ResourceLen
, ulFlags
, NULL
);
430 /***********************************************************************
431 * CM_Add_Res_Des_Ex [SETUPAPI.@]
433 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
434 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
435 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
437 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
438 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
440 return CR_CALL_NOT_IMPLEMENTED
;
444 /***********************************************************************
445 * CM_Connect_MachineA [SETUPAPI.@]
447 CONFIGRET WINAPI
CM_Connect_MachineA(
448 PCSTR UNCServerName
, PHMACHINE phMachine
)
453 TRACE("%s %p\n", UNCServerName
, phMachine
);
455 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
456 return CM_Connect_MachineW(NULL
, phMachine
);
458 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
459 return CR_INVALID_DATA
;
461 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
463 MyFree(pServerNameW
);
469 /***********************************************************************
470 * CM_Connect_MachineW [SETUPAPI.@]
472 CONFIGRET WINAPI
CM_Connect_MachineW(
473 PCWSTR UNCServerName
, PHMACHINE phMachine
)
475 PMACHINE_INFO pMachine
;
477 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
479 if (phMachine
== NULL
)
480 return CR_INVALID_POINTER
;
484 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
485 if (pMachine
== NULL
)
486 return CR_OUT_OF_MEMORY
;
488 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
490 pMachine
->bLocal
= TRUE
;
492 /* FIXME: store the computers name in pMachine->szMachineName */
494 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
495 &pMachine
->StringTable
))
497 HeapFree(GetProcessHeap(), 0, pMachine
);
503 pMachine
->bLocal
= FALSE
;
504 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
506 HeapFree(GetProcessHeap(), 0, pMachine
);
507 return CR_INVALID_MACHINENAME
;
509 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
511 pMachine
->StringTable
= pSetupStringTableInitialize();
512 if (pMachine
->StringTable
== NULL
)
514 HeapFree(GetProcessHeap(), 0, pMachine
);
518 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
520 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
522 pSetupStringTableDestroy(pMachine
->StringTable
);
523 HeapFree(GetProcessHeap(), 0, pMachine
);
524 return CR_INVALID_MACHINENAME
;
528 phMachine
= (PHMACHINE
)pMachine
;
534 /***********************************************************************
535 * CM_Create_DevNodeA [SETUPAPI.@]
537 CONFIGRET WINAPI
CM_Create_DevNodeA(
538 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
541 TRACE("%p %s %p %lx\n",
542 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
543 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
548 /***********************************************************************
549 * CM_Create_DevNodeW [SETUPAPI.@]
551 CONFIGRET WINAPI
CM_Create_DevNodeW(
552 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
555 TRACE("%p %s %p %lx\n",
556 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
557 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
562 /***********************************************************************
563 * CM_Create_DevNode_ExA [SETUPAPI.@]
565 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
566 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
567 ULONG ulFlags
, HANDLE hMachine
)
569 DEVINSTID_W pDeviceIDW
;
572 TRACE("%p %s %p %lx %p\n",
573 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
575 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
576 return CR_INVALID_DATA
;
578 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
587 /***********************************************************************
588 * CM_Create_DevNode_ExW [SETUPAPI.@]
590 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
591 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
592 ULONG ulFlags
, HANDLE hMachine
)
594 RPC_BINDING_HANDLE BindingHandle
= NULL
;
595 HSTRING_TABLE StringTable
= NULL
;
596 LPWSTR lpParentDevInst
;
597 CONFIGRET ret
= CR_SUCCESS
;
599 FIXME("%p %s %p %lx %p\n",
600 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
602 if (!pSetupIsUserAdmin())
603 return CR_ACCESS_DENIED
;
605 if (pdnDevInst
== NULL
)
606 return CR_INVALID_POINTER
;
608 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0)
609 return CR_INVALID_DEVICE_ID
;
612 return CR_INVALID_DEVNODE
;
614 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
615 return CR_INVALID_FLAG
;
617 if (hMachine
!= NULL
)
619 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
620 if (BindingHandle
== NULL
)
623 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
624 if (StringTable
== 0)
629 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
633 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
634 if (lpParentDevInst
== NULL
)
635 return CR_INVALID_DEVNODE
;
639 ret
= PNP_CreateDevInst(BindingHandle
,
645 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
647 ret
= RpcStatusToCmStatus(RpcExceptionCode());
651 if (ret
== CR_SUCCESS
)
653 *pdnDevInst
= pSetupStringTableAddString(StringTable
, pDeviceID
, 1);
654 if (*pdnDevInst
== 0)
655 ret
= CR_NO_SUCH_DEVNODE
;
662 /***********************************************************************
663 * CM_Delete_Class_Key [SETUPAPI.@]
665 CONFIGRET WINAPI
CM_Delete_Class_Key(
666 LPGUID ClassGuid
, ULONG ulFlags
)
668 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
669 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
673 /***********************************************************************
674 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
676 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
677 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
679 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
680 RPC_BINDING_HANDLE BindingHandle
= NULL
;
683 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
685 if (ClassGuid
== NULL
)
686 return CR_INVALID_POINTER
;
688 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
689 return CR_INVALID_FLAG
;
691 if (!GuidToString(ClassGuid
, szGuidString
))
692 return CR_INVALID_DATA
;
694 if (hMachine
!= NULL
)
696 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
697 if (BindingHandle
== NULL
)
702 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
708 ret
= PNP_DeleteClassKey(BindingHandle
,
712 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
714 ret
= RpcStatusToCmStatus(RpcExceptionCode());
722 /***********************************************************************
723 * CM_Delete_DevNode_Key [SETUPAPI.@]
725 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
726 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
728 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
729 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
734 /***********************************************************************
735 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
737 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
738 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
741 FIXME("%p %lu %lx %p\n",
742 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
744 return CR_CALL_NOT_IMPLEMENTED
;
748 /***********************************************************************
749 * CM_Disable_DevNode [SETUPAPI.@]
751 CONFIGRET WINAPI
CM_Disable_DevNode(
752 DEVINST dnDevInst
, ULONG ulFlags
)
754 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
755 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
759 /***********************************************************************
760 * CM_Disable_DevNode_Ex [SETUPAPI.@]
762 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
763 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
765 RPC_BINDING_HANDLE BindingHandle
= NULL
;
766 HSTRING_TABLE StringTable
= NULL
;
770 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
772 if (!pSetupIsUserAdmin())
773 return CR_ACCESS_DENIED
;
776 return CR_INVALID_DEVINST
;
779 return CR_INVALID_FLAG
;
781 if (hMachine
!= NULL
)
783 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
784 if (BindingHandle
== NULL
)
787 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
788 if (StringTable
== 0)
793 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
797 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
798 if (lpDevInst
== NULL
)
799 return CR_INVALID_DEVNODE
;
803 ret
= PNP_DeviceInstanceAction(BindingHandle
,
809 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
811 ret
= RpcStatusToCmStatus(RpcExceptionCode());
819 /***********************************************************************
820 * CM_Disconnect_Machine [SETUPAPI.@]
822 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
824 PMACHINE_INFO pMachine
;
826 TRACE("%lx\n", hMachine
);
828 pMachine
= (PMACHINE_INFO
)hMachine
;
829 if (pMachine
== NULL
)
832 if (pMachine
->bLocal
== FALSE
)
834 if (pMachine
->StringTable
!= NULL
)
835 pSetupStringTableDestroy(pMachine
->StringTable
);
837 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
838 return CR_ACCESS_DENIED
;
841 HeapFree(GetProcessHeap(), 0, pMachine
);
847 /***********************************************************************
848 * CM_Enable_DevNode [SETUPAPI.@]
850 CONFIGRET WINAPI
CM_Enable_DevNode(
851 DEVINST dnDevInst
, ULONG ulFlags
)
853 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
854 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
858 /***********************************************************************
859 * CM_Enable_DevNode_Ex [SETUPAPI.@]
861 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
862 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
864 RPC_BINDING_HANDLE BindingHandle
= NULL
;
865 HSTRING_TABLE StringTable
= NULL
;
869 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
871 if (!pSetupIsUserAdmin())
872 return CR_ACCESS_DENIED
;
875 return CR_INVALID_DEVINST
;
878 return CR_INVALID_FLAG
;
880 if (hMachine
!= NULL
)
882 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
883 if (BindingHandle
== NULL
)
886 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
887 if (StringTable
== 0)
892 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
896 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
897 if (lpDevInst
== NULL
)
898 return CR_INVALID_DEVNODE
;
902 ret
= PNP_DeviceInstanceAction(BindingHandle
,
908 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
910 ret
= RpcStatusToCmStatus(RpcExceptionCode());
918 /***********************************************************************
919 * CM_Enumerate_Classes [SETUPAPI.@]
921 CONFIGRET WINAPI
CM_Enumerate_Classes(
922 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
924 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
925 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
929 /***********************************************************************
930 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
932 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
933 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
935 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
936 RPC_BINDING_HANDLE BindingHandle
= NULL
;
937 CONFIGRET ret
= CR_SUCCESS
;
938 ULONG ulLength
= MAX_GUID_STRING_LEN
;
940 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
942 if (ClassGuid
== NULL
)
943 return CR_INVALID_POINTER
;
946 return CR_INVALID_FLAG
;
948 if (hMachine
!= NULL
)
950 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
951 if (BindingHandle
== NULL
)
956 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
962 ret
= PNP_EnumerateSubKeys(BindingHandle
,
970 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
972 ret
= RpcStatusToCmStatus(RpcExceptionCode());
976 if (ret
== CR_SUCCESS
)
979 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
981 /* Convert the buffer to a GUID */
982 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
990 /***********************************************************************
991 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
993 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
994 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
996 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
997 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1002 /***********************************************************************
1003 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1005 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1006 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1008 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1009 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1014 /***********************************************************************
1015 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1017 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1018 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1021 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1024 CONFIGRET ret
= CR_SUCCESS
;
1026 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1029 if (Buffer
== NULL
|| pulLength
== NULL
)
1030 return CR_INVALID_POINTER
;
1033 return CR_INVALID_FLAG
;
1035 ulOrigLength
= *pulLength
;
1038 ulLength
= MAX_DEVICE_ID_LEN
;
1039 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1041 if (ret
== CR_SUCCESS
)
1043 if (WideCharToMultiByte(CP_ACP
,
1053 *pulLength
= lstrlenA(Buffer
) + 1;
1060 /***********************************************************************
1061 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1063 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1064 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1067 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1070 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1073 if (Buffer
== NULL
|| pulLength
== NULL
)
1074 return CR_INVALID_POINTER
;
1077 return CR_INVALID_FLAG
;
1079 *Buffer
= UNICODE_NULL
;
1081 if (hMachine
!= NULL
)
1083 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1084 if (BindingHandle
== NULL
)
1089 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1095 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1096 PNP_ENUMERATOR_SUBKEYS
,
1103 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1105 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1113 /***********************************************************************
1114 * CM_Free_Log_Conf [SETUPAPI.@]
1116 CONFIGRET WINAPI
CM_Free_Log_Conf(
1117 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1119 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1120 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1124 /***********************************************************************
1125 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1127 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1128 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1130 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1131 HSTRING_TABLE StringTable
= NULL
;
1133 PLOG_CONF_INFO pLogConfInfo
;
1136 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1138 if (!pSetupIsUserAdmin())
1139 return CR_ACCESS_DENIED
;
1141 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1142 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1143 return CR_INVALID_LOG_CONF
;
1146 return CR_INVALID_FLAG
;
1148 if (hMachine
!= NULL
)
1150 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1151 if (BindingHandle
== NULL
)
1154 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1155 if (StringTable
== 0)
1160 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1164 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1165 if (lpDevInst
== NULL
)
1166 return CR_INVALID_DEVNODE
;
1170 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1171 pLogConfInfo
->ulTag
, 0);
1173 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1175 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1183 /***********************************************************************
1184 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1186 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1189 PLOG_CONF_INFO pLogConfInfo
;
1191 TRACE("%lx\n", lcLogConf
);
1193 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1194 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1195 return CR_INVALID_LOG_CONF
;
1197 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1203 /***********************************************************************
1204 * CM_Free_Res_Des [SETUPAPI.@]
1206 CONFIGRET WINAPI
CM_Free_Res_Des(
1207 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1209 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1210 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1214 /***********************************************************************
1215 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1217 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1218 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1221 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1223 return CR_CALL_NOT_IMPLEMENTED
;
1227 /***********************************************************************
1228 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1230 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1233 FIXME("%p\n", rdResDes
);
1235 return CR_CALL_NOT_IMPLEMENTED
;
1239 /***********************************************************************
1240 * CM_Get_Child [SETUPAPI.@]
1242 CONFIGRET WINAPI
CM_Get_Child(
1243 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1245 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1246 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1250 /***********************************************************************
1251 * CM_Get_Child_Ex [SETUPAPI.@]
1253 CONFIGRET WINAPI
CM_Get_Child_Ex(
1254 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1256 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1257 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1258 HSTRING_TABLE StringTable
= NULL
;
1260 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1263 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1265 if (pdnDevInst
== NULL
)
1266 return CR_INVALID_POINTER
;
1269 return CR_INVALID_DEVINST
;
1272 return CR_INVALID_FLAG
;
1276 if (hMachine
!= NULL
)
1278 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1279 if (BindingHandle
== NULL
)
1282 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1283 if (StringTable
== 0)
1288 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1292 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1293 if (lpDevInst
== NULL
)
1294 return CR_INVALID_DEVNODE
;
1298 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1299 PNP_GET_CHILD_DEVICE_INSTANCE
,
1305 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1307 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1311 if (ret
!= CR_SUCCESS
)
1314 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1316 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1320 *pdnDevInst
= dwIndex
;
1326 /***********************************************************************
1327 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1329 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1330 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1332 TRACE("%p %p %p %lx\n",
1333 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1334 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1339 /***********************************************************************
1340 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1342 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1343 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1345 TRACE("%p %p %p %lx\n",
1346 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1347 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1352 /***********************************************************************
1353 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1355 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1356 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1359 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1360 CONFIGRET ret
= CR_SUCCESS
;
1364 TRACE("%p %p %p %lx %lx\n",
1365 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1367 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1368 return CR_INVALID_POINTER
;
1370 ulOrigLength
= *pulLength
;
1373 ulLength
= MAX_GUID_STRING_LEN
;
1374 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1376 if (ret
== CR_SUCCESS
)
1378 if (WideCharToMultiByte(CP_ACP
,
1388 *pulLength
= lstrlenA(pszKeyName
) + 1;
1395 /***********************************************************************
1396 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1398 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1399 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1402 TRACE("%p %p %p %lx %lx\n",
1403 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1405 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1406 return CR_INVALID_POINTER
;
1409 return CR_INVALID_FLAG
;
1411 if (*pulLength
< MAX_GUID_STRING_LEN
)
1414 return CR_BUFFER_SMALL
;
1417 if (!GuidToString(ClassGuid
, pszKeyName
))
1418 return CR_INVALID_DATA
;
1420 *pulLength
= MAX_GUID_STRING_LEN
;
1426 /***********************************************************************
1427 * CM_Get_Class_NameA [SETUPAPI.@]
1429 CONFIGRET WINAPI
CM_Get_Class_NameA(
1430 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1432 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1433 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1438 /***********************************************************************
1439 * CM_Get_Class_NameW [SETUPAPI.@]
1441 CONFIGRET WINAPI
CM_Get_Class_NameW(
1442 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1444 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1445 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1450 /***********************************************************************
1451 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1453 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1454 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1457 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1458 CONFIGRET ret
= CR_SUCCESS
;
1462 TRACE("%p %p %p %lx %lx\n",
1463 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1465 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1466 return CR_INVALID_POINTER
;
1468 ulOrigLength
= *pulLength
;
1471 ulLength
= MAX_CLASS_NAME_LEN
;
1472 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1474 if (ret
== CR_SUCCESS
)
1476 if (WideCharToMultiByte(CP_ACP
,
1486 *pulLength
= lstrlenA(Buffer
) + 1;
1493 /***********************************************************************
1494 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1497 CM_Get_Class_Name_ExW(
1498 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1501 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1502 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1505 TRACE("%p %p %p %lx %lx\n",
1506 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1508 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1509 return CR_INVALID_POINTER
;
1512 return CR_INVALID_FLAG
;
1514 if (!GuidToString(ClassGuid
, szGuidString
))
1515 return CR_INVALID_DATA
;
1517 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1519 if (hMachine
!= NULL
)
1521 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1522 if (BindingHandle
== NULL
)
1527 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1533 ret
= PNP_GetClassName(BindingHandle
,
1539 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1541 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1549 /***********************************************************************
1550 * CM_Get_Depth [SETUPAPI.@]
1552 CONFIGRET WINAPI
CM_Get_Depth(
1553 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1555 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1556 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1560 /***********************************************************************
1561 * CM_Get_Depth_Ex [SETUPAPI.@]
1563 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1564 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1566 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1567 HSTRING_TABLE StringTable
= NULL
;
1571 TRACE("%p %lx %lx %lx\n",
1572 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1574 if (pulDepth
== NULL
)
1575 return CR_INVALID_POINTER
;
1578 return CR_INVALID_DEVINST
;
1581 return CR_INVALID_FLAG
;
1583 if (hMachine
!= NULL
)
1585 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1586 if (BindingHandle
== NULL
)
1589 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1590 if (StringTable
== 0)
1595 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1599 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1600 if (lpDevInst
== NULL
)
1601 return CR_INVALID_DEVNODE
;
1605 ret
= PNP_GetDepth(BindingHandle
,
1610 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1612 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1620 /***********************************************************************
1621 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1623 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1624 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1625 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1627 TRACE("%lx %lu %p %p %p %lx\n",
1628 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1630 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1631 pulRegDataType
, Buffer
,
1632 pulLength
, ulFlags
, NULL
);
1636 /***********************************************************************
1637 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1639 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1640 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1641 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1643 TRACE("%lx %lu %p %p %p %lx\n",
1644 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1646 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1647 pulRegDataType
, Buffer
,
1648 pulLength
, ulFlags
, NULL
);
1652 /***********************************************************************
1653 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1655 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1656 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1657 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1661 ULONG RegDataType
= REG_NONE
;
1664 TRACE("%lx %lu %p %p %p %lx %lx\n",
1665 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1669 return CR_INVALID_POINTER
;
1671 LengthW
= *pulLength
* sizeof(WCHAR
);
1672 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1675 return CR_OUT_OF_MEMORY
;
1677 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1685 if (ret
== CR_SUCCESS
)
1687 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1689 /* Do W->A conversion */
1690 *pulLength
= WideCharToMultiByte(CP_ACP
,
1693 lstrlenW(BufferW
) + 1,
1698 if (*pulLength
== 0)
1703 /* Directly copy the value */
1704 if (LengthW
<= *pulLength
)
1705 memcpy(Buffer
, BufferW
, LengthW
);
1708 *pulLength
= LengthW
;
1709 ret
= CR_BUFFER_SMALL
;
1715 *pulRegDataType
= RegDataType
;
1717 HeapFree(GetProcessHeap(), 0, BufferW
);
1723 /***********************************************************************
1724 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1726 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1727 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1728 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1730 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1731 HSTRING_TABLE StringTable
= NULL
;
1732 CONFIGRET ret
= CR_SUCCESS
;
1734 ULONG ulDataType
= 0;
1735 ULONG ulTransferLength
= 0;
1737 TRACE("%lx %lu %p %p %p %lx %lx\n",
1738 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1742 return CR_INVALID_DEVNODE
;
1744 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1745 return CR_INVALID_PROPERTY
;
1747 /* pulRegDataType is optional */
1749 /* Buffer is optional */
1751 if (pulLength
== NULL
)
1752 return CR_INVALID_POINTER
;
1754 if (*pulLength
== 0)
1755 return CR_INVALID_POINTER
;
1758 return CR_INVALID_FLAG
;
1760 if (hMachine
!= NULL
)
1762 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1763 if (BindingHandle
== NULL
)
1766 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1767 if (StringTable
== 0)
1772 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1776 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1777 if (lpDevInst
== NULL
)
1778 return CR_INVALID_DEVNODE
;
1780 ulTransferLength
= *pulLength
;
1784 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1793 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1795 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1799 if (ret
== CR_SUCCESS
)
1801 if (pulRegDataType
!= NULL
)
1802 *pulRegDataType
= ulDataType
;
1809 /***********************************************************************
1810 * CM_Get_DevNode_Status [SETUPAPI.@]
1812 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1813 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1816 TRACE("%p %p %lx %lx\n",
1817 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1818 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1823 /***********************************************************************
1824 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1827 CM_Get_DevNode_Status_Ex(
1828 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1829 ULONG ulFlags
, HMACHINE hMachine
)
1831 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1832 HSTRING_TABLE StringTable
= NULL
;
1836 TRACE("%p %p %lx %lx %lx\n",
1837 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1839 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1840 return CR_INVALID_POINTER
;
1843 return CR_INVALID_DEVINST
;
1846 return CR_INVALID_FLAG
;
1848 if (hMachine
!= NULL
)
1850 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1851 if (BindingHandle
== NULL
)
1854 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1855 if (StringTable
== 0)
1860 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1864 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1865 if (lpDevInst
== NULL
)
1866 return CR_INVALID_DEVNODE
;
1870 ret
= PNP_GetDeviceStatus(BindingHandle
,
1876 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1878 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1886 /***********************************************************************
1887 * CM_Get_Device_IDA [SETUPAPI.@]
1889 CONFIGRET WINAPI
CM_Get_Device_IDA(
1890 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1892 TRACE("%lx %p %ld %ld\n",
1893 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1894 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1898 /***********************************************************************
1899 * CM_Get_Device_IDW [SETUPAPI.@]
1901 CONFIGRET WINAPI
CM_Get_Device_IDW(
1902 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1904 TRACE("%lx %p %ld %ld\n",
1905 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1906 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1910 /***********************************************************************
1911 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1913 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1914 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1917 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1918 CONFIGRET ret
= CR_SUCCESS
;
1920 TRACE("%lx %p %ld %ld %lx\n",
1921 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1924 return CR_INVALID_POINTER
;
1926 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1931 if (ret
== CR_SUCCESS
)
1933 if (WideCharToMultiByte(CP_ACP
,
1936 lstrlenW(szBufferW
) + 1,
1948 /***********************************************************************
1949 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1951 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1952 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1955 HSTRING_TABLE StringTable
= NULL
;
1957 TRACE("%lx %p %ld %ld %lx\n",
1958 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1961 return CR_INVALID_DEVINST
;
1964 return CR_INVALID_POINTER
;
1967 return CR_INVALID_FLAG
;
1969 if (hMachine
!= NULL
)
1971 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1972 if (StringTable
== NULL
)
1977 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1981 if (!pSetupStringTableStringFromIdEx(StringTable
,
1991 /***********************************************************************
1992 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1994 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1995 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1997 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1998 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2003 /***********************************************************************
2004 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2006 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2007 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2009 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2010 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2015 /***********************************************************************
2016 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2018 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2019 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2022 LPWSTR BufferW
= NULL
;
2023 LPWSTR pszFilterW
= NULL
;
2024 CONFIGRET ret
= CR_SUCCESS
;
2026 TRACE("%p %p %ld %ld %lx\n",
2027 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2029 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2030 if (BufferW
== NULL
)
2031 return CR_OUT_OF_MEMORY
;
2033 if (pszFilter
== NULL
)
2035 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2043 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2045 ret
= CR_INVALID_DEVICE_ID
;
2049 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2058 if (WideCharToMultiByte(CP_ACP
,
2061 lstrlenW(BufferW
) + 1,
2075 /***********************************************************************
2076 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2078 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2079 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2082 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2085 TRACE("%p %p %ld %ld %lx\n",
2086 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2088 if (Buffer
== NULL
|| BufferLen
== 0)
2089 return CR_INVALID_POINTER
;
2091 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2092 return CR_INVALID_FLAG
;
2094 if (hMachine
!= NULL
)
2096 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2097 if (BindingHandle
== NULL
)
2102 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2110 ret
= PNP_GetDeviceList(BindingHandle
,
2116 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2118 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2126 /***********************************************************************
2127 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2129 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2130 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2132 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2133 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2137 /***********************************************************************
2138 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2140 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2141 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2143 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2144 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2148 /***********************************************************************
2149 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2151 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2152 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2154 LPWSTR pszFilterW
= NULL
;
2155 CONFIGRET ret
= CR_SUCCESS
;
2157 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2159 if (pszFilter
== NULL
)
2161 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2168 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2169 return CR_INVALID_DEVICE_ID
;
2171 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2183 /***********************************************************************
2184 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2186 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2187 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2189 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2192 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2195 return CR_INVALID_POINTER
;
2197 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2198 return CR_INVALID_FLAG
;
2200 if (hMachine
!= NULL
)
2202 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2203 if (BindingHandle
== NULL
)
2208 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2216 ret
= PNP_GetDeviceListSize(BindingHandle
,
2221 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2223 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2231 /***********************************************************************
2232 * CM_Get_Device_ID_Size [SETUPAPI.@]
2234 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2235 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2237 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2238 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2242 /***********************************************************************
2243 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2245 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2246 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2248 HSTRING_TABLE StringTable
= NULL
;
2251 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2254 return CR_INVALID_POINTER
;
2257 return CR_INVALID_DEVINST
;
2260 return CR_INVALID_FLAG
;
2262 if (hMachine
!= NULL
)
2264 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2265 if (StringTable
== NULL
)
2270 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2274 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2275 if (DeviceId
== NULL
)
2281 *pulLen
= lstrlenW(DeviceId
);
2287 /***********************************************************************
2288 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2290 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2291 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2292 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2294 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2295 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2297 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2298 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2303 /***********************************************************************
2304 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2306 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2307 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2308 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2310 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2311 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2313 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2314 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2319 /***********************************************************************
2320 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2322 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2323 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2324 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2326 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2327 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2329 return CR_CALL_NOT_IMPLEMENTED
;
2333 /***********************************************************************
2334 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2336 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2337 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2338 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2340 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2341 ULONG ulTransferLength
;
2342 CONFIGRET ret
= CR_SUCCESS
;
2344 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2345 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2347 if (pszDeviceInterface
== NULL
||
2348 AliasInterfaceGuid
== NULL
||
2349 pszAliasDeviceInterface
== NULL
||
2351 return CR_INVALID_POINTER
;
2354 return CR_INVALID_FLAG
;
2356 if (hMachine
!= NULL
)
2358 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2359 if (BindingHandle
== NULL
)
2364 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2368 ulTransferLength
= *pulLength
;
2372 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2373 (LPWSTR
)pszDeviceInterface
,
2375 pszAliasDeviceInterface
,
2380 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2382 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2390 /***********************************************************************
2391 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2393 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2394 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2395 ULONG BufferLen
, ULONG ulFlags
)
2397 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2398 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2400 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2401 Buffer
, BufferLen
, ulFlags
, NULL
);
2405 /***********************************************************************
2406 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2408 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2409 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2410 ULONG BufferLen
, ULONG ulFlags
)
2412 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2413 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2415 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2416 Buffer
, BufferLen
, ulFlags
, NULL
);
2420 /***********************************************************************
2421 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2423 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2424 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2425 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2427 DEVINSTID_W pDeviceIdW
= NULL
;
2428 PWCHAR BufferW
= NULL
;
2429 CONFIGRET ret
= CR_SUCCESS
;
2431 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2432 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2434 if (Buffer
== NULL
||
2436 return CR_INVALID_POINTER
;
2438 if (pDeviceID
!= NULL
)
2440 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2441 return CR_INVALID_DEVICE_ID
;
2444 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2445 if (BufferW
== NULL
)
2447 ret
= CR_OUT_OF_MEMORY
;
2451 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2452 BufferW
, BufferLen
, ulFlags
,
2454 if (ret
!= CR_SUCCESS
)
2457 if (WideCharToMultiByte(CP_ACP
,
2460 lstrlenW(BufferW
) + 1,
2468 if (BufferW
!= NULL
)
2471 if (pDeviceIdW
!= NULL
)
2478 /***********************************************************************
2479 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2481 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2482 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2483 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2485 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2486 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2487 CONFIGRET ret
= CR_SUCCESS
;
2489 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2490 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2492 if (Buffer
== NULL
||
2494 return CR_INVALID_POINTER
;
2496 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2497 return CR_INVALID_FLAG
;
2499 if (hMachine
!= NULL
)
2501 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2502 if (BindingHandle
== NULL
)
2507 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2512 BufferSize
= BufferLen
;
2516 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2523 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2525 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2533 /***********************************************************************
2534 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2536 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2537 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2540 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2541 pDeviceId
, ulFlags
);
2543 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2544 pDeviceId
, ulFlags
, NULL
);
2548 /***********************************************************************
2549 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2551 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2552 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2555 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2556 debugstr_w(pDeviceId
), ulFlags
);
2558 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2559 pDeviceId
, ulFlags
, NULL
);
2563 /***********************************************************************
2564 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2566 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2567 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2568 ULONG ulFlags
, HMACHINE hMachine
)
2570 DEVINSTID_W pDeviceIdW
= NULL
;
2571 CONFIGRET ret
= CR_SUCCESS
;
2573 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2574 pDeviceId
, ulFlags
, hMachine
);
2577 return CR_INVALID_POINTER
;
2579 if (pDeviceId
!= NULL
)
2581 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2582 return CR_INVALID_DEVICE_ID
;
2587 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2588 pDeviceIdW
, ulFlags
, hMachine
);
2590 if (pDeviceIdW
!= NULL
)
2597 /***********************************************************************
2598 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2600 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2601 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2602 ULONG ulFlags
, HMACHINE hMachine
)
2604 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2605 CONFIGRET ret
= CR_SUCCESS
;
2607 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2608 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2611 return CR_INVALID_POINTER
;
2613 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2614 return CR_INVALID_FLAG
;
2616 if (hMachine
!= NULL
)
2618 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2619 if (BindingHandle
== NULL
)
2624 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2632 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2638 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2640 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2648 /***********************************************************************
2649 * CM_Get_First_Log_Conf [SETUPAPI.@]
2651 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2652 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2654 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2655 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2659 /***********************************************************************
2660 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2662 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2663 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2665 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2666 HSTRING_TABLE StringTable
= NULL
;
2667 LPWSTR lpDevInst
= NULL
;
2668 CONFIGRET ret
= CR_SUCCESS
;
2670 PLOG_CONF_INFO pLogConfInfo
;
2672 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2675 return CR_INVALID_DEVINST
;
2677 if (ulFlags
& ~LOG_CONF_BITS
)
2678 return CR_INVALID_FLAG
;
2683 if (hMachine
!= NULL
)
2685 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2686 if (BindingHandle
== NULL
)
2689 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2690 if (StringTable
== 0)
2695 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2699 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2700 if (lpDevInst
== NULL
)
2701 return CR_INVALID_DEVNODE
;
2705 ret
= PNP_GetFirstLogConf(BindingHandle
,
2711 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2713 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2717 if (ret
!= CR_SUCCESS
)
2722 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2723 if (pLogConfInfo
== NULL
)
2724 return CR_OUT_OF_MEMORY
;
2726 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2727 pLogConfInfo
->dnDevInst
= dnDevInst
;
2728 pLogConfInfo
->ulFlags
= ulFlags
;
2729 pLogConfInfo
->ulTag
= ulTag
;
2731 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2738 /***********************************************************************
2739 * CM_Get_Global_State [SETUPAPI.@]
2741 CONFIGRET WINAPI
CM_Get_Global_State(
2742 PULONG pulState
, ULONG ulFlags
)
2744 TRACE("%p %lx\n", pulState
, ulFlags
);
2745 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2749 /***********************************************************************
2750 * CM_Get_Global_State_Ex [SETUPAPI.@]
2752 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2753 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2755 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2758 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2760 if (pulState
== NULL
)
2761 return CR_INVALID_POINTER
;
2764 return CR_INVALID_FLAG
;
2766 if (hMachine
!= NULL
)
2768 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2769 if (BindingHandle
== NULL
)
2774 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2780 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2782 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2784 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2792 /***********************************************************************
2793 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2795 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2796 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2799 TRACE("%s %lu %p %lx\n", szDevInstName
,
2800 ulHardwareProfile
, pulValue
, ulFlags
);
2802 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2803 pulValue
, ulFlags
, NULL
);
2807 /***********************************************************************
2808 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2810 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2811 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2814 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2815 ulHardwareProfile
, pulValue
, ulFlags
);
2817 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2818 pulValue
, ulFlags
, NULL
);
2822 /***********************************************************************
2823 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2825 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2826 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2827 ULONG ulFlags
, HMACHINE hMachine
)
2829 DEVINSTID_W pszDevIdW
= NULL
;
2830 CONFIGRET ret
= CR_SUCCESS
;
2832 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2833 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2835 if (szDevInstName
!= NULL
)
2837 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2838 return CR_INVALID_DEVICE_ID
;
2841 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2842 pulValue
, ulFlags
, hMachine
);
2844 if (pszDevIdW
!= NULL
)
2851 /***********************************************************************
2852 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2854 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2855 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2856 ULONG ulFlags
, HMACHINE hMachine
)
2858 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2861 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2862 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2864 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2865 return CR_INVALID_POINTER
;
2868 return CR_INVALID_FLAG
;
2870 /* FIXME: Check whether szDevInstName is valid */
2872 if (hMachine
!= NULL
)
2874 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2875 if (BindingHandle
== NULL
)
2880 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2886 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
2887 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
2889 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2891 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2899 /***********************************************************************
2900 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
2902 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
2903 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
2905 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2907 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
2912 /***********************************************************************
2913 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
2915 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
2916 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
2918 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2920 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
2925 /***********************************************************************
2926 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
2928 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
2929 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
2932 HWPROFILEINFO_W LocalProfileInfo
;
2935 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
2937 if (pHWProfileInfo
== NULL
)
2938 return CR_INVALID_POINTER
;
2940 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
2942 if (ret
== CR_SUCCESS
)
2944 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
2945 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
2947 if (WideCharToMultiByte(CP_ACP
,
2949 LocalProfileInfo
.HWPI_szFriendlyName
,
2950 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
2951 pHWProfileInfo
->HWPI_szFriendlyName
,
2962 /***********************************************************************
2963 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
2965 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
2966 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
2969 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2972 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
2974 if (pHWProfileInfo
== NULL
)
2975 return CR_INVALID_POINTER
;
2978 return CR_INVALID_FLAG
;
2980 if (hMachine
!= NULL
)
2982 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2983 if (BindingHandle
== NULL
)
2988 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2994 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
2995 sizeof(HWPROFILEINFO_W
), 0);
2997 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2999 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3007 /***********************************************************************
3008 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3010 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3011 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3013 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3014 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3018 /***********************************************************************
3019 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3021 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3022 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3025 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3026 HSTRING_TABLE StringTable
= NULL
;
3027 PLOG_CONF_INFO pLogConfInfo
;
3031 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3033 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3034 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3035 return CR_INVALID_LOG_CONF
;
3037 if (pPriority
== NULL
)
3038 return CR_INVALID_POINTER
;
3041 return CR_INVALID_FLAG
;
3043 if (hMachine
!= NULL
)
3045 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3046 if (BindingHandle
== NULL
)
3049 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3050 if (StringTable
== 0)
3055 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3059 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3060 if (lpDevInst
== NULL
)
3061 return CR_INVALID_DEVNODE
;
3065 ret
= PNP_GetLogConfPriority(BindingHandle
,
3067 pLogConfInfo
->ulFlags
,
3068 pLogConfInfo
->ulTag
,
3072 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3074 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3082 /***********************************************************************
3083 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3085 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3086 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3088 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3089 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3093 /***********************************************************************
3094 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3096 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3097 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3100 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3101 HSTRING_TABLE StringTable
= NULL
;
3102 PLOG_CONF_INFO pLogConfInfo
;
3103 PLOG_CONF_INFO pNewLogConfInfo
;
3108 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3113 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3114 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3115 return CR_INVALID_LOG_CONF
;
3118 return CR_INVALID_FLAG
;
3120 if (hMachine
!= NULL
)
3122 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3123 if (BindingHandle
== NULL
)
3126 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3127 if (StringTable
== 0)
3132 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3136 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3137 if (lpDevInst
== NULL
)
3138 return CR_INVALID_DEVNODE
;
3142 ret
= PNP_GetNextLogConf(BindingHandle
,
3144 pLogConfInfo
->ulFlags
,
3145 pLogConfInfo
->ulTag
,
3149 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3151 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3155 if (ret
!= CR_SUCCESS
)
3160 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3161 if (pNewLogConfInfo
== NULL
)
3162 return CR_OUT_OF_MEMORY
;
3164 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3165 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3166 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3167 pNewLogConfInfo
->ulTag
= ulNewTag
;
3169 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3176 /***********************************************************************
3177 * CM_Get_Next_Re_Des [SETUPAPI.@]
3179 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3180 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3181 PRESOURCEID pResourceID
, ULONG ulFlags
)
3183 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3184 pResourceID
, ulFlags
);
3185 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3186 pResourceID
, ulFlags
, NULL
);
3190 /***********************************************************************
3191 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3193 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3194 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3195 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3197 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3198 pResourceID
, ulFlags
, hMachine
);
3200 return CR_CALL_NOT_IMPLEMENTED
;
3204 /***********************************************************************
3205 * CM_Get_Parent [SETUPAPI.@]
3207 CONFIGRET WINAPI
CM_Get_Parent(
3208 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3210 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3211 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3215 /***********************************************************************
3216 * CM_Get_Parent_Ex [SETUPAPI.@]
3218 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3219 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3221 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3222 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3223 HSTRING_TABLE StringTable
= NULL
;
3225 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3228 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3230 if (pdnDevInst
== NULL
)
3231 return CR_INVALID_POINTER
;
3234 return CR_INVALID_DEVINST
;
3237 return CR_INVALID_FLAG
;
3241 if (hMachine
!= NULL
)
3243 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3244 if (BindingHandle
== NULL
)
3247 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3248 if (StringTable
== 0)
3253 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3257 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3258 if (lpDevInst
== NULL
)
3259 return CR_INVALID_DEVNODE
;
3263 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3264 PNP_GET_PARENT_DEVICE_INSTANCE
,
3270 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3272 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3276 if (ret
!= CR_SUCCESS
)
3279 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3281 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3285 *pdnDevInst
= dwIndex
;
3291 /***********************************************************************
3292 * CM_Get_Res_Des_Data [SETUPAPI.@]
3294 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3295 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3297 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3298 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3302 /***********************************************************************
3303 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3305 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3306 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3309 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3310 return CR_CALL_NOT_IMPLEMENTED
;
3314 /***********************************************************************
3315 * CM_Get_Res_Des_Size [SETUPAPI.@]
3317 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3318 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3320 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3321 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3325 /***********************************************************************
3326 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3328 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3329 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3331 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3332 return CR_CALL_NOT_IMPLEMENTED
;
3336 /***********************************************************************
3337 * CM_Get_Sibling [SETUPAPI.@]
3339 CONFIGRET WINAPI
CM_Get_Sibling(
3340 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3342 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3343 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3347 /***********************************************************************
3348 * CM_Get_Sibling_Ex [SETUPAPI.@]
3350 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3351 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3353 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3354 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3355 HSTRING_TABLE StringTable
= NULL
;
3357 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3360 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3362 if (pdnDevInst
== NULL
)
3363 return CR_INVALID_POINTER
;
3366 return CR_INVALID_DEVINST
;
3369 return CR_INVALID_FLAG
;
3373 if (hMachine
!= NULL
)
3375 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3376 if (BindingHandle
== NULL
)
3379 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3380 if (StringTable
== 0)
3385 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3389 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3390 if (lpDevInst
== NULL
)
3391 return CR_INVALID_DEVNODE
;
3395 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3396 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3402 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3404 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3408 if (ret
!= CR_SUCCESS
)
3411 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3413 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3417 *pdnDevInst
= dwIndex
;
3423 /***********************************************************************
3424 * CM_Get_Version [SETUPAPI.@]
3426 WORD WINAPI
CM_Get_Version(VOID
)
3429 return CM_Get_Version_Ex(NULL
);
3433 /***********************************************************************
3434 * CM_Get_Version_Ex [SETUPAPI.@]
3436 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3438 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3442 TRACE("%lx\n", hMachine
);
3444 if (hMachine
!= NULL
)
3446 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3447 if (BindingHandle
== NULL
)
3452 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3458 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3460 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3462 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3466 if (ret
!= CR_SUCCESS
)
3473 /***********************************************************************
3474 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3476 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3479 TRACE("%p\n", pbPresent
);
3480 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3484 /***********************************************************************
3485 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3487 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3488 PBOOL pbPresent
, HMACHINE hMachine
)
3490 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3493 TRACE("%p %lx\n", pbPresent
, hMachine
);
3495 if (pbPresent
== NULL
)
3496 return CR_INVALID_POINTER
;
3500 if (hMachine
!= NULL
)
3502 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3503 if (BindingHandle
== NULL
)
3508 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3514 ret
= PNP_IsDockStationPresent(BindingHandle
,
3517 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3519 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3527 /***********************************************************************
3528 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3530 BOOL WINAPI
CM_Is_Version_Available(
3533 TRACE("%hu\n", wVersion
);
3534 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3538 /***********************************************************************
3539 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3541 BOOL WINAPI
CM_Is_Version_Available_Ex(
3542 WORD wVersion
, HMACHINE hMachine
)
3544 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3545 WORD wServerVersion
;
3548 TRACE("%hu %lx\n", wVersion
, hMachine
);
3550 if (wVersion
<= 0x400)
3553 if (hMachine
!= NULL
)
3555 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3556 if (BindingHandle
== NULL
)
3561 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3567 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3569 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3571 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3575 if (ret
!= CR_SUCCESS
)
3578 return (wServerVersion
>= wVersion
);
3582 /***********************************************************************
3583 * CM_Locate_DevNodeA [SETUPAPI.@]
3585 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3586 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3588 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3589 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3593 /***********************************************************************
3594 * CM_Locate_DevNodeW [SETUPAPI.@]
3596 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3597 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3599 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3600 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3604 /***********************************************************************
3605 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3607 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3608 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3610 DEVINSTID_W pDevIdW
= NULL
;
3611 CONFIGRET ret
= CR_SUCCESS
;
3613 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3615 if (pDeviceID
!= NULL
)
3617 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3618 return CR_INVALID_DEVICE_ID
;
3621 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3623 if (pDevIdW
!= NULL
)
3630 /***********************************************************************
3631 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3633 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3634 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3636 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3637 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3638 HSTRING_TABLE StringTable
= NULL
;
3639 CONFIGRET ret
= CR_SUCCESS
;
3641 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3643 if (pdnDevInst
== NULL
)
3644 return CR_INVALID_POINTER
;
3646 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3647 return CR_INVALID_FLAG
;
3649 if (hMachine
!= NULL
)
3651 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3652 if (BindingHandle
== NULL
)
3655 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3656 if (StringTable
== 0)
3661 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3665 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3667 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3673 /* Get the root device ID */
3674 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3680 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3684 if (ret
!= CR_SUCCESS
)
3687 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3691 /* Validate the device ID */
3692 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3696 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3698 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3702 if (ret
== CR_SUCCESS
)
3704 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3705 if (*pdnDevInst
== -1)
3713 /***********************************************************************
3714 * CM_Modify_Res_Des [SETUPAPI.@]
3716 CONFIGRET WINAPI
CM_Modify_Res_Des(
3717 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
3718 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
3720 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3721 ResourceLen
, ulFlags
);
3722 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3723 ResourceLen
, ulFlags
, NULL
);
3727 /***********************************************************************
3728 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
3730 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
3731 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
3732 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
3734 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3735 ResourceLen
, ulFlags
, hMachine
);
3736 return CR_CALL_NOT_IMPLEMENTED
;
3740 /***********************************************************************
3741 * CM_Move_DevNode [SETUPAPI.@]
3743 CONFIGRET WINAPI
CM_Move_DevNode(
3744 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3746 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3747 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3751 /***********************************************************************
3752 * CM_Move_DevNode_Ex [SETUPAPI.@]
3754 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3755 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3758 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3759 HSTRING_TABLE StringTable
= NULL
;
3760 LPWSTR lpFromDevInst
;
3764 FIXME("%lx %lx %lx %lx\n",
3765 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3767 if (!pSetupIsUserAdmin())
3768 return CR_ACCESS_DENIED
;
3770 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3771 return CR_INVALID_DEVNODE
;
3774 return CR_INVALID_FLAG
;
3776 if (hMachine
!= NULL
)
3778 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3779 if (BindingHandle
== NULL
)
3782 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3783 if (StringTable
== 0)
3788 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3792 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
3793 if (lpFromDevInst
== NULL
)
3794 return CR_INVALID_DEVNODE
;
3796 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
3797 if (lpToDevInst
== NULL
)
3798 return CR_INVALID_DEVNODE
;
3802 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3808 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3810 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3818 /***********************************************************************
3819 * CM_Open_Class_KeyA [SETUPAPI.@]
3821 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3822 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3823 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3825 TRACE("%p %s %lx %lx %p %lx\n",
3826 debugstr_guid(pClassGuid
), pszClassName
,
3827 samDesired
, Disposition
, phkClass
, ulFlags
);
3829 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3830 Disposition
, phkClass
, ulFlags
, NULL
);
3834 /***********************************************************************
3835 * CM_Open_Class_KeyW [SETUPAPI.@]
3837 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3838 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3839 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3841 TRACE("%p %s %lx %lx %p %lx\n",
3842 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3843 samDesired
, Disposition
, phkClass
, ulFlags
);
3845 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3846 Disposition
, phkClass
, ulFlags
, NULL
);
3850 /***********************************************************************
3851 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3853 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3854 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3855 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3858 CONFIGRET rc
= CR_SUCCESS
;
3859 LPWSTR pszClassNameW
= NULL
;
3861 TRACE("%p %s %lx %lx %p %lx %lx\n",
3862 debugstr_guid(pClassGuid
), pszClassName
,
3863 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3865 if (pszClassName
!= NULL
)
3867 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3868 return CR_INVALID_DATA
;
3871 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3872 Disposition
, phkClass
, ulFlags
, hMachine
);
3874 if (pszClassNameW
!= NULL
)
3875 MyFree(pszClassNameW
);
3881 /***********************************************************************
3882 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3884 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3885 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3886 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3889 WCHAR szKeyName
[MAX_PATH
];
3890 LPWSTR lpGuidString
;
3891 DWORD dwDisposition
;
3895 TRACE("%p %s %lx %lx %p %lx %lx\n",
3896 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3897 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3899 /* Check Disposition and ulFlags */
3900 if ((Disposition
& ~RegDisposition_Bits
) ||
3901 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3902 return CR_INVALID_FLAG
;
3904 /* Check phkClass */
3905 if (phkClass
== NULL
)
3906 return CR_INVALID_POINTER
;
3910 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3911 pszClassName
!= NULL
)
3912 return CR_INVALID_DATA
;
3914 if (hMachine
== NULL
)
3916 hKey
= HKEY_LOCAL_MACHINE
;
3920 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3921 HKEY_LOCAL_MACHINE
, &hKey
))
3922 return CR_REGISTRY_ERROR
;
3925 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3927 lstrcpyW(szKeyName
, DeviceClasses
);
3931 lstrcpyW(szKeyName
, ControlClass
);
3934 if (pClassGuid
!= NULL
)
3936 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
3939 return CR_INVALID_DATA
;
3942 lstrcatW(szKeyName
, Backslash
);
3943 lstrcatW(szKeyName
, lpGuidString
);
3946 if (Disposition
== RegDisposition_OpenAlways
)
3948 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
3949 NULL
, phkClass
, &dwDisposition
);
3953 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
3958 if (pClassGuid
!= NULL
)
3959 RpcStringFreeW(&lpGuidString
);
3961 if (dwError
!= ERROR_SUCCESS
)
3964 return CR_NO_SUCH_REGISTRY_KEY
;
3967 if (pszClassName
!= NULL
)
3969 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
3970 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
3977 /***********************************************************************
3978 * CM_Open_DevNode_Key [SETUPAPI.@]
3980 CONFIGRET WINAPI
CM_Open_DevNode_Key(
3981 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3982 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
3984 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
3985 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
3986 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
3987 Disposition
, phkDevice
, ulFlags
, NULL
);
3991 /***********************************************************************
3992 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
3994 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
3995 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3996 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
3999 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4000 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4002 return CR_CALL_NOT_IMPLEMENTED
;
4006 /***********************************************************************
4007 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4009 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4010 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4011 ULONG ulNameLength
, ULONG ulFlags
)
4013 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4014 ulNameLength
, ulFlags
);
4016 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4017 ulNameLength
, ulFlags
, NULL
);
4021 /***********************************************************************
4022 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4024 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4025 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4026 ULONG ulNameLength
, ULONG ulFlags
)
4028 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4029 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4031 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4032 ulNameLength
, ulFlags
, NULL
);
4036 /***********************************************************************
4037 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4039 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4040 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4041 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4043 LPWSTR lpLocalVetoName
;
4046 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4047 ulNameLength
, ulFlags
, hMachine
);
4049 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4050 return CR_INVALID_POINTER
;
4052 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4053 if (lpLocalVetoName
== NULL
)
4054 return CR_OUT_OF_MEMORY
;
4056 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4057 ulNameLength
, ulFlags
, hMachine
);
4058 if (ret
== CR_REMOVE_VETOED
)
4060 if (WideCharToMultiByte(CP_ACP
,
4071 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4077 /***********************************************************************
4078 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4080 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4081 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4082 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4084 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4085 HSTRING_TABLE StringTable
= NULL
;
4089 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4090 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4092 if (dnAncestor
== 0)
4093 return CR_INVALID_DEVNODE
;
4095 if (ulFlags
& ~CM_REMOVE_BITS
)
4096 return CR_INVALID_FLAG
;
4098 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4099 return CR_INVALID_POINTER
;
4101 if (hMachine
!= NULL
)
4103 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4104 if (BindingHandle
== NULL
)
4107 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4108 if (StringTable
== 0)
4113 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4117 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4118 if (lpDevInst
== NULL
)
4119 return CR_INVALID_DEVNODE
;
4123 ret
= PNP_QueryRemove(BindingHandle
,
4130 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4132 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4140 /***********************************************************************
4141 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4143 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4144 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4147 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4148 ResourceID
, ulFlags
);
4150 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4151 ResourceID
, ulFlags
, NULL
);
4155 /***********************************************************************
4156 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4158 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4161 IN DEVINST dnDevInst
,
4162 IN RESOURCEID ResourceID
,
4164 IN HMACHINE hMachine
)
4166 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4167 HSTRING_TABLE StringTable
= NULL
;
4171 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4172 ResourceID
, ulFlags
, hMachine
);
4174 if (pData
== NULL
|| DataLen
== 0)
4175 return CR_INVALID_POINTER
;
4178 return CR_INVALID_DEVINST
;
4180 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4181 return CR_INVALID_FLAG
;
4183 if (hMachine
!= NULL
)
4185 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4186 if (BindingHandle
== NULL
)
4189 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4190 if (StringTable
== 0)
4195 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4199 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4200 if (lpDevInst
== NULL
)
4201 return CR_INVALID_DEVNODE
;
4205 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4212 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4214 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4222 /***********************************************************************
4223 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4225 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4226 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4228 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4230 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4235 /***********************************************************************
4236 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4238 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4239 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4240 ULONG ulFlags
, HMACHINE hMachine
)
4242 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4243 HSTRING_TABLE StringTable
= NULL
;
4247 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4250 if (pulSize
== NULL
)
4251 return CR_INVALID_POINTER
;
4254 return CR_INVALID_DEVINST
;
4256 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4257 return CR_INVALID_FLAG
;
4259 if (hMachine
!= NULL
)
4261 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4262 if (BindingHandle
== NULL
)
4265 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4266 if (StringTable
== 0)
4271 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4275 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4276 if (lpDevInst
== NULL
)
4277 return CR_INVALID_DEVNODE
;
4281 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4287 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4289 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4297 /***********************************************************************
4298 * CM_Query_Remove_SubTree [SETUPAPI.@]
4300 * This function is obsolete in Windows XP and above.
4302 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4303 DEVINST dnAncestor
, ULONG ulFlags
)
4305 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4306 return CR_CALL_NOT_IMPLEMENTED
;
4310 /***********************************************************************
4311 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4313 * This function is obsolete in Windows XP and above.
4315 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4316 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4318 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4319 return CR_CALL_NOT_IMPLEMENTED
;
4323 /***********************************************************************
4324 * CM_Reenumerate_DevNode [SETUPAPI.@]
4326 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4327 DEVINST dnDevInst
, ULONG ulFlags
)
4329 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4330 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4334 /***********************************************************************
4335 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4338 CM_Reenumerate_DevNode_Ex(
4339 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4341 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4342 HSTRING_TABLE StringTable
= NULL
;
4346 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4349 return CR_INVALID_DEVNODE
;
4351 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4352 return CR_INVALID_FLAG
;
4354 if (hMachine
!= NULL
)
4356 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4357 if (BindingHandle
== NULL
)
4360 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4361 if (StringTable
== 0)
4366 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4370 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4371 if (lpDevInst
== NULL
)
4372 return CR_INVALID_DEVNODE
;
4376 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4377 PNP_DEVINST_REENUMERATE
,
4382 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4384 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4392 /***********************************************************************
4393 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4395 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4396 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4397 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4399 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4400 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4402 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4403 pszReference
, pszDeviceInterface
,
4404 pulLength
, ulFlags
, NULL
);
4408 /***********************************************************************
4409 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4411 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4412 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4413 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4415 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4416 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4418 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4419 pszReference
, pszDeviceInterface
,
4420 pulLength
, ulFlags
, NULL
);
4424 /***********************************************************************
4425 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4427 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4428 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4429 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4431 LPWSTR pszReferenceW
= NULL
;
4432 LPWSTR pszDeviceInterfaceW
= NULL
;
4436 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4437 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4439 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4440 return CR_INVALID_POINTER
;
4442 if (pszReference
!= NULL
)
4444 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4445 return CR_INVALID_DATA
;
4448 ulLength
= *pulLength
;
4450 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4451 if (pszDeviceInterfaceW
== NULL
)
4453 ret
= CR_OUT_OF_MEMORY
;
4457 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4460 pszDeviceInterfaceW
,
4464 if (ret
== CR_SUCCESS
)
4466 if (WideCharToMultiByte(CP_ACP
,
4468 pszDeviceInterfaceW
,
4477 *pulLength
= ulLength
;
4480 if (pszDeviceInterfaceW
!= NULL
)
4481 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4483 if (pszReferenceW
!= NULL
)
4484 MyFree(pszReferenceW
);
4490 /***********************************************************************
4491 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4493 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4494 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4495 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4497 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4498 HSTRING_TABLE StringTable
= NULL
;
4500 ULONG ulTransferLength
;
4503 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4504 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4507 return CR_INVALID_DEVNODE
;
4509 if (InterfaceClassGuid
== NULL
||
4510 pszDeviceInterface
== NULL
||
4512 return CR_INVALID_POINTER
;
4515 return CR_INVALID_FLAG
;
4517 if (hMachine
!= NULL
)
4519 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4520 if (BindingHandle
== NULL
)
4523 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4524 if (StringTable
== 0)
4529 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4533 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4534 if (lpDevInst
== NULL
)
4535 return CR_INVALID_DEVNODE
;
4537 ulTransferLength
= *pulLength
;
4541 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4544 (LPWSTR
)pszReference
,
4550 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4552 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4560 /***********************************************************************
4561 * CM_Register_Device_Driver [SETUPAPI.@]
4563 CONFIGRET WINAPI
CM_Register_Device_Driver(
4564 DEVINST dnDevInst
, ULONG ulFlags
)
4566 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4567 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4571 /***********************************************************************
4572 * CM_Register_Device_Driver [SETUPAPI.@]
4574 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4575 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4577 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4578 HSTRING_TABLE StringTable
= NULL
;
4582 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4585 return CR_INVALID_DEVNODE
;
4587 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4588 return CR_INVALID_FLAG
;
4590 if (hMachine
!= NULL
)
4592 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4593 if (BindingHandle
== NULL
)
4596 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4597 if (StringTable
== 0)
4602 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4606 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4607 if (lpDevInst
== NULL
)
4608 return CR_INVALID_DEVNODE
;
4612 ret
= PNP_RegisterDriver(BindingHandle
,
4616 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4618 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4626 /***********************************************************************
4627 * CM_Remove_SubTree [SETUPAPI.@]
4629 * This function is obsolete in Windows XP and above.
4631 CONFIGRET WINAPI
CM_Remove_SubTree(
4632 DEVINST dnAncestor
, ULONG ulFlags
)
4634 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4635 return CR_CALL_NOT_IMPLEMENTED
;
4639 /***********************************************************************
4640 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4642 * This function is obsolete in Windows XP and above.
4644 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4645 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4647 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4648 return CR_CALL_NOT_IMPLEMENTED
;
4652 /***********************************************************************
4653 * CM_Request_Device_EjectA [SETUPAPI.@]
4655 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4656 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4657 ULONG ulNameLength
, ULONG ulFlags
)
4659 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4660 ulNameLength
, ulFlags
);
4661 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4662 ulNameLength
, ulFlags
, NULL
);
4666 /***********************************************************************
4667 * CM_Request_Device_EjectW [SETUPAPI.@]
4669 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4670 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4671 ULONG ulNameLength
, ULONG ulFlags
)
4673 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4674 ulNameLength
, ulFlags
);
4675 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4676 ulNameLength
, ulFlags
, NULL
);
4680 /***********************************************************************
4681 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4683 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4684 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4685 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4687 LPWSTR lpLocalVetoName
;
4690 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4691 ulNameLength
, ulFlags
, hMachine
);
4693 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4694 return CR_INVALID_POINTER
;
4696 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4697 if (lpLocalVetoName
== NULL
)
4698 return CR_OUT_OF_MEMORY
;
4700 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
4701 ulNameLength
, ulFlags
, hMachine
);
4702 if (ret
== CR_REMOVE_VETOED
)
4704 if (WideCharToMultiByte(CP_ACP
,
4715 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4721 /***********************************************************************
4722 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
4724 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
4725 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4726 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4728 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4729 HSTRING_TABLE StringTable
= NULL
;
4733 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
4734 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4737 return CR_INVALID_DEVNODE
;
4740 return CR_INVALID_FLAG
;
4742 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4743 return CR_INVALID_POINTER
;
4745 if (hMachine
!= NULL
)
4747 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4748 if (BindingHandle
== NULL
)
4751 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4752 if (StringTable
== 0)
4757 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4761 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4762 if (lpDevInst
== NULL
)
4763 return CR_INVALID_DEVNODE
;
4767 ret
= PNP_RequestDeviceEject(BindingHandle
,
4774 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4776 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4784 /***********************************************************************
4785 * CM_Request_Eject_PC [SETUPAPI.@]
4787 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
4790 return CM_Request_Eject_PC_Ex(NULL
);
4794 /***********************************************************************
4795 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
4797 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
4800 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4803 TRACE("%lx\n", hMachine
);
4805 if (hMachine
!= NULL
)
4807 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4808 if (BindingHandle
== NULL
)
4813 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4819 ret
= PNP_RequestEjectPC(BindingHandle
);
4821 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4823 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4831 /***********************************************************************
4832 * CM_Run_Detection [SETUPAPI.@]
4834 CONFIGRET WINAPI
CM_Run_Detection(
4837 TRACE("%lx\n", ulFlags
);
4838 return CM_Run_Detection_Ex(ulFlags
, NULL
);
4842 /***********************************************************************
4843 * CM_Run_Detection_Ex [SETUPAPI.@]
4845 CONFIGRET WINAPI
CM_Run_Detection_Ex(
4846 ULONG ulFlags
, HMACHINE hMachine
)
4848 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4851 TRACE("%lx %lx\n", ulFlags
, hMachine
);
4853 if (!pSetupIsUserAdmin())
4854 return CR_ACCESS_DENIED
;
4856 if (ulFlags
& ~CM_DETECT_BITS
)
4857 return CR_INVALID_FLAG
;
4859 if (hMachine
!= NULL
)
4861 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4862 if (BindingHandle
== NULL
)
4867 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4873 ret
= PNP_RunDetection(BindingHandle
,
4876 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4878 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4886 /***********************************************************************
4887 * CM_Set_DevNode_Problem [SETUPAPI.@]
4889 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
4890 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
4892 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
4893 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
4897 /***********************************************************************
4898 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
4900 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
4901 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
4903 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4904 HSTRING_TABLE StringTable
= NULL
;
4908 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
4911 return CR_INVALID_DEVNODE
;
4913 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
4914 return CR_INVALID_FLAG
;
4916 if (hMachine
!= NULL
)
4918 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4919 if (BindingHandle
== NULL
)
4922 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4923 if (StringTable
== 0)
4928 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4932 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4933 if (lpDevInst
== NULL
)
4934 return CR_INVALID_DEVNODE
;
4938 ret
= PNP_SetDeviceProblem(BindingHandle
,
4943 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4945 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4953 /***********************************************************************
4954 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
4956 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
4957 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4960 TRACE("%lx %lu %p %lx %lx\n",
4961 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
4962 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
4968 /***********************************************************************
4969 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
4971 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
4972 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4975 TRACE("%lx %lu %p %lx %lx\n",
4976 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
4977 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
4983 /***********************************************************************
4984 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
4986 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
4987 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4988 ULONG ulFlags
, HMACHINE hMachine
)
4990 CONFIGRET ret
= CR_SUCCESS
;
4994 FIXME("%lx %lu %p %lx %lx %lx\n",
4995 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
4997 if (Buffer
== NULL
&& ulLength
!= 0)
4998 return CR_INVALID_POINTER
;
5002 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5011 /* Get property type */
5014 case CM_DRP_DEVICEDESC
:
5018 case CM_DRP_HARDWAREID
:
5019 ulType
= REG_MULTI_SZ
;
5022 case CM_DRP_COMPATIBLEIDS
:
5023 ulType
= REG_MULTI_SZ
;
5026 case CM_DRP_SERVICE
:
5034 case CM_DRP_CLASSGUID
:
5042 case CM_DRP_CONFIGFLAGS
:
5050 case CM_DRP_FRIENDLYNAME
:
5054 case CM_DRP_LOCATION_INFORMATION
:
5058 case CM_DRP_UPPERFILTERS
:
5059 ulType
= REG_MULTI_SZ
;
5062 case CM_DRP_LOWERFILTERS
:
5063 ulType
= REG_MULTI_SZ
;
5067 return CR_INVALID_PROPERTY
;
5070 /* Allocate buffer if needed */
5071 if (ulType
== REG_SZ
||
5072 ulType
== REG_MULTI_SZ
)
5074 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5075 if (lpBuffer
== NULL
)
5077 ret
= CR_OUT_OF_MEMORY
;
5081 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5082 ulLength
, lpBuffer
, ulLength
))
5089 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5092 ulLength
* sizeof(WCHAR
),
5101 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5109 ret
= CR_CALL_NOT_IMPLEMENTED
;
5116 /***********************************************************************
5117 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5119 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5120 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5121 ULONG ulFlags
, HMACHINE hMachine
)
5123 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5124 HSTRING_TABLE StringTable
= NULL
;
5129 TRACE("%lx %lu %p %lx %lx %lx\n",
5130 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5133 return CR_INVALID_DEVNODE
;
5135 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5136 return CR_INVALID_PROPERTY
;
5138 if (Buffer
!= NULL
&& ulLength
== 0)
5139 return CR_INVALID_POINTER
;
5142 return CR_INVALID_FLAG
;
5144 if (hMachine
!= NULL
)
5146 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5147 if (BindingHandle
== NULL
)
5150 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5151 if (StringTable
== 0)
5156 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5160 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5161 if (lpDevInst
== NULL
)
5162 return CR_INVALID_DEVNODE
;
5166 case CM_DRP_DEVICEDESC
:
5170 case CM_DRP_HARDWAREID
:
5171 ulType
= REG_MULTI_SZ
;
5174 case CM_DRP_COMPATIBLEIDS
:
5175 ulType
= REG_MULTI_SZ
;
5178 case CM_DRP_SERVICE
:
5186 case CM_DRP_CLASSGUID
:
5194 case CM_DRP_CONFIGFLAGS
:
5202 case CM_DRP_FRIENDLYNAME
:
5206 case CM_DRP_LOCATION_INFORMATION
:
5210 case CM_DRP_UPPERFILTERS
:
5211 ulType
= REG_MULTI_SZ
;
5214 case CM_DRP_LOWERFILTERS
:
5215 ulType
= REG_MULTI_SZ
;
5219 return CR_INVALID_PROPERTY
;
5224 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5232 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5234 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5242 /***********************************************************************
5243 * CM_Set_HW_Prof [SETUPAPI.@]
5245 CONFIGRET WINAPI
CM_Set_HW_Prof(
5246 ULONG ulHardwareProfile
, ULONG ulFlags
)
5248 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5249 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5253 /***********************************************************************
5254 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5256 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5257 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5259 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5262 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5264 if (!pSetupIsUserAdmin())
5265 return CR_ACCESS_DENIED
;
5268 return CR_INVALID_FLAG
;
5270 if (hMachine
!= NULL
)
5272 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5273 if (BindingHandle
== NULL
)
5278 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5284 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5286 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5288 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5296 /***********************************************************************
5297 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5299 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5300 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5303 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5304 ulConfig
, ulValue
, ulFlags
);
5305 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5310 /***********************************************************************
5311 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5313 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5314 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5317 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5318 ulConfig
, ulValue
, ulFlags
);
5319 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5324 /***********************************************************************
5325 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5327 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5328 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5329 ULONG ulFlags
, HMACHINE hMachine
)
5331 DEVINSTID_W pszDevIdW
= NULL
;
5332 CONFIGRET ret
= CR_SUCCESS
;
5334 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5335 ulConfig
, ulValue
, ulFlags
, hMachine
);
5337 if (szDevInstName
!= NULL
)
5339 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5340 return CR_INVALID_DEVICE_ID
;
5343 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5346 if (pszDevIdW
!= NULL
)
5353 /***********************************************************************
5354 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5356 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5357 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5358 ULONG ulFlags
, HMACHINE hMachine
)
5360 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5363 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5364 ulConfig
, ulValue
, ulFlags
, hMachine
);
5366 if (szDevInstName
== NULL
)
5367 return CR_INVALID_POINTER
;
5369 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5370 return CR_INVALID_FLAG
;
5372 /* FIXME: Check whether szDevInstName is valid */
5374 if (hMachine
!= NULL
)
5376 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5377 if (BindingHandle
== NULL
)
5382 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5388 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5389 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5391 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5393 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5401 /***********************************************************************
5402 * CM_Setup_DevNode [SETUPAPI.@]
5404 CONFIGRET WINAPI
CM_Setup_DevNode(
5405 DEVINST dnDevInst
, ULONG ulFlags
)
5407 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5408 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5412 /***********************************************************************
5413 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5415 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5416 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5418 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5419 HSTRING_TABLE StringTable
= NULL
;
5423 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5425 if (!pSetupIsUserAdmin())
5426 return CR_ACCESS_DENIED
;
5429 return CR_INVALID_DEVNODE
;
5431 if (ulFlags
& ~CM_SETUP_BITS
)
5432 return CR_INVALID_FLAG
;
5434 if (hMachine
!= NULL
)
5436 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5437 if (BindingHandle
== NULL
)
5440 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5441 if (StringTable
== 0)
5446 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5450 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5451 if (lpDevInst
== NULL
)
5452 return CR_INVALID_DEVNODE
;
5456 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5462 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5464 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5472 /***********************************************************************
5473 * CM_Uninstall_DevNode [SETUPAPI.@]
5475 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5476 DEVINST dnPhantom
, ULONG ulFlags
)
5478 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5479 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5483 /***********************************************************************
5484 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5486 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5487 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5489 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5490 HSTRING_TABLE StringTable
= NULL
;
5494 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5497 return CR_INVALID_DEVNODE
;
5500 return CR_INVALID_FLAG
;
5502 if (hMachine
!= NULL
)
5504 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5505 if (BindingHandle
== NULL
)
5508 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5509 if (StringTable
== 0)
5514 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5518 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5519 if (lpDevInst
== NULL
)
5520 return CR_INVALID_DEVNODE
;
5524 ret
= PNP_UninstallDevInst(BindingHandle
,
5528 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5530 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5538 /***********************************************************************
5539 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5541 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5542 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5544 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5546 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5551 /***********************************************************************
5552 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5554 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5555 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5557 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5559 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5564 /***********************************************************************
5565 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5567 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5568 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5570 LPWSTR pszDeviceInterfaceW
= NULL
;
5573 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5575 if (pszDeviceInterface
== NULL
)
5576 return CR_INVALID_POINTER
;
5578 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5579 return CR_INVALID_DATA
;
5581 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5584 if (pszDeviceInterfaceW
!= NULL
)
5585 MyFree(pszDeviceInterfaceW
);
5591 /***********************************************************************
5592 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5594 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5595 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5597 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5600 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5602 if (pszDeviceInterface
== NULL
)
5603 return CR_INVALID_POINTER
;
5606 return CR_INVALID_FLAG
;
5608 if (hMachine
!= NULL
)
5610 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5611 if (BindingHandle
== NULL
)
5616 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5622 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
5623 (LPWSTR
)pszDeviceInterface
,
5626 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5628 ret
= RpcStatusToCmStatus(RpcExceptionCode());