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"
26 #include "rpc_private.h"
28 /* Registry key and value names */
29 static const WCHAR Backslash
[] = {'\\', 0};
30 static const WCHAR Class
[] = {'C','l','a','s','s',0};
32 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
33 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
34 'C','o','n','t','r','o','l','\\',
35 'C','l','a','s','s',0};
37 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
38 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
39 'C','o','n','t','r','o','l','\\',
40 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
42 typedef struct _MACHINE_INFO
44 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
45 RPC_BINDING_HANDLE BindingHandle
;
46 HSTRING_TABLE StringTable
;
48 } MACHINE_INFO
, *PMACHINE_INFO
;
51 typedef struct _LOG_CONF_INFO
57 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
59 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
62 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
66 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
69 lstrcpyW(&String
[1], lpString
);
72 String
[MAX_GUID_STRING_LEN
- 2] = '}';
73 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
75 RpcStringFreeW(&lpString
);
82 RpcStatusToCmStatus(RPC_STATUS Status
)
88 /***********************************************************************
89 * CMP_Init_Detection [SETUPAPI.@]
91 CONFIGRET WINAPI
CMP_Init_Detection(
94 RPC_BINDING_HANDLE BindingHandle
= NULL
;
97 TRACE("%lu\n", dwMagic
);
99 if (dwMagic
!= CMP_MAGIC
)
100 return CR_INVALID_DATA
;
102 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
107 ret
= PNP_InitDetection(BindingHandle
);
109 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
111 ret
= RpcStatusToCmStatus(RpcExceptionCode());
119 /***********************************************************************
120 * CMP_RegisterNotification [SETUPAPI.@]
124 CMP_RegisterNotification(IN HANDLE hRecipient
,
125 IN LPVOID lpvNotificationFilter
,
127 OUT PULONG pluhDevNotify
)
129 FIXME("Stub %p %p %lu %p\n", hRecipient
, lpvNotificationFilter
, dwFlags
, pluhDevNotify
);
130 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
135 /***********************************************************************
136 * CMP_Report_LogOn [SETUPAPI.@]
138 CONFIGRET WINAPI
CMP_Report_LogOn(
142 RPC_BINDING_HANDLE BindingHandle
= NULL
;
143 CONFIGRET ret
= CR_SUCCESS
;
147 TRACE("%lu\n", dwMagic
);
149 if (dwMagic
!= CMP_MAGIC
)
150 return CR_INVALID_DATA
;
152 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
155 bAdmin
= pSetupIsUserAdmin();
157 for (i
= 0; i
< 30; i
++)
161 ret
= PNP_ReportLogOn(BindingHandle
,
165 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
167 ret
= RpcStatusToCmStatus(RpcExceptionCode());
171 if (ret
== CR_SUCCESS
)
181 /***********************************************************************
182 * CMP_UnregisterNotification [SETUPAPI.@]
186 CMP_UnregisterNotification(IN HDEVNOTIFY handle
)
188 FIXME("Stub %p\n", handle
);
193 /***********************************************************************
194 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
196 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
202 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
206 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
212 /***********************************************************************
213 * CMP_WaitServicesAvailable [SETUPAPI.@]
217 CMP_WaitServicesAvailable(HMACHINE hMachine
)
219 RPC_BINDING_HANDLE BindingHandle
= NULL
;
220 CONFIGRET ret
= CR_SUCCESS
;
223 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
228 ret
= PNP_GetVersion(BindingHandle
, &Version
);
230 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
232 ret
= RpcStatusToCmStatus(RpcExceptionCode());
240 /***********************************************************************
241 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
243 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
244 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
247 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
248 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
253 /***********************************************************************
254 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
256 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
257 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
258 ULONG ulFlags
, HMACHINE hMachine
)
260 RPC_BINDING_HANDLE BindingHandle
= NULL
;
261 HSTRING_TABLE StringTable
= NULL
;
262 ULONG ulLogConfTag
= 0;
264 PLOG_CONF_INFO pLogConfInfo
;
265 CONFIGRET ret
= CR_SUCCESS
;
267 FIXME("%p %p %lu %lx %p\n",
268 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
270 if (!pSetupIsUserAdmin())
271 return CR_ACCESS_DENIED
;
273 if (plcLogConf
== NULL
)
274 return CR_INVALID_POINTER
;
277 return CR_INVALID_DEVINST
;
279 if (Priority
> 0xFFFF)
280 return CR_INVALID_PRIORITY
;
282 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
283 return CR_INVALID_FLAG
;
285 if (hMachine
!= NULL
)
287 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
288 if (BindingHandle
== NULL
)
291 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
292 if (StringTable
== 0)
297 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
301 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
302 if (lpDevInst
== NULL
)
303 return CR_INVALID_DEVNODE
;
307 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
308 &ulLogConfTag
, ulFlags
);
310 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
312 ret
= RpcStatusToCmStatus(RpcExceptionCode());
316 if (ret
== CR_SUCCESS
)
318 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
319 if (pLogConfInfo
== NULL
)
321 ret
= CR_OUT_OF_MEMORY
;
325 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
326 pLogConfInfo
->dnDevInst
= dnDevInst
;
327 pLogConfInfo
->ulFlags
= ulFlags
;
328 pLogConfInfo
->ulTag
= ulLogConfTag
;
330 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
340 /***********************************************************************
341 * CM_Add_IDA [SETUPAPI.@]
343 CONFIGRET WINAPI
CM_Add_IDA(
344 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
346 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
347 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
351 /***********************************************************************
352 * CM_Add_IDW [SETUPAPI.@]
354 CONFIGRET WINAPI
CM_Add_IDW(
355 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
357 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
358 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
362 /***********************************************************************
363 * CM_Add_ID_ExA [SETUPAPI.@]
365 CONFIGRET WINAPI
CM_Add_ID_ExA(
366 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
371 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
373 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
374 return CR_INVALID_DATA
;
376 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
384 /***********************************************************************
385 * CM_Add_ID_ExW [SETUPAPI.@]
387 CONFIGRET WINAPI
CM_Add_ID_ExW(
388 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
390 RPC_BINDING_HANDLE BindingHandle
= NULL
;
391 HSTRING_TABLE StringTable
= NULL
;
395 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
397 if (!pSetupIsUserAdmin())
398 return CR_ACCESS_DENIED
;
401 return CR_INVALID_DEVINST
;
404 return CR_INVALID_POINTER
;
406 if (ulFlags
& ~CM_ADD_ID_BITS
)
407 return CR_INVALID_FLAG
;
409 if (hMachine
!= NULL
)
411 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
412 if (BindingHandle
== NULL
)
415 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
416 if (StringTable
== 0)
421 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
425 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
426 if (lpDevInst
== NULL
)
427 return CR_INVALID_DEVNODE
;
431 ret
= PNP_AddID(BindingHandle
,
436 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
438 ret
= RpcStatusToCmStatus(RpcExceptionCode());
446 /***********************************************************************
447 * CM_Add_Res_Des [SETUPAPI.@]
449 CONFIGRET WINAPI
CM_Add_Res_Des(
450 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
451 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
453 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
454 ResourceData
, ResourceLen
, ulFlags
);
455 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
456 ResourceLen
, ulFlags
, NULL
);
460 /***********************************************************************
461 * CM_Add_Res_Des_Ex [SETUPAPI.@]
463 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
464 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
465 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
467 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
468 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
470 return CR_CALL_NOT_IMPLEMENTED
;
474 /***********************************************************************
475 * CM_Connect_MachineA [SETUPAPI.@]
477 CONFIGRET WINAPI
CM_Connect_MachineA(
478 PCSTR UNCServerName
, PHMACHINE phMachine
)
483 TRACE("%s %p\n", UNCServerName
, phMachine
);
485 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
486 return CM_Connect_MachineW(NULL
, phMachine
);
488 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
489 return CR_INVALID_DATA
;
491 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
493 MyFree(pServerNameW
);
499 /***********************************************************************
500 * CM_Connect_MachineW [SETUPAPI.@]
502 CONFIGRET WINAPI
CM_Connect_MachineW(
503 PCWSTR UNCServerName
, PHMACHINE phMachine
)
505 PMACHINE_INFO pMachine
;
507 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
509 if (phMachine
== NULL
)
510 return CR_INVALID_POINTER
;
514 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
515 if (pMachine
== NULL
)
516 return CR_OUT_OF_MEMORY
;
518 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
520 pMachine
->bLocal
= TRUE
;
522 /* FIXME: store the computers name in pMachine->szMachineName */
524 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
525 &pMachine
->StringTable
))
527 HeapFree(GetProcessHeap(), 0, pMachine
);
533 pMachine
->bLocal
= FALSE
;
534 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
536 HeapFree(GetProcessHeap(), 0, pMachine
);
537 return CR_INVALID_MACHINENAME
;
539 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
541 pMachine
->StringTable
= pSetupStringTableInitialize();
542 if (pMachine
->StringTable
== NULL
)
544 HeapFree(GetProcessHeap(), 0, pMachine
);
548 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
550 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
552 pSetupStringTableDestroy(pMachine
->StringTable
);
553 HeapFree(GetProcessHeap(), 0, pMachine
);
554 return CR_INVALID_MACHINENAME
;
558 phMachine
= (PHMACHINE
)pMachine
;
564 /***********************************************************************
565 * CM_Create_DevNodeA [SETUPAPI.@]
567 CONFIGRET WINAPI
CM_Create_DevNodeA(
568 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
571 TRACE("%p %s %p %lx\n",
572 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
573 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
578 /***********************************************************************
579 * CM_Create_DevNodeW [SETUPAPI.@]
581 CONFIGRET WINAPI
CM_Create_DevNodeW(
582 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
585 TRACE("%p %s %p %lx\n",
586 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
587 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
592 /***********************************************************************
593 * CM_Create_DevNode_ExA [SETUPAPI.@]
595 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
596 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
597 ULONG ulFlags
, HANDLE hMachine
)
599 DEVINSTID_W pDeviceIDW
;
602 TRACE("%p %s %p %lx %p\n",
603 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
605 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
606 return CR_INVALID_DATA
;
608 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
617 /***********************************************************************
618 * CM_Create_DevNode_ExW [SETUPAPI.@]
620 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
621 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
622 ULONG ulFlags
, HANDLE hMachine
)
624 RPC_BINDING_HANDLE BindingHandle
= NULL
;
625 HSTRING_TABLE StringTable
= NULL
;
626 LPWSTR lpParentDevInst
;
627 CONFIGRET ret
= CR_SUCCESS
;
628 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
630 TRACE("%p %s %p %lx %p\n",
631 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
633 if (!pSetupIsUserAdmin())
634 return CR_ACCESS_DENIED
;
636 if (pdnDevInst
== NULL
)
637 return CR_INVALID_POINTER
;
639 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
640 return CR_INVALID_DEVICE_ID
;
643 return CR_INVALID_DEVNODE
;
645 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
646 return CR_INVALID_FLAG
;
648 if (hMachine
!= NULL
)
650 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
651 if (BindingHandle
== NULL
)
654 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
655 if (StringTable
== 0)
660 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
664 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
665 if (lpParentDevInst
== NULL
)
666 return CR_INVALID_DEVNODE
;
668 wcscpy(szLocalDeviceID
, pDeviceID
);
672 ret
= PNP_CreateDevInst(BindingHandle
,
678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
680 ret
= RpcStatusToCmStatus(RpcExceptionCode());
684 if (ret
== CR_SUCCESS
)
686 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
687 * will return the generated device ID in szLocalDeviceID */
688 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
689 if (*pdnDevInst
== 0)
690 ret
= CR_NO_SUCH_DEVNODE
;
697 /***********************************************************************
698 * CM_Delete_Class_Key [SETUPAPI.@]
700 CONFIGRET WINAPI
CM_Delete_Class_Key(
701 LPGUID ClassGuid
, ULONG ulFlags
)
703 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
704 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
708 /***********************************************************************
709 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
711 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
712 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
714 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
715 RPC_BINDING_HANDLE BindingHandle
= NULL
;
718 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
720 if (ClassGuid
== NULL
)
721 return CR_INVALID_POINTER
;
723 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
724 return CR_INVALID_FLAG
;
726 if (!GuidToString(ClassGuid
, szGuidString
))
727 return CR_INVALID_DATA
;
729 if (hMachine
!= NULL
)
731 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
732 if (BindingHandle
== NULL
)
737 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
743 ret
= PNP_DeleteClassKey(BindingHandle
,
747 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
749 ret
= RpcStatusToCmStatus(RpcExceptionCode());
757 /***********************************************************************
758 * CM_Delete_DevNode_Key [SETUPAPI.@]
760 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
761 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
763 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
764 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
769 /***********************************************************************
770 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
772 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
773 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
776 FIXME("%p %lu %lx %p\n",
777 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
779 return CR_CALL_NOT_IMPLEMENTED
;
783 /***********************************************************************
784 * CM_Disable_DevNode [SETUPAPI.@]
786 CONFIGRET WINAPI
CM_Disable_DevNode(
787 DEVINST dnDevInst
, ULONG ulFlags
)
789 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
790 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
794 /***********************************************************************
795 * CM_Disable_DevNode_Ex [SETUPAPI.@]
797 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
798 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
800 RPC_BINDING_HANDLE BindingHandle
= NULL
;
801 HSTRING_TABLE StringTable
= NULL
;
805 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
807 if (!pSetupIsUserAdmin())
808 return CR_ACCESS_DENIED
;
811 return CR_INVALID_DEVINST
;
814 return CR_INVALID_FLAG
;
816 if (hMachine
!= NULL
)
818 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
819 if (BindingHandle
== NULL
)
822 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
823 if (StringTable
== 0)
828 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
832 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
833 if (lpDevInst
== NULL
)
834 return CR_INVALID_DEVNODE
;
838 ret
= PNP_DeviceInstanceAction(BindingHandle
,
844 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
846 ret
= RpcStatusToCmStatus(RpcExceptionCode());
854 /***********************************************************************
855 * CM_Disconnect_Machine [SETUPAPI.@]
857 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
859 PMACHINE_INFO pMachine
;
861 TRACE("%lx\n", hMachine
);
863 pMachine
= (PMACHINE_INFO
)hMachine
;
864 if (pMachine
== NULL
)
867 if (pMachine
->bLocal
== FALSE
)
869 if (pMachine
->StringTable
!= NULL
)
870 pSetupStringTableDestroy(pMachine
->StringTable
);
872 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
873 return CR_ACCESS_DENIED
;
876 HeapFree(GetProcessHeap(), 0, pMachine
);
882 /***********************************************************************
883 * CM_Enable_DevNode [SETUPAPI.@]
885 CONFIGRET WINAPI
CM_Enable_DevNode(
886 DEVINST dnDevInst
, ULONG ulFlags
)
888 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
889 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
893 /***********************************************************************
894 * CM_Enable_DevNode_Ex [SETUPAPI.@]
896 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
897 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
899 RPC_BINDING_HANDLE BindingHandle
= NULL
;
900 HSTRING_TABLE StringTable
= NULL
;
904 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
906 if (!pSetupIsUserAdmin())
907 return CR_ACCESS_DENIED
;
910 return CR_INVALID_DEVINST
;
913 return CR_INVALID_FLAG
;
915 if (hMachine
!= NULL
)
917 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
918 if (BindingHandle
== NULL
)
921 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
922 if (StringTable
== 0)
927 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
931 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
932 if (lpDevInst
== NULL
)
933 return CR_INVALID_DEVNODE
;
937 ret
= PNP_DeviceInstanceAction(BindingHandle
,
943 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
945 ret
= RpcStatusToCmStatus(RpcExceptionCode());
953 /***********************************************************************
954 * CM_Enumerate_Classes [SETUPAPI.@]
956 CONFIGRET WINAPI
CM_Enumerate_Classes(
957 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
959 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
960 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
964 /***********************************************************************
965 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
967 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
968 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
970 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
971 RPC_BINDING_HANDLE BindingHandle
= NULL
;
972 CONFIGRET ret
= CR_SUCCESS
;
973 ULONG ulLength
= MAX_GUID_STRING_LEN
;
975 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
977 if (ClassGuid
== NULL
)
978 return CR_INVALID_POINTER
;
981 return CR_INVALID_FLAG
;
983 if (hMachine
!= NULL
)
985 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
986 if (BindingHandle
== NULL
)
991 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
997 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1001 MAX_GUID_STRING_LEN
,
1005 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1007 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1011 if (ret
== CR_SUCCESS
)
1014 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1016 /* Convert the buffer to a GUID */
1017 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1025 /***********************************************************************
1026 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1028 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1029 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1031 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1032 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1037 /***********************************************************************
1038 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1040 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1041 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1043 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1044 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1049 /***********************************************************************
1050 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1052 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1053 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1056 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1059 CONFIGRET ret
= CR_SUCCESS
;
1061 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1064 if (Buffer
== NULL
|| pulLength
== NULL
)
1065 return CR_INVALID_POINTER
;
1068 return CR_INVALID_FLAG
;
1070 ulOrigLength
= *pulLength
;
1073 ulLength
= MAX_DEVICE_ID_LEN
;
1074 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1076 if (ret
== CR_SUCCESS
)
1078 if (WideCharToMultiByte(CP_ACP
,
1088 *pulLength
= lstrlenA(Buffer
) + 1;
1095 /***********************************************************************
1096 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1098 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1099 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1102 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1105 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1108 if (Buffer
== NULL
|| pulLength
== NULL
)
1109 return CR_INVALID_POINTER
;
1112 return CR_INVALID_FLAG
;
1114 *Buffer
= UNICODE_NULL
;
1116 if (hMachine
!= NULL
)
1118 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1119 if (BindingHandle
== NULL
)
1124 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1130 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1131 PNP_ENUMERATOR_SUBKEYS
,
1138 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1140 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1148 /***********************************************************************
1149 * CM_Free_Log_Conf [SETUPAPI.@]
1151 CONFIGRET WINAPI
CM_Free_Log_Conf(
1152 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1154 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1155 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1159 /***********************************************************************
1160 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1162 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1163 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1165 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1166 HSTRING_TABLE StringTable
= NULL
;
1168 PLOG_CONF_INFO pLogConfInfo
;
1171 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1173 if (!pSetupIsUserAdmin())
1174 return CR_ACCESS_DENIED
;
1176 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1177 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1178 return CR_INVALID_LOG_CONF
;
1181 return CR_INVALID_FLAG
;
1183 if (hMachine
!= NULL
)
1185 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1186 if (BindingHandle
== NULL
)
1189 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1190 if (StringTable
== 0)
1195 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1199 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1200 if (lpDevInst
== NULL
)
1201 return CR_INVALID_DEVNODE
;
1205 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1206 pLogConfInfo
->ulTag
, 0);
1208 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1210 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1218 /***********************************************************************
1219 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1221 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1224 PLOG_CONF_INFO pLogConfInfo
;
1226 TRACE("%lx\n", lcLogConf
);
1228 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1229 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1230 return CR_INVALID_LOG_CONF
;
1232 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1238 /***********************************************************************
1239 * CM_Free_Res_Des [SETUPAPI.@]
1241 CONFIGRET WINAPI
CM_Free_Res_Des(
1242 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1244 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1245 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1249 /***********************************************************************
1250 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1252 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1253 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1256 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1258 return CR_CALL_NOT_IMPLEMENTED
;
1262 /***********************************************************************
1263 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1265 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1268 FIXME("%p\n", rdResDes
);
1270 return CR_CALL_NOT_IMPLEMENTED
;
1274 /***********************************************************************
1275 * CM_Get_Child [SETUPAPI.@]
1277 CONFIGRET WINAPI
CM_Get_Child(
1278 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1280 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1281 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1285 /***********************************************************************
1286 * CM_Get_Child_Ex [SETUPAPI.@]
1288 CONFIGRET WINAPI
CM_Get_Child_Ex(
1289 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1291 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1292 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1293 HSTRING_TABLE StringTable
= NULL
;
1295 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1298 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1300 if (pdnDevInst
== NULL
)
1301 return CR_INVALID_POINTER
;
1304 return CR_INVALID_DEVINST
;
1307 return CR_INVALID_FLAG
;
1311 if (hMachine
!= NULL
)
1313 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1314 if (BindingHandle
== NULL
)
1317 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1318 if (StringTable
== 0)
1323 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1327 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1328 if (lpDevInst
== NULL
)
1329 return CR_INVALID_DEVNODE
;
1333 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1334 PNP_GET_CHILD_DEVICE_INSTANCE
,
1340 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1342 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1346 if (ret
!= CR_SUCCESS
)
1349 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1351 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1355 *pdnDevInst
= dwIndex
;
1361 /***********************************************************************
1362 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1364 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1365 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1367 TRACE("%p %p %p %lx\n",
1368 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1369 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1374 /***********************************************************************
1375 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1377 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1378 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1380 TRACE("%p %p %p %lx\n",
1381 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1382 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1387 /***********************************************************************
1388 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1390 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1391 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1394 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1395 CONFIGRET ret
= CR_SUCCESS
;
1399 TRACE("%p %p %p %lx %lx\n",
1400 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1402 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1403 return CR_INVALID_POINTER
;
1405 ulOrigLength
= *pulLength
;
1408 ulLength
= MAX_GUID_STRING_LEN
;
1409 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1411 if (ret
== CR_SUCCESS
)
1413 if (WideCharToMultiByte(CP_ACP
,
1423 *pulLength
= lstrlenA(pszKeyName
) + 1;
1430 /***********************************************************************
1431 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1433 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1434 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1437 TRACE("%p %p %p %lx %lx\n",
1438 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1440 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1441 return CR_INVALID_POINTER
;
1444 return CR_INVALID_FLAG
;
1446 if (*pulLength
< MAX_GUID_STRING_LEN
)
1449 return CR_BUFFER_SMALL
;
1452 if (!GuidToString(ClassGuid
, pszKeyName
))
1453 return CR_INVALID_DATA
;
1455 *pulLength
= MAX_GUID_STRING_LEN
;
1461 /***********************************************************************
1462 * CM_Get_Class_NameA [SETUPAPI.@]
1464 CONFIGRET WINAPI
CM_Get_Class_NameA(
1465 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1467 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1468 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1473 /***********************************************************************
1474 * CM_Get_Class_NameW [SETUPAPI.@]
1476 CONFIGRET WINAPI
CM_Get_Class_NameW(
1477 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1479 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1480 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1485 /***********************************************************************
1486 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1488 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1489 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1492 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1493 CONFIGRET ret
= CR_SUCCESS
;
1497 TRACE("%p %p %p %lx %lx\n",
1498 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1500 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1501 return CR_INVALID_POINTER
;
1503 ulOrigLength
= *pulLength
;
1506 ulLength
= MAX_CLASS_NAME_LEN
;
1507 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1509 if (ret
== CR_SUCCESS
)
1511 if (WideCharToMultiByte(CP_ACP
,
1521 *pulLength
= lstrlenA(Buffer
) + 1;
1528 /***********************************************************************
1529 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1532 CM_Get_Class_Name_ExW(
1533 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1536 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1537 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1540 TRACE("%p %p %p %lx %lx\n",
1541 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1543 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1544 return CR_INVALID_POINTER
;
1547 return CR_INVALID_FLAG
;
1549 if (!GuidToString(ClassGuid
, szGuidString
))
1550 return CR_INVALID_DATA
;
1552 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1554 if (hMachine
!= NULL
)
1556 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1557 if (BindingHandle
== NULL
)
1562 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1568 ret
= PNP_GetClassName(BindingHandle
,
1574 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1576 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1584 /***********************************************************************
1585 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
1587 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
1588 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1589 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1591 FIXME("%p %lu %p %p %p %lx %lx\n",
1592 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1594 return CR_CALL_NOT_IMPLEMENTED
;
1598 /***********************************************************************
1599 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
1601 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
1602 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1603 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1605 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1606 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
1608 ULONG ulTransferLength
= 0;
1611 TRACE("%p %lu %p %p %p %lx %lx\n",
1612 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1615 if (ClassGuid
== NULL
|| pulLength
== NULL
)
1616 return CR_INVALID_POINTER
;
1619 return CR_INVALID_FLAG
;
1621 if (pSetupStringFromGuid(ClassGuid
,
1623 PNP_MAX_GUID_STRING_LEN
) != 0)
1624 return CR_INVALID_DATA
;
1626 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
1627 return CR_INVALID_PROPERTY
;
1629 if (hMachine
!= NULL
)
1631 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1632 if (BindingHandle
== NULL
)
1637 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1641 ulTransferLength
= *pulLength
;
1645 ret
= PNP_GetClassRegProp(BindingHandle
,
1654 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1656 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1660 if (ret
== CR_SUCCESS
)
1662 if (pulRegDataType
!= NULL
)
1663 *pulRegDataType
= ulType
;
1670 /***********************************************************************
1671 * CM_Get_Depth [SETUPAPI.@]
1673 CONFIGRET WINAPI
CM_Get_Depth(
1674 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1676 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1677 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1681 /***********************************************************************
1682 * CM_Get_Depth_Ex [SETUPAPI.@]
1684 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1685 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1687 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1688 HSTRING_TABLE StringTable
= NULL
;
1692 TRACE("%p %lx %lx %lx\n",
1693 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1695 if (pulDepth
== NULL
)
1696 return CR_INVALID_POINTER
;
1699 return CR_INVALID_DEVINST
;
1702 return CR_INVALID_FLAG
;
1704 if (hMachine
!= NULL
)
1706 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1707 if (BindingHandle
== NULL
)
1710 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1711 if (StringTable
== 0)
1716 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1720 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1721 if (lpDevInst
== NULL
)
1722 return CR_INVALID_DEVNODE
;
1726 ret
= PNP_GetDepth(BindingHandle
,
1731 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1733 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1741 /***********************************************************************
1742 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
1744 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
1745 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1746 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1748 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
1749 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1750 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
1751 pulRegDataType
, Buffer
,
1752 pulLength
, ulFlags
, NULL
);
1756 /***********************************************************************
1757 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
1759 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
1760 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1761 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1763 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
1764 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1765 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
1766 pulRegDataType
, Buffer
,
1767 pulLength
, ulFlags
, NULL
);
1771 /***********************************************************************
1772 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
1774 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
1775 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1776 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1778 LPWSTR pszPropertyNameW
= NULL
;
1781 ULONG ulDataType
= REG_NONE
;
1784 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
1785 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
1788 return CR_INVALID_POINTER
;
1790 ulLengthW
= *pulLength
* sizeof(WCHAR
);
1791 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
1793 return CR_OUT_OF_MEMORY
;
1795 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
1797 if (pszPropertyNameW
== NULL
)
1799 HeapFree(GetProcessHeap(), 0, BufferW
);
1800 return CR_OUT_OF_MEMORY
;
1803 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
1810 if (ret
== CR_SUCCESS
)
1812 if (ulDataType
== REG_SZ
||
1813 ulDataType
== REG_EXPAND_SZ
||
1814 ulDataType
== REG_MULTI_SZ
)
1816 /* Do W->A conversion */
1817 *pulLength
= WideCharToMultiByte(CP_ACP
,
1820 lstrlenW(BufferW
) + 1,
1825 if (*pulLength
== 0)
1830 /* Directly copy the value */
1831 if (ulLengthW
<= *pulLength
)
1832 memcpy(Buffer
, BufferW
, ulLengthW
);
1835 *pulLength
= ulLengthW
;
1836 ret
= CR_BUFFER_SMALL
;
1842 *pulRegDataType
= ulDataType
;
1844 HeapFree(GetProcessHeap(), 0, BufferW
);
1845 MyFree(pszPropertyNameW
);
1851 /***********************************************************************
1852 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
1854 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
1855 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1856 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1858 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1859 HSTRING_TABLE StringTable
= NULL
;
1861 ULONG ulDataType
= REG_NONE
;
1862 ULONG ulTransferLength
;
1863 CONFIGRET ret
= CR_SUCCESS
;
1865 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
1866 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
1867 pulLength
, ulFlags
, hMachine
);
1870 return CR_INVALID_DEVNODE
;
1872 if (pszCustomPropertyName
== NULL
||
1873 pulLength
== NULL
||
1875 return CR_INVALID_POINTER
;
1877 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
1878 return CR_INVALID_FLAG
;
1880 if (hMachine
!= NULL
)
1882 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1883 if (BindingHandle
== NULL
)
1886 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1887 if (StringTable
== 0)
1892 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1896 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1897 if (lpDevInst
== NULL
)
1898 return CR_INVALID_DEVNODE
;
1900 ulTransferLength
= *pulLength
;
1904 ret
= PNP_GetCustomDevProp(BindingHandle
,
1906 (LPWSTR
)pszCustomPropertyName
,
1913 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1915 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1919 if (ret
== CR_SUCCESS
)
1921 if (pulRegDataType
!= NULL
)
1922 *pulRegDataType
= ulDataType
;
1929 /***********************************************************************
1930 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1932 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1933 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1934 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1936 TRACE("%lx %lu %p %p %p %lx\n",
1937 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1939 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1940 pulRegDataType
, Buffer
,
1941 pulLength
, ulFlags
, NULL
);
1945 /***********************************************************************
1946 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1948 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1949 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1950 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1952 TRACE("%lx %lu %p %p %p %lx\n",
1953 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1955 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1956 pulRegDataType
, Buffer
,
1957 pulLength
, ulFlags
, NULL
);
1961 /***********************************************************************
1962 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1964 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1965 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1966 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1970 ULONG ulDataType
= REG_NONE
;
1973 TRACE("%lx %lu %p %p %p %lx %lx\n",
1974 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1978 return CR_INVALID_POINTER
;
1980 LengthW
= *pulLength
* sizeof(WCHAR
);
1981 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1984 return CR_OUT_OF_MEMORY
;
1986 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1994 if (ret
== CR_SUCCESS
)
1996 if (ulDataType
== REG_SZ
||
1997 ulDataType
== REG_EXPAND_SZ
||
1998 ulDataType
== REG_MULTI_SZ
)
2000 /* Do W->A conversion */
2001 *pulLength
= WideCharToMultiByte(CP_ACP
,
2004 lstrlenW(BufferW
) + 1,
2009 if (*pulLength
== 0)
2014 /* Directly copy the value */
2015 if (LengthW
<= *pulLength
)
2016 memcpy(Buffer
, BufferW
, LengthW
);
2019 *pulLength
= LengthW
;
2020 ret
= CR_BUFFER_SMALL
;
2026 *pulRegDataType
= ulDataType
;
2028 HeapFree(GetProcessHeap(), 0, BufferW
);
2034 /***********************************************************************
2035 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2037 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2038 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2039 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2041 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2042 HSTRING_TABLE StringTable
= NULL
;
2043 CONFIGRET ret
= CR_SUCCESS
;
2045 ULONG ulDataType
= REG_NONE
;
2046 ULONG ulTransferLength
= 0;
2048 TRACE("%lx %lu %p %p %p %lx %lx\n",
2049 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2053 return CR_INVALID_DEVNODE
;
2055 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2056 return CR_INVALID_PROPERTY
;
2058 /* pulRegDataType is optional */
2060 /* Buffer is optional */
2062 if (pulLength
== NULL
)
2063 return CR_INVALID_POINTER
;
2065 if (*pulLength
== 0)
2066 return CR_INVALID_POINTER
;
2069 return CR_INVALID_FLAG
;
2071 if (hMachine
!= NULL
)
2073 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2074 if (BindingHandle
== NULL
)
2077 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2078 if (StringTable
== 0)
2083 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2087 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2088 if (lpDevInst
== NULL
)
2089 return CR_INVALID_DEVNODE
;
2091 ulTransferLength
= *pulLength
;
2095 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2104 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2106 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2110 if (ret
== CR_SUCCESS
)
2112 if (pulRegDataType
!= NULL
)
2113 *pulRegDataType
= ulDataType
;
2120 /***********************************************************************
2121 * CM_Get_DevNode_Status [SETUPAPI.@]
2123 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2124 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2127 TRACE("%p %p %lx %lx\n",
2128 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2129 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2134 /***********************************************************************
2135 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2138 CM_Get_DevNode_Status_Ex(
2139 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2140 ULONG ulFlags
, HMACHINE hMachine
)
2142 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2143 HSTRING_TABLE StringTable
= NULL
;
2147 TRACE("%p %p %lx %lx %lx\n",
2148 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2150 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2151 return CR_INVALID_POINTER
;
2154 return CR_INVALID_DEVINST
;
2157 return CR_INVALID_FLAG
;
2159 if (hMachine
!= NULL
)
2161 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2162 if (BindingHandle
== NULL
)
2165 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2166 if (StringTable
== 0)
2171 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2175 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2176 if (lpDevInst
== NULL
)
2177 return CR_INVALID_DEVNODE
;
2181 ret
= PNP_GetDeviceStatus(BindingHandle
,
2187 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2189 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2197 /***********************************************************************
2198 * CM_Get_Device_IDA [SETUPAPI.@]
2200 CONFIGRET WINAPI
CM_Get_Device_IDA(
2201 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2203 TRACE("%lx %p %ld %ld\n",
2204 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2205 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2209 /***********************************************************************
2210 * CM_Get_Device_IDW [SETUPAPI.@]
2212 CONFIGRET WINAPI
CM_Get_Device_IDW(
2213 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2215 TRACE("%lx %p %ld %ld\n",
2216 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2217 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2221 /***********************************************************************
2222 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2224 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2225 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2228 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2229 CONFIGRET ret
= CR_SUCCESS
;
2231 TRACE("%lx %p %ld %ld %lx\n",
2232 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2235 return CR_INVALID_POINTER
;
2237 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2242 if (ret
== CR_SUCCESS
)
2244 if (WideCharToMultiByte(CP_ACP
,
2247 lstrlenW(szBufferW
) + 1,
2259 /***********************************************************************
2260 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2262 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2263 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2266 HSTRING_TABLE StringTable
= NULL
;
2268 TRACE("%lx %p %ld %ld %lx\n",
2269 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2272 return CR_INVALID_DEVINST
;
2275 return CR_INVALID_POINTER
;
2278 return CR_INVALID_FLAG
;
2280 if (hMachine
!= NULL
)
2282 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2283 if (StringTable
== NULL
)
2288 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2292 if (!pSetupStringTableStringFromIdEx(StringTable
,
2302 /***********************************************************************
2303 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2305 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2306 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2308 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2309 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2314 /***********************************************************************
2315 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2317 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2318 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2320 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2321 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2326 /***********************************************************************
2327 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2329 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2330 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2333 LPWSTR BufferW
= NULL
;
2334 LPWSTR pszFilterW
= NULL
;
2335 CONFIGRET ret
= CR_SUCCESS
;
2337 TRACE("%p %p %ld %ld %lx\n",
2338 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2340 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2341 if (BufferW
== NULL
)
2342 return CR_OUT_OF_MEMORY
;
2344 if (pszFilter
== NULL
)
2346 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2354 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2356 ret
= CR_INVALID_DEVICE_ID
;
2360 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2369 if (WideCharToMultiByte(CP_ACP
,
2372 lstrlenW(BufferW
) + 1,
2386 /***********************************************************************
2387 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2389 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2390 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2393 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2396 TRACE("%p %p %ld %ld %lx\n",
2397 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2399 if (Buffer
== NULL
|| BufferLen
== 0)
2400 return CR_INVALID_POINTER
;
2402 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2403 return CR_INVALID_FLAG
;
2405 if (hMachine
!= NULL
)
2407 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2408 if (BindingHandle
== NULL
)
2413 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2421 ret
= PNP_GetDeviceList(BindingHandle
,
2427 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2429 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2437 /***********************************************************************
2438 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2440 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2441 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2443 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2444 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2448 /***********************************************************************
2449 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2451 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2452 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2454 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2455 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2459 /***********************************************************************
2460 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2462 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2463 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2465 LPWSTR pszFilterW
= NULL
;
2466 CONFIGRET ret
= CR_SUCCESS
;
2468 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2470 if (pszFilter
== NULL
)
2472 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2479 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2480 return CR_INVALID_DEVICE_ID
;
2482 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2494 /***********************************************************************
2495 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2497 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2498 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2500 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2503 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2506 return CR_INVALID_POINTER
;
2508 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2509 return CR_INVALID_FLAG
;
2511 if (hMachine
!= NULL
)
2513 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2514 if (BindingHandle
== NULL
)
2519 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2527 ret
= PNP_GetDeviceListSize(BindingHandle
,
2532 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2534 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2542 /***********************************************************************
2543 * CM_Get_Device_ID_Size [SETUPAPI.@]
2545 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2546 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2548 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2549 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2553 /***********************************************************************
2554 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2556 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2557 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2559 HSTRING_TABLE StringTable
= NULL
;
2562 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2565 return CR_INVALID_POINTER
;
2568 return CR_INVALID_DEVINST
;
2571 return CR_INVALID_FLAG
;
2573 if (hMachine
!= NULL
)
2575 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2576 if (StringTable
== NULL
)
2581 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2585 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2586 if (DeviceId
== NULL
)
2592 *pulLen
= lstrlenW(DeviceId
);
2598 /***********************************************************************
2599 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2601 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2602 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2603 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2605 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2606 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2608 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2609 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2614 /***********************************************************************
2615 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2617 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2618 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2619 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2621 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2622 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2624 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2625 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2630 /***********************************************************************
2631 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2633 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2634 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2635 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2637 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2638 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2640 return CR_CALL_NOT_IMPLEMENTED
;
2644 /***********************************************************************
2645 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2647 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2648 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2649 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2651 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2652 ULONG ulTransferLength
;
2653 CONFIGRET ret
= CR_SUCCESS
;
2655 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2656 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2658 if (pszDeviceInterface
== NULL
||
2659 AliasInterfaceGuid
== NULL
||
2660 pszAliasDeviceInterface
== NULL
||
2662 return CR_INVALID_POINTER
;
2665 return CR_INVALID_FLAG
;
2667 if (hMachine
!= NULL
)
2669 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2670 if (BindingHandle
== NULL
)
2675 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2679 ulTransferLength
= *pulLength
;
2683 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2684 (LPWSTR
)pszDeviceInterface
,
2686 pszAliasDeviceInterface
,
2691 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2693 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2701 /***********************************************************************
2702 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2704 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2705 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2706 ULONG BufferLen
, ULONG ulFlags
)
2708 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2709 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2711 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2712 Buffer
, BufferLen
, ulFlags
, NULL
);
2716 /***********************************************************************
2717 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2719 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2720 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2721 ULONG BufferLen
, ULONG ulFlags
)
2723 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2724 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2726 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2727 Buffer
, BufferLen
, ulFlags
, NULL
);
2731 /***********************************************************************
2732 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2734 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2735 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2736 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2738 DEVINSTID_W pDeviceIdW
= NULL
;
2739 PWCHAR BufferW
= NULL
;
2740 CONFIGRET ret
= CR_SUCCESS
;
2742 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2743 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2745 if (Buffer
== NULL
||
2747 return CR_INVALID_POINTER
;
2749 if (pDeviceID
!= NULL
)
2751 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2752 return CR_INVALID_DEVICE_ID
;
2755 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2756 if (BufferW
== NULL
)
2758 ret
= CR_OUT_OF_MEMORY
;
2762 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2763 BufferW
, BufferLen
, ulFlags
,
2765 if (ret
!= CR_SUCCESS
)
2768 if (WideCharToMultiByte(CP_ACP
,
2771 lstrlenW(BufferW
) + 1,
2779 if (BufferW
!= NULL
)
2782 if (pDeviceIdW
!= NULL
)
2789 /***********************************************************************
2790 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2792 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2793 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2794 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2796 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2797 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2798 CONFIGRET ret
= CR_SUCCESS
;
2800 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2801 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2803 if (Buffer
== NULL
||
2805 return CR_INVALID_POINTER
;
2807 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2808 return CR_INVALID_FLAG
;
2810 if (hMachine
!= NULL
)
2812 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2813 if (BindingHandle
== NULL
)
2818 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2823 BufferSize
= BufferLen
;
2827 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2834 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2836 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2844 /***********************************************************************
2845 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2847 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2848 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2851 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2852 pDeviceId
, ulFlags
);
2854 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2855 pDeviceId
, ulFlags
, NULL
);
2859 /***********************************************************************
2860 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2862 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2863 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2866 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2867 debugstr_w(pDeviceId
), ulFlags
);
2869 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2870 pDeviceId
, ulFlags
, NULL
);
2874 /***********************************************************************
2875 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2877 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2878 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2879 ULONG ulFlags
, HMACHINE hMachine
)
2881 DEVINSTID_W pDeviceIdW
= NULL
;
2882 CONFIGRET ret
= CR_SUCCESS
;
2884 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2885 pDeviceId
, ulFlags
, hMachine
);
2888 return CR_INVALID_POINTER
;
2890 if (pDeviceId
!= NULL
)
2892 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2893 return CR_INVALID_DEVICE_ID
;
2898 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2899 pDeviceIdW
, ulFlags
, hMachine
);
2901 if (pDeviceIdW
!= NULL
)
2908 /***********************************************************************
2909 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2911 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2912 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2913 ULONG ulFlags
, HMACHINE hMachine
)
2915 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2916 CONFIGRET ret
= CR_SUCCESS
;
2918 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2919 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2922 return CR_INVALID_POINTER
;
2924 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2925 return CR_INVALID_FLAG
;
2927 if (hMachine
!= NULL
)
2929 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2930 if (BindingHandle
== NULL
)
2935 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2943 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2949 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2951 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2959 /***********************************************************************
2960 * CM_Get_First_Log_Conf [SETUPAPI.@]
2962 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2963 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2965 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2966 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2970 /***********************************************************************
2971 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2973 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2974 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2976 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2977 HSTRING_TABLE StringTable
= NULL
;
2978 LPWSTR lpDevInst
= NULL
;
2979 CONFIGRET ret
= CR_SUCCESS
;
2981 PLOG_CONF_INFO pLogConfInfo
;
2983 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2986 return CR_INVALID_DEVINST
;
2988 if (ulFlags
& ~LOG_CONF_BITS
)
2989 return CR_INVALID_FLAG
;
2994 if (hMachine
!= NULL
)
2996 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2997 if (BindingHandle
== NULL
)
3000 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3001 if (StringTable
== 0)
3006 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3010 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3011 if (lpDevInst
== NULL
)
3012 return CR_INVALID_DEVNODE
;
3016 ret
= PNP_GetFirstLogConf(BindingHandle
,
3022 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3024 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3028 if (ret
!= CR_SUCCESS
)
3033 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3034 if (pLogConfInfo
== NULL
)
3035 return CR_OUT_OF_MEMORY
;
3037 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3038 pLogConfInfo
->dnDevInst
= dnDevInst
;
3039 pLogConfInfo
->ulFlags
= ulFlags
;
3040 pLogConfInfo
->ulTag
= ulTag
;
3042 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3049 /***********************************************************************
3050 * CM_Get_Global_State [SETUPAPI.@]
3052 CONFIGRET WINAPI
CM_Get_Global_State(
3053 PULONG pulState
, ULONG ulFlags
)
3055 TRACE("%p %lx\n", pulState
, ulFlags
);
3056 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3060 /***********************************************************************
3061 * CM_Get_Global_State_Ex [SETUPAPI.@]
3063 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3064 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3066 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3069 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3071 if (pulState
== NULL
)
3072 return CR_INVALID_POINTER
;
3075 return CR_INVALID_FLAG
;
3077 if (hMachine
!= NULL
)
3079 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3080 if (BindingHandle
== NULL
)
3085 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3091 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3093 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3095 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3103 /***********************************************************************
3104 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3106 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3107 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3110 TRACE("%s %lu %p %lx\n", szDevInstName
,
3111 ulHardwareProfile
, pulValue
, ulFlags
);
3113 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3114 pulValue
, ulFlags
, NULL
);
3118 /***********************************************************************
3119 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3121 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3122 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3125 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3126 ulHardwareProfile
, pulValue
, ulFlags
);
3128 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3129 pulValue
, ulFlags
, NULL
);
3133 /***********************************************************************
3134 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3136 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3137 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3138 ULONG ulFlags
, HMACHINE hMachine
)
3140 DEVINSTID_W pszDevIdW
= NULL
;
3141 CONFIGRET ret
= CR_SUCCESS
;
3143 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3144 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3146 if (szDevInstName
!= NULL
)
3148 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3149 return CR_INVALID_DEVICE_ID
;
3152 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3153 pulValue
, ulFlags
, hMachine
);
3155 if (pszDevIdW
!= NULL
)
3162 /***********************************************************************
3163 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3165 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3166 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3167 ULONG ulFlags
, HMACHINE hMachine
)
3169 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3172 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3173 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3175 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3176 return CR_INVALID_POINTER
;
3179 return CR_INVALID_FLAG
;
3181 /* FIXME: Check whether szDevInstName is valid */
3183 if (hMachine
!= NULL
)
3185 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3186 if (BindingHandle
== NULL
)
3191 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3197 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3198 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3200 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3202 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3210 /***********************************************************************
3211 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3213 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3214 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3216 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3218 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3223 /***********************************************************************
3224 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3226 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3227 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3229 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3231 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3236 /***********************************************************************
3237 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3239 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3240 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3243 HWPROFILEINFO_W LocalProfileInfo
;
3246 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3248 if (pHWProfileInfo
== NULL
)
3249 return CR_INVALID_POINTER
;
3251 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3253 if (ret
== CR_SUCCESS
)
3255 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3256 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3258 if (WideCharToMultiByte(CP_ACP
,
3260 LocalProfileInfo
.HWPI_szFriendlyName
,
3261 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3262 pHWProfileInfo
->HWPI_szFriendlyName
,
3273 /***********************************************************************
3274 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3276 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3277 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3280 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3283 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3285 if (pHWProfileInfo
== NULL
)
3286 return CR_INVALID_POINTER
;
3289 return CR_INVALID_FLAG
;
3291 if (hMachine
!= NULL
)
3293 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3294 if (BindingHandle
== NULL
)
3299 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3305 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3306 sizeof(HWPROFILEINFO_W
), 0);
3308 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3310 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3318 /***********************************************************************
3319 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3321 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3322 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3324 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3325 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3329 /***********************************************************************
3330 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3332 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3333 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3336 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3337 HSTRING_TABLE StringTable
= NULL
;
3338 PLOG_CONF_INFO pLogConfInfo
;
3342 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3344 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3345 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3346 return CR_INVALID_LOG_CONF
;
3348 if (pPriority
== NULL
)
3349 return CR_INVALID_POINTER
;
3352 return CR_INVALID_FLAG
;
3354 if (hMachine
!= NULL
)
3356 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3357 if (BindingHandle
== NULL
)
3360 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3361 if (StringTable
== 0)
3366 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3370 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3371 if (lpDevInst
== NULL
)
3372 return CR_INVALID_DEVNODE
;
3376 ret
= PNP_GetLogConfPriority(BindingHandle
,
3378 pLogConfInfo
->ulFlags
,
3379 pLogConfInfo
->ulTag
,
3383 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3385 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3393 /***********************************************************************
3394 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3396 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3397 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3399 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3400 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3404 /***********************************************************************
3405 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3407 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3408 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3411 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3412 HSTRING_TABLE StringTable
= NULL
;
3413 PLOG_CONF_INFO pLogConfInfo
;
3414 PLOG_CONF_INFO pNewLogConfInfo
;
3419 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3424 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3425 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3426 return CR_INVALID_LOG_CONF
;
3429 return CR_INVALID_FLAG
;
3431 if (hMachine
!= NULL
)
3433 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3434 if (BindingHandle
== NULL
)
3437 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3438 if (StringTable
== 0)
3443 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3447 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3448 if (lpDevInst
== NULL
)
3449 return CR_INVALID_DEVNODE
;
3453 ret
= PNP_GetNextLogConf(BindingHandle
,
3455 pLogConfInfo
->ulFlags
,
3456 pLogConfInfo
->ulTag
,
3460 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3462 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3466 if (ret
!= CR_SUCCESS
)
3471 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3472 if (pNewLogConfInfo
== NULL
)
3473 return CR_OUT_OF_MEMORY
;
3475 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3476 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3477 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3478 pNewLogConfInfo
->ulTag
= ulNewTag
;
3480 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3487 /***********************************************************************
3488 * CM_Get_Next_Re_Des [SETUPAPI.@]
3490 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3491 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3492 PRESOURCEID pResourceID
, ULONG ulFlags
)
3494 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3495 pResourceID
, ulFlags
);
3496 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3497 pResourceID
, ulFlags
, NULL
);
3501 /***********************************************************************
3502 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3504 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3505 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3506 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3508 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3509 pResourceID
, ulFlags
, hMachine
);
3511 return CR_CALL_NOT_IMPLEMENTED
;
3515 /***********************************************************************
3516 * CM_Get_Parent [SETUPAPI.@]
3518 CONFIGRET WINAPI
CM_Get_Parent(
3519 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3521 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3522 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3526 /***********************************************************************
3527 * CM_Get_Parent_Ex [SETUPAPI.@]
3529 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3530 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3532 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3533 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3534 HSTRING_TABLE StringTable
= NULL
;
3536 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3539 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3541 if (pdnDevInst
== NULL
)
3542 return CR_INVALID_POINTER
;
3545 return CR_INVALID_DEVINST
;
3548 return CR_INVALID_FLAG
;
3552 if (hMachine
!= NULL
)
3554 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3555 if (BindingHandle
== NULL
)
3558 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3559 if (StringTable
== 0)
3564 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3568 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3569 if (lpDevInst
== NULL
)
3570 return CR_INVALID_DEVNODE
;
3574 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3575 PNP_GET_PARENT_DEVICE_INSTANCE
,
3581 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3583 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3587 if (ret
!= CR_SUCCESS
)
3590 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3592 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3596 *pdnDevInst
= dwIndex
;
3602 /***********************************************************************
3603 * CM_Get_Res_Des_Data [SETUPAPI.@]
3605 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3606 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3608 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3609 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3613 /***********************************************************************
3614 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3616 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3617 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3620 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3621 return CR_CALL_NOT_IMPLEMENTED
;
3625 /***********************************************************************
3626 * CM_Get_Res_Des_Size [SETUPAPI.@]
3628 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3629 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3631 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3632 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3636 /***********************************************************************
3637 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3639 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3640 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3642 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3643 return CR_CALL_NOT_IMPLEMENTED
;
3647 /***********************************************************************
3648 * CM_Get_Sibling [SETUPAPI.@]
3650 CONFIGRET WINAPI
CM_Get_Sibling(
3651 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3653 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3654 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3658 /***********************************************************************
3659 * CM_Get_Sibling_Ex [SETUPAPI.@]
3661 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3662 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3664 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3665 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3666 HSTRING_TABLE StringTable
= NULL
;
3668 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3671 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3673 if (pdnDevInst
== NULL
)
3674 return CR_INVALID_POINTER
;
3677 return CR_INVALID_DEVINST
;
3680 return CR_INVALID_FLAG
;
3684 if (hMachine
!= NULL
)
3686 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3687 if (BindingHandle
== NULL
)
3690 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3691 if (StringTable
== 0)
3696 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3700 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3701 if (lpDevInst
== NULL
)
3702 return CR_INVALID_DEVNODE
;
3706 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3707 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3713 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3715 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3719 if (ret
!= CR_SUCCESS
)
3722 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3724 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3728 *pdnDevInst
= dwIndex
;
3734 /***********************************************************************
3735 * CM_Get_Version [SETUPAPI.@]
3737 WORD WINAPI
CM_Get_Version(VOID
)
3740 return CM_Get_Version_Ex(NULL
);
3744 /***********************************************************************
3745 * CM_Get_Version_Ex [SETUPAPI.@]
3747 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3749 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3753 TRACE("%lx\n", hMachine
);
3755 if (hMachine
!= NULL
)
3757 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3758 if (BindingHandle
== NULL
)
3763 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3769 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3771 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3773 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3777 if (ret
!= CR_SUCCESS
)
3784 /***********************************************************************
3785 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3787 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3790 TRACE("%p\n", pbPresent
);
3791 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3795 /***********************************************************************
3796 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3798 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3799 PBOOL pbPresent
, HMACHINE hMachine
)
3801 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3804 TRACE("%p %lx\n", pbPresent
, hMachine
);
3806 if (pbPresent
== NULL
)
3807 return CR_INVALID_POINTER
;
3811 if (hMachine
!= NULL
)
3813 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3814 if (BindingHandle
== NULL
)
3819 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3825 ret
= PNP_IsDockStationPresent(BindingHandle
,
3828 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3830 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3838 /***********************************************************************
3839 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3841 BOOL WINAPI
CM_Is_Version_Available(
3844 TRACE("%hu\n", wVersion
);
3845 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3849 /***********************************************************************
3850 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3852 BOOL WINAPI
CM_Is_Version_Available_Ex(
3853 WORD wVersion
, HMACHINE hMachine
)
3855 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3856 WORD wServerVersion
;
3859 TRACE("%hu %lx\n", wVersion
, hMachine
);
3861 if (wVersion
<= 0x400)
3864 if (hMachine
!= NULL
)
3866 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3867 if (BindingHandle
== NULL
)
3872 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3878 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3880 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3882 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3886 if (ret
!= CR_SUCCESS
)
3889 return (wServerVersion
>= wVersion
);
3893 /***********************************************************************
3894 * CM_Locate_DevNodeA [SETUPAPI.@]
3896 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3897 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3899 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3900 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3904 /***********************************************************************
3905 * CM_Locate_DevNodeW [SETUPAPI.@]
3907 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3908 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3910 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3911 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3915 /***********************************************************************
3916 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3918 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3919 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3921 DEVINSTID_W pDevIdW
= NULL
;
3922 CONFIGRET ret
= CR_SUCCESS
;
3924 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3926 if (pDeviceID
!= NULL
)
3928 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3929 return CR_INVALID_DEVICE_ID
;
3932 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3934 if (pDevIdW
!= NULL
)
3941 /***********************************************************************
3942 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3944 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3945 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3947 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3948 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3949 HSTRING_TABLE StringTable
= NULL
;
3950 CONFIGRET ret
= CR_SUCCESS
;
3952 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3954 if (pdnDevInst
== NULL
)
3955 return CR_INVALID_POINTER
;
3957 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3958 return CR_INVALID_FLAG
;
3960 if (hMachine
!= NULL
)
3962 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3963 if (BindingHandle
== NULL
)
3966 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3967 if (StringTable
== 0)
3972 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3976 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3978 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3984 /* Get the root device ID */
3985 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3989 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3991 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3995 if (ret
!= CR_SUCCESS
)
3998 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4002 /* Validate the device ID */
4003 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4007 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4009 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4013 if (ret
== CR_SUCCESS
)
4015 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4016 if (*pdnDevInst
== -1)
4024 /***********************************************************************
4025 * CM_Modify_Res_Des [SETUPAPI.@]
4027 CONFIGRET WINAPI
CM_Modify_Res_Des(
4028 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
4029 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
4031 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4032 ResourceLen
, ulFlags
);
4033 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4034 ResourceLen
, ulFlags
, NULL
);
4038 /***********************************************************************
4039 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4041 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
4042 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
4043 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
4045 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4046 ResourceLen
, ulFlags
, hMachine
);
4047 return CR_CALL_NOT_IMPLEMENTED
;
4051 /***********************************************************************
4052 * CM_Move_DevNode [SETUPAPI.@]
4054 CONFIGRET WINAPI
CM_Move_DevNode(
4055 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
4057 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
4058 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4062 /***********************************************************************
4063 * CM_Move_DevNode_Ex [SETUPAPI.@]
4065 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
4066 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
4069 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4070 HSTRING_TABLE StringTable
= NULL
;
4071 LPWSTR lpFromDevInst
;
4075 FIXME("%lx %lx %lx %lx\n",
4076 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4078 if (!pSetupIsUserAdmin())
4079 return CR_ACCESS_DENIED
;
4081 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4082 return CR_INVALID_DEVNODE
;
4085 return CR_INVALID_FLAG
;
4087 if (hMachine
!= NULL
)
4089 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4090 if (BindingHandle
== NULL
)
4093 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4094 if (StringTable
== 0)
4099 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4103 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4104 if (lpFromDevInst
== NULL
)
4105 return CR_INVALID_DEVNODE
;
4107 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4108 if (lpToDevInst
== NULL
)
4109 return CR_INVALID_DEVNODE
;
4113 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4119 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4121 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4129 /***********************************************************************
4130 * CM_Open_Class_KeyA [SETUPAPI.@]
4132 CONFIGRET WINAPI
CM_Open_Class_KeyA(
4133 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4134 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4136 TRACE("%p %s %lx %lx %p %lx\n",
4137 debugstr_guid(pClassGuid
), pszClassName
,
4138 samDesired
, Disposition
, phkClass
, ulFlags
);
4140 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4141 Disposition
, phkClass
, ulFlags
, NULL
);
4145 /***********************************************************************
4146 * CM_Open_Class_KeyW [SETUPAPI.@]
4148 CONFIGRET WINAPI
CM_Open_Class_KeyW(
4149 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4150 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4152 TRACE("%p %s %lx %lx %p %lx\n",
4153 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4154 samDesired
, Disposition
, phkClass
, ulFlags
);
4156 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4157 Disposition
, phkClass
, ulFlags
, NULL
);
4161 /***********************************************************************
4162 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4164 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
4165 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4166 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4169 LPWSTR pszClassNameW
= NULL
;
4172 TRACE("%p %s %lx %lx %p %lx %lx\n",
4173 debugstr_guid(pClassGuid
), pszClassName
,
4174 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4176 if (pszClassName
!= NULL
)
4178 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4179 return CR_INVALID_DATA
;
4182 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4183 Disposition
, phkClass
, ulFlags
, hMachine
);
4185 if (pszClassNameW
!= NULL
)
4186 MyFree(pszClassNameW
);
4192 /***********************************************************************
4193 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4195 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
4196 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4197 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4200 WCHAR szKeyName
[MAX_PATH
];
4201 LPWSTR lpGuidString
;
4202 DWORD dwDisposition
;
4206 TRACE("%p %s %lx %lx %p %lx %lx\n",
4207 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4208 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4210 /* Check Disposition and ulFlags */
4211 if ((Disposition
& ~RegDisposition_Bits
) ||
4212 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
4213 return CR_INVALID_FLAG
;
4215 /* Check phkClass */
4216 if (phkClass
== NULL
)
4217 return CR_INVALID_POINTER
;
4221 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
4222 pszClassName
!= NULL
)
4223 return CR_INVALID_DATA
;
4225 if (hMachine
== NULL
)
4227 hKey
= HKEY_LOCAL_MACHINE
;
4231 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
4232 HKEY_LOCAL_MACHINE
, &hKey
))
4233 return CR_REGISTRY_ERROR
;
4236 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
4238 lstrcpyW(szKeyName
, DeviceClasses
);
4242 lstrcpyW(szKeyName
, ControlClass
);
4245 if (pClassGuid
!= NULL
)
4247 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
4250 return CR_INVALID_DATA
;
4253 lstrcatW(szKeyName
, Backslash
);
4254 lstrcatW(szKeyName
, lpGuidString
);
4257 if (Disposition
== RegDisposition_OpenAlways
)
4259 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
4260 NULL
, phkClass
, &dwDisposition
);
4264 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
4269 if (pClassGuid
!= NULL
)
4270 RpcStringFreeW(&lpGuidString
);
4272 if (dwError
!= ERROR_SUCCESS
)
4275 return CR_NO_SUCH_REGISTRY_KEY
;
4278 if (pszClassName
!= NULL
)
4280 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
4281 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
4288 /***********************************************************************
4289 * CM_Open_DevNode_Key [SETUPAPI.@]
4291 CONFIGRET WINAPI
CM_Open_DevNode_Key(
4292 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4293 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
4295 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
4296 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
4297 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
4298 Disposition
, phkDevice
, ulFlags
, NULL
);
4302 /***********************************************************************
4303 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
4305 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
4306 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4307 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4310 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4311 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4313 return CR_CALL_NOT_IMPLEMENTED
;
4317 /***********************************************************************
4318 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4320 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4321 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4322 ULONG ulNameLength
, ULONG ulFlags
)
4324 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4325 ulNameLength
, ulFlags
);
4327 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4328 ulNameLength
, ulFlags
, NULL
);
4332 /***********************************************************************
4333 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4335 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4336 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4337 ULONG ulNameLength
, ULONG ulFlags
)
4339 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4340 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4342 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4343 ulNameLength
, ulFlags
, NULL
);
4347 /***********************************************************************
4348 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4350 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4351 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4352 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4354 LPWSTR lpLocalVetoName
;
4357 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4358 ulNameLength
, ulFlags
, hMachine
);
4360 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4361 return CR_INVALID_POINTER
;
4363 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4364 if (lpLocalVetoName
== NULL
)
4365 return CR_OUT_OF_MEMORY
;
4367 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4368 ulNameLength
, ulFlags
, hMachine
);
4369 if (ret
== CR_REMOVE_VETOED
)
4371 if (WideCharToMultiByte(CP_ACP
,
4382 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4388 /***********************************************************************
4389 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4391 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4392 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4393 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4395 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4396 HSTRING_TABLE StringTable
= NULL
;
4400 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4401 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4403 if (dnAncestor
== 0)
4404 return CR_INVALID_DEVNODE
;
4406 if (ulFlags
& ~CM_REMOVE_BITS
)
4407 return CR_INVALID_FLAG
;
4409 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4410 return CR_INVALID_POINTER
;
4412 if (hMachine
!= NULL
)
4414 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4415 if (BindingHandle
== NULL
)
4418 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4419 if (StringTable
== 0)
4424 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4428 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4429 if (lpDevInst
== NULL
)
4430 return CR_INVALID_DEVNODE
;
4434 ret
= PNP_QueryRemove(BindingHandle
,
4441 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4443 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4451 /***********************************************************************
4452 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4454 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4455 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4458 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4459 ResourceID
, ulFlags
);
4461 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4462 ResourceID
, ulFlags
, NULL
);
4466 /***********************************************************************
4467 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4469 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4472 IN DEVINST dnDevInst
,
4473 IN RESOURCEID ResourceID
,
4475 IN HMACHINE hMachine
)
4477 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4478 HSTRING_TABLE StringTable
= NULL
;
4482 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4483 ResourceID
, ulFlags
, hMachine
);
4485 if (pData
== NULL
|| DataLen
== 0)
4486 return CR_INVALID_POINTER
;
4489 return CR_INVALID_DEVINST
;
4491 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4492 return CR_INVALID_FLAG
;
4494 if (hMachine
!= NULL
)
4496 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4497 if (BindingHandle
== NULL
)
4500 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4501 if (StringTable
== 0)
4506 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4510 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4511 if (lpDevInst
== NULL
)
4512 return CR_INVALID_DEVNODE
;
4516 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4523 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4525 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4533 /***********************************************************************
4534 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4536 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4537 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4539 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4541 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4546 /***********************************************************************
4547 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4549 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4550 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4551 ULONG ulFlags
, HMACHINE hMachine
)
4553 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4554 HSTRING_TABLE StringTable
= NULL
;
4558 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4561 if (pulSize
== NULL
)
4562 return CR_INVALID_POINTER
;
4565 return CR_INVALID_DEVINST
;
4567 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4568 return CR_INVALID_FLAG
;
4570 if (hMachine
!= NULL
)
4572 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4573 if (BindingHandle
== NULL
)
4576 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4577 if (StringTable
== 0)
4582 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4586 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4587 if (lpDevInst
== NULL
)
4588 return CR_INVALID_DEVNODE
;
4592 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4598 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4600 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4608 /***********************************************************************
4609 * CM_Query_Remove_SubTree [SETUPAPI.@]
4611 * This function is obsolete in Windows XP and above.
4613 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4614 DEVINST dnAncestor
, ULONG ulFlags
)
4616 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4617 return CR_CALL_NOT_IMPLEMENTED
;
4621 /***********************************************************************
4622 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4624 * This function is obsolete in Windows XP and above.
4626 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4627 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4629 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4630 return CR_CALL_NOT_IMPLEMENTED
;
4634 /***********************************************************************
4635 * CM_Reenumerate_DevNode [SETUPAPI.@]
4637 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4638 DEVINST dnDevInst
, ULONG ulFlags
)
4640 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4641 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4645 /***********************************************************************
4646 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4649 CM_Reenumerate_DevNode_Ex(
4650 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4652 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4653 HSTRING_TABLE StringTable
= NULL
;
4657 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4660 return CR_INVALID_DEVNODE
;
4662 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4663 return CR_INVALID_FLAG
;
4665 if (hMachine
!= NULL
)
4667 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4668 if (BindingHandle
== NULL
)
4671 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4672 if (StringTable
== 0)
4677 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4681 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4682 if (lpDevInst
== NULL
)
4683 return CR_INVALID_DEVNODE
;
4687 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4688 PNP_DEVINST_REENUMERATE
,
4693 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4695 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4703 /***********************************************************************
4704 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4706 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4707 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4708 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4710 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4711 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4713 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4714 pszReference
, pszDeviceInterface
,
4715 pulLength
, ulFlags
, NULL
);
4719 /***********************************************************************
4720 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4722 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4723 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4724 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4726 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4727 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4729 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4730 pszReference
, pszDeviceInterface
,
4731 pulLength
, ulFlags
, NULL
);
4735 /***********************************************************************
4736 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4738 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4739 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4740 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4742 LPWSTR pszReferenceW
= NULL
;
4743 LPWSTR pszDeviceInterfaceW
= NULL
;
4747 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4748 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4750 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4751 return CR_INVALID_POINTER
;
4753 if (pszReference
!= NULL
)
4755 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4756 return CR_INVALID_DATA
;
4759 ulLength
= *pulLength
;
4761 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4762 if (pszDeviceInterfaceW
== NULL
)
4764 ret
= CR_OUT_OF_MEMORY
;
4768 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4771 pszDeviceInterfaceW
,
4775 if (ret
== CR_SUCCESS
)
4777 if (WideCharToMultiByte(CP_ACP
,
4779 pszDeviceInterfaceW
,
4788 *pulLength
= ulLength
;
4791 if (pszDeviceInterfaceW
!= NULL
)
4792 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4794 if (pszReferenceW
!= NULL
)
4795 MyFree(pszReferenceW
);
4801 /***********************************************************************
4802 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4804 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4805 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4806 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4808 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4809 HSTRING_TABLE StringTable
= NULL
;
4811 ULONG ulTransferLength
;
4814 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4815 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4818 return CR_INVALID_DEVNODE
;
4820 if (InterfaceClassGuid
== NULL
||
4821 pszDeviceInterface
== NULL
||
4823 return CR_INVALID_POINTER
;
4826 return CR_INVALID_FLAG
;
4828 if (hMachine
!= NULL
)
4830 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4831 if (BindingHandle
== NULL
)
4834 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4835 if (StringTable
== 0)
4840 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4844 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4845 if (lpDevInst
== NULL
)
4846 return CR_INVALID_DEVNODE
;
4848 ulTransferLength
= *pulLength
;
4852 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4855 (LPWSTR
)pszReference
,
4861 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4863 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4871 /***********************************************************************
4872 * CM_Register_Device_Driver [SETUPAPI.@]
4874 CONFIGRET WINAPI
CM_Register_Device_Driver(
4875 DEVINST dnDevInst
, ULONG ulFlags
)
4877 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4878 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4882 /***********************************************************************
4883 * CM_Register_Device_Driver [SETUPAPI.@]
4885 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4886 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4888 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4889 HSTRING_TABLE StringTable
= NULL
;
4893 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4896 return CR_INVALID_DEVNODE
;
4898 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4899 return CR_INVALID_FLAG
;
4901 if (hMachine
!= NULL
)
4903 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4904 if (BindingHandle
== NULL
)
4907 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4908 if (StringTable
== 0)
4913 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4917 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4918 if (lpDevInst
== NULL
)
4919 return CR_INVALID_DEVNODE
;
4923 ret
= PNP_RegisterDriver(BindingHandle
,
4927 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4929 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4937 /***********************************************************************
4938 * CM_Remove_SubTree [SETUPAPI.@]
4940 * This function is obsolete in Windows XP and above.
4942 CONFIGRET WINAPI
CM_Remove_SubTree(
4943 DEVINST dnAncestor
, ULONG ulFlags
)
4945 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4946 return CR_CALL_NOT_IMPLEMENTED
;
4950 /***********************************************************************
4951 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4953 * This function is obsolete in Windows XP and above.
4955 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4956 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4958 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4959 return CR_CALL_NOT_IMPLEMENTED
;
4963 /***********************************************************************
4964 * CM_Request_Device_EjectA [SETUPAPI.@]
4966 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4967 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4968 ULONG ulNameLength
, ULONG ulFlags
)
4970 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4971 ulNameLength
, ulFlags
);
4972 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4973 ulNameLength
, ulFlags
, NULL
);
4977 /***********************************************************************
4978 * CM_Request_Device_EjectW [SETUPAPI.@]
4980 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4981 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4982 ULONG ulNameLength
, ULONG ulFlags
)
4984 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4985 ulNameLength
, ulFlags
);
4986 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4987 ulNameLength
, ulFlags
, NULL
);
4991 /***********************************************************************
4992 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4994 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4995 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4996 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4998 LPWSTR lpLocalVetoName
;
5001 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5002 ulNameLength
, ulFlags
, hMachine
);
5004 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5005 return CR_INVALID_POINTER
;
5007 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5008 if (lpLocalVetoName
== NULL
)
5009 return CR_OUT_OF_MEMORY
;
5011 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5012 ulNameLength
, ulFlags
, hMachine
);
5013 if (ret
== CR_REMOVE_VETOED
)
5015 if (WideCharToMultiByte(CP_ACP
,
5026 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5032 /***********************************************************************
5033 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5035 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5036 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5037 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5039 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5040 HSTRING_TABLE StringTable
= NULL
;
5044 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5045 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5048 return CR_INVALID_DEVNODE
;
5051 return CR_INVALID_FLAG
;
5053 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5054 return CR_INVALID_POINTER
;
5056 if (hMachine
!= NULL
)
5058 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5059 if (BindingHandle
== NULL
)
5062 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5063 if (StringTable
== 0)
5068 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5072 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5073 if (lpDevInst
== NULL
)
5074 return CR_INVALID_DEVNODE
;
5078 ret
= PNP_RequestDeviceEject(BindingHandle
,
5085 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5087 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5095 /***********************************************************************
5096 * CM_Request_Eject_PC [SETUPAPI.@]
5098 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
5101 return CM_Request_Eject_PC_Ex(NULL
);
5105 /***********************************************************************
5106 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
5108 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
5111 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5114 TRACE("%lx\n", hMachine
);
5116 if (hMachine
!= NULL
)
5118 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5119 if (BindingHandle
== NULL
)
5124 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5130 ret
= PNP_RequestEjectPC(BindingHandle
);
5132 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5134 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5142 /***********************************************************************
5143 * CM_Run_Detection [SETUPAPI.@]
5145 CONFIGRET WINAPI
CM_Run_Detection(
5148 TRACE("%lx\n", ulFlags
);
5149 return CM_Run_Detection_Ex(ulFlags
, NULL
);
5153 /***********************************************************************
5154 * CM_Run_Detection_Ex [SETUPAPI.@]
5156 CONFIGRET WINAPI
CM_Run_Detection_Ex(
5157 ULONG ulFlags
, HMACHINE hMachine
)
5159 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5162 TRACE("%lx %lx\n", ulFlags
, hMachine
);
5164 if (!pSetupIsUserAdmin())
5165 return CR_ACCESS_DENIED
;
5167 if (ulFlags
& ~CM_DETECT_BITS
)
5168 return CR_INVALID_FLAG
;
5170 if (hMachine
!= NULL
)
5172 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5173 if (BindingHandle
== NULL
)
5178 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5184 ret
= PNP_RunDetection(BindingHandle
,
5187 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5189 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5197 /***********************************************************************
5198 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
5200 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
5201 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5202 ULONG ulFlags
, HMACHINE hMachine
)
5204 FIXME("%p %lx %p %lu %lx %p\n",
5205 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5206 return CR_CALL_NOT_IMPLEMENTED
;
5210 /***********************************************************************
5211 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
5213 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
5214 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5215 ULONG ulFlags
, HMACHINE hMachine
)
5217 FIXME("%p %lx %p %lu %lx %p\n",
5218 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5219 return CR_CALL_NOT_IMPLEMENTED
;
5223 /***********************************************************************
5224 * CM_Set_DevNode_Problem [SETUPAPI.@]
5226 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
5227 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
5229 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
5230 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
5234 /***********************************************************************
5235 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
5237 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
5238 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
5240 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5241 HSTRING_TABLE StringTable
= NULL
;
5245 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
5248 return CR_INVALID_DEVNODE
;
5250 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
5251 return CR_INVALID_FLAG
;
5253 if (hMachine
!= NULL
)
5255 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5256 if (BindingHandle
== NULL
)
5259 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5260 if (StringTable
== 0)
5265 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5269 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5270 if (lpDevInst
== NULL
)
5271 return CR_INVALID_DEVNODE
;
5275 ret
= PNP_SetDeviceProblem(BindingHandle
,
5280 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5282 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5290 /***********************************************************************
5291 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
5293 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
5294 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5297 TRACE("%lx %lu %p %lx %lx\n",
5298 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5299 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
5305 /***********************************************************************
5306 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
5308 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
5309 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5312 TRACE("%lx %lu %p %lx %lx\n",
5313 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5314 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
5320 /***********************************************************************
5321 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
5323 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
5324 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5325 ULONG ulFlags
, HMACHINE hMachine
)
5327 CONFIGRET ret
= CR_SUCCESS
;
5331 FIXME("%lx %lu %p %lx %lx %lx\n",
5332 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5334 if (Buffer
== NULL
&& ulLength
!= 0)
5335 return CR_INVALID_POINTER
;
5339 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5348 /* Get property type */
5351 case CM_DRP_DEVICEDESC
:
5355 case CM_DRP_HARDWAREID
:
5356 ulType
= REG_MULTI_SZ
;
5359 case CM_DRP_COMPATIBLEIDS
:
5360 ulType
= REG_MULTI_SZ
;
5363 case CM_DRP_SERVICE
:
5371 case CM_DRP_CLASSGUID
:
5379 case CM_DRP_CONFIGFLAGS
:
5387 case CM_DRP_FRIENDLYNAME
:
5391 case CM_DRP_LOCATION_INFORMATION
:
5395 case CM_DRP_UPPERFILTERS
:
5396 ulType
= REG_MULTI_SZ
;
5399 case CM_DRP_LOWERFILTERS
:
5400 ulType
= REG_MULTI_SZ
;
5403 case CM_DRP_SECURITY
:
5404 ulType
= REG_BINARY
;
5407 case CM_DRP_DEVTYPE
:
5411 case CM_DRP_EXCLUSIVE
:
5415 case CM_DRP_CHARACTERISTICS
:
5419 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5423 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5428 return CR_INVALID_PROPERTY
;
5431 /* Allocate buffer if needed */
5432 if (ulType
== REG_SZ
||
5433 ulType
== REG_MULTI_SZ
)
5435 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5436 if (lpBuffer
== NULL
)
5438 ret
= CR_OUT_OF_MEMORY
;
5442 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5443 ulLength
, lpBuffer
, ulLength
))
5450 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5453 ulLength
* sizeof(WCHAR
),
5462 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5470 ret
= CR_CALL_NOT_IMPLEMENTED
;
5477 /***********************************************************************
5478 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5480 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5481 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5482 ULONG ulFlags
, HMACHINE hMachine
)
5484 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5485 HSTRING_TABLE StringTable
= NULL
;
5490 TRACE("%lx %lu %p %lx %lx %lx\n",
5491 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5494 return CR_INVALID_DEVNODE
;
5496 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5497 return CR_INVALID_PROPERTY
;
5499 if (Buffer
!= NULL
&& ulLength
== 0)
5500 return CR_INVALID_POINTER
;
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
, dnDevInst
);
5522 if (lpDevInst
== NULL
)
5523 return CR_INVALID_DEVNODE
;
5527 case CM_DRP_DEVICEDESC
:
5531 case CM_DRP_HARDWAREID
:
5532 ulType
= REG_MULTI_SZ
;
5535 case CM_DRP_COMPATIBLEIDS
:
5536 ulType
= REG_MULTI_SZ
;
5539 case CM_DRP_SERVICE
:
5547 case CM_DRP_CLASSGUID
:
5555 case CM_DRP_CONFIGFLAGS
:
5563 case CM_DRP_FRIENDLYNAME
:
5567 case CM_DRP_LOCATION_INFORMATION
:
5571 case CM_DRP_UPPERFILTERS
:
5572 ulType
= REG_MULTI_SZ
;
5575 case CM_DRP_LOWERFILTERS
:
5576 ulType
= REG_MULTI_SZ
;
5579 case CM_DRP_SECURITY
:
5580 ulType
= REG_BINARY
;
5583 case CM_DRP_DEVTYPE
:
5587 case CM_DRP_EXCLUSIVE
:
5591 case CM_DRP_CHARACTERISTICS
:
5595 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5599 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5604 return CR_INVALID_PROPERTY
;
5609 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5617 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5619 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5627 /***********************************************************************
5628 * CM_Set_HW_Prof [SETUPAPI.@]
5630 CONFIGRET WINAPI
CM_Set_HW_Prof(
5631 ULONG ulHardwareProfile
, ULONG ulFlags
)
5633 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5634 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5638 /***********************************************************************
5639 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5641 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5642 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5644 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5647 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5649 if (!pSetupIsUserAdmin())
5650 return CR_ACCESS_DENIED
;
5653 return CR_INVALID_FLAG
;
5655 if (hMachine
!= NULL
)
5657 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5658 if (BindingHandle
== NULL
)
5663 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5669 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5671 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5673 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5681 /***********************************************************************
5682 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5684 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5685 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5688 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5689 ulConfig
, ulValue
, ulFlags
);
5690 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5695 /***********************************************************************
5696 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5698 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5699 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5702 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5703 ulConfig
, ulValue
, ulFlags
);
5704 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5709 /***********************************************************************
5710 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5712 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5713 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5714 ULONG ulFlags
, HMACHINE hMachine
)
5716 DEVINSTID_W pszDevIdW
= NULL
;
5717 CONFIGRET ret
= CR_SUCCESS
;
5719 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5720 ulConfig
, ulValue
, ulFlags
, hMachine
);
5722 if (szDevInstName
!= NULL
)
5724 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5725 return CR_INVALID_DEVICE_ID
;
5728 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5731 if (pszDevIdW
!= NULL
)
5738 /***********************************************************************
5739 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5741 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5742 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5743 ULONG ulFlags
, HMACHINE hMachine
)
5745 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5748 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5749 ulConfig
, ulValue
, ulFlags
, hMachine
);
5751 if (szDevInstName
== NULL
)
5752 return CR_INVALID_POINTER
;
5754 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5755 return CR_INVALID_FLAG
;
5757 /* FIXME: Check whether szDevInstName is valid */
5759 if (hMachine
!= NULL
)
5761 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5762 if (BindingHandle
== NULL
)
5767 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5773 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5774 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5776 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5778 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5786 /***********************************************************************
5787 * CM_Setup_DevNode [SETUPAPI.@]
5789 CONFIGRET WINAPI
CM_Setup_DevNode(
5790 DEVINST dnDevInst
, ULONG ulFlags
)
5792 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5793 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5797 /***********************************************************************
5798 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5800 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5801 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5803 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5804 HSTRING_TABLE StringTable
= NULL
;
5808 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5810 if (!pSetupIsUserAdmin())
5811 return CR_ACCESS_DENIED
;
5814 return CR_INVALID_DEVNODE
;
5816 if (ulFlags
& ~CM_SETUP_BITS
)
5817 return CR_INVALID_FLAG
;
5819 if (hMachine
!= NULL
)
5821 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5822 if (BindingHandle
== NULL
)
5825 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5826 if (StringTable
== 0)
5831 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5835 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5836 if (lpDevInst
== NULL
)
5837 return CR_INVALID_DEVNODE
;
5841 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5847 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5849 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5857 /***********************************************************************
5858 * CM_Uninstall_DevNode [SETUPAPI.@]
5860 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5861 DEVINST dnPhantom
, ULONG ulFlags
)
5863 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5864 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5868 /***********************************************************************
5869 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5871 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5872 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5874 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5875 HSTRING_TABLE StringTable
= NULL
;
5879 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5882 return CR_INVALID_DEVNODE
;
5885 return CR_INVALID_FLAG
;
5887 if (hMachine
!= NULL
)
5889 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5890 if (BindingHandle
== NULL
)
5893 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5894 if (StringTable
== 0)
5899 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5903 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5904 if (lpDevInst
== NULL
)
5905 return CR_INVALID_DEVNODE
;
5909 ret
= PNP_UninstallDevInst(BindingHandle
,
5913 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5915 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5923 /***********************************************************************
5924 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5926 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5927 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5929 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5931 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5936 /***********************************************************************
5937 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5939 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5940 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5942 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5944 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5949 /***********************************************************************
5950 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5952 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5953 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5955 LPWSTR pszDeviceInterfaceW
= NULL
;
5958 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5960 if (pszDeviceInterface
== NULL
)
5961 return CR_INVALID_POINTER
;
5963 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5964 return CR_INVALID_DATA
;
5966 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5969 if (pszDeviceInterfaceW
!= NULL
)
5970 MyFree(pszDeviceInterfaceW
);
5976 /***********************************************************************
5977 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5979 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5980 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5982 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5985 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5987 if (pszDeviceInterface
== NULL
)
5988 return CR_INVALID_POINTER
;
5991 return CR_INVALID_FLAG
;
5993 if (hMachine
!= NULL
)
5995 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5996 if (BindingHandle
== NULL
)
6001 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6007 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6008 (LPWSTR
)pszDeviceInterface
,
6011 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6013 ret
= RpcStatusToCmStatus(RpcExceptionCode());