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"
27 #include "rpc_private.h"
29 /* Registry key and value names */
30 static const WCHAR Backslash
[] = {'\\', 0};
31 static const WCHAR Class
[] = {'C','l','a','s','s',0};
33 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
34 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
35 'C','o','n','t','r','o','l','\\',
36 'C','l','a','s','s',0};
38 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
39 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
40 'C','o','n','t','r','o','l','\\',
41 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
43 typedef struct _MACHINE_INFO
45 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
46 RPC_BINDING_HANDLE BindingHandle
;
47 HSTRING_TABLE StringTable
;
49 } MACHINE_INFO
, *PMACHINE_INFO
;
52 typedef struct _LOG_CONF_INFO
58 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
60 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
63 typedef struct _NOTIFY_DATA
67 } NOTIFY_DATA
, *PNOTIFY_DATA
;
69 #define NOTIFY_MAGIC 0x44556677
72 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
76 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
79 lstrcpyW(&String
[1], lpString
);
82 String
[MAX_GUID_STRING_LEN
- 2] = '}';
83 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
85 RpcStringFreeW(&lpString
);
92 RpcStatusToCmStatus(RPC_STATUS Status
)
98 /***********************************************************************
99 * CMP_Init_Detection [SETUPAPI.@]
101 CONFIGRET WINAPI
CMP_Init_Detection(
104 RPC_BINDING_HANDLE BindingHandle
= NULL
;
107 TRACE("%lu\n", dwMagic
);
109 if (dwMagic
!= CMP_MAGIC
)
110 return CR_INVALID_DATA
;
112 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
117 ret
= PNP_InitDetection(BindingHandle
);
119 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
121 ret
= RpcStatusToCmStatus(RpcExceptionCode());
129 /***********************************************************************
130 * CMP_RegisterNotification [SETUPAPI.@]
134 CMP_RegisterNotification(
135 IN HANDLE hRecipient
,
136 IN LPVOID lpvNotificationFilter
,
138 OUT PHDEVNOTIFY phDevNotify
)
140 RPC_BINDING_HANDLE BindingHandle
= NULL
;
141 PNOTIFY_DATA pNotifyData
= NULL
;
142 CONFIGRET ret
= CR_SUCCESS
;
144 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n", hRecipient
, lpvNotificationFilter
, dwFlags
, phDevNotify
);
146 if ((hRecipient
== NULL
) ||
147 (lpvNotificationFilter
== NULL
) ||
148 (phDevNotify
== NULL
))
149 return CR_INVALID_POINTER
;
152 return CR_INVALID_FLAG
;
154 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
155 return CR_INVALID_DATA
;
157 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
160 pNotifyData
= HeapAlloc(GetProcessHeap(),
162 sizeof(NOTIFY_DATA
));
163 if (pNotifyData
== NULL
)
164 return CR_OUT_OF_MEMORY
;
166 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
169 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
173 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
181 ret
= PNP_RegisterNotification(BindingHandle
,
183 &pNotifyData
->ulNotifyData
);
185 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
187 ret
= RpcStatusToCmStatus(RpcExceptionCode());
191 if (ret
== CR_SUCCESS
)
193 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
197 if (pNotifyData
!= NULL
)
198 HeapFree(GetProcessHeap(), 0, pNotifyData
);
200 *phDevNotify
= (HDEVNOTIFY
)NULL
;
207 /***********************************************************************
208 * CMP_Report_LogOn [SETUPAPI.@]
210 CONFIGRET WINAPI
CMP_Report_LogOn(
214 RPC_BINDING_HANDLE BindingHandle
= NULL
;
215 CONFIGRET ret
= CR_SUCCESS
;
219 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
221 if (dwMagic
!= CMP_MAGIC
)
222 return CR_INVALID_DATA
;
224 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
227 bAdmin
= pSetupIsUserAdmin();
229 for (i
= 0; i
< 30; i
++)
233 ret
= PNP_ReportLogOn(BindingHandle
,
237 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
239 ret
= RpcStatusToCmStatus(RpcExceptionCode());
243 if (ret
== CR_SUCCESS
)
253 /***********************************************************************
254 * CMP_UnregisterNotification [SETUPAPI.@]
258 CMP_UnregisterNotification(
259 IN HDEVNOTIFY hDevNotify
)
261 RPC_BINDING_HANDLE BindingHandle
= NULL
;
262 PNOTIFY_DATA pNotifyData
;
263 CONFIGRET ret
= CR_SUCCESS
;
265 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
267 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
269 if ((pNotifyData
== NULL
) ||
270 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
271 return CR_INVALID_POINTER
;
273 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
278 ret
= PNP_UnregisterNotification(BindingHandle
,
279 pNotifyData
->ulNotifyData
);
281 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
283 ret
= RpcStatusToCmStatus(RpcExceptionCode());
287 if (ret
== CR_SUCCESS
)
288 HeapFree(GetProcessHeap(), 0, pNotifyData
);
294 /***********************************************************************
295 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
297 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
303 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
307 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
313 /***********************************************************************
314 * CMP_WaitServicesAvailable [SETUPAPI.@]
318 CMP_WaitServicesAvailable(HMACHINE hMachine
)
320 RPC_BINDING_HANDLE BindingHandle
= NULL
;
321 CONFIGRET ret
= CR_SUCCESS
;
324 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
329 ret
= PNP_GetVersion(BindingHandle
, &Version
);
331 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
333 ret
= RpcStatusToCmStatus(RpcExceptionCode());
341 /***********************************************************************
342 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
344 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
345 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
348 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
349 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
354 /***********************************************************************
355 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
357 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
358 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
359 ULONG ulFlags
, HMACHINE hMachine
)
361 RPC_BINDING_HANDLE BindingHandle
= NULL
;
362 HSTRING_TABLE StringTable
= NULL
;
363 ULONG ulLogConfTag
= 0;
365 PLOG_CONF_INFO pLogConfInfo
;
366 CONFIGRET ret
= CR_SUCCESS
;
368 FIXME("%p %p %lu %lx %p\n",
369 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
371 if (!pSetupIsUserAdmin())
372 return CR_ACCESS_DENIED
;
374 if (plcLogConf
== NULL
)
375 return CR_INVALID_POINTER
;
378 return CR_INVALID_DEVINST
;
380 if (Priority
> 0xFFFF)
381 return CR_INVALID_PRIORITY
;
383 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
384 return CR_INVALID_FLAG
;
386 if (hMachine
!= NULL
)
388 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
389 if (BindingHandle
== NULL
)
392 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
393 if (StringTable
== 0)
398 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
402 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
403 if (lpDevInst
== NULL
)
404 return CR_INVALID_DEVNODE
;
408 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
409 &ulLogConfTag
, ulFlags
);
411 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
413 ret
= RpcStatusToCmStatus(RpcExceptionCode());
417 if (ret
== CR_SUCCESS
)
419 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
420 if (pLogConfInfo
== NULL
)
422 ret
= CR_OUT_OF_MEMORY
;
426 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
427 pLogConfInfo
->dnDevInst
= dnDevInst
;
428 pLogConfInfo
->ulFlags
= ulFlags
;
429 pLogConfInfo
->ulTag
= ulLogConfTag
;
431 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
441 /***********************************************************************
442 * CM_Add_IDA [SETUPAPI.@]
444 CONFIGRET WINAPI
CM_Add_IDA(
445 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
447 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
448 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
452 /***********************************************************************
453 * CM_Add_IDW [SETUPAPI.@]
455 CONFIGRET WINAPI
CM_Add_IDW(
456 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
458 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
459 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
463 /***********************************************************************
464 * CM_Add_ID_ExA [SETUPAPI.@]
466 CONFIGRET WINAPI
CM_Add_ID_ExA(
467 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
472 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
474 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
475 return CR_INVALID_DATA
;
477 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
485 /***********************************************************************
486 * CM_Add_ID_ExW [SETUPAPI.@]
488 CONFIGRET WINAPI
CM_Add_ID_ExW(
489 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
491 RPC_BINDING_HANDLE BindingHandle
= NULL
;
492 HSTRING_TABLE StringTable
= NULL
;
496 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
498 if (!pSetupIsUserAdmin())
499 return CR_ACCESS_DENIED
;
502 return CR_INVALID_DEVINST
;
505 return CR_INVALID_POINTER
;
507 if (ulFlags
& ~CM_ADD_ID_BITS
)
508 return CR_INVALID_FLAG
;
510 if (hMachine
!= NULL
)
512 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
513 if (BindingHandle
== NULL
)
516 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
517 if (StringTable
== 0)
522 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
526 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
527 if (lpDevInst
== NULL
)
528 return CR_INVALID_DEVNODE
;
532 ret
= PNP_AddID(BindingHandle
,
537 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
539 ret
= RpcStatusToCmStatus(RpcExceptionCode());
547 /***********************************************************************
548 * CM_Add_Res_Des [SETUPAPI.@]
550 CONFIGRET WINAPI
CM_Add_Res_Des(
551 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
552 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
554 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
555 ResourceData
, ResourceLen
, ulFlags
);
556 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
557 ResourceLen
, ulFlags
, NULL
);
561 /***********************************************************************
562 * CM_Add_Res_Des_Ex [SETUPAPI.@]
564 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
565 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
566 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
568 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
569 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
571 return CR_CALL_NOT_IMPLEMENTED
;
575 /***********************************************************************
576 * CM_Connect_MachineA [SETUPAPI.@]
578 CONFIGRET WINAPI
CM_Connect_MachineA(
579 PCSTR UNCServerName
, PHMACHINE phMachine
)
584 TRACE("%s %p\n", UNCServerName
, phMachine
);
586 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
587 return CM_Connect_MachineW(NULL
, phMachine
);
589 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
590 return CR_INVALID_DATA
;
592 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
594 MyFree(pServerNameW
);
600 /***********************************************************************
601 * CM_Connect_MachineW [SETUPAPI.@]
603 CONFIGRET WINAPI
CM_Connect_MachineW(
604 PCWSTR UNCServerName
, PHMACHINE phMachine
)
606 PMACHINE_INFO pMachine
;
608 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
610 if (phMachine
== NULL
)
611 return CR_INVALID_POINTER
;
615 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
616 if (pMachine
== NULL
)
617 return CR_OUT_OF_MEMORY
;
619 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
621 pMachine
->bLocal
= TRUE
;
623 /* FIXME: store the computers name in pMachine->szMachineName */
625 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
626 &pMachine
->StringTable
))
628 HeapFree(GetProcessHeap(), 0, pMachine
);
634 pMachine
->bLocal
= FALSE
;
635 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
637 HeapFree(GetProcessHeap(), 0, pMachine
);
638 return CR_INVALID_MACHINENAME
;
640 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
642 pMachine
->StringTable
= pSetupStringTableInitialize();
643 if (pMachine
->StringTable
== NULL
)
645 HeapFree(GetProcessHeap(), 0, pMachine
);
649 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
651 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
653 pSetupStringTableDestroy(pMachine
->StringTable
);
654 HeapFree(GetProcessHeap(), 0, pMachine
);
655 return CR_INVALID_MACHINENAME
;
659 *phMachine
= (PHMACHINE
)pMachine
;
665 /***********************************************************************
666 * CM_Create_DevNodeA [SETUPAPI.@]
668 CONFIGRET WINAPI
CM_Create_DevNodeA(
669 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
672 TRACE("%p %s %p %lx\n",
673 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
674 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
679 /***********************************************************************
680 * CM_Create_DevNodeW [SETUPAPI.@]
682 CONFIGRET WINAPI
CM_Create_DevNodeW(
683 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
686 TRACE("%p %s %p %lx\n",
687 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
688 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
693 /***********************************************************************
694 * CM_Create_DevNode_ExA [SETUPAPI.@]
696 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
697 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
698 ULONG ulFlags
, HANDLE hMachine
)
700 DEVINSTID_W pDeviceIDW
;
703 TRACE("%p %s %p %lx %p\n",
704 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
706 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
707 return CR_INVALID_DATA
;
709 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
718 /***********************************************************************
719 * CM_Create_DevNode_ExW [SETUPAPI.@]
721 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
722 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
723 ULONG ulFlags
, HANDLE hMachine
)
725 RPC_BINDING_HANDLE BindingHandle
= NULL
;
726 HSTRING_TABLE StringTable
= NULL
;
727 LPWSTR lpParentDevInst
;
728 CONFIGRET ret
= CR_SUCCESS
;
729 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
731 TRACE("%p %s %p %lx %p\n",
732 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
734 if (!pSetupIsUserAdmin())
735 return CR_ACCESS_DENIED
;
737 if (pdnDevInst
== NULL
)
738 return CR_INVALID_POINTER
;
740 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
741 return CR_INVALID_DEVICE_ID
;
744 return CR_INVALID_DEVNODE
;
746 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
747 return CR_INVALID_FLAG
;
749 if (hMachine
!= NULL
)
751 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
752 if (BindingHandle
== NULL
)
755 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
756 if (StringTable
== 0)
761 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
765 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
766 if (lpParentDevInst
== NULL
)
767 return CR_INVALID_DEVNODE
;
769 wcscpy(szLocalDeviceID
, pDeviceID
);
773 ret
= PNP_CreateDevInst(BindingHandle
,
779 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
781 ret
= RpcStatusToCmStatus(RpcExceptionCode());
785 if (ret
== CR_SUCCESS
)
787 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
788 * will return the generated device ID in szLocalDeviceID */
789 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
790 if (*pdnDevInst
== 0)
791 ret
= CR_NO_SUCH_DEVNODE
;
798 /***********************************************************************
799 * CM_Delete_Class_Key [SETUPAPI.@]
801 CONFIGRET WINAPI
CM_Delete_Class_Key(
802 LPGUID ClassGuid
, ULONG ulFlags
)
804 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
805 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
809 /***********************************************************************
810 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
812 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
813 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
815 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
816 RPC_BINDING_HANDLE BindingHandle
= NULL
;
819 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
821 if (ClassGuid
== NULL
)
822 return CR_INVALID_POINTER
;
824 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
825 return CR_INVALID_FLAG
;
827 if (!GuidToString(ClassGuid
, szGuidString
))
828 return CR_INVALID_DATA
;
830 if (hMachine
!= NULL
)
832 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
833 if (BindingHandle
== NULL
)
838 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
844 ret
= PNP_DeleteClassKey(BindingHandle
,
848 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
850 ret
= RpcStatusToCmStatus(RpcExceptionCode());
858 /***********************************************************************
859 * CM_Delete_DevNode_Key [SETUPAPI.@]
861 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
862 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
864 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
865 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
870 /***********************************************************************
871 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
873 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
874 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
877 FIXME("%p %lu %lx %p\n",
878 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
880 return CR_CALL_NOT_IMPLEMENTED
;
884 /***********************************************************************
885 * CM_Disable_DevNode [SETUPAPI.@]
887 CONFIGRET WINAPI
CM_Disable_DevNode(
888 DEVINST dnDevInst
, ULONG ulFlags
)
890 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
891 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
895 /***********************************************************************
896 * CM_Disable_DevNode_Ex [SETUPAPI.@]
898 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
899 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
901 RPC_BINDING_HANDLE BindingHandle
= NULL
;
902 HSTRING_TABLE StringTable
= NULL
;
906 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
908 if (!pSetupIsUserAdmin())
909 return CR_ACCESS_DENIED
;
912 return CR_INVALID_DEVINST
;
915 return CR_INVALID_FLAG
;
917 if (hMachine
!= NULL
)
919 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
920 if (BindingHandle
== NULL
)
923 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
924 if (StringTable
== 0)
929 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
933 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
934 if (lpDevInst
== NULL
)
935 return CR_INVALID_DEVNODE
;
939 ret
= PNP_DeviceInstanceAction(BindingHandle
,
945 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
947 ret
= RpcStatusToCmStatus(RpcExceptionCode());
955 /***********************************************************************
956 * CM_Disconnect_Machine [SETUPAPI.@]
958 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
960 PMACHINE_INFO pMachine
;
962 TRACE("%lx\n", hMachine
);
964 pMachine
= (PMACHINE_INFO
)hMachine
;
965 if (pMachine
== NULL
)
968 if (pMachine
->bLocal
== FALSE
)
970 if (pMachine
->StringTable
!= NULL
)
971 pSetupStringTableDestroy(pMachine
->StringTable
);
973 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
974 return CR_ACCESS_DENIED
;
977 HeapFree(GetProcessHeap(), 0, pMachine
);
983 /***********************************************************************
984 * CM_Enable_DevNode [SETUPAPI.@]
986 CONFIGRET WINAPI
CM_Enable_DevNode(
987 DEVINST dnDevInst
, ULONG ulFlags
)
989 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
990 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
994 /***********************************************************************
995 * CM_Enable_DevNode_Ex [SETUPAPI.@]
997 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
998 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1000 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1001 HSTRING_TABLE StringTable
= NULL
;
1005 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1007 if (!pSetupIsUserAdmin())
1008 return CR_ACCESS_DENIED
;
1011 return CR_INVALID_DEVINST
;
1014 return CR_INVALID_FLAG
;
1016 if (hMachine
!= NULL
)
1018 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1019 if (BindingHandle
== NULL
)
1022 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1023 if (StringTable
== 0)
1028 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1032 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1033 if (lpDevInst
== NULL
)
1034 return CR_INVALID_DEVNODE
;
1038 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1044 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1046 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1054 /***********************************************************************
1055 * CM_Enumerate_Classes [SETUPAPI.@]
1057 CONFIGRET WINAPI
CM_Enumerate_Classes(
1058 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
1060 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
1061 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1065 /***********************************************************************
1066 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1068 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
1069 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
1071 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1072 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1073 CONFIGRET ret
= CR_SUCCESS
;
1074 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1076 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1078 if (ClassGuid
== NULL
)
1079 return CR_INVALID_POINTER
;
1082 return CR_INVALID_FLAG
;
1084 if (hMachine
!= NULL
)
1086 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1087 if (BindingHandle
== NULL
)
1092 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1098 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1102 MAX_GUID_STRING_LEN
,
1106 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1108 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1112 if (ret
== CR_SUCCESS
)
1115 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1117 /* Convert the buffer to a GUID */
1118 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1126 /***********************************************************************
1127 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1129 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1130 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1132 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1133 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1138 /***********************************************************************
1139 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1141 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1142 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1144 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1145 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1150 /***********************************************************************
1151 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1153 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1154 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1157 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1160 CONFIGRET ret
= CR_SUCCESS
;
1162 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1165 if (Buffer
== NULL
|| pulLength
== NULL
)
1166 return CR_INVALID_POINTER
;
1169 return CR_INVALID_FLAG
;
1171 ulOrigLength
= *pulLength
;
1174 ulLength
= MAX_DEVICE_ID_LEN
;
1175 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1177 if (ret
== CR_SUCCESS
)
1179 if (WideCharToMultiByte(CP_ACP
,
1189 *pulLength
= lstrlenA(Buffer
) + 1;
1196 /***********************************************************************
1197 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1199 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1200 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1203 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1206 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1209 if (Buffer
== NULL
|| pulLength
== NULL
)
1210 return CR_INVALID_POINTER
;
1213 return CR_INVALID_FLAG
;
1215 *Buffer
= UNICODE_NULL
;
1217 if (hMachine
!= NULL
)
1219 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1220 if (BindingHandle
== NULL
)
1225 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1231 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1232 PNP_ENUMERATOR_SUBKEYS
,
1239 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1241 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1249 /***********************************************************************
1250 * CM_Free_Log_Conf [SETUPAPI.@]
1252 CONFIGRET WINAPI
CM_Free_Log_Conf(
1253 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1255 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1256 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1260 /***********************************************************************
1261 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1263 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1264 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1266 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1267 HSTRING_TABLE StringTable
= NULL
;
1269 PLOG_CONF_INFO pLogConfInfo
;
1272 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1274 if (!pSetupIsUserAdmin())
1275 return CR_ACCESS_DENIED
;
1277 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1278 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1279 return CR_INVALID_LOG_CONF
;
1282 return CR_INVALID_FLAG
;
1284 if (hMachine
!= NULL
)
1286 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1287 if (BindingHandle
== NULL
)
1290 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1291 if (StringTable
== 0)
1296 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1300 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1301 if (lpDevInst
== NULL
)
1302 return CR_INVALID_DEVNODE
;
1306 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1307 pLogConfInfo
->ulTag
, 0);
1309 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1311 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1319 /***********************************************************************
1320 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1322 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1325 PLOG_CONF_INFO pLogConfInfo
;
1327 TRACE("%lx\n", lcLogConf
);
1329 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1330 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1331 return CR_INVALID_LOG_CONF
;
1333 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1339 /***********************************************************************
1340 * CM_Free_Res_Des [SETUPAPI.@]
1342 CONFIGRET WINAPI
CM_Free_Res_Des(
1343 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1345 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1346 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1350 /***********************************************************************
1351 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1353 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1354 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1357 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1359 return CR_CALL_NOT_IMPLEMENTED
;
1363 /***********************************************************************
1364 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1366 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1369 FIXME("%p\n", rdResDes
);
1371 return CR_CALL_NOT_IMPLEMENTED
;
1375 /***********************************************************************
1376 * CM_Get_Child [SETUPAPI.@]
1378 CONFIGRET WINAPI
CM_Get_Child(
1379 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1381 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1382 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1386 /***********************************************************************
1387 * CM_Get_Child_Ex [SETUPAPI.@]
1389 CONFIGRET WINAPI
CM_Get_Child_Ex(
1390 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1392 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1393 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1394 HSTRING_TABLE StringTable
= NULL
;
1396 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1399 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1401 if (pdnDevInst
== NULL
)
1402 return CR_INVALID_POINTER
;
1405 return CR_INVALID_DEVINST
;
1408 return CR_INVALID_FLAG
;
1412 if (hMachine
!= NULL
)
1414 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1415 if (BindingHandle
== NULL
)
1418 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1419 if (StringTable
== 0)
1424 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1428 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1429 if (lpDevInst
== NULL
)
1430 return CR_INVALID_DEVNODE
;
1434 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1435 PNP_GET_CHILD_DEVICE_INSTANCE
,
1441 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1443 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1447 if (ret
!= CR_SUCCESS
)
1450 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1452 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1456 *pdnDevInst
= dwIndex
;
1462 /***********************************************************************
1463 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1465 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1466 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1468 TRACE("%p %p %p %lx\n",
1469 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1470 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1475 /***********************************************************************
1476 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1478 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1479 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1481 TRACE("%p %p %p %lx\n",
1482 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1483 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1488 /***********************************************************************
1489 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1491 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1492 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1495 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1496 CONFIGRET ret
= CR_SUCCESS
;
1500 TRACE("%p %p %p %lx %lx\n",
1501 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1503 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1504 return CR_INVALID_POINTER
;
1506 ulOrigLength
= *pulLength
;
1509 ulLength
= MAX_GUID_STRING_LEN
;
1510 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1512 if (ret
== CR_SUCCESS
)
1514 if (WideCharToMultiByte(CP_ACP
,
1524 *pulLength
= lstrlenA(pszKeyName
) + 1;
1531 /***********************************************************************
1532 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1534 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1535 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1538 TRACE("%p %p %p %lx %lx\n",
1539 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1541 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1542 return CR_INVALID_POINTER
;
1545 return CR_INVALID_FLAG
;
1547 if (*pulLength
< MAX_GUID_STRING_LEN
)
1550 return CR_BUFFER_SMALL
;
1553 if (!GuidToString(ClassGuid
, pszKeyName
))
1554 return CR_INVALID_DATA
;
1556 *pulLength
= MAX_GUID_STRING_LEN
;
1562 /***********************************************************************
1563 * CM_Get_Class_NameA [SETUPAPI.@]
1565 CONFIGRET WINAPI
CM_Get_Class_NameA(
1566 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1568 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1569 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1574 /***********************************************************************
1575 * CM_Get_Class_NameW [SETUPAPI.@]
1577 CONFIGRET WINAPI
CM_Get_Class_NameW(
1578 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1580 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1581 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1586 /***********************************************************************
1587 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1589 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1590 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1593 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1594 CONFIGRET ret
= CR_SUCCESS
;
1598 TRACE("%p %p %p %lx %lx\n",
1599 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1601 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1602 return CR_INVALID_POINTER
;
1604 ulOrigLength
= *pulLength
;
1607 ulLength
= MAX_CLASS_NAME_LEN
;
1608 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1610 if (ret
== CR_SUCCESS
)
1612 if (WideCharToMultiByte(CP_ACP
,
1622 *pulLength
= lstrlenA(Buffer
) + 1;
1629 /***********************************************************************
1630 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1633 CM_Get_Class_Name_ExW(
1634 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1637 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1638 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1641 TRACE("%p %p %p %lx %lx\n",
1642 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1644 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1645 return CR_INVALID_POINTER
;
1648 return CR_INVALID_FLAG
;
1650 if (!GuidToString(ClassGuid
, szGuidString
))
1651 return CR_INVALID_DATA
;
1653 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1655 if (hMachine
!= NULL
)
1657 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1658 if (BindingHandle
== NULL
)
1663 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1669 ret
= PNP_GetClassName(BindingHandle
,
1675 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1677 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1685 /***********************************************************************
1686 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
1688 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
1689 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1690 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1692 FIXME("%p %lu %p %p %p %lx %lx\n",
1693 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1695 return CR_CALL_NOT_IMPLEMENTED
;
1699 /***********************************************************************
1700 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
1702 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
1703 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1704 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1706 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1707 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
1709 ULONG ulTransferLength
= 0;
1712 TRACE("%p %lu %p %p %p %lx %lx\n",
1713 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1716 if (ClassGuid
== NULL
|| pulLength
== NULL
)
1717 return CR_INVALID_POINTER
;
1720 return CR_INVALID_FLAG
;
1722 if (pSetupStringFromGuid(ClassGuid
,
1724 PNP_MAX_GUID_STRING_LEN
) != 0)
1725 return CR_INVALID_DATA
;
1727 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
1728 return CR_INVALID_PROPERTY
;
1730 if (hMachine
!= NULL
)
1732 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1733 if (BindingHandle
== NULL
)
1738 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1742 ulTransferLength
= *pulLength
;
1746 ret
= PNP_GetClassRegProp(BindingHandle
,
1755 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1757 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1761 if (ret
== CR_SUCCESS
)
1763 if (pulRegDataType
!= NULL
)
1764 *pulRegDataType
= ulType
;
1771 /***********************************************************************
1772 * CM_Get_Depth [SETUPAPI.@]
1774 CONFIGRET WINAPI
CM_Get_Depth(
1775 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1777 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1778 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1782 /***********************************************************************
1783 * CM_Get_Depth_Ex [SETUPAPI.@]
1785 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1786 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1788 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1789 HSTRING_TABLE StringTable
= NULL
;
1793 TRACE("%p %lx %lx %lx\n",
1794 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1796 if (pulDepth
== NULL
)
1797 return CR_INVALID_POINTER
;
1800 return CR_INVALID_DEVINST
;
1803 return CR_INVALID_FLAG
;
1805 if (hMachine
!= NULL
)
1807 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1808 if (BindingHandle
== NULL
)
1811 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1812 if (StringTable
== 0)
1817 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1821 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1822 if (lpDevInst
== NULL
)
1823 return CR_INVALID_DEVNODE
;
1827 ret
= PNP_GetDepth(BindingHandle
,
1832 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1834 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1842 /***********************************************************************
1843 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
1845 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
1846 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1847 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1849 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
1850 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1851 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
1852 pulRegDataType
, Buffer
,
1853 pulLength
, ulFlags
, NULL
);
1857 /***********************************************************************
1858 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
1860 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
1861 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1862 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1864 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
1865 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1866 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
1867 pulRegDataType
, Buffer
,
1868 pulLength
, ulFlags
, NULL
);
1872 /***********************************************************************
1873 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
1875 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
1876 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1877 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1879 LPWSTR pszPropertyNameW
= NULL
;
1882 ULONG ulDataType
= REG_NONE
;
1885 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
1886 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
1889 return CR_INVALID_POINTER
;
1891 ulLengthW
= *pulLength
* sizeof(WCHAR
);
1892 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
1894 return CR_OUT_OF_MEMORY
;
1896 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
1898 if (pszPropertyNameW
== NULL
)
1900 HeapFree(GetProcessHeap(), 0, BufferW
);
1901 return CR_OUT_OF_MEMORY
;
1904 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
1911 if (ret
== CR_SUCCESS
)
1913 if (ulDataType
== REG_SZ
||
1914 ulDataType
== REG_EXPAND_SZ
||
1915 ulDataType
== REG_MULTI_SZ
)
1917 /* Do W->A conversion */
1918 *pulLength
= WideCharToMultiByte(CP_ACP
,
1921 lstrlenW(BufferW
) + 1,
1926 if (*pulLength
== 0)
1931 /* Directly copy the value */
1932 if (ulLengthW
<= *pulLength
)
1933 memcpy(Buffer
, BufferW
, ulLengthW
);
1936 *pulLength
= ulLengthW
;
1937 ret
= CR_BUFFER_SMALL
;
1943 *pulRegDataType
= ulDataType
;
1945 HeapFree(GetProcessHeap(), 0, BufferW
);
1946 MyFree(pszPropertyNameW
);
1952 /***********************************************************************
1953 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
1955 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
1956 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1957 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1959 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1960 HSTRING_TABLE StringTable
= NULL
;
1962 ULONG ulDataType
= REG_NONE
;
1963 ULONG ulTransferLength
;
1964 CONFIGRET ret
= CR_SUCCESS
;
1966 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
1967 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
1968 pulLength
, ulFlags
, hMachine
);
1971 return CR_INVALID_DEVNODE
;
1973 if (pszCustomPropertyName
== NULL
||
1974 pulLength
== NULL
||
1976 return CR_INVALID_POINTER
;
1978 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
1979 return CR_INVALID_FLAG
;
1981 if (hMachine
!= NULL
)
1983 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1984 if (BindingHandle
== NULL
)
1987 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1988 if (StringTable
== 0)
1993 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1997 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1998 if (lpDevInst
== NULL
)
1999 return CR_INVALID_DEVNODE
;
2001 ulTransferLength
= *pulLength
;
2005 ret
= PNP_GetCustomDevProp(BindingHandle
,
2007 (LPWSTR
)pszCustomPropertyName
,
2014 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2016 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2020 if (ret
== CR_SUCCESS
)
2022 if (pulRegDataType
!= NULL
)
2023 *pulRegDataType
= ulDataType
;
2030 /***********************************************************************
2031 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
2033 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
2034 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2035 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2037 TRACE("%lx %lu %p %p %p %lx\n",
2038 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2040 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2041 pulRegDataType
, Buffer
,
2042 pulLength
, ulFlags
, NULL
);
2046 /***********************************************************************
2047 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
2049 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
2050 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2051 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2053 TRACE("%lx %lu %p %p %p %lx\n",
2054 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2056 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2057 pulRegDataType
, Buffer
,
2058 pulLength
, ulFlags
, NULL
);
2062 /***********************************************************************
2063 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
2065 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
2066 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2067 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2071 ULONG ulDataType
= REG_NONE
;
2074 TRACE("%lx %lu %p %p %p %lx %lx\n",
2075 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2079 return CR_INVALID_POINTER
;
2081 LengthW
= *pulLength
* sizeof(WCHAR
);
2082 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
2085 return CR_OUT_OF_MEMORY
;
2087 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
2095 if (ret
== CR_SUCCESS
)
2097 if (ulDataType
== REG_SZ
||
2098 ulDataType
== REG_EXPAND_SZ
||
2099 ulDataType
== REG_MULTI_SZ
)
2101 /* Do W->A conversion */
2102 *pulLength
= WideCharToMultiByte(CP_ACP
,
2105 lstrlenW(BufferW
) + 1,
2110 if (*pulLength
== 0)
2115 /* Directly copy the value */
2116 if (LengthW
<= *pulLength
)
2117 memcpy(Buffer
, BufferW
, LengthW
);
2120 *pulLength
= LengthW
;
2121 ret
= CR_BUFFER_SMALL
;
2127 *pulRegDataType
= ulDataType
;
2129 HeapFree(GetProcessHeap(), 0, BufferW
);
2135 /***********************************************************************
2136 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2138 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2139 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2140 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2142 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2143 HSTRING_TABLE StringTable
= NULL
;
2144 CONFIGRET ret
= CR_SUCCESS
;
2146 ULONG ulDataType
= REG_NONE
;
2147 ULONG ulTransferLength
= 0;
2149 TRACE("%lx %lu %p %p %p %lx %lx\n",
2150 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2154 return CR_INVALID_DEVNODE
;
2156 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2157 return CR_INVALID_PROPERTY
;
2159 /* pulRegDataType is optional */
2161 /* Buffer is optional */
2163 if (pulLength
== NULL
)
2164 return CR_INVALID_POINTER
;
2166 if (*pulLength
== 0)
2167 return CR_INVALID_POINTER
;
2170 return CR_INVALID_FLAG
;
2172 if (hMachine
!= NULL
)
2174 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2175 if (BindingHandle
== NULL
)
2178 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2179 if (StringTable
== 0)
2184 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2188 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2189 if (lpDevInst
== NULL
)
2190 return CR_INVALID_DEVNODE
;
2192 ulTransferLength
= *pulLength
;
2196 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2205 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2207 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2211 if (ret
== CR_SUCCESS
)
2213 if (pulRegDataType
!= NULL
)
2214 *pulRegDataType
= ulDataType
;
2221 /***********************************************************************
2222 * CM_Get_DevNode_Status [SETUPAPI.@]
2224 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2225 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2228 TRACE("%p %p %lx %lx\n",
2229 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2230 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2235 /***********************************************************************
2236 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2239 CM_Get_DevNode_Status_Ex(
2240 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2241 ULONG ulFlags
, HMACHINE hMachine
)
2243 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2244 HSTRING_TABLE StringTable
= NULL
;
2248 TRACE("%p %p %lx %lx %lx\n",
2249 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2251 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2252 return CR_INVALID_POINTER
;
2255 return CR_INVALID_DEVINST
;
2258 return CR_INVALID_FLAG
;
2260 if (hMachine
!= NULL
)
2262 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2263 if (BindingHandle
== NULL
)
2266 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2267 if (StringTable
== 0)
2272 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2276 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2277 if (lpDevInst
== NULL
)
2278 return CR_INVALID_DEVNODE
;
2282 ret
= PNP_GetDeviceStatus(BindingHandle
,
2288 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2290 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2298 /***********************************************************************
2299 * CM_Get_Device_IDA [SETUPAPI.@]
2301 CONFIGRET WINAPI
CM_Get_Device_IDA(
2302 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2304 TRACE("%lx %p %ld %ld\n",
2305 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2306 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2310 /***********************************************************************
2311 * CM_Get_Device_IDW [SETUPAPI.@]
2313 CONFIGRET WINAPI
CM_Get_Device_IDW(
2314 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2316 TRACE("%lx %p %ld %ld\n",
2317 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2318 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2322 /***********************************************************************
2323 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2325 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2326 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2329 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2330 CONFIGRET ret
= CR_SUCCESS
;
2332 TRACE("%lx %p %ld %ld %lx\n",
2333 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2336 return CR_INVALID_POINTER
;
2338 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2343 if (ret
== CR_SUCCESS
)
2345 if (WideCharToMultiByte(CP_ACP
,
2348 lstrlenW(szBufferW
) + 1,
2360 /***********************************************************************
2361 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2363 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2364 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2367 HSTRING_TABLE StringTable
= NULL
;
2369 TRACE("%lx %p %ld %ld %lx\n",
2370 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2373 return CR_INVALID_DEVINST
;
2376 return CR_INVALID_POINTER
;
2379 return CR_INVALID_FLAG
;
2381 if (hMachine
!= NULL
)
2383 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2384 if (StringTable
== NULL
)
2389 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2393 if (!pSetupStringTableStringFromIdEx(StringTable
,
2403 /***********************************************************************
2404 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2406 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2407 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2409 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2410 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2415 /***********************************************************************
2416 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2418 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2419 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2421 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2422 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2427 /***********************************************************************
2428 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2430 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2431 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2434 LPWSTR BufferW
= NULL
;
2435 LPWSTR pszFilterW
= NULL
;
2436 CONFIGRET ret
= CR_SUCCESS
;
2438 TRACE("%p %p %ld %ld %lx\n",
2439 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2441 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2442 if (BufferW
== NULL
)
2443 return CR_OUT_OF_MEMORY
;
2445 if (pszFilter
== NULL
)
2447 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2455 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2457 ret
= CR_INVALID_DEVICE_ID
;
2461 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2470 if (WideCharToMultiByte(CP_ACP
,
2473 lstrlenW(BufferW
) + 1,
2487 /***********************************************************************
2488 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2490 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2491 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2494 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2497 TRACE("%p %p %ld %ld %lx\n",
2498 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2500 if (Buffer
== NULL
|| BufferLen
== 0)
2501 return CR_INVALID_POINTER
;
2503 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2504 return CR_INVALID_FLAG
;
2506 if (hMachine
!= NULL
)
2508 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2509 if (BindingHandle
== NULL
)
2514 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2522 ret
= PNP_GetDeviceList(BindingHandle
,
2528 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2530 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2538 /***********************************************************************
2539 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2541 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2542 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2544 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2545 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2549 /***********************************************************************
2550 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2552 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2553 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2555 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2556 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2560 /***********************************************************************
2561 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2563 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2564 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2566 LPWSTR pszFilterW
= NULL
;
2567 CONFIGRET ret
= CR_SUCCESS
;
2569 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2571 if (pszFilter
== NULL
)
2573 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2580 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2581 return CR_INVALID_DEVICE_ID
;
2583 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2595 /***********************************************************************
2596 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2598 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2599 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2601 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2604 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2607 return CR_INVALID_POINTER
;
2609 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2610 return CR_INVALID_FLAG
;
2612 if (hMachine
!= NULL
)
2614 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2615 if (BindingHandle
== NULL
)
2620 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2628 ret
= PNP_GetDeviceListSize(BindingHandle
,
2633 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2635 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2643 /***********************************************************************
2644 * CM_Get_Device_ID_Size [SETUPAPI.@]
2646 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2647 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2649 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2650 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2654 /***********************************************************************
2655 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2657 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2658 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2660 HSTRING_TABLE StringTable
= NULL
;
2663 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2666 return CR_INVALID_POINTER
;
2669 return CR_INVALID_DEVINST
;
2672 return CR_INVALID_FLAG
;
2674 if (hMachine
!= NULL
)
2676 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2677 if (StringTable
== NULL
)
2682 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2686 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2687 if (DeviceId
== NULL
)
2693 *pulLen
= lstrlenW(DeviceId
);
2699 /***********************************************************************
2700 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2702 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2703 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2704 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2706 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2707 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2709 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2710 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2715 /***********************************************************************
2716 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2718 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2719 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2720 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2722 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2723 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2725 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2726 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2731 /***********************************************************************
2732 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2734 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2735 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2736 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2738 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2739 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2741 return CR_CALL_NOT_IMPLEMENTED
;
2745 /***********************************************************************
2746 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2748 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2749 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2750 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2752 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2753 ULONG ulTransferLength
;
2754 CONFIGRET ret
= CR_SUCCESS
;
2756 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2757 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2759 if (pszDeviceInterface
== NULL
||
2760 AliasInterfaceGuid
== NULL
||
2761 pszAliasDeviceInterface
== NULL
||
2763 return CR_INVALID_POINTER
;
2766 return CR_INVALID_FLAG
;
2768 if (hMachine
!= NULL
)
2770 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2771 if (BindingHandle
== NULL
)
2776 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2780 ulTransferLength
= *pulLength
;
2784 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2785 (LPWSTR
)pszDeviceInterface
,
2787 pszAliasDeviceInterface
,
2792 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2794 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2802 /***********************************************************************
2803 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2805 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2806 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2807 ULONG BufferLen
, ULONG ulFlags
)
2809 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2810 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2812 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2813 Buffer
, BufferLen
, ulFlags
, NULL
);
2817 /***********************************************************************
2818 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2820 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2821 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2822 ULONG BufferLen
, ULONG ulFlags
)
2824 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2825 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2827 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2828 Buffer
, BufferLen
, ulFlags
, NULL
);
2832 /***********************************************************************
2833 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2835 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2836 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2837 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2839 DEVINSTID_W pDeviceIdW
= NULL
;
2840 PWCHAR BufferW
= NULL
;
2841 CONFIGRET ret
= CR_SUCCESS
;
2843 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2844 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2846 if (Buffer
== NULL
||
2848 return CR_INVALID_POINTER
;
2850 if (pDeviceID
!= NULL
)
2852 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2853 return CR_INVALID_DEVICE_ID
;
2856 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2857 if (BufferW
== NULL
)
2859 ret
= CR_OUT_OF_MEMORY
;
2863 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2864 BufferW
, BufferLen
, ulFlags
,
2866 if (ret
!= CR_SUCCESS
)
2869 if (WideCharToMultiByte(CP_ACP
,
2872 lstrlenW(BufferW
) + 1,
2880 if (BufferW
!= NULL
)
2883 if (pDeviceIdW
!= NULL
)
2890 /***********************************************************************
2891 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2893 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2894 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2895 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2897 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2898 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2899 CONFIGRET ret
= CR_SUCCESS
;
2901 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2902 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2904 if (Buffer
== NULL
||
2906 return CR_INVALID_POINTER
;
2908 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2909 return CR_INVALID_FLAG
;
2911 if (hMachine
!= NULL
)
2913 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2914 if (BindingHandle
== NULL
)
2919 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2924 BufferSize
= BufferLen
;
2928 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2935 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2937 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2945 /***********************************************************************
2946 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2948 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2949 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2952 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2953 pDeviceId
, ulFlags
);
2955 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2956 pDeviceId
, ulFlags
, NULL
);
2960 /***********************************************************************
2961 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2963 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2964 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2967 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2968 debugstr_w(pDeviceId
), ulFlags
);
2970 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2971 pDeviceId
, ulFlags
, NULL
);
2975 /***********************************************************************
2976 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2978 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2979 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2980 ULONG ulFlags
, HMACHINE hMachine
)
2982 DEVINSTID_W pDeviceIdW
= NULL
;
2983 CONFIGRET ret
= CR_SUCCESS
;
2985 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2986 pDeviceId
, ulFlags
, hMachine
);
2989 return CR_INVALID_POINTER
;
2991 if (pDeviceId
!= NULL
)
2993 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2994 return CR_INVALID_DEVICE_ID
;
2999 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3000 pDeviceIdW
, ulFlags
, hMachine
);
3002 if (pDeviceIdW
!= NULL
)
3009 /***********************************************************************
3010 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
3012 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
3013 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3014 ULONG ulFlags
, HMACHINE hMachine
)
3016 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3017 CONFIGRET ret
= CR_SUCCESS
;
3019 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3020 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
3023 return CR_INVALID_POINTER
;
3025 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3026 return CR_INVALID_FLAG
;
3028 if (hMachine
!= NULL
)
3030 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3031 if (BindingHandle
== NULL
)
3036 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3044 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
3050 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3052 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3060 /***********************************************************************
3061 * CM_Get_First_Log_Conf [SETUPAPI.@]
3063 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
3064 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
3066 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
3067 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
3071 /***********************************************************************
3072 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
3074 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
3075 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3077 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3078 HSTRING_TABLE StringTable
= NULL
;
3079 LPWSTR lpDevInst
= NULL
;
3080 CONFIGRET ret
= CR_SUCCESS
;
3082 PLOG_CONF_INFO pLogConfInfo
;
3084 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
3087 return CR_INVALID_DEVINST
;
3089 if (ulFlags
& ~LOG_CONF_BITS
)
3090 return CR_INVALID_FLAG
;
3095 if (hMachine
!= NULL
)
3097 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3098 if (BindingHandle
== NULL
)
3101 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3102 if (StringTable
== 0)
3107 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3111 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3112 if (lpDevInst
== NULL
)
3113 return CR_INVALID_DEVNODE
;
3117 ret
= PNP_GetFirstLogConf(BindingHandle
,
3123 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3125 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3129 if (ret
!= CR_SUCCESS
)
3134 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3135 if (pLogConfInfo
== NULL
)
3136 return CR_OUT_OF_MEMORY
;
3138 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3139 pLogConfInfo
->dnDevInst
= dnDevInst
;
3140 pLogConfInfo
->ulFlags
= ulFlags
;
3141 pLogConfInfo
->ulTag
= ulTag
;
3143 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3150 /***********************************************************************
3151 * CM_Get_Global_State [SETUPAPI.@]
3153 CONFIGRET WINAPI
CM_Get_Global_State(
3154 PULONG pulState
, ULONG ulFlags
)
3156 TRACE("%p %lx\n", pulState
, ulFlags
);
3157 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3161 /***********************************************************************
3162 * CM_Get_Global_State_Ex [SETUPAPI.@]
3164 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3165 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3167 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3170 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3172 if (pulState
== NULL
)
3173 return CR_INVALID_POINTER
;
3176 return CR_INVALID_FLAG
;
3178 if (hMachine
!= NULL
)
3180 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3181 if (BindingHandle
== NULL
)
3186 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3192 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3194 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3196 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3204 /***********************************************************************
3205 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3207 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3208 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3211 TRACE("%s %lu %p %lx\n", szDevInstName
,
3212 ulHardwareProfile
, pulValue
, ulFlags
);
3214 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3215 pulValue
, ulFlags
, NULL
);
3219 /***********************************************************************
3220 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3222 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3223 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3226 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3227 ulHardwareProfile
, pulValue
, ulFlags
);
3229 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3230 pulValue
, ulFlags
, NULL
);
3234 /***********************************************************************
3235 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3237 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3238 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3239 ULONG ulFlags
, HMACHINE hMachine
)
3241 DEVINSTID_W pszDevIdW
= NULL
;
3242 CONFIGRET ret
= CR_SUCCESS
;
3244 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3245 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3247 if (szDevInstName
!= NULL
)
3249 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3250 return CR_INVALID_DEVICE_ID
;
3253 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3254 pulValue
, ulFlags
, hMachine
);
3256 if (pszDevIdW
!= NULL
)
3263 /***********************************************************************
3264 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3266 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3267 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3268 ULONG ulFlags
, HMACHINE hMachine
)
3270 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3273 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3274 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3276 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3277 return CR_INVALID_POINTER
;
3280 return CR_INVALID_FLAG
;
3282 /* FIXME: Check whether szDevInstName is valid */
3284 if (hMachine
!= NULL
)
3286 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3287 if (BindingHandle
== NULL
)
3292 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3298 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3299 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3301 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3303 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3311 /***********************************************************************
3312 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3314 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3315 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3317 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3319 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3324 /***********************************************************************
3325 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3327 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3328 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3330 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3332 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3337 /***********************************************************************
3338 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3340 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3341 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3344 HWPROFILEINFO_W LocalProfileInfo
;
3347 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3349 if (pHWProfileInfo
== NULL
)
3350 return CR_INVALID_POINTER
;
3352 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3354 if (ret
== CR_SUCCESS
)
3356 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3357 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3359 if (WideCharToMultiByte(CP_ACP
,
3361 LocalProfileInfo
.HWPI_szFriendlyName
,
3362 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3363 pHWProfileInfo
->HWPI_szFriendlyName
,
3374 /***********************************************************************
3375 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3377 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3378 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3381 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3384 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3386 if (pHWProfileInfo
== NULL
)
3387 return CR_INVALID_POINTER
;
3390 return CR_INVALID_FLAG
;
3392 if (hMachine
!= NULL
)
3394 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3395 if (BindingHandle
== NULL
)
3400 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3406 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3407 sizeof(HWPROFILEINFO_W
), 0);
3409 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3411 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3419 /***********************************************************************
3420 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3422 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3423 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3425 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3426 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3430 /***********************************************************************
3431 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3433 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3434 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3437 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3438 HSTRING_TABLE StringTable
= NULL
;
3439 PLOG_CONF_INFO pLogConfInfo
;
3443 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3445 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3446 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3447 return CR_INVALID_LOG_CONF
;
3449 if (pPriority
== NULL
)
3450 return CR_INVALID_POINTER
;
3453 return CR_INVALID_FLAG
;
3455 if (hMachine
!= NULL
)
3457 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3458 if (BindingHandle
== NULL
)
3461 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3462 if (StringTable
== 0)
3467 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3471 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3472 if (lpDevInst
== NULL
)
3473 return CR_INVALID_DEVNODE
;
3477 ret
= PNP_GetLogConfPriority(BindingHandle
,
3479 pLogConfInfo
->ulFlags
,
3480 pLogConfInfo
->ulTag
,
3484 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3486 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3494 /***********************************************************************
3495 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3497 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3498 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3500 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3501 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3505 /***********************************************************************
3506 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3508 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3509 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3512 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3513 HSTRING_TABLE StringTable
= NULL
;
3514 PLOG_CONF_INFO pLogConfInfo
;
3515 PLOG_CONF_INFO pNewLogConfInfo
;
3520 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3525 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3526 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3527 return CR_INVALID_LOG_CONF
;
3530 return CR_INVALID_FLAG
;
3532 if (hMachine
!= NULL
)
3534 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3535 if (BindingHandle
== NULL
)
3538 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3539 if (StringTable
== 0)
3544 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3548 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3549 if (lpDevInst
== NULL
)
3550 return CR_INVALID_DEVNODE
;
3554 ret
= PNP_GetNextLogConf(BindingHandle
,
3556 pLogConfInfo
->ulFlags
,
3557 pLogConfInfo
->ulTag
,
3561 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3563 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3567 if (ret
!= CR_SUCCESS
)
3572 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3573 if (pNewLogConfInfo
== NULL
)
3574 return CR_OUT_OF_MEMORY
;
3576 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3577 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3578 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3579 pNewLogConfInfo
->ulTag
= ulNewTag
;
3581 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3588 /***********************************************************************
3589 * CM_Get_Next_Re_Des [SETUPAPI.@]
3591 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3592 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3593 PRESOURCEID pResourceID
, ULONG ulFlags
)
3595 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3596 pResourceID
, ulFlags
);
3597 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3598 pResourceID
, ulFlags
, NULL
);
3602 /***********************************************************************
3603 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3605 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3606 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3607 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3609 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3610 pResourceID
, ulFlags
, hMachine
);
3612 return CR_CALL_NOT_IMPLEMENTED
;
3616 /***********************************************************************
3617 * CM_Get_Parent [SETUPAPI.@]
3619 CONFIGRET WINAPI
CM_Get_Parent(
3620 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3622 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3623 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3627 /***********************************************************************
3628 * CM_Get_Parent_Ex [SETUPAPI.@]
3630 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3631 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3633 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3634 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3635 HSTRING_TABLE StringTable
= NULL
;
3637 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3640 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3642 if (pdnDevInst
== NULL
)
3643 return CR_INVALID_POINTER
;
3646 return CR_INVALID_DEVINST
;
3649 return CR_INVALID_FLAG
;
3653 if (hMachine
!= NULL
)
3655 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3656 if (BindingHandle
== NULL
)
3659 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3660 if (StringTable
== 0)
3665 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3669 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3670 if (lpDevInst
== NULL
)
3671 return CR_INVALID_DEVNODE
;
3675 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3676 PNP_GET_PARENT_DEVICE_INSTANCE
,
3682 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3684 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3688 if (ret
!= CR_SUCCESS
)
3691 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3693 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3697 *pdnDevInst
= dwIndex
;
3703 /***********************************************************************
3704 * CM_Get_Res_Des_Data [SETUPAPI.@]
3706 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3707 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3709 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3710 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3714 /***********************************************************************
3715 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3717 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3718 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3721 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3722 return CR_CALL_NOT_IMPLEMENTED
;
3726 /***********************************************************************
3727 * CM_Get_Res_Des_Size [SETUPAPI.@]
3729 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3730 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3732 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3733 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3737 /***********************************************************************
3738 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3740 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3741 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3743 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3744 return CR_CALL_NOT_IMPLEMENTED
;
3748 /***********************************************************************
3749 * CM_Get_Sibling [SETUPAPI.@]
3751 CONFIGRET WINAPI
CM_Get_Sibling(
3752 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3754 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3755 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3759 /***********************************************************************
3760 * CM_Get_Sibling_Ex [SETUPAPI.@]
3762 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3763 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3765 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3766 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3767 HSTRING_TABLE StringTable
= NULL
;
3769 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3772 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3774 if (pdnDevInst
== NULL
)
3775 return CR_INVALID_POINTER
;
3778 return CR_INVALID_DEVINST
;
3781 return CR_INVALID_FLAG
;
3785 if (hMachine
!= NULL
)
3787 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3788 if (BindingHandle
== NULL
)
3791 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3792 if (StringTable
== 0)
3797 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3801 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3802 if (lpDevInst
== NULL
)
3803 return CR_INVALID_DEVNODE
;
3807 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3808 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3814 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3816 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3820 if (ret
!= CR_SUCCESS
)
3823 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3825 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3829 *pdnDevInst
= dwIndex
;
3835 /***********************************************************************
3836 * CM_Get_Version [SETUPAPI.@]
3838 WORD WINAPI
CM_Get_Version(VOID
)
3841 return CM_Get_Version_Ex(NULL
);
3845 /***********************************************************************
3846 * CM_Get_Version_Ex [SETUPAPI.@]
3848 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3850 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3854 TRACE("%lx\n", hMachine
);
3856 if (hMachine
!= NULL
)
3858 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3859 if (BindingHandle
== NULL
)
3864 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3870 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3872 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3874 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3878 if (ret
!= CR_SUCCESS
)
3885 /***********************************************************************
3886 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3888 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3891 TRACE("%p\n", pbPresent
);
3892 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3896 /***********************************************************************
3897 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3899 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3900 PBOOL pbPresent
, HMACHINE hMachine
)
3902 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3905 TRACE("%p %lx\n", pbPresent
, hMachine
);
3907 if (pbPresent
== NULL
)
3908 return CR_INVALID_POINTER
;
3912 if (hMachine
!= NULL
)
3914 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3915 if (BindingHandle
== NULL
)
3920 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3926 ret
= PNP_IsDockStationPresent(BindingHandle
,
3929 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3931 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3939 /***********************************************************************
3940 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3942 BOOL WINAPI
CM_Is_Version_Available(
3945 TRACE("%hu\n", wVersion
);
3946 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3950 /***********************************************************************
3951 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3953 BOOL WINAPI
CM_Is_Version_Available_Ex(
3954 WORD wVersion
, HMACHINE hMachine
)
3956 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3957 WORD wServerVersion
;
3960 TRACE("%hu %lx\n", wVersion
, hMachine
);
3962 if (wVersion
<= 0x400)
3965 if (hMachine
!= NULL
)
3967 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3968 if (BindingHandle
== NULL
)
3973 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3979 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3981 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3983 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3987 if (ret
!= CR_SUCCESS
)
3990 return (wServerVersion
>= wVersion
);
3994 /***********************************************************************
3995 * CM_Locate_DevNodeA [SETUPAPI.@]
3997 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3998 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
4000 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
4001 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4005 /***********************************************************************
4006 * CM_Locate_DevNodeW [SETUPAPI.@]
4008 CONFIGRET WINAPI
CM_Locate_DevNodeW(
4009 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
4011 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
4012 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4016 /***********************************************************************
4017 * CM_Locate_DevNode_ExA [SETUPAPI.@]
4019 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
4020 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
4022 DEVINSTID_W pDevIdW
= NULL
;
4023 CONFIGRET ret
= CR_SUCCESS
;
4025 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
4027 if (pDeviceID
!= NULL
)
4029 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
4030 return CR_INVALID_DEVICE_ID
;
4033 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
4035 if (pDevIdW
!= NULL
)
4042 /***********************************************************************
4043 * CM_Locate_DevNode_ExW [SETUPAPI.@]
4045 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
4046 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
4048 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
4049 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4050 HSTRING_TABLE StringTable
= NULL
;
4051 CONFIGRET ret
= CR_SUCCESS
;
4053 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4055 if (pdnDevInst
== NULL
)
4056 return CR_INVALID_POINTER
;
4058 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
4059 return CR_INVALID_FLAG
;
4061 if (hMachine
!= NULL
)
4063 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4064 if (BindingHandle
== NULL
)
4067 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4068 if (StringTable
== 0)
4073 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4077 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
4079 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
4085 /* Get the root device ID */
4086 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
4090 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4092 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4096 if (ret
!= CR_SUCCESS
)
4099 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4103 /* Validate the device ID */
4104 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4108 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4110 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4114 if (ret
== CR_SUCCESS
)
4116 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4117 if (*pdnDevInst
== -1)
4125 /***********************************************************************
4126 * CM_Modify_Res_Des [SETUPAPI.@]
4128 CONFIGRET WINAPI
CM_Modify_Res_Des(
4129 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
4130 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
4132 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4133 ResourceLen
, ulFlags
);
4134 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4135 ResourceLen
, ulFlags
, NULL
);
4139 /***********************************************************************
4140 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4142 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
4143 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
4144 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
4146 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4147 ResourceLen
, ulFlags
, hMachine
);
4148 return CR_CALL_NOT_IMPLEMENTED
;
4152 /***********************************************************************
4153 * CM_Move_DevNode [SETUPAPI.@]
4155 CONFIGRET WINAPI
CM_Move_DevNode(
4156 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
4158 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
4159 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4163 /***********************************************************************
4164 * CM_Move_DevNode_Ex [SETUPAPI.@]
4166 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
4167 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
4170 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4171 HSTRING_TABLE StringTable
= NULL
;
4172 LPWSTR lpFromDevInst
;
4176 FIXME("%lx %lx %lx %lx\n",
4177 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4179 if (!pSetupIsUserAdmin())
4180 return CR_ACCESS_DENIED
;
4182 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4183 return CR_INVALID_DEVNODE
;
4186 return CR_INVALID_FLAG
;
4188 if (hMachine
!= NULL
)
4190 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4191 if (BindingHandle
== NULL
)
4194 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4195 if (StringTable
== 0)
4200 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4204 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4205 if (lpFromDevInst
== NULL
)
4206 return CR_INVALID_DEVNODE
;
4208 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4209 if (lpToDevInst
== NULL
)
4210 return CR_INVALID_DEVNODE
;
4214 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4220 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4222 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4230 /***********************************************************************
4231 * CM_Open_Class_KeyA [SETUPAPI.@]
4233 CONFIGRET WINAPI
CM_Open_Class_KeyA(
4234 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4235 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4237 TRACE("%p %s %lx %lx %p %lx\n",
4238 debugstr_guid(pClassGuid
), pszClassName
,
4239 samDesired
, Disposition
, phkClass
, ulFlags
);
4241 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4242 Disposition
, phkClass
, ulFlags
, NULL
);
4246 /***********************************************************************
4247 * CM_Open_Class_KeyW [SETUPAPI.@]
4249 CONFIGRET WINAPI
CM_Open_Class_KeyW(
4250 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4251 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4253 TRACE("%p %s %lx %lx %p %lx\n",
4254 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4255 samDesired
, Disposition
, phkClass
, ulFlags
);
4257 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4258 Disposition
, phkClass
, ulFlags
, NULL
);
4262 /***********************************************************************
4263 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4265 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
4266 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4267 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4270 LPWSTR pszClassNameW
= NULL
;
4273 TRACE("%p %s %lx %lx %p %lx %lx\n",
4274 debugstr_guid(pClassGuid
), pszClassName
,
4275 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4277 if (pszClassName
!= NULL
)
4279 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4280 return CR_INVALID_DATA
;
4283 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4284 Disposition
, phkClass
, ulFlags
, hMachine
);
4286 if (pszClassNameW
!= NULL
)
4287 MyFree(pszClassNameW
);
4293 /***********************************************************************
4294 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4296 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
4297 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4298 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4301 WCHAR szKeyName
[MAX_PATH
];
4302 LPWSTR lpGuidString
;
4303 DWORD dwDisposition
;
4307 TRACE("%p %s %lx %lx %p %lx %lx\n",
4308 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4309 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4311 /* Check Disposition and ulFlags */
4312 if ((Disposition
& ~RegDisposition_Bits
) ||
4313 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
4314 return CR_INVALID_FLAG
;
4316 /* Check phkClass */
4317 if (phkClass
== NULL
)
4318 return CR_INVALID_POINTER
;
4322 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
4323 pszClassName
!= NULL
)
4324 return CR_INVALID_DATA
;
4326 if (hMachine
== NULL
)
4328 hKey
= HKEY_LOCAL_MACHINE
;
4332 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
4333 HKEY_LOCAL_MACHINE
, &hKey
))
4334 return CR_REGISTRY_ERROR
;
4337 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
4339 lstrcpyW(szKeyName
, DeviceClasses
);
4343 lstrcpyW(szKeyName
, ControlClass
);
4346 if (pClassGuid
!= NULL
)
4348 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
4351 return CR_INVALID_DATA
;
4354 lstrcatW(szKeyName
, Backslash
);
4355 lstrcatW(szKeyName
, lpGuidString
);
4358 if (Disposition
== RegDisposition_OpenAlways
)
4360 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
4361 NULL
, phkClass
, &dwDisposition
);
4365 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
4370 if (pClassGuid
!= NULL
)
4371 RpcStringFreeW(&lpGuidString
);
4373 if (dwError
!= ERROR_SUCCESS
)
4376 return CR_NO_SUCH_REGISTRY_KEY
;
4379 if (pszClassName
!= NULL
)
4381 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
4382 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
4389 /***********************************************************************
4390 * CM_Open_DevNode_Key [SETUPAPI.@]
4392 CONFIGRET WINAPI
CM_Open_DevNode_Key(
4393 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4394 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
4396 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
4397 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
4398 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
4399 Disposition
, phkDevice
, ulFlags
, NULL
);
4403 /***********************************************************************
4404 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
4406 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
4407 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4408 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4411 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4412 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4414 return CR_CALL_NOT_IMPLEMENTED
;
4418 /***********************************************************************
4419 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4421 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4422 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4423 ULONG ulNameLength
, ULONG ulFlags
)
4425 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4426 ulNameLength
, ulFlags
);
4428 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4429 ulNameLength
, ulFlags
, NULL
);
4433 /***********************************************************************
4434 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4436 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4437 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4438 ULONG ulNameLength
, ULONG ulFlags
)
4440 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4441 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4443 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4444 ulNameLength
, ulFlags
, NULL
);
4448 /***********************************************************************
4449 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4451 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4452 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4453 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4455 LPWSTR lpLocalVetoName
;
4458 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4459 ulNameLength
, ulFlags
, hMachine
);
4461 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4462 return CR_INVALID_POINTER
;
4464 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4465 if (lpLocalVetoName
== NULL
)
4466 return CR_OUT_OF_MEMORY
;
4468 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4469 ulNameLength
, ulFlags
, hMachine
);
4470 if (ret
== CR_REMOVE_VETOED
)
4472 if (WideCharToMultiByte(CP_ACP
,
4483 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4489 /***********************************************************************
4490 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4492 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4493 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4494 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4496 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4497 HSTRING_TABLE StringTable
= NULL
;
4501 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4502 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4504 if (dnAncestor
== 0)
4505 return CR_INVALID_DEVNODE
;
4507 if (ulFlags
& ~CM_REMOVE_BITS
)
4508 return CR_INVALID_FLAG
;
4510 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4511 return CR_INVALID_POINTER
;
4513 if (hMachine
!= NULL
)
4515 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4516 if (BindingHandle
== NULL
)
4519 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4520 if (StringTable
== 0)
4525 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4529 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4530 if (lpDevInst
== NULL
)
4531 return CR_INVALID_DEVNODE
;
4535 ret
= PNP_QueryRemove(BindingHandle
,
4542 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4544 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4552 /***********************************************************************
4553 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4555 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4556 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4559 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4560 ResourceID
, ulFlags
);
4562 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4563 ResourceID
, ulFlags
, NULL
);
4567 /***********************************************************************
4568 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4570 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4573 IN DEVINST dnDevInst
,
4574 IN RESOURCEID ResourceID
,
4576 IN HMACHINE hMachine
)
4578 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4579 HSTRING_TABLE StringTable
= NULL
;
4583 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4584 ResourceID
, ulFlags
, hMachine
);
4586 if (pData
== NULL
|| DataLen
== 0)
4587 return CR_INVALID_POINTER
;
4590 return CR_INVALID_DEVINST
;
4592 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4593 return CR_INVALID_FLAG
;
4595 if (hMachine
!= NULL
)
4597 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4598 if (BindingHandle
== NULL
)
4601 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4602 if (StringTable
== 0)
4607 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4611 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4612 if (lpDevInst
== NULL
)
4613 return CR_INVALID_DEVNODE
;
4617 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4624 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4626 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4634 /***********************************************************************
4635 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4637 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4638 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4640 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4642 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4647 /***********************************************************************
4648 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4650 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4651 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4652 ULONG ulFlags
, HMACHINE hMachine
)
4654 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4655 HSTRING_TABLE StringTable
= NULL
;
4659 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4662 if (pulSize
== NULL
)
4663 return CR_INVALID_POINTER
;
4666 return CR_INVALID_DEVINST
;
4668 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4669 return CR_INVALID_FLAG
;
4671 if (hMachine
!= NULL
)
4673 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4674 if (BindingHandle
== NULL
)
4677 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4678 if (StringTable
== 0)
4683 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4687 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4688 if (lpDevInst
== NULL
)
4689 return CR_INVALID_DEVNODE
;
4693 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4699 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4701 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4709 /***********************************************************************
4710 * CM_Query_Remove_SubTree [SETUPAPI.@]
4712 * This function is obsolete in Windows XP and above.
4714 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4715 DEVINST dnAncestor
, ULONG ulFlags
)
4717 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4718 return CR_CALL_NOT_IMPLEMENTED
;
4722 /***********************************************************************
4723 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4725 * This function is obsolete in Windows XP and above.
4727 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4728 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4730 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4731 return CR_CALL_NOT_IMPLEMENTED
;
4735 /***********************************************************************
4736 * CM_Reenumerate_DevNode [SETUPAPI.@]
4738 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4739 DEVINST dnDevInst
, ULONG ulFlags
)
4741 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4742 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4746 /***********************************************************************
4747 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4750 CM_Reenumerate_DevNode_Ex(
4751 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4753 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4754 HSTRING_TABLE StringTable
= NULL
;
4758 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4761 return CR_INVALID_DEVNODE
;
4763 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4764 return CR_INVALID_FLAG
;
4766 if (hMachine
!= NULL
)
4768 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4769 if (BindingHandle
== NULL
)
4772 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4773 if (StringTable
== 0)
4778 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4782 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4783 if (lpDevInst
== NULL
)
4784 return CR_INVALID_DEVNODE
;
4788 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4789 PNP_DEVINST_REENUMERATE
,
4794 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4796 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4804 /***********************************************************************
4805 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4807 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4808 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4809 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4811 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4812 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4814 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4815 pszReference
, pszDeviceInterface
,
4816 pulLength
, ulFlags
, NULL
);
4820 /***********************************************************************
4821 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4823 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4824 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4825 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4827 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4828 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4830 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4831 pszReference
, pszDeviceInterface
,
4832 pulLength
, ulFlags
, NULL
);
4836 /***********************************************************************
4837 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4839 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4840 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4841 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4843 LPWSTR pszReferenceW
= NULL
;
4844 LPWSTR pszDeviceInterfaceW
= NULL
;
4848 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4849 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4851 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4852 return CR_INVALID_POINTER
;
4854 if (pszReference
!= NULL
)
4856 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4857 return CR_INVALID_DATA
;
4860 ulLength
= *pulLength
;
4862 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4863 if (pszDeviceInterfaceW
== NULL
)
4865 ret
= CR_OUT_OF_MEMORY
;
4869 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4872 pszDeviceInterfaceW
,
4876 if (ret
== CR_SUCCESS
)
4878 if (WideCharToMultiByte(CP_ACP
,
4880 pszDeviceInterfaceW
,
4889 *pulLength
= ulLength
;
4892 if (pszDeviceInterfaceW
!= NULL
)
4893 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4895 if (pszReferenceW
!= NULL
)
4896 MyFree(pszReferenceW
);
4902 /***********************************************************************
4903 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4905 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4906 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4907 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4909 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4910 HSTRING_TABLE StringTable
= NULL
;
4912 ULONG ulTransferLength
;
4915 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4916 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4919 return CR_INVALID_DEVNODE
;
4921 if (InterfaceClassGuid
== NULL
||
4922 pszDeviceInterface
== NULL
||
4924 return CR_INVALID_POINTER
;
4927 return CR_INVALID_FLAG
;
4929 if (hMachine
!= NULL
)
4931 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4932 if (BindingHandle
== NULL
)
4935 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4936 if (StringTable
== 0)
4941 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4945 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4946 if (lpDevInst
== NULL
)
4947 return CR_INVALID_DEVNODE
;
4949 ulTransferLength
= *pulLength
;
4953 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4956 (LPWSTR
)pszReference
,
4962 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4964 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4972 /***********************************************************************
4973 * CM_Register_Device_Driver [SETUPAPI.@]
4975 CONFIGRET WINAPI
CM_Register_Device_Driver(
4976 DEVINST dnDevInst
, ULONG ulFlags
)
4978 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4979 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4983 /***********************************************************************
4984 * CM_Register_Device_Driver [SETUPAPI.@]
4986 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4987 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4989 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4990 HSTRING_TABLE StringTable
= NULL
;
4994 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4997 return CR_INVALID_DEVNODE
;
4999 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
5000 return CR_INVALID_FLAG
;
5002 if (hMachine
!= NULL
)
5004 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5005 if (BindingHandle
== NULL
)
5008 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5009 if (StringTable
== 0)
5014 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5018 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5019 if (lpDevInst
== NULL
)
5020 return CR_INVALID_DEVNODE
;
5024 ret
= PNP_RegisterDriver(BindingHandle
,
5028 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5030 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5038 /***********************************************************************
5039 * CM_Remove_SubTree [SETUPAPI.@]
5041 * This function is obsolete in Windows XP and above.
5043 CONFIGRET WINAPI
CM_Remove_SubTree(
5044 DEVINST dnAncestor
, ULONG ulFlags
)
5046 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5047 return CR_CALL_NOT_IMPLEMENTED
;
5051 /***********************************************************************
5052 * CM_Remove_SubTree_Ex [SETUPAPI.@]
5054 * This function is obsolete in Windows XP and above.
5056 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
5057 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5059 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5060 return CR_CALL_NOT_IMPLEMENTED
;
5064 /***********************************************************************
5065 * CM_Request_Device_EjectA [SETUPAPI.@]
5067 CONFIGRET WINAPI
CM_Request_Device_EjectA(
5068 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5069 ULONG ulNameLength
, ULONG ulFlags
)
5071 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5072 ulNameLength
, ulFlags
);
5073 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
5074 ulNameLength
, ulFlags
, NULL
);
5078 /***********************************************************************
5079 * CM_Request_Device_EjectW [SETUPAPI.@]
5081 CONFIGRET WINAPI
CM_Request_Device_EjectW(
5082 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5083 ULONG ulNameLength
, ULONG ulFlags
)
5085 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
5086 ulNameLength
, ulFlags
);
5087 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
5088 ulNameLength
, ulFlags
, NULL
);
5092 /***********************************************************************
5093 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
5095 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
5096 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5097 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5099 LPWSTR lpLocalVetoName
;
5102 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5103 ulNameLength
, ulFlags
, hMachine
);
5105 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5106 return CR_INVALID_POINTER
;
5108 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5109 if (lpLocalVetoName
== NULL
)
5110 return CR_OUT_OF_MEMORY
;
5112 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5113 ulNameLength
, ulFlags
, hMachine
);
5114 if (ret
== CR_REMOVE_VETOED
)
5116 if (WideCharToMultiByte(CP_ACP
,
5127 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5133 /***********************************************************************
5134 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5136 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5137 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5138 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5140 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5141 HSTRING_TABLE StringTable
= NULL
;
5145 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5146 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5149 return CR_INVALID_DEVNODE
;
5152 return CR_INVALID_FLAG
;
5154 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5155 return CR_INVALID_POINTER
;
5157 if (hMachine
!= NULL
)
5159 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5160 if (BindingHandle
== NULL
)
5163 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5164 if (StringTable
== 0)
5169 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5173 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5174 if (lpDevInst
== NULL
)
5175 return CR_INVALID_DEVNODE
;
5179 ret
= PNP_RequestDeviceEject(BindingHandle
,
5186 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5188 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5196 /***********************************************************************
5197 * CM_Request_Eject_PC [SETUPAPI.@]
5199 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
5202 return CM_Request_Eject_PC_Ex(NULL
);
5206 /***********************************************************************
5207 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
5209 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
5212 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5215 TRACE("%lx\n", hMachine
);
5217 if (hMachine
!= NULL
)
5219 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5220 if (BindingHandle
== NULL
)
5225 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5231 ret
= PNP_RequestEjectPC(BindingHandle
);
5233 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5235 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5243 /***********************************************************************
5244 * CM_Run_Detection [SETUPAPI.@]
5246 CONFIGRET WINAPI
CM_Run_Detection(
5249 TRACE("%lx\n", ulFlags
);
5250 return CM_Run_Detection_Ex(ulFlags
, NULL
);
5254 /***********************************************************************
5255 * CM_Run_Detection_Ex [SETUPAPI.@]
5257 CONFIGRET WINAPI
CM_Run_Detection_Ex(
5258 ULONG ulFlags
, HMACHINE hMachine
)
5260 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5263 TRACE("%lx %lx\n", ulFlags
, hMachine
);
5265 if (!pSetupIsUserAdmin())
5266 return CR_ACCESS_DENIED
;
5268 if (ulFlags
& ~CM_DETECT_BITS
)
5269 return CR_INVALID_FLAG
;
5271 if (hMachine
!= NULL
)
5273 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5274 if (BindingHandle
== NULL
)
5279 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5285 ret
= PNP_RunDetection(BindingHandle
,
5288 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5290 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5298 /***********************************************************************
5299 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
5301 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
5302 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5303 ULONG ulFlags
, HMACHINE hMachine
)
5305 FIXME("%p %lx %p %lu %lx %p\n",
5306 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5307 return CR_CALL_NOT_IMPLEMENTED
;
5311 /***********************************************************************
5312 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
5314 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
5315 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5316 ULONG ulFlags
, HMACHINE hMachine
)
5318 FIXME("%p %lx %p %lu %lx %p\n",
5319 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5320 return CR_CALL_NOT_IMPLEMENTED
;
5324 /***********************************************************************
5325 * CM_Set_DevNode_Problem [SETUPAPI.@]
5327 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
5328 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
5330 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
5331 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
5335 /***********************************************************************
5336 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
5338 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
5339 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
5341 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5342 HSTRING_TABLE StringTable
= NULL
;
5346 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
5349 return CR_INVALID_DEVNODE
;
5351 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
5352 return CR_INVALID_FLAG
;
5354 if (hMachine
!= NULL
)
5356 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5357 if (BindingHandle
== NULL
)
5360 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5361 if (StringTable
== 0)
5366 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5370 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5371 if (lpDevInst
== NULL
)
5372 return CR_INVALID_DEVNODE
;
5376 ret
= PNP_SetDeviceProblem(BindingHandle
,
5381 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5383 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5391 /***********************************************************************
5392 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
5394 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
5395 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5398 TRACE("%lx %lu %p %lx %lx\n",
5399 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5400 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
5406 /***********************************************************************
5407 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
5409 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
5410 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5413 TRACE("%lx %lu %p %lx %lx\n",
5414 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5415 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
5421 /***********************************************************************
5422 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
5424 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
5425 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5426 ULONG ulFlags
, HMACHINE hMachine
)
5428 CONFIGRET ret
= CR_SUCCESS
;
5432 FIXME("%lx %lu %p %lx %lx %lx\n",
5433 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5435 if (Buffer
== NULL
&& ulLength
!= 0)
5436 return CR_INVALID_POINTER
;
5440 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5449 /* Get property type */
5452 case CM_DRP_DEVICEDESC
:
5456 case CM_DRP_HARDWAREID
:
5457 ulType
= REG_MULTI_SZ
;
5460 case CM_DRP_COMPATIBLEIDS
:
5461 ulType
= REG_MULTI_SZ
;
5464 case CM_DRP_SERVICE
:
5472 case CM_DRP_CLASSGUID
:
5480 case CM_DRP_CONFIGFLAGS
:
5488 case CM_DRP_FRIENDLYNAME
:
5492 case CM_DRP_LOCATION_INFORMATION
:
5496 case CM_DRP_UPPERFILTERS
:
5497 ulType
= REG_MULTI_SZ
;
5500 case CM_DRP_LOWERFILTERS
:
5501 ulType
= REG_MULTI_SZ
;
5504 case CM_DRP_SECURITY
:
5505 ulType
= REG_BINARY
;
5508 case CM_DRP_DEVTYPE
:
5512 case CM_DRP_EXCLUSIVE
:
5516 case CM_DRP_CHARACTERISTICS
:
5520 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5524 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5529 return CR_INVALID_PROPERTY
;
5532 /* Allocate buffer if needed */
5533 if (ulType
== REG_SZ
||
5534 ulType
== REG_MULTI_SZ
)
5536 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5537 if (lpBuffer
== NULL
)
5539 ret
= CR_OUT_OF_MEMORY
;
5543 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5544 ulLength
, lpBuffer
, ulLength
))
5551 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5554 ulLength
* sizeof(WCHAR
),
5563 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5571 ret
= CR_CALL_NOT_IMPLEMENTED
;
5578 /***********************************************************************
5579 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5581 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5582 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5583 ULONG ulFlags
, HMACHINE hMachine
)
5585 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5586 HSTRING_TABLE StringTable
= NULL
;
5591 TRACE("%lx %lu %p %lx %lx %lx\n",
5592 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5595 return CR_INVALID_DEVNODE
;
5597 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5598 return CR_INVALID_PROPERTY
;
5600 if (Buffer
!= NULL
&& ulLength
== 0)
5601 return CR_INVALID_POINTER
;
5604 return CR_INVALID_FLAG
;
5606 if (hMachine
!= NULL
)
5608 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5609 if (BindingHandle
== NULL
)
5612 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5613 if (StringTable
== 0)
5618 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5622 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5623 if (lpDevInst
== NULL
)
5624 return CR_INVALID_DEVNODE
;
5628 case CM_DRP_DEVICEDESC
:
5632 case CM_DRP_HARDWAREID
:
5633 ulType
= REG_MULTI_SZ
;
5636 case CM_DRP_COMPATIBLEIDS
:
5637 ulType
= REG_MULTI_SZ
;
5640 case CM_DRP_SERVICE
:
5648 case CM_DRP_CLASSGUID
:
5656 case CM_DRP_CONFIGFLAGS
:
5664 case CM_DRP_FRIENDLYNAME
:
5668 case CM_DRP_LOCATION_INFORMATION
:
5672 case CM_DRP_UPPERFILTERS
:
5673 ulType
= REG_MULTI_SZ
;
5676 case CM_DRP_LOWERFILTERS
:
5677 ulType
= REG_MULTI_SZ
;
5680 case CM_DRP_SECURITY
:
5681 ulType
= REG_BINARY
;
5684 case CM_DRP_DEVTYPE
:
5688 case CM_DRP_EXCLUSIVE
:
5692 case CM_DRP_CHARACTERISTICS
:
5696 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5700 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5705 return CR_INVALID_PROPERTY
;
5710 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5718 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5720 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5728 /***********************************************************************
5729 * CM_Set_HW_Prof [SETUPAPI.@]
5731 CONFIGRET WINAPI
CM_Set_HW_Prof(
5732 ULONG ulHardwareProfile
, ULONG ulFlags
)
5734 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5735 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5739 /***********************************************************************
5740 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5742 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5743 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5745 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5748 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5750 if (!pSetupIsUserAdmin())
5751 return CR_ACCESS_DENIED
;
5754 return CR_INVALID_FLAG
;
5756 if (hMachine
!= NULL
)
5758 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5759 if (BindingHandle
== NULL
)
5764 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5770 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5772 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5774 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5782 /***********************************************************************
5783 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5785 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5786 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5789 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5790 ulConfig
, ulValue
, ulFlags
);
5791 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5796 /***********************************************************************
5797 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5799 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5800 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5803 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5804 ulConfig
, ulValue
, ulFlags
);
5805 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5810 /***********************************************************************
5811 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5813 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5814 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5815 ULONG ulFlags
, HMACHINE hMachine
)
5817 DEVINSTID_W pszDevIdW
= NULL
;
5818 CONFIGRET ret
= CR_SUCCESS
;
5820 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5821 ulConfig
, ulValue
, ulFlags
, hMachine
);
5823 if (szDevInstName
!= NULL
)
5825 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5826 return CR_INVALID_DEVICE_ID
;
5829 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5832 if (pszDevIdW
!= NULL
)
5839 /***********************************************************************
5840 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5842 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5843 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5844 ULONG ulFlags
, HMACHINE hMachine
)
5846 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5849 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5850 ulConfig
, ulValue
, ulFlags
, hMachine
);
5852 if (szDevInstName
== NULL
)
5853 return CR_INVALID_POINTER
;
5855 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5856 return CR_INVALID_FLAG
;
5858 /* FIXME: Check whether szDevInstName is valid */
5860 if (hMachine
!= NULL
)
5862 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5863 if (BindingHandle
== NULL
)
5868 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5874 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5875 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5877 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5879 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5887 /***********************************************************************
5888 * CM_Setup_DevNode [SETUPAPI.@]
5890 CONFIGRET WINAPI
CM_Setup_DevNode(
5891 DEVINST dnDevInst
, ULONG ulFlags
)
5893 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5894 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5898 /***********************************************************************
5899 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5901 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5902 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5904 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5905 HSTRING_TABLE StringTable
= NULL
;
5909 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5911 if (!pSetupIsUserAdmin())
5912 return CR_ACCESS_DENIED
;
5915 return CR_INVALID_DEVNODE
;
5917 if (ulFlags
& ~CM_SETUP_BITS
)
5918 return CR_INVALID_FLAG
;
5920 if (hMachine
!= NULL
)
5922 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5923 if (BindingHandle
== NULL
)
5926 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5927 if (StringTable
== 0)
5932 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5936 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5937 if (lpDevInst
== NULL
)
5938 return CR_INVALID_DEVNODE
;
5942 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5948 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5950 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5958 /***********************************************************************
5959 * CM_Uninstall_DevNode [SETUPAPI.@]
5961 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5962 DEVINST dnPhantom
, ULONG ulFlags
)
5964 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5965 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5969 /***********************************************************************
5970 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5972 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5973 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5975 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5976 HSTRING_TABLE StringTable
= NULL
;
5980 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5983 return CR_INVALID_DEVNODE
;
5986 return CR_INVALID_FLAG
;
5988 if (hMachine
!= NULL
)
5990 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5991 if (BindingHandle
== NULL
)
5994 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5995 if (StringTable
== 0)
6000 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6004 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
6005 if (lpDevInst
== NULL
)
6006 return CR_INVALID_DEVNODE
;
6010 ret
= PNP_UninstallDevInst(BindingHandle
,
6014 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6016 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6024 /***********************************************************************
6025 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
6027 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
6028 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
6030 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
6032 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
6037 /***********************************************************************
6038 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
6040 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
6041 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
6043 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
6045 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
6050 /***********************************************************************
6051 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
6053 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
6054 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6056 LPWSTR pszDeviceInterfaceW
= NULL
;
6059 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
6061 if (pszDeviceInterface
== NULL
)
6062 return CR_INVALID_POINTER
;
6064 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
6065 return CR_INVALID_DATA
;
6067 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
6070 if (pszDeviceInterfaceW
!= NULL
)
6071 MyFree(pszDeviceInterfaceW
);
6077 /***********************************************************************
6078 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
6080 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
6081 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6083 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6086 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
6088 if (pszDeviceInterface
== NULL
)
6089 return CR_INVALID_POINTER
;
6092 return CR_INVALID_FLAG
;
6094 if (hMachine
!= NULL
)
6096 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6097 if (BindingHandle
== NULL
)
6102 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6108 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6109 (LPWSTR
)pszDeviceInterface
,
6112 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6114 ret
= RpcStatusToCmStatus(RpcExceptionCode());