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
;