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
;
598 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
600 TRACE("%p %s %p %lx %p\n",
601 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
603 if (!pSetupIsUserAdmin())
604 return CR_ACCESS_DENIED
;
606 if (pdnDevInst
== NULL
)
607 return CR_INVALID_POINTER
;
609 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
610 return CR_INVALID_DEVICE_ID
;
613 return CR_INVALID_DEVNODE
;
615 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
616 return CR_INVALID_FLAG
;
618 if (hMachine
!= NULL
)
620 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
621 if (BindingHandle
== NULL
)
624 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
625 if (StringTable
== 0)
630 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
634 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
635 if (lpParentDevInst
== NULL
)
636 return CR_INVALID_DEVNODE
;
638 wcscpy(szLocalDeviceID
, pDeviceID
);
642 ret
= PNP_CreateDevInst(BindingHandle
,
648 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
650 ret
= RpcStatusToCmStatus(RpcExceptionCode());
654 if (ret
== CR_SUCCESS
)
656 *pdnDevInst
= pSetupStringTableAddString(StringTable
, pDeviceID
, 1);
657 if (*pdnDevInst
== 0)
658 ret
= CR_NO_SUCH_DEVNODE
;
665 /***********************************************************************
666 * CM_Delete_Class_Key [SETUPAPI.@]
668 CONFIGRET WINAPI
CM_Delete_Class_Key(
669 LPGUID ClassGuid
, ULONG ulFlags
)
671 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
672 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
676 /***********************************************************************
677 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
679 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
680 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
682 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
683 RPC_BINDING_HANDLE BindingHandle
= NULL
;
686 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
688 if (ClassGuid
== NULL
)
689 return CR_INVALID_POINTER
;
691 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
692 return CR_INVALID_FLAG
;
694 if (!GuidToString(ClassGuid
, szGuidString
))
695 return CR_INVALID_DATA
;
697 if (hMachine
!= NULL
)
699 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
700 if (BindingHandle
== NULL
)
705 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
711 ret
= PNP_DeleteClassKey(BindingHandle
,
715 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
717 ret
= RpcStatusToCmStatus(RpcExceptionCode());
725 /***********************************************************************
726 * CM_Delete_DevNode_Key [SETUPAPI.@]
728 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
729 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
731 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
732 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
737 /***********************************************************************
738 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
740 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
741 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
744 FIXME("%p %lu %lx %p\n",
745 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
747 return CR_CALL_NOT_IMPLEMENTED
;
751 /***********************************************************************
752 * CM_Disable_DevNode [SETUPAPI.@]
754 CONFIGRET WINAPI
CM_Disable_DevNode(
755 DEVINST dnDevInst
, ULONG ulFlags
)
757 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
758 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
762 /***********************************************************************
763 * CM_Disable_DevNode_Ex [SETUPAPI.@]
765 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
766 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
768 RPC_BINDING_HANDLE BindingHandle
= NULL
;
769 HSTRING_TABLE StringTable
= NULL
;
773 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
775 if (!pSetupIsUserAdmin())
776 return CR_ACCESS_DENIED
;
779 return CR_INVALID_DEVINST
;
782 return CR_INVALID_FLAG
;
784 if (hMachine
!= NULL
)
786 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
787 if (BindingHandle
== NULL
)
790 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
791 if (StringTable
== 0)
796 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
800 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
801 if (lpDevInst
== NULL
)
802 return CR_INVALID_DEVNODE
;
806 ret
= PNP_DeviceInstanceAction(BindingHandle
,
812 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
814 ret
= RpcStatusToCmStatus(RpcExceptionCode());
822 /***********************************************************************
823 * CM_Disconnect_Machine [SETUPAPI.@]
825 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
827 PMACHINE_INFO pMachine
;
829 TRACE("%lx\n", hMachine
);
831 pMachine
= (PMACHINE_INFO
)hMachine
;
832 if (pMachine
== NULL
)
835 if (pMachine
->bLocal
== FALSE
)
837 if (pMachine
->StringTable
!= NULL
)
838 pSetupStringTableDestroy(pMachine
->StringTable
);
840 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
841 return CR_ACCESS_DENIED
;
844 HeapFree(GetProcessHeap(), 0, pMachine
);
850 /***********************************************************************
851 * CM_Enable_DevNode [SETUPAPI.@]
853 CONFIGRET WINAPI
CM_Enable_DevNode(
854 DEVINST dnDevInst
, ULONG ulFlags
)
856 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
857 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
861 /***********************************************************************
862 * CM_Enable_DevNode_Ex [SETUPAPI.@]
864 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
865 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
867 RPC_BINDING_HANDLE BindingHandle
= NULL
;
868 HSTRING_TABLE StringTable
= NULL
;
872 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
874 if (!pSetupIsUserAdmin())
875 return CR_ACCESS_DENIED
;
878 return CR_INVALID_DEVINST
;
881 return CR_INVALID_FLAG
;
883 if (hMachine
!= NULL
)
885 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
886 if (BindingHandle
== NULL
)
889 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
890 if (StringTable
== 0)
895 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
899 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
900 if (lpDevInst
== NULL
)
901 return CR_INVALID_DEVNODE
;
905 ret
= PNP_DeviceInstanceAction(BindingHandle
,
911 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
913 ret
= RpcStatusToCmStatus(RpcExceptionCode());
921 /***********************************************************************
922 * CM_Enumerate_Classes [SETUPAPI.@]
924 CONFIGRET WINAPI
CM_Enumerate_Classes(
925 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
927 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
928 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
932 /***********************************************************************
933 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
935 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
936 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
938 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
939 RPC_BINDING_HANDLE BindingHandle
= NULL
;
940 CONFIGRET ret
= CR_SUCCESS
;
941 ULONG ulLength
= MAX_GUID_STRING_LEN
;
943 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
945 if (ClassGuid
== NULL
)
946 return CR_INVALID_POINTER
;
949 return CR_INVALID_FLAG
;
951 if (hMachine
!= NULL
)
953 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
954 if (BindingHandle
== NULL
)
959 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
965 ret
= PNP_EnumerateSubKeys(BindingHandle
,
973 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
975 ret
= RpcStatusToCmStatus(RpcExceptionCode());
979 if (ret
== CR_SUCCESS
)
982 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
984 /* Convert the buffer to a GUID */
985 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
993 /***********************************************************************
994 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
996 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
997 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
999 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1000 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1005 /***********************************************************************
1006 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1008 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1009 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1011 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1012 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1017 /***********************************************************************
1018 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1020 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1021 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1024 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1027 CONFIGRET ret
= CR_SUCCESS
;
1029 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1032 if (Buffer
== NULL
|| pulLength
== NULL
)
1033 return CR_INVALID_POINTER
;
1036 return CR_INVALID_FLAG
;
1038 ulOrigLength
= *pulLength
;
1041 ulLength
= MAX_DEVICE_ID_LEN
;
1042 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1044 if (ret
== CR_SUCCESS
)
1046 if (WideCharToMultiByte(CP_ACP
,
1056 *pulLength
= lstrlenA(Buffer
) + 1;
1063 /***********************************************************************
1064 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1066 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1067 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1070 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1073 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1076 if (Buffer
== NULL
|| pulLength
== NULL
)
1077 return CR_INVALID_POINTER
;
1080 return CR_INVALID_FLAG
;
1082 *Buffer
= UNICODE_NULL
;
1084 if (hMachine
!= NULL
)
1086 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1087 if (BindingHandle
== NULL
)
1092 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1098 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1099 PNP_ENUMERATOR_SUBKEYS
,
1106 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1108 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1116 /***********************************************************************
1117 * CM_Free_Log_Conf [SETUPAPI.@]
1119 CONFIGRET WINAPI
CM_Free_Log_Conf(
1120 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1122 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1123 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1127 /***********************************************************************
1128 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1130 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1131 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1133 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1134 HSTRING_TABLE StringTable
= NULL
;
1136 PLOG_CONF_INFO pLogConfInfo
;
1139 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1141 if (!pSetupIsUserAdmin())
1142 return CR_ACCESS_DENIED
;
1144 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1145 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1146 return CR_INVALID_LOG_CONF
;
1149 return CR_INVALID_FLAG
;
1151 if (hMachine
!= NULL
)
1153 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1154 if (BindingHandle
== NULL
)
1157 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1158 if (StringTable
== 0)
1163 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1167 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1168 if (lpDevInst
== NULL
)
1169 return CR_INVALID_DEVNODE
;
1173 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1174 pLogConfInfo
->ulTag
, 0);
1176 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1178 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1186 /***********************************************************************
1187 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1189 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1192 PLOG_CONF_INFO pLogConfInfo
;
1194 TRACE("%lx\n", lcLogConf
);
1196 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1197 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1198 return CR_INVALID_LOG_CONF
;
1200 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1206 /***********************************************************************
1207 * CM_Free_Res_Des [SETUPAPI.@]
1209 CONFIGRET WINAPI
CM_Free_Res_Des(
1210 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1212 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1213 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1217 /***********************************************************************
1218 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1220 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1221 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1224 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1226 return CR_CALL_NOT_IMPLEMENTED
;
1230 /***********************************************************************
1231 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1233 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1236 FIXME("%p\n", rdResDes
);
1238 return CR_CALL_NOT_IMPLEMENTED
;
1242 /***********************************************************************
1243 * CM_Get_Child [SETUPAPI.@]
1245 CONFIGRET WINAPI
CM_Get_Child(
1246 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1248 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1249 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1253 /***********************************************************************
1254 * CM_Get_Child_Ex [SETUPAPI.@]
1256 CONFIGRET WINAPI
CM_Get_Child_Ex(
1257 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1259 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1260 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1261 HSTRING_TABLE StringTable
= NULL
;
1263 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1266 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1268 if (pdnDevInst
== NULL
)
1269 return CR_INVALID_POINTER
;
1272 return CR_INVALID_DEVINST
;
1275 return CR_INVALID_FLAG
;
1279 if (hMachine
!= NULL
)
1281 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1282 if (BindingHandle
== NULL
)
1285 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1286 if (StringTable
== 0)
1291 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1295 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1296 if (lpDevInst
== NULL
)
1297 return CR_INVALID_DEVNODE
;
1301 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1302 PNP_GET_CHILD_DEVICE_INSTANCE
,
1308 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1310 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1314 if (ret
!= CR_SUCCESS
)
1317 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1319 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1323 *pdnDevInst
= dwIndex
;
1329 /***********************************************************************
1330 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1332 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1333 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1335 TRACE("%p %p %p %lx\n",
1336 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1337 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1342 /***********************************************************************
1343 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1345 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1346 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1348 TRACE("%p %p %p %lx\n",
1349 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1350 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1355 /***********************************************************************
1356 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1358 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1359 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1362 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1363 CONFIGRET ret
= CR_SUCCESS
;
1367 TRACE("%p %p %p %lx %lx\n",
1368 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1370 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1371 return CR_INVALID_POINTER
;
1373 ulOrigLength
= *pulLength
;
1376 ulLength
= MAX_GUID_STRING_LEN
;
1377 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1379 if (ret
== CR_SUCCESS
)
1381 if (WideCharToMultiByte(CP_ACP
,
1391 *pulLength
= lstrlenA(pszKeyName
) + 1;
1398 /***********************************************************************
1399 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1401 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1402 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1405 TRACE("%p %p %p %lx %lx\n",
1406 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1408 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1409 return CR_INVALID_POINTER
;
1412 return CR_INVALID_FLAG
;
1414 if (*pulLength
< MAX_GUID_STRING_LEN
)
1417 return CR_BUFFER_SMALL
;
1420 if (!GuidToString(ClassGuid
, pszKeyName
))
1421 return CR_INVALID_DATA
;
1423 *pulLength
= MAX_GUID_STRING_LEN
;
1429 /***********************************************************************
1430 * CM_Get_Class_NameA [SETUPAPI.@]
1432 CONFIGRET WINAPI
CM_Get_Class_NameA(
1433 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1435 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1436 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1441 /***********************************************************************
1442 * CM_Get_Class_NameW [SETUPAPI.@]
1444 CONFIGRET WINAPI
CM_Get_Class_NameW(
1445 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1447 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1448 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1453 /***********************************************************************
1454 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1456 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1457 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1460 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1461 CONFIGRET ret
= CR_SUCCESS
;
1465 TRACE("%p %p %p %lx %lx\n",
1466 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1468 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1469 return CR_INVALID_POINTER
;
1471 ulOrigLength
= *pulLength
;
1474 ulLength
= MAX_CLASS_NAME_LEN
;
1475 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1477 if (ret
== CR_SUCCESS
)
1479 if (WideCharToMultiByte(CP_ACP
,
1489 *pulLength
= lstrlenA(Buffer
) + 1;
1496 /***********************************************************************
1497 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1500 CM_Get_Class_Name_ExW(
1501 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1504 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1505 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1508 TRACE("%p %p %p %lx %lx\n",
1509 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1511 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1512 return CR_INVALID_POINTER
;
1515 return CR_INVALID_FLAG
;
1517 if (!GuidToString(ClassGuid
, szGuidString
))
1518 return CR_INVALID_DATA
;
1520 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1522 if (hMachine
!= NULL
)
1524 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1525 if (BindingHandle
== NULL
)
1530 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1536 ret
= PNP_GetClassName(BindingHandle
,
1542 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1544 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1552 /***********************************************************************
1553 * CM_Get_Depth [SETUPAPI.@]
1555 CONFIGRET WINAPI
CM_Get_Depth(
1556 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1558 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1559 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1563 /***********************************************************************
1564 * CM_Get_Depth_Ex [SETUPAPI.@]
1566 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1567 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1569 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1570 HSTRING_TABLE StringTable
= NULL
;
1574 TRACE("%p %lx %lx %lx\n",
1575 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1577 if (pulDepth
== NULL
)
1578 return CR_INVALID_POINTER
;
1581 return CR_INVALID_DEVINST
;
1584 return CR_INVALID_FLAG
;
1586 if (hMachine
!= NULL
)
1588 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1589 if (BindingHandle
== NULL
)
1592 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1593 if (StringTable
== 0)
1598 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1602 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1603 if (lpDevInst
== NULL
)
1604 return CR_INVALID_DEVNODE
;
1608 ret
= PNP_GetDepth(BindingHandle
,
1613 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1615 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1623 /***********************************************************************
1624 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1626 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1627 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1628 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1630 TRACE("%lx %lu %p %p %p %lx\n",
1631 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1633 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1634 pulRegDataType
, Buffer
,
1635 pulLength
, ulFlags
, NULL
);
1639 /***********************************************************************
1640 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1642 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1643 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1644 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1646 TRACE("%lx %lu %p %p %p %lx\n",
1647 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1649 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1650 pulRegDataType
, Buffer
,
1651 pulLength
, ulFlags
, NULL
);
1655 /***********************************************************************
1656 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1658 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1659 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1660 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1664 ULONG RegDataType
= REG_NONE
;
1667 TRACE("%lx %lu %p %p %p %lx %lx\n",
1668 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1672 return CR_INVALID_POINTER
;
1674 LengthW
= *pulLength
* sizeof(WCHAR
);
1675 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1678 return CR_OUT_OF_MEMORY
;
1680 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1688 if (ret
== CR_SUCCESS
)
1690 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1692 /* Do W->A conversion */
1693 *pulLength
= WideCharToMultiByte(CP_ACP
,
1696 lstrlenW(BufferW
) + 1,
1701 if (*pulLength
== 0)
1706 /* Directly copy the value */
1707 if (LengthW
<= *pulLength
)
1708 memcpy(Buffer
, BufferW
, LengthW
);
1711 *pulLength
= LengthW
;
1712 ret
= CR_BUFFER_SMALL
;
1718 *pulRegDataType
= RegDataType
;
1720 HeapFree(GetProcessHeap(), 0, BufferW
);
1726 /***********************************************************************
1727 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1729 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1730 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1731 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1733 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1734 HSTRING_TABLE StringTable
= NULL
;
1735 CONFIGRET ret
= CR_SUCCESS
;
1737 ULONG ulDataType
= 0;
1738 ULONG ulTransferLength
= 0;
1740 TRACE("%lx %lu %p %p %p %lx %lx\n",
1741 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1745 return CR_INVALID_DEVNODE
;
1747 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1748 return CR_INVALID_PROPERTY
;
1750 /* pulRegDataType is optional */
1752 /* Buffer is optional */
1754 if (pulLength
== NULL
)
1755 return CR_INVALID_POINTER
;
1757 if (*pulLength
== 0)
1758 return CR_INVALID_POINTER
;
1761 return CR_INVALID_FLAG
;
1763 if (hMachine
!= NULL
)
1765 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1766 if (BindingHandle
== NULL
)
1769 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1770 if (StringTable
== 0)
1775 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1779 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1780 if (lpDevInst
== NULL
)
1781 return CR_INVALID_DEVNODE
;
1783 ulTransferLength
= *pulLength
;
1787 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1796 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1798 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1802 if (ret
== CR_SUCCESS
)
1804 if (pulRegDataType
!= NULL
)
1805 *pulRegDataType
= ulDataType
;
1812 /***********************************************************************
1813 * CM_Get_DevNode_Status [SETUPAPI.@]
1815 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1816 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1819 TRACE("%p %p %lx %lx\n",
1820 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1821 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1826 /***********************************************************************
1827 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1830 CM_Get_DevNode_Status_Ex(
1831 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1832 ULONG ulFlags
, HMACHINE hMachine
)
1834 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1835 HSTRING_TABLE StringTable
= NULL
;
1839 TRACE("%p %p %lx %lx %lx\n",
1840 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1842 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1843 return CR_INVALID_POINTER
;
1846 return CR_INVALID_DEVINST
;
1849 return CR_INVALID_FLAG
;
1851 if (hMachine
!= NULL
)
1853 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1854 if (BindingHandle
== NULL
)
1857 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1858 if (StringTable
== 0)
1863 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1867 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1868 if (lpDevInst
== NULL
)
1869 return CR_INVALID_DEVNODE
;
1873 ret
= PNP_GetDeviceStatus(BindingHandle
,
1879 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1881 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1889 /***********************************************************************
1890 * CM_Get_Device_IDA [SETUPAPI.@]
1892 CONFIGRET WINAPI
CM_Get_Device_IDA(
1893 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1895 TRACE("%lx %p %ld %ld\n",
1896 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1897 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1901 /***********************************************************************
1902 * CM_Get_Device_IDW [SETUPAPI.@]
1904 CONFIGRET WINAPI
CM_Get_Device_IDW(
1905 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1907 TRACE("%lx %p %ld %ld\n",
1908 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1909 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1913 /***********************************************************************
1914 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1916 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1917 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1920 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1921 CONFIGRET ret
= CR_SUCCESS
;
1923 TRACE("%lx %p %ld %ld %lx\n",
1924 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1927 return CR_INVALID_POINTER
;
1929 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1934 if (ret
== CR_SUCCESS
)
1936 if (WideCharToMultiByte(CP_ACP
,
1939 lstrlenW(szBufferW
) + 1,
1951 /***********************************************************************
1952 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1954 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1955 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1958 HSTRING_TABLE StringTable
= NULL
;
1960 TRACE("%lx %p %ld %ld %lx\n",
1961 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1964 return CR_INVALID_DEVINST
;
1967 return CR_INVALID_POINTER
;
1970 return CR_INVALID_FLAG
;
1972 if (hMachine
!= NULL
)
1974 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1975 if (StringTable
== NULL
)
1980 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1984 if (!pSetupStringTableStringFromIdEx(StringTable
,
1994 /***********************************************************************
1995 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1997 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1998 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2000 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2001 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2006 /***********************************************************************
2007 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2009 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2010 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2012 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2013 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2018 /***********************************************************************
2019 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2021 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2022 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2025 LPWSTR BufferW
= NULL
;
2026 LPWSTR pszFilterW
= NULL
;
2027 CONFIGRET ret
= CR_SUCCESS
;
2029 TRACE("%p %p %ld %ld %lx\n",
2030 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2032 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2033 if (BufferW
== NULL
)
2034 return CR_OUT_OF_MEMORY
;
2036 if (pszFilter
== NULL
)
2038 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2046 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2048 ret
= CR_INVALID_DEVICE_ID
;
2052 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2061 if (WideCharToMultiByte(CP_ACP
,
2064 lstrlenW(BufferW
) + 1,
2078 /***********************************************************************
2079 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2081 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2082 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2085 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2088 TRACE("%p %p %ld %ld %lx\n",
2089 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2091 if (Buffer
== NULL
|| BufferLen
== 0)
2092 return CR_INVALID_POINTER
;
2094 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2095 return CR_INVALID_FLAG
;
2097 if (hMachine
!= NULL
)
2099 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2100 if (BindingHandle
== NULL
)
2105 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2113 ret
= PNP_GetDeviceList(BindingHandle
,
2119 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2121 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2129 /***********************************************************************
2130 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2132 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2133 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2135 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2136 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2140 /***********************************************************************
2141 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2143 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2144 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2146 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2147 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2151 /***********************************************************************
2152 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2154 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2155 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2157 LPWSTR pszFilterW
= NULL
;
2158 CONFIGRET ret
= CR_SUCCESS
;
2160 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2162 if (pszFilter
== NULL
)
2164 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2171 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2172 return CR_INVALID_DEVICE_ID
;
2174 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2186 /***********************************************************************
2187 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2189 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2190 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2192 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2195 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2198 return CR_INVALID_POINTER
;
2200 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2201 return CR_INVALID_FLAG
;
2203 if (hMachine
!= NULL
)
2205 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2206 if (BindingHandle
== NULL
)
2211 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2219 ret
= PNP_GetDeviceListSize(BindingHandle
,
2224 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2226 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2234 /***********************************************************************
2235 * CM_Get_Device_ID_Size [SETUPAPI.@]
2237 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2238 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2240 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2241 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2245 /***********************************************************************
2246 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2248 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2249 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2251 HSTRING_TABLE StringTable
= NULL
;
2254 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2257 return CR_INVALID_POINTER
;
2260 return CR_INVALID_DEVINST
;
2263 return CR_INVALID_FLAG
;
2265 if (hMachine
!= NULL
)
2267 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2268 if (StringTable
== NULL
)
2273 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2277 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2278 if (DeviceId
== NULL
)
2284 *pulLen
= lstrlenW(DeviceId
);
2290 /***********************************************************************
2291 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2293 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2294 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2295 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2297 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2298 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2300 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2301 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2306 /***********************************************************************
2307 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2309 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2310 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2311 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2313 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2314 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2316 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2317 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2322 /***********************************************************************
2323 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2325 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2326 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2327 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2329 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2330 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2332 return CR_CALL_NOT_IMPLEMENTED
;
2336 /***********************************************************************
2337 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2339 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2340 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2341 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2343 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2344 ULONG ulTransferLength
;
2345 CONFIGRET ret
= CR_SUCCESS
;
2347 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2348 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2350 if (pszDeviceInterface
== NULL
||
2351 AliasInterfaceGuid
== NULL
||
2352 pszAliasDeviceInterface
== NULL
||
2354 return CR_INVALID_POINTER
;
2357 return CR_INVALID_FLAG
;
2359 if (hMachine
!= NULL
)
2361 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2362 if (BindingHandle
== NULL
)
2367 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2371 ulTransferLength
= *pulLength
;
2375 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2376 (LPWSTR
)pszDeviceInterface
,
2378 pszAliasDeviceInterface
,
2383 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2385 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2393 /***********************************************************************
2394 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2396 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2397 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2398 ULONG BufferLen
, ULONG ulFlags
)
2400 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2401 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2403 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2404 Buffer
, BufferLen
, ulFlags
, NULL
);
2408 /***********************************************************************
2409 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2411 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2412 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2413 ULONG BufferLen
, ULONG ulFlags
)
2415 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2416 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2418 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2419 Buffer
, BufferLen
, ulFlags
, NULL
);
2423 /***********************************************************************
2424 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2426 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2427 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2428 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2430 DEVINSTID_W pDeviceIdW
= NULL
;
2431 PWCHAR BufferW
= NULL
;
2432 CONFIGRET ret
= CR_SUCCESS
;
2434 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2435 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2437 if (Buffer
== NULL
||
2439 return CR_INVALID_POINTER
;
2441 if (pDeviceID
!= NULL
)
2443 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2444 return CR_INVALID_DEVICE_ID
;
2447 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2448 if (BufferW
== NULL
)
2450 ret
= CR_OUT_OF_MEMORY
;
2454 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2455 BufferW
, BufferLen
, ulFlags
,
2457 if (ret
!= CR_SUCCESS
)
2460 if (WideCharToMultiByte(CP_ACP
,
2463 lstrlenW(BufferW
) + 1,
2471 if (BufferW
!= NULL
)
2474 if (pDeviceIdW
!= NULL
)
2481 /***********************************************************************
2482 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2484 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2485 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2486 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2488 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2489 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2490 CONFIGRET ret
= CR_SUCCESS
;
2492 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2493 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2495 if (Buffer
== NULL
||
2497 return CR_INVALID_POINTER
;
2499 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2500 return CR_INVALID_FLAG
;
2502 if (hMachine
!= NULL
)
2504 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2505 if (BindingHandle
== NULL
)
2510 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2515 BufferSize
= BufferLen
;
2519 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2526 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2528 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2536 /***********************************************************************
2537 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2539 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2540 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2543 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2544 pDeviceId
, ulFlags
);
2546 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2547 pDeviceId
, ulFlags
, NULL
);
2551 /***********************************************************************
2552 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2554 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2555 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2558 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2559 debugstr_w(pDeviceId
), ulFlags
);
2561 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2562 pDeviceId
, ulFlags
, NULL
);
2566 /***********************************************************************
2567 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2569 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2570 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2571 ULONG ulFlags
, HMACHINE hMachine
)
2573 DEVINSTID_W pDeviceIdW
= NULL
;
2574 CONFIGRET ret
= CR_SUCCESS
;
2576 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2577 pDeviceId
, ulFlags
, hMachine
);
2580 return CR_INVALID_POINTER
;
2582 if (pDeviceId
!= NULL
)
2584 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2585 return CR_INVALID_DEVICE_ID
;
2590 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2591 pDeviceIdW
, ulFlags
, hMachine
);
2593 if (pDeviceIdW
!= NULL
)
2600 /***********************************************************************
2601 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2603 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2604 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2605 ULONG ulFlags
, HMACHINE hMachine
)
2607 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2608 CONFIGRET ret
= CR_SUCCESS
;
2610 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2611 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2614 return CR_INVALID_POINTER
;
2616 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2617 return CR_INVALID_FLAG
;
2619 if (hMachine
!= NULL
)
2621 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2622 if (BindingHandle
== NULL
)
2627 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2635 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2641 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2643 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2651 /***********************************************************************
2652 * CM_Get_First_Log_Conf [SETUPAPI.@]
2654 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2655 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2657 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2658 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2662 /***********************************************************************
2663 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2665 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2666 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2668 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2669 HSTRING_TABLE StringTable
= NULL
;
2670 LPWSTR lpDevInst
= NULL
;
2671 CONFIGRET ret
= CR_SUCCESS
;
2673 PLOG_CONF_INFO pLogConfInfo
;
2675 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2678 return CR_INVALID_DEVINST
;
2680 if (ulFlags
& ~LOG_CONF_BITS
)
2681 return CR_INVALID_FLAG
;
2686 if (hMachine
!= NULL
)
2688 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2689 if (BindingHandle
== NULL
)
2692 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2693 if (StringTable
== 0)
2698 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2702 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2703 if (lpDevInst
== NULL
)
2704 return CR_INVALID_DEVNODE
;
2708 ret
= PNP_GetFirstLogConf(BindingHandle
,
2714 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2716 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2720 if (ret
!= CR_SUCCESS
)
2725 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2726 if (pLogConfInfo
== NULL
)
2727 return CR_OUT_OF_MEMORY
;
2729 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2730 pLogConfInfo
->dnDevInst
= dnDevInst
;
2731 pLogConfInfo
->ulFlags
= ulFlags
;
2732 pLogConfInfo
->ulTag
= ulTag
;
2734 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2741 /***********************************************************************
2742 * CM_Get_Global_State [SETUPAPI.@]
2744 CONFIGRET WINAPI
CM_Get_Global_State(
2745 PULONG pulState
, ULONG ulFlags
)
2747 TRACE("%p %lx\n", pulState
, ulFlags
);
2748 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2752 /***********************************************************************
2753 * CM_Get_Global_State_Ex [SETUPAPI.@]
2755 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2756 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2758 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2761 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2763 if (pulState
== NULL
)
2764 return CR_INVALID_POINTER
;
2767 return CR_INVALID_FLAG
;
2769 if (hMachine
!= NULL
)
2771 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2772 if (BindingHandle
== NULL
)
2777 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2783 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2785 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2787 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2795 /***********************************************************************
2796 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2798 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2799 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2802 TRACE("%s %lu %p %lx\n", szDevInstName
,
2803 ulHardwareProfile
, pulValue
, ulFlags
);
2805 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2806 pulValue
, ulFlags
, NULL
);
2810 /***********************************************************************
2811 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2813 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2814 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2817 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2818 ulHardwareProfile
, pulValue
, ulFlags
);
2820 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2821 pulValue
, ulFlags
, NULL
);
2825 /***********************************************************************
2826 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2828 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2829 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2830 ULONG ulFlags
, HMACHINE hMachine
)
2832 DEVINSTID_W pszDevIdW
= NULL
;
2833 CONFIGRET ret
= CR_SUCCESS
;
2835 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2836 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2838 if (szDevInstName
!= NULL
)
2840 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2841 return CR_INVALID_DEVICE_ID
;
2844 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2845 pulValue
, ulFlags
, hMachine
);
2847 if (pszDevIdW
!= NULL
)
2854 /***********************************************************************
2855 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2857 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2858 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2859 ULONG ulFlags
, HMACHINE hMachine
)
2861 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2864 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2865 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2867 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2868 return CR_INVALID_POINTER
;
2871 return CR_INVALID_FLAG
;
2873 /* FIXME: Check whether szDevInstName is valid */
2875 if (hMachine
!= NULL
)
2877 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2878 if (BindingHandle
== NULL
)
2883 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2889 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
2890 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
2892 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2894 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2902 /***********************************************************************
2903 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
2905 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
2906 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
2908 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2910 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
2915 /***********************************************************************
2916 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
2918 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
2919 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
2921 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2923 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
2928 /***********************************************************************
2929 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
2931 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
2932 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
2935 HWPROFILEINFO_W LocalProfileInfo
;
2938 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
2940 if (pHWProfileInfo
== NULL
)
2941 return CR_INVALID_POINTER
;
2943 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
2945 if (ret
== CR_SUCCESS
)
2947 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
2948 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
2950 if (WideCharToMultiByte(CP_ACP
,
2952 LocalProfileInfo
.HWPI_szFriendlyName
,
2953 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
2954 pHWProfileInfo
->HWPI_szFriendlyName
,
2965 /***********************************************************************
2966 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
2968 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
2969 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
2972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2975 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
2977 if (pHWProfileInfo
== NULL
)
2978 return CR_INVALID_POINTER
;
2981 return CR_INVALID_FLAG
;
2983 if (hMachine
!= NULL
)
2985 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2986 if (BindingHandle
== NULL
)
2991 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2997 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
2998 sizeof(HWPROFILEINFO_W
), 0);
3000 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3002 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3010 /***********************************************************************
3011 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3013 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3014 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3016 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3017 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3021 /***********************************************************************
3022 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3024 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3025 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3028 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3029 HSTRING_TABLE StringTable
= NULL
;
3030 PLOG_CONF_INFO pLogConfInfo
;
3034 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3036 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3037 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3038 return CR_INVALID_LOG_CONF
;
3040 if (pPriority
== NULL
)
3041 return CR_INVALID_POINTER
;
3044 return CR_INVALID_FLAG
;
3046 if (hMachine
!= NULL
)
3048 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3049 if (BindingHandle
== NULL
)
3052 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3053 if (StringTable
== 0)
3058 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3062 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3063 if (lpDevInst
== NULL
)
3064 return CR_INVALID_DEVNODE
;
3068 ret
= PNP_GetLogConfPriority(BindingHandle
,
3070 pLogConfInfo
->ulFlags
,
3071 pLogConfInfo
->ulTag
,
3075 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3077 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3085 /***********************************************************************
3086 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3088 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3089 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3091 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3092 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3096 /***********************************************************************
3097 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3099 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3100 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3103 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3104 HSTRING_TABLE StringTable
= NULL
;
3105 PLOG_CONF_INFO pLogConfInfo
;
3106 PLOG_CONF_INFO pNewLogConfInfo
;
3111 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3116 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3117 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3118 return CR_INVALID_LOG_CONF
;
3121 return CR_INVALID_FLAG
;
3123 if (hMachine
!= NULL
)
3125 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3126 if (BindingHandle
== NULL
)
3129 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3130 if (StringTable
== 0)
3135 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3139 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3140 if (lpDevInst
== NULL
)
3141 return CR_INVALID_DEVNODE
;
3145 ret
= PNP_GetNextLogConf(BindingHandle
,
3147 pLogConfInfo
->ulFlags
,
3148 pLogConfInfo
->ulTag
,
3152 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3154 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3158 if (ret
!= CR_SUCCESS
)
3163 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3164 if (pNewLogConfInfo
== NULL
)
3165 return CR_OUT_OF_MEMORY
;
3167 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3168 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3169 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3170 pNewLogConfInfo
->ulTag
= ulNewTag
;
3172 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3179 /***********************************************************************
3180 * CM_Get_Next_Re_Des [SETUPAPI.@]
3182 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3183 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3184 PRESOURCEID pResourceID
, ULONG ulFlags
)
3186 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3187 pResourceID
, ulFlags
);
3188 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3189 pResourceID
, ulFlags
, NULL
);
3193 /***********************************************************************
3194 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3196 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3197 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3198 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3200 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3201 pResourceID
, ulFlags
, hMachine
);
3203 return CR_CALL_NOT_IMPLEMENTED
;
3207 /***********************************************************************
3208 * CM_Get_Parent [SETUPAPI.@]
3210 CONFIGRET WINAPI
CM_Get_Parent(
3211 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3213 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3214 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3218 /***********************************************************************
3219 * CM_Get_Parent_Ex [SETUPAPI.@]
3221 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3222 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3224 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3225 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3226 HSTRING_TABLE StringTable
= NULL
;
3228 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3231 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3233 if (pdnDevInst
== NULL
)
3234 return CR_INVALID_POINTER
;
3237 return CR_INVALID_DEVINST
;
3240 return CR_INVALID_FLAG
;
3244 if (hMachine
!= NULL
)
3246 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3247 if (BindingHandle
== NULL
)
3250 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3251 if (StringTable
== 0)
3256 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3260 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3261 if (lpDevInst
== NULL
)
3262 return CR_INVALID_DEVNODE
;
3266 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3267 PNP_GET_PARENT_DEVICE_INSTANCE
,
3273 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3275 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3279 if (ret
!= CR_SUCCESS
)
3282 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3284 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3288 *pdnDevInst
= dwIndex
;
3294 /***********************************************************************
3295 * CM_Get_Res_Des_Data [SETUPAPI.@]
3297 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3298 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3300 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3301 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3305 /***********************************************************************
3306 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3308 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3309 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3312 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3313 return CR_CALL_NOT_IMPLEMENTED
;
3317 /***********************************************************************
3318 * CM_Get_Res_Des_Size [SETUPAPI.@]
3320 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3321 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3323 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3324 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3328 /***********************************************************************
3329 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3331 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3332 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3334 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3335 return CR_CALL_NOT_IMPLEMENTED
;
3339 /***********************************************************************
3340 * CM_Get_Sibling [SETUPAPI.@]
3342 CONFIGRET WINAPI
CM_Get_Sibling(
3343 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3345 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3346 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3350 /***********************************************************************
3351 * CM_Get_Sibling_Ex [SETUPAPI.@]
3353 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3354 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3356 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3357 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3358 HSTRING_TABLE StringTable
= NULL
;
3360 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3363 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3365 if (pdnDevInst
== NULL
)
3366 return CR_INVALID_POINTER
;
3369 return CR_INVALID_DEVINST
;
3372 return CR_INVALID_FLAG
;
3376 if (hMachine
!= NULL
)
3378 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3379 if (BindingHandle
== NULL
)
3382 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3383 if (StringTable
== 0)
3388 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3392 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3393 if (lpDevInst
== NULL
)
3394 return CR_INVALID_DEVNODE
;
3398 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3399 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3405 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3407 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3411 if (ret
!= CR_SUCCESS
)
3414 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3416 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3420 *pdnDevInst
= dwIndex
;
3426 /***********************************************************************
3427 * CM_Get_Version [SETUPAPI.@]
3429 WORD WINAPI
CM_Get_Version(VOID
)
3432 return CM_Get_Version_Ex(NULL
);
3436 /***********************************************************************
3437 * CM_Get_Version_Ex [SETUPAPI.@]
3439 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3441 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3445 TRACE("%lx\n", hMachine
);
3447 if (hMachine
!= NULL
)
3449 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3450 if (BindingHandle
== NULL
)
3455 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3461 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3463 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3465 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3469 if (ret
!= CR_SUCCESS
)
3476 /***********************************************************************
3477 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3479 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3482 TRACE("%p\n", pbPresent
);
3483 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3487 /***********************************************************************
3488 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3490 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3491 PBOOL pbPresent
, HMACHINE hMachine
)
3493 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3496 TRACE("%p %lx\n", pbPresent
, hMachine
);
3498 if (pbPresent
== NULL
)
3499 return CR_INVALID_POINTER
;
3503 if (hMachine
!= NULL
)
3505 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3506 if (BindingHandle
== NULL
)
3511 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3517 ret
= PNP_IsDockStationPresent(BindingHandle
,
3520 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3522 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3530 /***********************************************************************
3531 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3533 BOOL WINAPI
CM_Is_Version_Available(
3536 TRACE("%hu\n", wVersion
);
3537 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3541 /***********************************************************************
3542 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3544 BOOL WINAPI
CM_Is_Version_Available_Ex(
3545 WORD wVersion
, HMACHINE hMachine
)
3547 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3548 WORD wServerVersion
;
3551 TRACE("%hu %lx\n", wVersion
, hMachine
);
3553 if (wVersion
<= 0x400)
3556 if (hMachine
!= NULL
)
3558 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3559 if (BindingHandle
== NULL
)
3564 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3570 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3572 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3574 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3578 if (ret
!= CR_SUCCESS
)
3581 return (wServerVersion
>= wVersion
);
3585 /***********************************************************************
3586 * CM_Locate_DevNodeA [SETUPAPI.@]
3588 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3589 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3591 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3592 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3596 /***********************************************************************
3597 * CM_Locate_DevNodeW [SETUPAPI.@]
3599 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3600 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3602 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3603 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3607 /***********************************************************************
3608 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3610 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3611 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3613 DEVINSTID_W pDevIdW
= NULL
;
3614 CONFIGRET ret
= CR_SUCCESS
;
3616 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3618 if (pDeviceID
!= NULL
)
3620 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3621 return CR_INVALID_DEVICE_ID
;
3624 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3626 if (pDevIdW
!= NULL
)
3633 /***********************************************************************
3634 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3636 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3637 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3639 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3640 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3641 HSTRING_TABLE StringTable
= NULL
;
3642 CONFIGRET ret
= CR_SUCCESS
;
3644 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3646 if (pdnDevInst
== NULL
)
3647 return CR_INVALID_POINTER
;
3649 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3650 return CR_INVALID_FLAG
;
3652 if (hMachine
!= NULL
)
3654 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3655 if (BindingHandle
== NULL
)
3658 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3659 if (StringTable
== 0)
3664 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3668 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3670 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3676 /* Get the root device ID */
3677 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3681 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3683 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3687 if (ret
!= CR_SUCCESS
)
3690 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3694 /* Validate the device ID */
3695 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3699 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3701 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3705 if (ret
== CR_SUCCESS
)
3707 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3708 if (*pdnDevInst
== -1)
3716 /***********************************************************************
3717 * CM_Modify_Res_Des [SETUPAPI.@]
3719 CONFIGRET WINAPI
CM_Modify_Res_Des(
3720 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
3721 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
3723 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3724 ResourceLen
, ulFlags
);
3725 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3726 ResourceLen
, ulFlags
, NULL
);
3730 /***********************************************************************
3731 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
3733 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
3734 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
3735 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
3737 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3738 ResourceLen
, ulFlags
, hMachine
);
3739 return CR_CALL_NOT_IMPLEMENTED
;
3743 /***********************************************************************
3744 * CM_Move_DevNode [SETUPAPI.@]
3746 CONFIGRET WINAPI
CM_Move_DevNode(
3747 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3749 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3750 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3754 /***********************************************************************
3755 * CM_Move_DevNode_Ex [SETUPAPI.@]
3757 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3758 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3761 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3762 HSTRING_TABLE StringTable
= NULL
;
3763 LPWSTR lpFromDevInst
;
3767 FIXME("%lx %lx %lx %lx\n",
3768 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3770 if (!pSetupIsUserAdmin())
3771 return CR_ACCESS_DENIED
;
3773 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3774 return CR_INVALID_DEVNODE
;
3777 return CR_INVALID_FLAG
;
3779 if (hMachine
!= NULL
)
3781 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3782 if (BindingHandle
== NULL
)
3785 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3786 if (StringTable
== 0)
3791 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3795 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
3796 if (lpFromDevInst
== NULL
)
3797 return CR_INVALID_DEVNODE
;
3799 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
3800 if (lpToDevInst
== NULL
)
3801 return CR_INVALID_DEVNODE
;
3805 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3811 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3813 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3821 /***********************************************************************
3822 * CM_Open_Class_KeyA [SETUPAPI.@]
3824 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3825 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3826 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3828 TRACE("%p %s %lx %lx %p %lx\n",
3829 debugstr_guid(pClassGuid
), pszClassName
,
3830 samDesired
, Disposition
, phkClass
, ulFlags
);
3832 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3833 Disposition
, phkClass
, ulFlags
, NULL
);
3837 /***********************************************************************
3838 * CM_Open_Class_KeyW [SETUPAPI.@]
3840 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3841 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3842 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3844 TRACE("%p %s %lx %lx %p %lx\n",
3845 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3846 samDesired
, Disposition
, phkClass
, ulFlags
);
3848 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3849 Disposition
, phkClass
, ulFlags
, NULL
);
3853 /***********************************************************************
3854 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3856 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3857 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3858 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3861 CONFIGRET rc
= CR_SUCCESS
;
3862 LPWSTR pszClassNameW
= NULL
;
3864 TRACE("%p %s %lx %lx %p %lx %lx\n",
3865 debugstr_guid(pClassGuid
), pszClassName
,
3866 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3868 if (pszClassName
!= NULL
)
3870 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3871 return CR_INVALID_DATA
;
3874 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3875 Disposition
, phkClass
, ulFlags
, hMachine
);
3877 if (pszClassNameW
!= NULL
)
3878 MyFree(pszClassNameW
);
3884 /***********************************************************************
3885 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3887 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3888 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3889 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3892 WCHAR szKeyName
[MAX_PATH
];
3893 LPWSTR lpGuidString
;
3894 DWORD dwDisposition
;
3898 TRACE("%p %s %lx %lx %p %lx %lx\n",
3899 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3900 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3902 /* Check Disposition and ulFlags */
3903 if ((Disposition
& ~RegDisposition_Bits
) ||
3904 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3905 return CR_INVALID_FLAG
;
3907 /* Check phkClass */
3908 if (phkClass
== NULL
)
3909 return CR_INVALID_POINTER
;
3913 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3914 pszClassName
!= NULL
)
3915 return CR_INVALID_DATA
;
3917 if (hMachine
== NULL
)
3919 hKey
= HKEY_LOCAL_MACHINE
;
3923 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3924 HKEY_LOCAL_MACHINE
, &hKey
))
3925 return CR_REGISTRY_ERROR
;
3928 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3930 lstrcpyW(szKeyName
, DeviceClasses
);
3934 lstrcpyW(szKeyName
, ControlClass
);
3937 if (pClassGuid
!= NULL
)
3939 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
3942 return CR_INVALID_DATA
;
3945 lstrcatW(szKeyName
, Backslash
);
3946 lstrcatW(szKeyName
, lpGuidString
);
3949 if (Disposition
== RegDisposition_OpenAlways
)
3951 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
3952 NULL
, phkClass
, &dwDisposition
);
3956 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
3961 if (pClassGuid
!= NULL
)
3962 RpcStringFreeW(&lpGuidString
);
3964 if (dwError
!= ERROR_SUCCESS
)
3967 return CR_NO_SUCH_REGISTRY_KEY
;
3970 if (pszClassName
!= NULL
)
3972 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
3973 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
3980 /***********************************************************************
3981 * CM_Open_DevNode_Key [SETUPAPI.@]
3983 CONFIGRET WINAPI
CM_Open_DevNode_Key(
3984 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3985 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
3987 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
3988 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
3989 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
3990 Disposition
, phkDevice
, ulFlags
, NULL
);
3994 /***********************************************************************
3995 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
3997 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
3998 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3999 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4002 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4003 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4005 return CR_CALL_NOT_IMPLEMENTED
;
4009 /***********************************************************************
4010 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4012 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4013 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4014 ULONG ulNameLength
, ULONG ulFlags
)
4016 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4017 ulNameLength
, ulFlags
);
4019 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4020 ulNameLength
, ulFlags
, NULL
);
4024 /***********************************************************************
4025 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4027 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4028 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4029 ULONG ulNameLength
, ULONG ulFlags
)
4031 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4032 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4034 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4035 ulNameLength
, ulFlags
, NULL
);
4039 /***********************************************************************
4040 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4042 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4043 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4044 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4046 LPWSTR lpLocalVetoName
;
4049 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4050 ulNameLength
, ulFlags
, hMachine
);
4052 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4053 return CR_INVALID_POINTER
;
4055 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4056 if (lpLocalVetoName
== NULL
)
4057 return CR_OUT_OF_MEMORY
;
4059 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4060 ulNameLength
, ulFlags
, hMachine
);
4061 if (ret
== CR_REMOVE_VETOED
)
4063 if (WideCharToMultiByte(CP_ACP
,
4074 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4080 /***********************************************************************
4081 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4083 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4084 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4085 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4087 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4088 HSTRING_TABLE StringTable
= NULL
;
4092 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4093 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4095 if (dnAncestor
== 0)
4096 return CR_INVALID_DEVNODE
;
4098 if (ulFlags
& ~CM_REMOVE_BITS
)
4099 return CR_INVALID_FLAG
;
4101 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4102 return CR_INVALID_POINTER
;
4104 if (hMachine
!= NULL
)
4106 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4107 if (BindingHandle
== NULL
)
4110 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4111 if (StringTable
== 0)
4116 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4120 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4121 if (lpDevInst
== NULL
)
4122 return CR_INVALID_DEVNODE
;
4126 ret
= PNP_QueryRemove(BindingHandle
,
4133 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4135 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4143 /***********************************************************************
4144 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4146 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4147 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4150 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4151 ResourceID
, ulFlags
);
4153 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4154 ResourceID
, ulFlags
, NULL
);
4158 /***********************************************************************
4159 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4161 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4164 IN DEVINST dnDevInst
,
4165 IN RESOURCEID ResourceID
,
4167 IN HMACHINE hMachine
)
4169 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4170 HSTRING_TABLE StringTable
= NULL
;
4174 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4175 ResourceID
, ulFlags
, hMachine
);
4177 if (pData
== NULL
|| DataLen
== 0)
4178 return CR_INVALID_POINTER
;
4181 return CR_INVALID_DEVINST
;
4183 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4184 return CR_INVALID_FLAG
;
4186 if (hMachine
!= NULL
)
4188 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4189 if (BindingHandle
== NULL
)
4192 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4193 if (StringTable
== 0)
4198 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4202 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4203 if (lpDevInst
== NULL
)
4204 return CR_INVALID_DEVNODE
;
4208 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4215 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4217 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4225 /***********************************************************************
4226 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4228 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4229 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4231 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4233 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4238 /***********************************************************************
4239 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4241 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4242 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4243 ULONG ulFlags
, HMACHINE hMachine
)
4245 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4246 HSTRING_TABLE StringTable
= NULL
;
4250 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4253 if (pulSize
== NULL
)
4254 return CR_INVALID_POINTER
;
4257 return CR_INVALID_DEVINST
;
4259 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4260 return CR_INVALID_FLAG
;
4262 if (hMachine
!= NULL
)
4264 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4265 if (BindingHandle
== NULL
)
4268 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4269 if (StringTable
== 0)
4274 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4278 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4279 if (lpDevInst
== NULL
)
4280 return CR_INVALID_DEVNODE
;
4284 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4290 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4292 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4300 /***********************************************************************
4301 * CM_Query_Remove_SubTree [SETUPAPI.@]
4303 * This function is obsolete in Windows XP and above.
4305 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4306 DEVINST dnAncestor
, ULONG ulFlags
)
4308 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4309 return CR_CALL_NOT_IMPLEMENTED
;
4313 /***********************************************************************
4314 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4316 * This function is obsolete in Windows XP and above.
4318 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4319 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4321 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4322 return CR_CALL_NOT_IMPLEMENTED
;
4326 /***********************************************************************
4327 * CM_Reenumerate_DevNode [SETUPAPI.@]
4329 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4330 DEVINST dnDevInst
, ULONG ulFlags
)
4332 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4333 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4337 /***********************************************************************
4338 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4341 CM_Reenumerate_DevNode_Ex(
4342 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4344 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4345 HSTRING_TABLE StringTable
= NULL
;
4349 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4352 return CR_INVALID_DEVNODE
;
4354 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4355 return CR_INVALID_FLAG
;
4357 if (hMachine
!= NULL
)
4359 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4360 if (BindingHandle
== NULL
)
4363 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4364 if (StringTable
== 0)
4369 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4373 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4374 if (lpDevInst
== NULL
)
4375 return CR_INVALID_DEVNODE
;
4379 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4380 PNP_DEVINST_REENUMERATE
,
4385 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4387 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4395 /***********************************************************************
4396 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4398 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4399 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4400 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4402 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4403 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4405 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4406 pszReference
, pszDeviceInterface
,
4407 pulLength
, ulFlags
, NULL
);
4411 /***********************************************************************
4412 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4414 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4415 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4416 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4418 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4419 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4421 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4422 pszReference
, pszDeviceInterface
,
4423 pulLength
, ulFlags
, NULL
);
4427 /***********************************************************************
4428 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4430 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4431 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4432 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4434 LPWSTR pszReferenceW
= NULL
;
4435 LPWSTR pszDeviceInterfaceW
= NULL
;
4439 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4440 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4442 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4443 return CR_INVALID_POINTER
;
4445 if (pszReference
!= NULL
)
4447 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4448 return CR_INVALID_DATA
;
4451 ulLength
= *pulLength
;
4453 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4454 if (pszDeviceInterfaceW
== NULL
)
4456 ret
= CR_OUT_OF_MEMORY
;
4460 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4463 pszDeviceInterfaceW
,
4467 if (ret
== CR_SUCCESS
)
4469 if (WideCharToMultiByte(CP_ACP
,
4471 pszDeviceInterfaceW
,
4480 *pulLength
= ulLength
;
4483 if (pszDeviceInterfaceW
!= NULL
)
4484 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4486 if (pszReferenceW
!= NULL
)
4487 MyFree(pszReferenceW
);
4493 /***********************************************************************
4494 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4496 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4497 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4498 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4500 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4501 HSTRING_TABLE StringTable
= NULL
;
4503 ULONG ulTransferLength
;
4506 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4507 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4510 return CR_INVALID_DEVNODE
;
4512 if (InterfaceClassGuid
== NULL
||
4513 pszDeviceInterface
== NULL
||
4515 return CR_INVALID_POINTER
;
4518 return CR_INVALID_FLAG
;
4520 if (hMachine
!= NULL
)
4522 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4523 if (BindingHandle
== NULL
)
4526 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4527 if (StringTable
== 0)
4532 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4536 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4537 if (lpDevInst
== NULL
)
4538 return CR_INVALID_DEVNODE
;
4540 ulTransferLength
= *pulLength
;
4544 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4547 (LPWSTR
)pszReference
,
4553 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4555 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4563 /***********************************************************************
4564 * CM_Register_Device_Driver [SETUPAPI.@]
4566 CONFIGRET WINAPI
CM_Register_Device_Driver(
4567 DEVINST dnDevInst
, ULONG ulFlags
)
4569 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4570 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4574 /***********************************************************************
4575 * CM_Register_Device_Driver [SETUPAPI.@]
4577 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4578 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4580 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4581 HSTRING_TABLE StringTable
= NULL
;
4585 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4588 return CR_INVALID_DEVNODE
;
4590 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4591 return CR_INVALID_FLAG
;
4593 if (hMachine
!= NULL
)
4595 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4596 if (BindingHandle
== NULL
)
4599 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4600 if (StringTable
== 0)
4605 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4609 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4610 if (lpDevInst
== NULL
)
4611 return CR_INVALID_DEVNODE
;
4615 ret
= PNP_RegisterDriver(BindingHandle
,
4619 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4621 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4629 /***********************************************************************
4630 * CM_Remove_SubTree [SETUPAPI.@]
4632 * This function is obsolete in Windows XP and above.
4634 CONFIGRET WINAPI
CM_Remove_SubTree(
4635 DEVINST dnAncestor
, ULONG ulFlags
)
4637 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4638 return CR_CALL_NOT_IMPLEMENTED
;
4642 /***********************************************************************
4643 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4645 * This function is obsolete in Windows XP and above.
4647 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4648 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4650 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4651 return CR_CALL_NOT_IMPLEMENTED
;
4655 /***********************************************************************
4656 * CM_Request_Device_EjectA [SETUPAPI.@]
4658 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4659 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4660 ULONG ulNameLength
, ULONG ulFlags
)
4662 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4663 ulNameLength
, ulFlags
);
4664 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4665 ulNameLength
, ulFlags
, NULL
);
4669 /***********************************************************************
4670 * CM_Request_Device_EjectW [SETUPAPI.@]
4672 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4673 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4674 ULONG ulNameLength
, ULONG ulFlags
)
4676 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4677 ulNameLength
, ulFlags
);
4678 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4679 ulNameLength
, ulFlags
, NULL
);
4683 /***********************************************************************
4684 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4686 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4687 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4688 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4690 LPWSTR lpLocalVetoName
;
4693 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4694 ulNameLength
, ulFlags
, hMachine
);
4696 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4697 return CR_INVALID_POINTER
;
4699 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4700 if (lpLocalVetoName
== NULL
)
4701 return CR_OUT_OF_MEMORY
;
4703 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
4704 ulNameLength
, ulFlags
, hMachine
);
4705 if (ret
== CR_REMOVE_VETOED
)
4707 if (WideCharToMultiByte(CP_ACP
,
4718 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4724 /***********************************************************************
4725 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
4727 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
4728 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4729 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4731 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4732 HSTRING_TABLE StringTable
= NULL
;
4736 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
4737 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4740 return CR_INVALID_DEVNODE
;
4743 return CR_INVALID_FLAG
;
4745 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4746 return CR_INVALID_POINTER
;
4748 if (hMachine
!= NULL
)
4750 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4751 if (BindingHandle
== NULL
)
4754 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4755 if (StringTable
== 0)
4760 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4764 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4765 if (lpDevInst
== NULL
)
4766 return CR_INVALID_DEVNODE
;
4770 ret
= PNP_RequestDeviceEject(BindingHandle
,
4777 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4779 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4787 /***********************************************************************
4788 * CM_Request_Eject_PC [SETUPAPI.@]
4790 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
4793 return CM_Request_Eject_PC_Ex(NULL
);
4797 /***********************************************************************
4798 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
4800 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
4803 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4806 TRACE("%lx\n", hMachine
);
4808 if (hMachine
!= NULL
)
4810 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4811 if (BindingHandle
== NULL
)
4816 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4822 ret
= PNP_RequestEjectPC(BindingHandle
);
4824 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4826 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4834 /***********************************************************************
4835 * CM_Run_Detection [SETUPAPI.@]
4837 CONFIGRET WINAPI
CM_Run_Detection(
4840 TRACE("%lx\n", ulFlags
);
4841 return CM_Run_Detection_Ex(ulFlags
, NULL
);
4845 /***********************************************************************
4846 * CM_Run_Detection_Ex [SETUPAPI.@]
4848 CONFIGRET WINAPI
CM_Run_Detection_Ex(
4849 ULONG ulFlags
, HMACHINE hMachine
)
4851 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4854 TRACE("%lx %lx\n", ulFlags
, hMachine
);
4856 if (!pSetupIsUserAdmin())
4857 return CR_ACCESS_DENIED
;
4859 if (ulFlags
& ~CM_DETECT_BITS
)
4860 return CR_INVALID_FLAG
;
4862 if (hMachine
!= NULL
)
4864 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4865 if (BindingHandle
== NULL
)
4870 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4876 ret
= PNP_RunDetection(BindingHandle
,
4879 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4881 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4889 /***********************************************************************
4890 * CM_Set_DevNode_Problem [SETUPAPI.@]
4892 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
4893 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
4895 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
4896 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
4900 /***********************************************************************
4901 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
4903 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
4904 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
4906 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4907 HSTRING_TABLE StringTable
= NULL
;
4911 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
4914 return CR_INVALID_DEVNODE
;
4916 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
4917 return CR_INVALID_FLAG
;
4919 if (hMachine
!= NULL
)
4921 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4922 if (BindingHandle
== NULL
)
4925 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4926 if (StringTable
== 0)
4931 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4935 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4936 if (lpDevInst
== NULL
)
4937 return CR_INVALID_DEVNODE
;
4941 ret
= PNP_SetDeviceProblem(BindingHandle
,
4946 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4948 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4956 /***********************************************************************
4957 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
4959 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
4960 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4963 TRACE("%lx %lu %p %lx %lx\n",
4964 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
4965 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
4971 /***********************************************************************
4972 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
4974 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
4975 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4978 TRACE("%lx %lu %p %lx %lx\n",
4979 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
4980 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
4986 /***********************************************************************
4987 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
4989 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
4990 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
4991 ULONG ulFlags
, HMACHINE hMachine
)
4993 CONFIGRET ret
= CR_SUCCESS
;
4997 FIXME("%lx %lu %p %lx %lx %lx\n",
4998 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5000 if (Buffer
== NULL
&& ulLength
!= 0)
5001 return CR_INVALID_POINTER
;
5005 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5014 /* Get property type */
5017 case CM_DRP_DEVICEDESC
:
5021 case CM_DRP_HARDWAREID
:
5022 ulType
= REG_MULTI_SZ
;
5025 case CM_DRP_COMPATIBLEIDS
:
5026 ulType
= REG_MULTI_SZ
;
5029 case CM_DRP_SERVICE
:
5037 case CM_DRP_CLASSGUID
:
5045 case CM_DRP_CONFIGFLAGS
:
5053 case CM_DRP_FRIENDLYNAME
:
5057 case CM_DRP_LOCATION_INFORMATION
:
5061 case CM_DRP_UPPERFILTERS
:
5062 ulType
= REG_MULTI_SZ
;
5065 case CM_DRP_LOWERFILTERS
:
5066 ulType
= REG_MULTI_SZ
;
5070 return CR_INVALID_PROPERTY
;
5073 /* Allocate buffer if needed */
5074 if (ulType
== REG_SZ
||
5075 ulType
== REG_MULTI_SZ
)
5077 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5078 if (lpBuffer
== NULL
)
5080 ret
= CR_OUT_OF_MEMORY
;
5084 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5085 ulLength
, lpBuffer
, ulLength
))
5092 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5095 ulLength
* sizeof(WCHAR
),
5104 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5112 ret
= CR_CALL_NOT_IMPLEMENTED
;
5119 /***********************************************************************
5120 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5122 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5123 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5124 ULONG ulFlags
, HMACHINE hMachine
)
5126 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5127 HSTRING_TABLE StringTable
= NULL
;
5132 TRACE("%lx %lu %p %lx %lx %lx\n",
5133 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5136 return CR_INVALID_DEVNODE
;
5138 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5139 return CR_INVALID_PROPERTY
;
5141 if (Buffer
!= NULL
&& ulLength
== 0)
5142 return CR_INVALID_POINTER
;
5145 return CR_INVALID_FLAG
;
5147 if (hMachine
!= NULL
)
5149 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5150 if (BindingHandle
== NULL
)
5153 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5154 if (StringTable
== 0)
5159 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5163 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5164 if (lpDevInst
== NULL
)
5165 return CR_INVALID_DEVNODE
;
5169 case CM_DRP_DEVICEDESC
:
5173 case CM_DRP_HARDWAREID
:
5174 ulType
= REG_MULTI_SZ
;
5177 case CM_DRP_COMPATIBLEIDS
:
5178 ulType
= REG_MULTI_SZ
;
5181 case CM_DRP_SERVICE
:
5189 case CM_DRP_CLASSGUID
:
5197 case CM_DRP_CONFIGFLAGS
:
5205 case CM_DRP_FRIENDLYNAME
:
5209 case CM_DRP_LOCATION_INFORMATION
:
5213 case CM_DRP_UPPERFILTERS
:
5214 ulType
= REG_MULTI_SZ
;
5217 case CM_DRP_LOWERFILTERS
:
5218 ulType
= REG_MULTI_SZ
;
5222 return CR_INVALID_PROPERTY
;
5227 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5235 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5237 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5245 /***********************************************************************
5246 * CM_Set_HW_Prof [SETUPAPI.@]
5248 CONFIGRET WINAPI
CM_Set_HW_Prof(
5249 ULONG ulHardwareProfile
, ULONG ulFlags
)
5251 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5252 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5256 /***********************************************************************
5257 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5259 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5260 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5262 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5265 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5267 if (!pSetupIsUserAdmin())
5268 return CR_ACCESS_DENIED
;
5271 return CR_INVALID_FLAG
;
5273 if (hMachine
!= NULL
)
5275 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5276 if (BindingHandle
== NULL
)
5281 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5287 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5289 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5291 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5299 /***********************************************************************
5300 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5302 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5303 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5306 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5307 ulConfig
, ulValue
, ulFlags
);
5308 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5313 /***********************************************************************
5314 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5316 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5317 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5320 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5321 ulConfig
, ulValue
, ulFlags
);
5322 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5327 /***********************************************************************
5328 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5330 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5331 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5332 ULONG ulFlags
, HMACHINE hMachine
)
5334 DEVINSTID_W pszDevIdW
= NULL
;
5335 CONFIGRET ret
= CR_SUCCESS
;
5337 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5338 ulConfig
, ulValue
, ulFlags
, hMachine
);
5340 if (szDevInstName
!= NULL
)
5342 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5343 return CR_INVALID_DEVICE_ID
;
5346 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5349 if (pszDevIdW
!= NULL
)
5356 /***********************************************************************
5357 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5359 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5360 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5361 ULONG ulFlags
, HMACHINE hMachine
)
5363 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5366 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5367 ulConfig
, ulValue
, ulFlags
, hMachine
);
5369 if (szDevInstName
== NULL
)
5370 return CR_INVALID_POINTER
;
5372 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5373 return CR_INVALID_FLAG
;
5375 /* FIXME: Check whether szDevInstName is valid */
5377 if (hMachine
!= NULL
)
5379 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5380 if (BindingHandle
== NULL
)
5385 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5391 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5392 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5394 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5396 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5404 /***********************************************************************
5405 * CM_Setup_DevNode [SETUPAPI.@]
5407 CONFIGRET WINAPI
CM_Setup_DevNode(
5408 DEVINST dnDevInst
, ULONG ulFlags
)
5410 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5411 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5415 /***********************************************************************
5416 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5418 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5419 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5421 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5422 HSTRING_TABLE StringTable
= NULL
;
5426 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5428 if (!pSetupIsUserAdmin())
5429 return CR_ACCESS_DENIED
;
5432 return CR_INVALID_DEVNODE
;
5434 if (ulFlags
& ~CM_SETUP_BITS
)
5435 return CR_INVALID_FLAG
;
5437 if (hMachine
!= NULL
)
5439 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5440 if (BindingHandle
== NULL
)
5443 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5444 if (StringTable
== 0)
5449 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5453 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5454 if (lpDevInst
== NULL
)
5455 return CR_INVALID_DEVNODE
;
5459 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5465 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5467 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5475 /***********************************************************************
5476 * CM_Uninstall_DevNode [SETUPAPI.@]
5478 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5479 DEVINST dnPhantom
, ULONG ulFlags
)
5481 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5482 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5486 /***********************************************************************
5487 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5489 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5490 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5492 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5493 HSTRING_TABLE StringTable
= NULL
;
5497 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5500 return CR_INVALID_DEVNODE
;
5503 return CR_INVALID_FLAG
;
5505 if (hMachine
!= NULL
)
5507 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5508 if (BindingHandle
== NULL
)
5511 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5512 if (StringTable
== 0)
5517 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5521 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5522 if (lpDevInst
== NULL
)
5523 return CR_INVALID_DEVNODE
;
5527 ret
= PNP_UninstallDevInst(BindingHandle
,
5531 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5533 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5541 /***********************************************************************
5542 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5544 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5545 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5547 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5549 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5554 /***********************************************************************
5555 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5557 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5558 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5560 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5562 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5567 /***********************************************************************
5568 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5570 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5571 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5573 LPWSTR pszDeviceInterfaceW
= NULL
;
5576 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5578 if (pszDeviceInterface
== NULL
)
5579 return CR_INVALID_POINTER
;
5581 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5582 return CR_INVALID_DATA
;
5584 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5587 if (pszDeviceInterfaceW
!= NULL
)
5588 MyFree(pszDeviceInterfaceW
);
5594 /***********************************************************************
5595 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5597 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5598 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5600 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5603 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5605 if (pszDeviceInterface
== NULL
)
5606 return CR_INVALID_POINTER
;
5609 return CR_INVALID_FLAG
;
5611 if (hMachine
!= NULL
)
5613 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5614 if (BindingHandle
== NULL
)
5619 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5625 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
5626 (LPWSTR
)pszDeviceInterface
,
5629 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5631 ret
= RpcStatusToCmStatus(RpcExceptionCode());