2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005, 2006 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "setupapi_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
26 /* Registry key and value names */
27 static const WCHAR Backslash
[] = {'\\', 0};
28 static const WCHAR Class
[] = {'C','l','a','s','s',0};
30 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
31 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
32 'C','o','n','t','r','o','l','\\',
33 'C','l','a','s','s',0};
35 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
36 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
37 'C','o','n','t','r','o','l','\\',
38 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
40 typedef struct _MACHINE_INFO
42 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
43 RPC_BINDING_HANDLE BindingHandle
;
44 HSTRING_TABLE StringTable
;
46 } MACHINE_INFO
, *PMACHINE_INFO
;
49 typedef struct _LOG_CONF_INFO
55 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
57 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
60 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
64 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
67 lstrcpyW(&String
[1], lpString
);
70 String
[MAX_GUID_STRING_LEN
- 2] = '}';
71 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
73 RpcStringFreeW(&lpString
);
80 RpcStatusToCmStatus(RPC_STATUS Status
)
86 /***********************************************************************
87 * CMP_Init_Detection [SETUPAPI.@]
89 CONFIGRET WINAPI
CMP_Init_Detection(
92 RPC_BINDING_HANDLE BindingHandle
= NULL
;
95 TRACE("%lu\n", dwMagic
);
97 if (dwMagic
!= CMP_MAGIC
)
98 return CR_INVALID_DATA
;
100 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
105 ret
= PNP_InitDetection(BindingHandle
);
107 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
109 ret
= RpcStatusToCmStatus(RpcExceptionCode());
117 /***********************************************************************
118 * CMP_RegisterNotification [SETUPAPI.@]
122 CMP_RegisterNotification(IN HANDLE hRecipient
,
123 IN LPVOID lpvNotificationFilter
,
125 OUT PULONG pluhDevNotify
)
127 FIXME("Stub %p %p %lu %p\n", hRecipient
, lpvNotificationFilter
, dwFlags
, pluhDevNotify
);
128 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
133 /***********************************************************************
134 * CMP_Report_LogOn [SETUPAPI.@]
136 CONFIGRET WINAPI
CMP_Report_LogOn(
140 RPC_BINDING_HANDLE BindingHandle
= NULL
;
141 CONFIGRET ret
= CR_SUCCESS
;
145 TRACE("%lu\n", dwMagic
);
147 if (dwMagic
!= CMP_MAGIC
)
148 return CR_INVALID_DATA
;
150 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
153 bAdmin
= pSetupIsUserAdmin();
155 for (i
= 0; i
< 30; i
++)
159 ret
= PNP_ReportLogOn(BindingHandle
,
163 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
165 ret
= RpcStatusToCmStatus(RpcExceptionCode());
169 if (ret
== CR_SUCCESS
)
179 /***********************************************************************
180 * CMP_UnregisterNotification [SETUPAPI.@]
184 CMP_UnregisterNotification(IN HDEVNOTIFY handle
)
186 FIXME("Stub %p\n", handle
);
191 /***********************************************************************
192 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
194 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
200 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
204 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
210 /***********************************************************************
211 * CMP_WaitServicesAvailable [SETUPAPI.@]
215 CMP_WaitServicesAvailable(HMACHINE hMachine
)
217 RPC_BINDING_HANDLE BindingHandle
= NULL
;
218 CONFIGRET ret
= CR_SUCCESS
;
221 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
226 ret
= PNP_GetVersion(BindingHandle
, &Version
);
228 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
230 ret
= RpcStatusToCmStatus(RpcExceptionCode());
238 /***********************************************************************
239 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
241 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
242 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
245 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
246 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
251 /***********************************************************************
252 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
254 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
255 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
256 ULONG ulFlags
, HMACHINE hMachine
)
258 RPC_BINDING_HANDLE BindingHandle
= NULL
;
259 HSTRING_TABLE StringTable
= NULL
;
260 ULONG ulLogConfTag
= 0;
262 PLOG_CONF_INFO pLogConfInfo
;
263 CONFIGRET ret
= CR_SUCCESS
;
265 FIXME("%p %p %lu %lx %p\n",
266 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
268 if (!pSetupIsUserAdmin())
269 return CR_ACCESS_DENIED
;
271 if (plcLogConf
== NULL
)
272 return CR_INVALID_POINTER
;
275 return CR_INVALID_DEVINST
;
277 if (Priority
> 0xFFFF)
278 return CR_INVALID_PRIORITY
;
280 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
281 return CR_INVALID_FLAG
;
283 if (hMachine
!= NULL
)
285 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
286 if (BindingHandle
== NULL
)
289 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
290 if (StringTable
== 0)
295 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
299 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
300 if (lpDevInst
== NULL
)
301 return CR_INVALID_DEVNODE
;
305 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
306 &ulLogConfTag
, ulFlags
);
308 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
310 ret
= RpcStatusToCmStatus(RpcExceptionCode());
314 if (ret
== CR_SUCCESS
)
316 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
317 if (pLogConfInfo
== NULL
)
319 ret
= CR_OUT_OF_MEMORY
;
323 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
324 pLogConfInfo
->dnDevInst
= dnDevInst
;
325 pLogConfInfo
->ulFlags
= ulFlags
;
326 pLogConfInfo
->ulTag
= ulLogConfTag
;
328 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
338 /***********************************************************************
339 * CM_Add_IDA [SETUPAPI.@]
341 CONFIGRET WINAPI
CM_Add_IDA(
342 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
344 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
345 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
349 /***********************************************************************
350 * CM_Add_IDW [SETUPAPI.@]
352 CONFIGRET WINAPI
CM_Add_IDW(
353 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
355 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
356 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
360 /***********************************************************************
361 * CM_Add_ID_ExA [SETUPAPI.@]
363 CONFIGRET WINAPI
CM_Add_ID_ExA(
364 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
369 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
371 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
372 return CR_INVALID_DATA
;
374 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
382 /***********************************************************************
383 * CM_Add_ID_ExW [SETUPAPI.@]
385 CONFIGRET WINAPI
CM_Add_ID_ExW(
386 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
388 RPC_BINDING_HANDLE BindingHandle
= NULL
;
389 HSTRING_TABLE StringTable
= NULL
;
393 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
395 if (!pSetupIsUserAdmin())
396 return CR_ACCESS_DENIED
;
399 return CR_INVALID_DEVINST
;
402 return CR_INVALID_POINTER
;
404 if (ulFlags
& ~CM_ADD_ID_BITS
)
405 return CR_INVALID_FLAG
;
407 if (hMachine
!= NULL
)
409 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
410 if (BindingHandle
== NULL
)
413 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
414 if (StringTable
== 0)
419 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
423 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
424 if (lpDevInst
== NULL
)
425 return CR_INVALID_DEVNODE
;
429 ret
= PNP_AddID(BindingHandle
,
434 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
436 ret
= RpcStatusToCmStatus(RpcExceptionCode());
444 /***********************************************************************
445 * CM_Add_Res_Des [SETUPAPI.@]
447 CONFIGRET WINAPI
CM_Add_Res_Des(
448 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
449 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
451 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
452 ResourceData
, ResourceLen
, ulFlags
);
453 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
454 ResourceLen
, ulFlags
, NULL
);
458 /***********************************************************************
459 * CM_Add_Res_Des_Ex [SETUPAPI.@]
461 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
462 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
463 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
465 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
466 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
468 return CR_CALL_NOT_IMPLEMENTED
;
472 /***********************************************************************
473 * CM_Connect_MachineA [SETUPAPI.@]
475 CONFIGRET WINAPI
CM_Connect_MachineA(
476 PCSTR UNCServerName
, PHMACHINE phMachine
)
481 TRACE("%s %p\n", UNCServerName
, phMachine
);
483 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
484 return CM_Connect_MachineW(NULL
, phMachine
);
486 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
487 return CR_INVALID_DATA
;
489 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
491 MyFree(pServerNameW
);
497 /***********************************************************************
498 * CM_Connect_MachineW [SETUPAPI.@]
500 CONFIGRET WINAPI
CM_Connect_MachineW(
501 PCWSTR UNCServerName
, PHMACHINE phMachine
)
503 PMACHINE_INFO pMachine
;
505 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
507 if (phMachine
== NULL
)
508 return CR_INVALID_POINTER
;
512 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
513 if (pMachine
== NULL
)
514 return CR_OUT_OF_MEMORY
;
516 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
518 pMachine
->bLocal
= TRUE
;
520 /* FIXME: store the computers name in pMachine->szMachineName */
522 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
523 &pMachine
->StringTable
))
525 HeapFree(GetProcessHeap(), 0, pMachine
);
531 pMachine
->bLocal
= FALSE
;
532 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
534 HeapFree(GetProcessHeap(), 0, pMachine
);
535 return CR_INVALID_MACHINENAME
;
537 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
539 pMachine
->StringTable
= pSetupStringTableInitialize();
540 if (pMachine
->StringTable
== NULL
)
542 HeapFree(GetProcessHeap(), 0, pMachine
);
546 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
548 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
550 pSetupStringTableDestroy(pMachine
->StringTable
);
551 HeapFree(GetProcessHeap(), 0, pMachine
);
552 return CR_INVALID_MACHINENAME
;
556 phMachine
= (PHMACHINE
)pMachine
;
562 /***********************************************************************
563 * CM_Create_DevNodeA [SETUPAPI.@]
565 CONFIGRET WINAPI
CM_Create_DevNodeA(
566 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
569 TRACE("%p %s %p %lx\n",
570 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
571 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
576 /***********************************************************************
577 * CM_Create_DevNodeW [SETUPAPI.@]
579 CONFIGRET WINAPI
CM_Create_DevNodeW(
580 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
583 TRACE("%p %s %p %lx\n",
584 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
585 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
590 /***********************************************************************
591 * CM_Create_DevNode_ExA [SETUPAPI.@]
593 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
594 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
595 ULONG ulFlags
, HANDLE hMachine
)
597 DEVINSTID_W pDeviceIDW
;
600 TRACE("%p %s %p %lx %p\n",
601 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
603 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
604 return CR_INVALID_DATA
;
606 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
615 /***********************************************************************
616 * CM_Create_DevNode_ExW [SETUPAPI.@]
618 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
619 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
620 ULONG ulFlags
, HANDLE hMachine
)
622 RPC_BINDING_HANDLE BindingHandle
= NULL
;
623 HSTRING_TABLE StringTable
= NULL
;
624 LPWSTR lpParentDevInst
;
625 CONFIGRET ret
= CR_SUCCESS
;
626 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
628 TRACE("%p %s %p %lx %p\n",
629 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
631 if (!pSetupIsUserAdmin())
632 return CR_ACCESS_DENIED
;
634 if (pdnDevInst
== NULL
)
635 return CR_INVALID_POINTER
;
637 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
638 return CR_INVALID_DEVICE_ID
;
641 return CR_INVALID_DEVNODE
;
643 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
644 return CR_INVALID_FLAG
;
646 if (hMachine
!= NULL
)
648 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
649 if (BindingHandle
== NULL
)
652 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
653 if (StringTable
== 0)
658 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
662 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
663 if (lpParentDevInst
== NULL
)
664 return CR_INVALID_DEVNODE
;
666 wcscpy(szLocalDeviceID
, pDeviceID
);
670 ret
= PNP_CreateDevInst(BindingHandle
,
676 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
678 ret
= RpcStatusToCmStatus(RpcExceptionCode());
682 if (ret
== CR_SUCCESS
)
684 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
685 * will return the generated device ID in szLocalDeviceID */
686 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
687 if (*pdnDevInst
== 0)
688 ret
= CR_NO_SUCH_DEVNODE
;
695 /***********************************************************************
696 * CM_Delete_Class_Key [SETUPAPI.@]
698 CONFIGRET WINAPI
CM_Delete_Class_Key(
699 LPGUID ClassGuid
, ULONG ulFlags
)
701 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
702 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
706 /***********************************************************************
707 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
709 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
710 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
712 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
713 RPC_BINDING_HANDLE BindingHandle
= NULL
;
716 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
718 if (ClassGuid
== NULL
)
719 return CR_INVALID_POINTER
;
721 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
722 return CR_INVALID_FLAG
;
724 if (!GuidToString(ClassGuid
, szGuidString
))
725 return CR_INVALID_DATA
;
727 if (hMachine
!= NULL
)
729 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
730 if (BindingHandle
== NULL
)
735 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
741 ret
= PNP_DeleteClassKey(BindingHandle
,
745 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
747 ret
= RpcStatusToCmStatus(RpcExceptionCode());
755 /***********************************************************************
756 * CM_Delete_DevNode_Key [SETUPAPI.@]
758 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
759 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
761 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
762 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
767 /***********************************************************************
768 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
770 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
771 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
774 FIXME("%p %lu %lx %p\n",
775 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
777 return CR_CALL_NOT_IMPLEMENTED
;
781 /***********************************************************************
782 * CM_Disable_DevNode [SETUPAPI.@]
784 CONFIGRET WINAPI
CM_Disable_DevNode(
785 DEVINST dnDevInst
, ULONG ulFlags
)
787 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
788 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
792 /***********************************************************************
793 * CM_Disable_DevNode_Ex [SETUPAPI.@]
795 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
796 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
798 RPC_BINDING_HANDLE BindingHandle
= NULL
;
799 HSTRING_TABLE StringTable
= NULL
;
803 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
805 if (!pSetupIsUserAdmin())
806 return CR_ACCESS_DENIED
;
809 return CR_INVALID_DEVINST
;
812 return CR_INVALID_FLAG
;
814 if (hMachine
!= NULL
)
816 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
817 if (BindingHandle
== NULL
)
820 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
821 if (StringTable
== 0)
826 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
830 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
831 if (lpDevInst
== NULL
)
832 return CR_INVALID_DEVNODE
;
836 ret
= PNP_DeviceInstanceAction(BindingHandle
,
842 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
844 ret
= RpcStatusToCmStatus(RpcExceptionCode());
852 /***********************************************************************
853 * CM_Disconnect_Machine [SETUPAPI.@]
855 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
857 PMACHINE_INFO pMachine
;
859 TRACE("%lx\n", hMachine
);
861 pMachine
= (PMACHINE_INFO
)hMachine
;
862 if (pMachine
== NULL
)
865 if (pMachine
->bLocal
== FALSE
)
867 if (pMachine
->StringTable
!= NULL
)
868 pSetupStringTableDestroy(pMachine
->StringTable
);
870 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
871 return CR_ACCESS_DENIED
;
874 HeapFree(GetProcessHeap(), 0, pMachine
);
880 /***********************************************************************
881 * CM_Enable_DevNode [SETUPAPI.@]
883 CONFIGRET WINAPI
CM_Enable_DevNode(
884 DEVINST dnDevInst
, ULONG ulFlags
)
886 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
887 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
891 /***********************************************************************
892 * CM_Enable_DevNode_Ex [SETUPAPI.@]
894 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
895 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
897 RPC_BINDING_HANDLE BindingHandle
= NULL
;
898 HSTRING_TABLE StringTable
= NULL
;
902 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
904 if (!pSetupIsUserAdmin())
905 return CR_ACCESS_DENIED
;
908 return CR_INVALID_DEVINST
;
911 return CR_INVALID_FLAG
;
913 if (hMachine
!= NULL
)
915 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
916 if (BindingHandle
== NULL
)
919 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
920 if (StringTable
== 0)
925 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
929 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
930 if (lpDevInst
== NULL
)
931 return CR_INVALID_DEVNODE
;
935 ret
= PNP_DeviceInstanceAction(BindingHandle
,
941 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
943 ret
= RpcStatusToCmStatus(RpcExceptionCode());
951 /***********************************************************************
952 * CM_Enumerate_Classes [SETUPAPI.@]
954 CONFIGRET WINAPI
CM_Enumerate_Classes(
955 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
957 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
958 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
962 /***********************************************************************
963 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
965 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
966 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
968 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
969 RPC_BINDING_HANDLE BindingHandle
= NULL
;
970 CONFIGRET ret
= CR_SUCCESS
;
971 ULONG ulLength
= MAX_GUID_STRING_LEN
;
973 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
975 if (ClassGuid
== NULL
)
976 return CR_INVALID_POINTER
;
979 return CR_INVALID_FLAG
;
981 if (hMachine
!= NULL
)
983 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
984 if (BindingHandle
== NULL
)
989 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
995 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1003 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1005 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1009 if (ret
== CR_SUCCESS
)
1012 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1014 /* Convert the buffer to a GUID */
1015 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1023 /***********************************************************************
1024 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1026 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1027 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1029 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1030 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1035 /***********************************************************************
1036 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1038 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1039 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1041 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1042 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1047 /***********************************************************************
1048 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1050 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1051 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1054 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1057 CONFIGRET ret
= CR_SUCCESS
;
1059 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1062 if (Buffer
== NULL
|| pulLength
== NULL
)
1063 return CR_INVALID_POINTER
;
1066 return CR_INVALID_FLAG
;
1068 ulOrigLength
= *pulLength
;
1071 ulLength
= MAX_DEVICE_ID_LEN
;
1072 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1074 if (ret
== CR_SUCCESS
)
1076 if (WideCharToMultiByte(CP_ACP
,
1086 *pulLength
= lstrlenA(Buffer
) + 1;
1093 /***********************************************************************
1094 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1096 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1097 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1100 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1103 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1106 if (Buffer
== NULL
|| pulLength
== NULL
)
1107 return CR_INVALID_POINTER
;
1110 return CR_INVALID_FLAG
;
1112 *Buffer
= UNICODE_NULL
;
1114 if (hMachine
!= NULL
)
1116 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1117 if (BindingHandle
== NULL
)
1122 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1128 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1129 PNP_ENUMERATOR_SUBKEYS
,
1136 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1138 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1146 /***********************************************************************
1147 * CM_Free_Log_Conf [SETUPAPI.@]
1149 CONFIGRET WINAPI
CM_Free_Log_Conf(
1150 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1152 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1153 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1157 /***********************************************************************
1158 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1160 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1161 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1163 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1164 HSTRING_TABLE StringTable
= NULL
;
1166 PLOG_CONF_INFO pLogConfInfo
;
1169 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1171 if (!pSetupIsUserAdmin())
1172 return CR_ACCESS_DENIED
;
1174 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1175 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1176 return CR_INVALID_LOG_CONF
;
1179 return CR_INVALID_FLAG
;
1181 if (hMachine
!= NULL
)
1183 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1184 if (BindingHandle
== NULL
)
1187 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1188 if (StringTable
== 0)
1193 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1197 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1198 if (lpDevInst
== NULL
)
1199 return CR_INVALID_DEVNODE
;
1203 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1204 pLogConfInfo
->ulTag
, 0);
1206 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1208 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1216 /***********************************************************************
1217 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1219 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1222 PLOG_CONF_INFO pLogConfInfo
;
1224 TRACE("%lx\n", lcLogConf
);
1226 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1227 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1228 return CR_INVALID_LOG_CONF
;
1230 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1236 /***********************************************************************
1237 * CM_Free_Res_Des [SETUPAPI.@]
1239 CONFIGRET WINAPI
CM_Free_Res_Des(
1240 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1242 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1243 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1247 /***********************************************************************
1248 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1250 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1251 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1254 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1256 return CR_CALL_NOT_IMPLEMENTED
;
1260 /***********************************************************************
1261 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1263 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1266 FIXME("%p\n", rdResDes
);
1268 return CR_CALL_NOT_IMPLEMENTED
;
1272 /***********************************************************************
1273 * CM_Get_Child [SETUPAPI.@]
1275 CONFIGRET WINAPI
CM_Get_Child(
1276 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1278 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1279 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1283 /***********************************************************************
1284 * CM_Get_Child_Ex [SETUPAPI.@]
1286 CONFIGRET WINAPI
CM_Get_Child_Ex(
1287 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1289 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1290 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1291 HSTRING_TABLE StringTable
= NULL
;
1293 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1296 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1298 if (pdnDevInst
== NULL
)
1299 return CR_INVALID_POINTER
;
1302 return CR_INVALID_DEVINST
;
1305 return CR_INVALID_FLAG
;
1309 if (hMachine
!= NULL
)
1311 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1312 if (BindingHandle
== NULL
)
1315 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1316 if (StringTable
== 0)
1321 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1325 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1326 if (lpDevInst
== NULL
)
1327 return CR_INVALID_DEVNODE
;
1331 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1332 PNP_GET_CHILD_DEVICE_INSTANCE
,
1338 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1340 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1344 if (ret
!= CR_SUCCESS
)
1347 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1349 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1353 *pdnDevInst
= dwIndex
;
1359 /***********************************************************************
1360 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1362 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1363 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1365 TRACE("%p %p %p %lx\n",
1366 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1367 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1372 /***********************************************************************
1373 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1375 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1376 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1378 TRACE("%p %p %p %lx\n",
1379 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1380 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1385 /***********************************************************************
1386 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1388 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1389 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1392 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1393 CONFIGRET ret
= CR_SUCCESS
;
1397 TRACE("%p %p %p %lx %lx\n",
1398 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1400 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1401 return CR_INVALID_POINTER
;
1403 ulOrigLength
= *pulLength
;
1406 ulLength
= MAX_GUID_STRING_LEN
;
1407 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1409 if (ret
== CR_SUCCESS
)
1411 if (WideCharToMultiByte(CP_ACP
,
1421 *pulLength
= lstrlenA(pszKeyName
) + 1;
1428 /***********************************************************************
1429 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1431 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1432 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1435 TRACE("%p %p %p %lx %lx\n",
1436 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1438 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1439 return CR_INVALID_POINTER
;
1442 return CR_INVALID_FLAG
;
1444 if (*pulLength
< MAX_GUID_STRING_LEN
)
1447 return CR_BUFFER_SMALL
;
1450 if (!GuidToString(ClassGuid
, pszKeyName
))
1451 return CR_INVALID_DATA
;
1453 *pulLength
= MAX_GUID_STRING_LEN
;
1459 /***********************************************************************
1460 * CM_Get_Class_NameA [SETUPAPI.@]
1462 CONFIGRET WINAPI
CM_Get_Class_NameA(
1463 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1465 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1466 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1471 /***********************************************************************
1472 * CM_Get_Class_NameW [SETUPAPI.@]
1474 CONFIGRET WINAPI
CM_Get_Class_NameW(
1475 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1477 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1478 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1483 /***********************************************************************
1484 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1486 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1487 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1490 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1491 CONFIGRET ret
= CR_SUCCESS
;
1495 TRACE("%p %p %p %lx %lx\n",
1496 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1498 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1499 return CR_INVALID_POINTER
;
1501 ulOrigLength
= *pulLength
;
1504 ulLength
= MAX_CLASS_NAME_LEN
;
1505 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1507 if (ret
== CR_SUCCESS
)
1509 if (WideCharToMultiByte(CP_ACP
,
1519 *pulLength
= lstrlenA(Buffer
) + 1;
1526 /***********************************************************************
1527 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1530 CM_Get_Class_Name_ExW(
1531 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1534 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1535 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1538 TRACE("%p %p %p %lx %lx\n",
1539 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1541 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1542 return CR_INVALID_POINTER
;
1545 return CR_INVALID_FLAG
;
1547 if (!GuidToString(ClassGuid
, szGuidString
))
1548 return CR_INVALID_DATA
;
1550 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1552 if (hMachine
!= NULL
)
1554 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1555 if (BindingHandle
== NULL
)
1560 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1566 ret
= PNP_GetClassName(BindingHandle
,
1572 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1574 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1582 /***********************************************************************
1583 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
1585 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
1586 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1587 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1589 FIXME("%p %lu %p %p %p %lx %lx\n",
1590 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1592 return CR_CALL_NOT_IMPLEMENTED
;
1596 /***********************************************************************
1597 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
1599 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
1600 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1601 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1603 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1604 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
1606 ULONG ulTransferLength
= 0;
1609 TRACE("%p %lu %p %p %p %lx %lx\n",
1610 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1613 if (ClassGuid
== NULL
|| pulLength
== NULL
)
1614 return CR_INVALID_POINTER
;
1617 return CR_INVALID_FLAG
;
1619 if (pSetupStringFromGuid(ClassGuid
,
1621 PNP_MAX_GUID_STRING_LEN
) != 0)
1622 return CR_INVALID_DATA
;
1624 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
1625 return CR_INVALID_PROPERTY
;
1627 if (hMachine
!= NULL
)
1629 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1630 if (BindingHandle
== NULL
)
1635 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1639 ulTransferLength
= *pulLength
;
1643 ret
= PNP_GetClassRegProp(BindingHandle
,
1652 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1654 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1658 if (ret
== CR_SUCCESS
)
1660 if (pulRegDataType
!= NULL
)
1661 *pulRegDataType
= ulType
;
1668 /***********************************************************************
1669 * CM_Get_Depth [SETUPAPI.@]
1671 CONFIGRET WINAPI
CM_Get_Depth(
1672 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1674 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1675 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1679 /***********************************************************************
1680 * CM_Get_Depth_Ex [SETUPAPI.@]
1682 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1683 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1685 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1686 HSTRING_TABLE StringTable
= NULL
;
1690 TRACE("%p %lx %lx %lx\n",
1691 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1693 if (pulDepth
== NULL
)
1694 return CR_INVALID_POINTER
;
1697 return CR_INVALID_DEVINST
;
1700 return CR_INVALID_FLAG
;
1702 if (hMachine
!= NULL
)
1704 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1705 if (BindingHandle
== NULL
)
1708 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1709 if (StringTable
== 0)
1714 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1718 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1719 if (lpDevInst
== NULL
)
1720 return CR_INVALID_DEVNODE
;
1724 ret
= PNP_GetDepth(BindingHandle
,
1729 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1731 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1739 /***********************************************************************
1740 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
1742 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
1743 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1744 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1746 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
1747 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1748 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
1749 pulRegDataType
, Buffer
,
1750 pulLength
, ulFlags
, NULL
);
1754 /***********************************************************************
1755 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
1757 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
1758 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1759 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1761 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
1762 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1763 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
1764 pulRegDataType
, Buffer
,
1765 pulLength
, ulFlags
, NULL
);
1769 /***********************************************************************
1770 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
1772 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
1773 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1774 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1776 LPWSTR pszPropertyNameW
= NULL
;
1779 ULONG ulDataType
= REG_NONE
;
1782 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
1783 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
1786 return CR_INVALID_POINTER
;
1788 ulLengthW
= *pulLength
* sizeof(WCHAR
);
1789 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
1791 return CR_OUT_OF_MEMORY
;
1793 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
1795 if (pszPropertyNameW
== NULL
)
1797 HeapFree(GetProcessHeap(), 0, BufferW
);
1798 return CR_OUT_OF_MEMORY
;
1801 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
1808 if (ret
== CR_SUCCESS
)
1810 if (ulDataType
== REG_SZ
||
1811 ulDataType
== REG_EXPAND_SZ
||
1812 ulDataType
== REG_MULTI_SZ
)
1814 /* Do W->A conversion */
1815 *pulLength
= WideCharToMultiByte(CP_ACP
,
1818 lstrlenW(BufferW
) + 1,
1823 if (*pulLength
== 0)
1828 /* Directly copy the value */
1829 if (ulLengthW
<= *pulLength
)
1830 memcpy(Buffer
, BufferW
, ulLengthW
);
1833 *pulLength
= ulLengthW
;
1834 ret
= CR_BUFFER_SMALL
;
1840 *pulRegDataType
= ulDataType
;
1842 HeapFree(GetProcessHeap(), 0, BufferW
);
1843 MyFree(pszPropertyNameW
);
1849 /***********************************************************************
1850 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
1852 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
1853 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1854 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1856 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1857 HSTRING_TABLE StringTable
= NULL
;
1859 ULONG ulDataType
= REG_NONE
;
1860 ULONG ulTransferLength
;
1861 CONFIGRET ret
= CR_SUCCESS
;
1863 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
1864 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
1865 pulLength
, ulFlags
, hMachine
);
1868 return CR_INVALID_DEVNODE
;
1870 if (pszCustomPropertyName
== NULL
||
1871 pulLength
== NULL
||
1873 return CR_INVALID_POINTER
;
1875 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
1876 return CR_INVALID_FLAG
;
1878 if (hMachine
!= NULL
)
1880 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1881 if (BindingHandle
== NULL
)
1884 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1885 if (StringTable
== 0)
1890 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1894 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1895 if (lpDevInst
== NULL
)
1896 return CR_INVALID_DEVNODE
;
1898 ulTransferLength
= *pulLength
;
1902 ret
= PNP_GetCustomDevProp(BindingHandle
,
1904 (LPWSTR
)pszCustomPropertyName
,
1911 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1913 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1917 if (ret
== CR_SUCCESS
)
1919 if (pulRegDataType
!= NULL
)
1920 *pulRegDataType
= ulDataType
;
1927 /***********************************************************************
1928 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1930 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1931 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1932 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1934 TRACE("%lx %lu %p %p %p %lx\n",
1935 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1937 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1938 pulRegDataType
, Buffer
,
1939 pulLength
, ulFlags
, NULL
);
1943 /***********************************************************************
1944 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1946 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1947 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1948 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1950 TRACE("%lx %lu %p %p %p %lx\n",
1951 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1953 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1954 pulRegDataType
, Buffer
,
1955 pulLength
, ulFlags
, NULL
);
1959 /***********************************************************************
1960 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1962 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1963 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1964 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1968 ULONG ulDataType
= REG_NONE
;
1971 TRACE("%lx %lu %p %p %p %lx %lx\n",
1972 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1976 return CR_INVALID_POINTER
;
1978 LengthW
= *pulLength
* sizeof(WCHAR
);
1979 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1982 return CR_OUT_OF_MEMORY
;
1984 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1992 if (ret
== CR_SUCCESS
)
1994 if (ulDataType
== REG_SZ
||
1995 ulDataType
== REG_EXPAND_SZ
||
1996 ulDataType
== REG_MULTI_SZ
)
1998 /* Do W->A conversion */
1999 *pulLength
= WideCharToMultiByte(CP_ACP
,
2002 lstrlenW(BufferW
) + 1,
2007 if (*pulLength
== 0)
2012 /* Directly copy the value */
2013 if (LengthW
<= *pulLength
)
2014 memcpy(Buffer
, BufferW
, LengthW
);
2017 *pulLength
= LengthW
;
2018 ret
= CR_BUFFER_SMALL
;
2024 *pulRegDataType
= ulDataType
;
2026 HeapFree(GetProcessHeap(), 0, BufferW
);
2032 /***********************************************************************
2033 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2035 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2036 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2037 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2039 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2040 HSTRING_TABLE StringTable
= NULL
;
2041 CONFIGRET ret
= CR_SUCCESS
;
2043 ULONG ulDataType
= REG_NONE
;
2044 ULONG ulTransferLength
= 0;
2046 TRACE("%lx %lu %p %p %p %lx %lx\n",
2047 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2051 return CR_INVALID_DEVNODE
;
2053 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2054 return CR_INVALID_PROPERTY
;
2056 /* pulRegDataType is optional */
2058 /* Buffer is optional */
2060 if (pulLength
== NULL
)
2061 return CR_INVALID_POINTER
;
2063 if (*pulLength
== 0)
2064 return CR_INVALID_POINTER
;
2067 return CR_INVALID_FLAG
;
2069 if (hMachine
!= NULL
)
2071 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2072 if (BindingHandle
== NULL
)
2075 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2076 if (StringTable
== 0)
2081 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2085 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2086 if (lpDevInst
== NULL
)
2087 return CR_INVALID_DEVNODE
;
2089 ulTransferLength
= *pulLength
;
2093 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2102 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2104 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2108 if (ret
== CR_SUCCESS
)
2110 if (pulRegDataType
!= NULL
)
2111 *pulRegDataType
= ulDataType
;
2118 /***********************************************************************
2119 * CM_Get_DevNode_Status [SETUPAPI.@]
2121 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2122 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2125 TRACE("%p %p %lx %lx\n",
2126 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2127 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2132 /***********************************************************************
2133 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2136 CM_Get_DevNode_Status_Ex(
2137 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2138 ULONG ulFlags
, HMACHINE hMachine
)
2140 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2141 HSTRING_TABLE StringTable
= NULL
;
2145 TRACE("%p %p %lx %lx %lx\n",
2146 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2148 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2149 return CR_INVALID_POINTER
;
2152 return CR_INVALID_DEVINST
;
2155 return CR_INVALID_FLAG
;
2157 if (hMachine
!= NULL
)
2159 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2160 if (BindingHandle
== NULL
)
2163 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2164 if (StringTable
== 0)
2169 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2173 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2174 if (lpDevInst
== NULL
)
2175 return CR_INVALID_DEVNODE
;
2179 ret
= PNP_GetDeviceStatus(BindingHandle
,
2185 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2187 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2195 /***********************************************************************
2196 * CM_Get_Device_IDA [SETUPAPI.@]
2198 CONFIGRET WINAPI
CM_Get_Device_IDA(
2199 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2201 TRACE("%lx %p %ld %ld\n",
2202 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2203 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2207 /***********************************************************************
2208 * CM_Get_Device_IDW [SETUPAPI.@]
2210 CONFIGRET WINAPI
CM_Get_Device_IDW(
2211 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2213 TRACE("%lx %p %ld %ld\n",
2214 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2215 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2219 /***********************************************************************
2220 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2222 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2223 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2226 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2227 CONFIGRET ret
= CR_SUCCESS
;
2229 TRACE("%lx %p %ld %ld %lx\n",
2230 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2233 return CR_INVALID_POINTER
;
2235 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2240 if (ret
== CR_SUCCESS
)
2242 if (WideCharToMultiByte(CP_ACP
,
2245 lstrlenW(szBufferW
) + 1,
2257 /***********************************************************************
2258 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2260 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2261 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2264 HSTRING_TABLE StringTable
= NULL
;
2266 TRACE("%lx %p %ld %ld %lx\n",
2267 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2270 return CR_INVALID_DEVINST
;
2273 return CR_INVALID_POINTER
;
2276 return CR_INVALID_FLAG
;
2278 if (hMachine
!= NULL
)
2280 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2281 if (StringTable
== NULL
)
2286 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2290 if (!pSetupStringTableStringFromIdEx(StringTable
,
2300 /***********************************************************************
2301 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2303 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2304 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2306 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2307 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2312 /***********************************************************************
2313 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2315 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2316 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2318 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2319 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2324 /***********************************************************************
2325 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2327 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2328 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2331 LPWSTR BufferW
= NULL
;
2332 LPWSTR pszFilterW
= NULL
;
2333 CONFIGRET ret
= CR_SUCCESS
;
2335 TRACE("%p %p %ld %ld %lx\n",
2336 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2338 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2339 if (BufferW
== NULL
)
2340 return CR_OUT_OF_MEMORY
;
2342 if (pszFilter
== NULL
)
2344 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2352 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2354 ret
= CR_INVALID_DEVICE_ID
;
2358 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2367 if (WideCharToMultiByte(CP_ACP
,
2370 lstrlenW(BufferW
) + 1,
2384 /***********************************************************************
2385 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2387 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2388 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2391 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2394 TRACE("%p %p %ld %ld %lx\n",
2395 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2397 if (Buffer
== NULL
|| BufferLen
== 0)
2398 return CR_INVALID_POINTER
;
2400 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2401 return CR_INVALID_FLAG
;
2403 if (hMachine
!= NULL
)
2405 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2406 if (BindingHandle
== NULL
)
2411 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2419 ret
= PNP_GetDeviceList(BindingHandle
,
2425 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2427 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2435 /***********************************************************************
2436 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2438 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2439 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2441 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2442 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2446 /***********************************************************************
2447 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2449 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2450 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2452 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2453 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2457 /***********************************************************************
2458 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2460 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2461 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2463 LPWSTR pszFilterW
= NULL
;
2464 CONFIGRET ret
= CR_SUCCESS
;
2466 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2468 if (pszFilter
== NULL
)
2470 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2477 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2478 return CR_INVALID_DEVICE_ID
;
2480 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2492 /***********************************************************************
2493 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2495 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2496 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2498 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2501 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2504 return CR_INVALID_POINTER
;
2506 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2507 return CR_INVALID_FLAG
;
2509 if (hMachine
!= NULL
)
2511 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2512 if (BindingHandle
== NULL
)
2517 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2525 ret
= PNP_GetDeviceListSize(BindingHandle
,
2530 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2532 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2540 /***********************************************************************
2541 * CM_Get_Device_ID_Size [SETUPAPI.@]
2543 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2544 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2546 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2547 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2551 /***********************************************************************
2552 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2554 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2555 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2557 HSTRING_TABLE StringTable
= NULL
;
2560 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2563 return CR_INVALID_POINTER
;
2566 return CR_INVALID_DEVINST
;
2569 return CR_INVALID_FLAG
;
2571 if (hMachine
!= NULL
)
2573 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2574 if (StringTable
== NULL
)
2579 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2583 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2584 if (DeviceId
== NULL
)
2590 *pulLen
= lstrlenW(DeviceId
);
2596 /***********************************************************************
2597 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2599 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2600 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2601 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2603 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2604 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2606 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2607 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2612 /***********************************************************************
2613 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2615 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2616 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2617 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2619 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2620 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2622 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2623 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2628 /***********************************************************************
2629 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2631 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2632 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2633 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2635 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2636 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2638 return CR_CALL_NOT_IMPLEMENTED
;
2642 /***********************************************************************
2643 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2645 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2646 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2647 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2649 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2650 ULONG ulTransferLength
;
2651 CONFIGRET ret
= CR_SUCCESS
;
2653 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2654 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2656 if (pszDeviceInterface
== NULL
||
2657 AliasInterfaceGuid
== NULL
||
2658 pszAliasDeviceInterface
== NULL
||
2660 return CR_INVALID_POINTER
;
2663 return CR_INVALID_FLAG
;
2665 if (hMachine
!= NULL
)
2667 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2668 if (BindingHandle
== NULL
)
2673 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2677 ulTransferLength
= *pulLength
;
2681 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2682 (LPWSTR
)pszDeviceInterface
,
2684 pszAliasDeviceInterface
,
2689 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2691 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2699 /***********************************************************************
2700 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2702 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2703 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2704 ULONG BufferLen
, ULONG ulFlags
)
2706 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2707 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2709 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2710 Buffer
, BufferLen
, ulFlags
, NULL
);
2714 /***********************************************************************
2715 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2717 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2718 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2719 ULONG BufferLen
, ULONG ulFlags
)
2721 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2722 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2724 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2725 Buffer
, BufferLen
, ulFlags
, NULL
);
2729 /***********************************************************************
2730 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2732 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2733 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2734 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2736 DEVINSTID_W pDeviceIdW
= NULL
;
2737 PWCHAR BufferW
= NULL
;
2738 CONFIGRET ret
= CR_SUCCESS
;
2740 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2741 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2743 if (Buffer
== NULL
||
2745 return CR_INVALID_POINTER
;
2747 if (pDeviceID
!= NULL
)
2749 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2750 return CR_INVALID_DEVICE_ID
;
2753 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2754 if (BufferW
== NULL
)
2756 ret
= CR_OUT_OF_MEMORY
;
2760 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2761 BufferW
, BufferLen
, ulFlags
,
2763 if (ret
!= CR_SUCCESS
)
2766 if (WideCharToMultiByte(CP_ACP
,
2769 lstrlenW(BufferW
) + 1,
2777 if (BufferW
!= NULL
)
2780 if (pDeviceIdW
!= NULL
)
2787 /***********************************************************************
2788 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2790 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2791 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2792 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2794 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2795 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2796 CONFIGRET ret
= CR_SUCCESS
;
2798 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2799 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2801 if (Buffer
== NULL
||
2803 return CR_INVALID_POINTER
;
2805 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2806 return CR_INVALID_FLAG
;
2808 if (hMachine
!= NULL
)
2810 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2811 if (BindingHandle
== NULL
)
2816 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2821 BufferSize
= BufferLen
;
2825 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2832 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2834 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2842 /***********************************************************************
2843 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2845 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2846 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2849 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2850 pDeviceId
, ulFlags
);
2852 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2853 pDeviceId
, ulFlags
, NULL
);
2857 /***********************************************************************
2858 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2860 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2861 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2864 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2865 debugstr_w(pDeviceId
), ulFlags
);
2867 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2868 pDeviceId
, ulFlags
, NULL
);
2872 /***********************************************************************
2873 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2875 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2876 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2877 ULONG ulFlags
, HMACHINE hMachine
)
2879 DEVINSTID_W pDeviceIdW
= NULL
;
2880 CONFIGRET ret
= CR_SUCCESS
;
2882 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2883 pDeviceId
, ulFlags
, hMachine
);
2886 return CR_INVALID_POINTER
;
2888 if (pDeviceId
!= NULL
)
2890 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2891 return CR_INVALID_DEVICE_ID
;
2896 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2897 pDeviceIdW
, ulFlags
, hMachine
);
2899 if (pDeviceIdW
!= NULL
)
2906 /***********************************************************************
2907 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2909 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2910 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2911 ULONG ulFlags
, HMACHINE hMachine
)
2913 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2914 CONFIGRET ret
= CR_SUCCESS
;
2916 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2917 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2920 return CR_INVALID_POINTER
;
2922 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2923 return CR_INVALID_FLAG
;
2925 if (hMachine
!= NULL
)
2927 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2928 if (BindingHandle
== NULL
)
2933 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2941 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2947 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2949 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2957 /***********************************************************************
2958 * CM_Get_First_Log_Conf [SETUPAPI.@]
2960 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2961 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2963 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2964 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2968 /***********************************************************************
2969 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2971 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2972 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2974 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2975 HSTRING_TABLE StringTable
= NULL
;
2976 LPWSTR lpDevInst
= NULL
;
2977 CONFIGRET ret
= CR_SUCCESS
;
2979 PLOG_CONF_INFO pLogConfInfo
;
2981 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2984 return CR_INVALID_DEVINST
;
2986 if (ulFlags
& ~LOG_CONF_BITS
)
2987 return CR_INVALID_FLAG
;
2992 if (hMachine
!= NULL
)
2994 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2995 if (BindingHandle
== NULL
)
2998 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2999 if (StringTable
== 0)
3004 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3008 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3009 if (lpDevInst
== NULL
)
3010 return CR_INVALID_DEVNODE
;
3014 ret
= PNP_GetFirstLogConf(BindingHandle
,
3020 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3022 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3026 if (ret
!= CR_SUCCESS
)
3031 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3032 if (pLogConfInfo
== NULL
)
3033 return CR_OUT_OF_MEMORY
;
3035 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3036 pLogConfInfo
->dnDevInst
= dnDevInst
;
3037 pLogConfInfo
->ulFlags
= ulFlags
;
3038 pLogConfInfo
->ulTag
= ulTag
;
3040 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3047 /***********************************************************************
3048 * CM_Get_Global_State [SETUPAPI.@]
3050 CONFIGRET WINAPI
CM_Get_Global_State(
3051 PULONG pulState
, ULONG ulFlags
)
3053 TRACE("%p %lx\n", pulState
, ulFlags
);
3054 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3058 /***********************************************************************
3059 * CM_Get_Global_State_Ex [SETUPAPI.@]
3061 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3062 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3064 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3067 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3069 if (pulState
== NULL
)
3070 return CR_INVALID_POINTER
;
3073 return CR_INVALID_FLAG
;
3075 if (hMachine
!= NULL
)
3077 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3078 if (BindingHandle
== NULL
)
3083 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3089 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3091 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3093 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3101 /***********************************************************************
3102 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3104 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3105 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3108 TRACE("%s %lu %p %lx\n", szDevInstName
,
3109 ulHardwareProfile
, pulValue
, ulFlags
);
3111 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3112 pulValue
, ulFlags
, NULL
);
3116 /***********************************************************************
3117 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3119 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3120 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3123 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3124 ulHardwareProfile
, pulValue
, ulFlags
);
3126 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3127 pulValue
, ulFlags
, NULL
);
3131 /***********************************************************************
3132 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3134 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3135 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3136 ULONG ulFlags
, HMACHINE hMachine
)
3138 DEVINSTID_W pszDevIdW
= NULL
;
3139 CONFIGRET ret
= CR_SUCCESS
;
3141 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3142 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3144 if (szDevInstName
!= NULL
)
3146 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3147 return CR_INVALID_DEVICE_ID
;
3150 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3151 pulValue
, ulFlags
, hMachine
);
3153 if (pszDevIdW
!= NULL
)
3160 /***********************************************************************
3161 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3163 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3164 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3165 ULONG ulFlags
, HMACHINE hMachine
)
3167 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3170 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3171 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3173 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3174 return CR_INVALID_POINTER
;
3177 return CR_INVALID_FLAG
;
3179 /* FIXME: Check whether szDevInstName is valid */
3181 if (hMachine
!= NULL
)
3183 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3184 if (BindingHandle
== NULL
)
3189 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3195 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3196 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3198 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3200 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3208 /***********************************************************************
3209 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3211 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3212 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3214 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3216 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3221 /***********************************************************************
3222 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3224 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3225 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3227 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3229 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3234 /***********************************************************************
3235 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3237 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3238 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3241 HWPROFILEINFO_W LocalProfileInfo
;
3244 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3246 if (pHWProfileInfo
== NULL
)
3247 return CR_INVALID_POINTER
;
3249 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3251 if (ret
== CR_SUCCESS
)
3253 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3254 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3256 if (WideCharToMultiByte(CP_ACP
,
3258 LocalProfileInfo
.HWPI_szFriendlyName
,
3259 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3260 pHWProfileInfo
->HWPI_szFriendlyName
,
3271 /***********************************************************************
3272 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3274 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3275 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3278 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3281 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3283 if (pHWProfileInfo
== NULL
)
3284 return CR_INVALID_POINTER
;
3287 return CR_INVALID_FLAG
;
3289 if (hMachine
!= NULL
)
3291 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3292 if (BindingHandle
== NULL
)
3297 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3303 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3304 sizeof(HWPROFILEINFO_W
), 0);
3306 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3308 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3316 /***********************************************************************
3317 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3319 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3320 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3322 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3323 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3327 /***********************************************************************
3328 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3330 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3331 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3334 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3335 HSTRING_TABLE StringTable
= NULL
;
3336 PLOG_CONF_INFO pLogConfInfo
;
3340 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3342 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3343 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3344 return CR_INVALID_LOG_CONF
;
3346 if (pPriority
== NULL
)
3347 return CR_INVALID_POINTER
;
3350 return CR_INVALID_FLAG
;
3352 if (hMachine
!= NULL
)
3354 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3355 if (BindingHandle
== NULL
)
3358 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3359 if (StringTable
== 0)
3364 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3368 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3369 if (lpDevInst
== NULL
)
3370 return CR_INVALID_DEVNODE
;
3374 ret
= PNP_GetLogConfPriority(BindingHandle
,
3376 pLogConfInfo
->ulFlags
,
3377 pLogConfInfo
->ulTag
,
3381 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3383 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3391 /***********************************************************************
3392 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3394 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3395 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3397 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3398 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3402 /***********************************************************************
3403 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3405 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3406 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3409 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3410 HSTRING_TABLE StringTable
= NULL
;
3411 PLOG_CONF_INFO pLogConfInfo
;
3412 PLOG_CONF_INFO pNewLogConfInfo
;
3417 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3422 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3423 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3424 return CR_INVALID_LOG_CONF
;
3427 return CR_INVALID_FLAG
;
3429 if (hMachine
!= NULL
)
3431 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3432 if (BindingHandle
== NULL
)
3435 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3436 if (StringTable
== 0)
3441 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3445 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3446 if (lpDevInst
== NULL
)
3447 return CR_INVALID_DEVNODE
;
3451 ret
= PNP_GetNextLogConf(BindingHandle
,
3453 pLogConfInfo
->ulFlags
,
3454 pLogConfInfo
->ulTag
,
3458 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3460 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3464 if (ret
!= CR_SUCCESS
)
3469 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3470 if (pNewLogConfInfo
== NULL
)
3471 return CR_OUT_OF_MEMORY
;
3473 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3474 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3475 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3476 pNewLogConfInfo
->ulTag
= ulNewTag
;
3478 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3485 /***********************************************************************
3486 * CM_Get_Next_Re_Des [SETUPAPI.@]
3488 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3489 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3490 PRESOURCEID pResourceID
, ULONG ulFlags
)
3492 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3493 pResourceID
, ulFlags
);
3494 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3495 pResourceID
, ulFlags
, NULL
);
3499 /***********************************************************************
3500 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3502 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3503 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3504 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3506 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3507 pResourceID
, ulFlags
, hMachine
);
3509 return CR_CALL_NOT_IMPLEMENTED
;
3513 /***********************************************************************
3514 * CM_Get_Parent [SETUPAPI.@]
3516 CONFIGRET WINAPI
CM_Get_Parent(
3517 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3519 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3520 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3524 /***********************************************************************
3525 * CM_Get_Parent_Ex [SETUPAPI.@]
3527 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3528 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3530 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3531 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3532 HSTRING_TABLE StringTable
= NULL
;
3534 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3537 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3539 if (pdnDevInst
== NULL
)
3540 return CR_INVALID_POINTER
;
3543 return CR_INVALID_DEVINST
;
3546 return CR_INVALID_FLAG
;
3550 if (hMachine
!= NULL
)
3552 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3553 if (BindingHandle
== NULL
)
3556 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3557 if (StringTable
== 0)
3562 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3566 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3567 if (lpDevInst
== NULL
)
3568 return CR_INVALID_DEVNODE
;
3572 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3573 PNP_GET_PARENT_DEVICE_INSTANCE
,
3579 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3581 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3585 if (ret
!= CR_SUCCESS
)
3588 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3590 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3594 *pdnDevInst
= dwIndex
;
3600 /***********************************************************************
3601 * CM_Get_Res_Des_Data [SETUPAPI.@]
3603 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3604 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3606 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3607 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3611 /***********************************************************************
3612 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3614 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3615 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3618 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3619 return CR_CALL_NOT_IMPLEMENTED
;
3623 /***********************************************************************
3624 * CM_Get_Res_Des_Size [SETUPAPI.@]
3626 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3627 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3629 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3630 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3634 /***********************************************************************
3635 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3637 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3638 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3640 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3641 return CR_CALL_NOT_IMPLEMENTED
;
3645 /***********************************************************************
3646 * CM_Get_Sibling [SETUPAPI.@]
3648 CONFIGRET WINAPI
CM_Get_Sibling(
3649 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3651 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3652 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3656 /***********************************************************************
3657 * CM_Get_Sibling_Ex [SETUPAPI.@]
3659 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3660 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3662 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3663 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3664 HSTRING_TABLE StringTable
= NULL
;
3666 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3669 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3671 if (pdnDevInst
== NULL
)
3672 return CR_INVALID_POINTER
;
3675 return CR_INVALID_DEVINST
;
3678 return CR_INVALID_FLAG
;
3682 if (hMachine
!= NULL
)
3684 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3685 if (BindingHandle
== NULL
)
3688 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3689 if (StringTable
== 0)
3694 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3698 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3699 if (lpDevInst
== NULL
)
3700 return CR_INVALID_DEVNODE
;
3704 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3705 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3711 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3713 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3717 if (ret
!= CR_SUCCESS
)
3720 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3722 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3726 *pdnDevInst
= dwIndex
;
3732 /***********************************************************************
3733 * CM_Get_Version [SETUPAPI.@]
3735 WORD WINAPI
CM_Get_Version(VOID
)
3738 return CM_Get_Version_Ex(NULL
);
3742 /***********************************************************************
3743 * CM_Get_Version_Ex [SETUPAPI.@]
3745 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3747 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3751 TRACE("%lx\n", hMachine
);
3753 if (hMachine
!= NULL
)
3755 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3756 if (BindingHandle
== NULL
)
3761 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3767 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3769 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3771 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3775 if (ret
!= CR_SUCCESS
)
3782 /***********************************************************************
3783 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3785 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3788 TRACE("%p\n", pbPresent
);
3789 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3793 /***********************************************************************
3794 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3796 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3797 PBOOL pbPresent
, HMACHINE hMachine
)
3799 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3802 TRACE("%p %lx\n", pbPresent
, hMachine
);
3804 if (pbPresent
== NULL
)
3805 return CR_INVALID_POINTER
;
3809 if (hMachine
!= NULL
)
3811 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3812 if (BindingHandle
== NULL
)
3817 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3823 ret
= PNP_IsDockStationPresent(BindingHandle
,
3826 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3828 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3836 /***********************************************************************
3837 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3839 BOOL WINAPI
CM_Is_Version_Available(
3842 TRACE("%hu\n", wVersion
);
3843 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3847 /***********************************************************************
3848 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3850 BOOL WINAPI
CM_Is_Version_Available_Ex(
3851 WORD wVersion
, HMACHINE hMachine
)
3853 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3854 WORD wServerVersion
;
3857 TRACE("%hu %lx\n", wVersion
, hMachine
);
3859 if (wVersion
<= 0x400)
3862 if (hMachine
!= NULL
)
3864 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3865 if (BindingHandle
== NULL
)
3870 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3876 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3878 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3880 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3884 if (ret
!= CR_SUCCESS
)
3887 return (wServerVersion
>= wVersion
);
3891 /***********************************************************************
3892 * CM_Locate_DevNodeA [SETUPAPI.@]
3894 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3895 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3897 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3898 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3902 /***********************************************************************
3903 * CM_Locate_DevNodeW [SETUPAPI.@]
3905 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3906 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3908 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3909 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3913 /***********************************************************************
3914 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3916 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3917 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3919 DEVINSTID_W pDevIdW
= NULL
;
3920 CONFIGRET ret
= CR_SUCCESS
;
3922 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3924 if (pDeviceID
!= NULL
)
3926 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3927 return CR_INVALID_DEVICE_ID
;
3930 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3932 if (pDevIdW
!= NULL
)
3939 /***********************************************************************
3940 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3942 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3943 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3945 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3946 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3947 HSTRING_TABLE StringTable
= NULL
;
3948 CONFIGRET ret
= CR_SUCCESS
;
3950 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3952 if (pdnDevInst
== NULL
)
3953 return CR_INVALID_POINTER
;
3955 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3956 return CR_INVALID_FLAG
;
3958 if (hMachine
!= NULL
)
3960 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3961 if (BindingHandle
== NULL
)
3964 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3965 if (StringTable
== 0)
3970 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3974 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3976 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3982 /* Get the root device ID */
3983 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3987 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3989 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3993 if (ret
!= CR_SUCCESS
)
3996 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4000 /* Validate the device ID */
4001 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4005 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4007 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4011 if (ret
== CR_SUCCESS
)
4013 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4014 if (*pdnDevInst
== -1)
4022 /***********************************************************************
4023 * CM_Modify_Res_Des [SETUPAPI.@]
4025 CONFIGRET WINAPI
CM_Modify_Res_Des(
4026 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
4027 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
4029 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4030 ResourceLen
, ulFlags
);
4031 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4032 ResourceLen
, ulFlags
, NULL
);
4036 /***********************************************************************
4037 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4039 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
4040 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
4041 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
4043 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4044 ResourceLen
, ulFlags
, hMachine
);
4045 return CR_CALL_NOT_IMPLEMENTED
;
4049 /***********************************************************************
4050 * CM_Move_DevNode [SETUPAPI.@]
4052 CONFIGRET WINAPI
CM_Move_DevNode(
4053 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
4055 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
4056 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4060 /***********************************************************************
4061 * CM_Move_DevNode_Ex [SETUPAPI.@]
4063 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
4064 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
4067 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4068 HSTRING_TABLE StringTable
= NULL
;
4069 LPWSTR lpFromDevInst
;
4073 FIXME("%lx %lx %lx %lx\n",
4074 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4076 if (!pSetupIsUserAdmin())
4077 return CR_ACCESS_DENIED
;
4079 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4080 return CR_INVALID_DEVNODE
;
4083 return CR_INVALID_FLAG
;
4085 if (hMachine
!= NULL
)
4087 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4088 if (BindingHandle
== NULL
)
4091 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4092 if (StringTable
== 0)
4097 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4101 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4102 if (lpFromDevInst
== NULL
)
4103 return CR_INVALID_DEVNODE
;
4105 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4106 if (lpToDevInst
== NULL
)
4107 return CR_INVALID_DEVNODE
;
4111 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4117 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4119 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4127 /***********************************************************************
4128 * CM_Open_Class_KeyA [SETUPAPI.@]
4130 CONFIGRET WINAPI
CM_Open_Class_KeyA(
4131 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4132 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4134 TRACE("%p %s %lx %lx %p %lx\n",
4135 debugstr_guid(pClassGuid
), pszClassName
,
4136 samDesired
, Disposition
, phkClass
, ulFlags
);
4138 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4139 Disposition
, phkClass
, ulFlags
, NULL
);
4143 /***********************************************************************
4144 * CM_Open_Class_KeyW [SETUPAPI.@]
4146 CONFIGRET WINAPI
CM_Open_Class_KeyW(
4147 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4148 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4150 TRACE("%p %s %lx %lx %p %lx\n",
4151 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4152 samDesired
, Disposition
, phkClass
, ulFlags
);
4154 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4155 Disposition
, phkClass
, ulFlags
, NULL
);
4159 /***********************************************************************
4160 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4162 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
4163 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4164 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4167 LPWSTR pszClassNameW
= NULL
;
4170 TRACE("%p %s %lx %lx %p %lx %lx\n",
4171 debugstr_guid(pClassGuid
), pszClassName
,
4172 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4174 if (pszClassName
!= NULL
)
4176 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4177 return CR_INVALID_DATA
;
4180 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4181 Disposition
, phkClass
, ulFlags
, hMachine
);
4183 if (pszClassNameW
!= NULL
)
4184 MyFree(pszClassNameW
);
4190 /***********************************************************************
4191 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4193 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
4194 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4195 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4198 WCHAR szKeyName
[MAX_PATH
];
4199 LPWSTR lpGuidString
;
4200 DWORD dwDisposition
;
4204 TRACE("%p %s %lx %lx %p %lx %lx\n",
4205 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4206 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4208 /* Check Disposition and ulFlags */
4209 if ((Disposition
& ~RegDisposition_Bits
) ||
4210 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
4211 return CR_INVALID_FLAG
;
4213 /* Check phkClass */
4214 if (phkClass
== NULL
)
4215 return CR_INVALID_POINTER
;
4219 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
4220 pszClassName
!= NULL
)
4221 return CR_INVALID_DATA
;
4223 if (hMachine
== NULL
)
4225 hKey
= HKEY_LOCAL_MACHINE
;
4229 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
4230 HKEY_LOCAL_MACHINE
, &hKey
))
4231 return CR_REGISTRY_ERROR
;
4234 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
4236 lstrcpyW(szKeyName
, DeviceClasses
);
4240 lstrcpyW(szKeyName
, ControlClass
);
4243 if (pClassGuid
!= NULL
)
4245 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
4248 return CR_INVALID_DATA
;
4251 lstrcatW(szKeyName
, Backslash
);
4252 lstrcatW(szKeyName
, lpGuidString
);
4255 if (Disposition
== RegDisposition_OpenAlways
)
4257 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
4258 NULL
, phkClass
, &dwDisposition
);
4262 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
4267 if (pClassGuid
!= NULL
)
4268 RpcStringFreeW(&lpGuidString
);
4270 if (dwError
!= ERROR_SUCCESS
)
4273 return CR_NO_SUCH_REGISTRY_KEY
;
4276 if (pszClassName
!= NULL
)
4278 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
4279 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
4286 /***********************************************************************
4287 * CM_Open_DevNode_Key [SETUPAPI.@]
4289 CONFIGRET WINAPI
CM_Open_DevNode_Key(
4290 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4291 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
4293 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
4294 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
4295 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
4296 Disposition
, phkDevice
, ulFlags
, NULL
);
4300 /***********************************************************************
4301 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
4303 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
4304 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4305 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4308 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4309 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4311 return CR_CALL_NOT_IMPLEMENTED
;
4315 /***********************************************************************
4316 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4318 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4319 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4320 ULONG ulNameLength
, ULONG ulFlags
)
4322 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4323 ulNameLength
, ulFlags
);
4325 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4326 ulNameLength
, ulFlags
, NULL
);
4330 /***********************************************************************
4331 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4333 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4334 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4335 ULONG ulNameLength
, ULONG ulFlags
)
4337 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4338 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4340 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4341 ulNameLength
, ulFlags
, NULL
);
4345 /***********************************************************************
4346 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4348 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4349 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4350 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4352 LPWSTR lpLocalVetoName
;
4355 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4356 ulNameLength
, ulFlags
, hMachine
);
4358 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4359 return CR_INVALID_POINTER
;
4361 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4362 if (lpLocalVetoName
== NULL
)
4363 return CR_OUT_OF_MEMORY
;
4365 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4366 ulNameLength
, ulFlags
, hMachine
);
4367 if (ret
== CR_REMOVE_VETOED
)
4369 if (WideCharToMultiByte(CP_ACP
,
4380 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4386 /***********************************************************************
4387 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4389 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4390 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4391 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4393 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4394 HSTRING_TABLE StringTable
= NULL
;
4398 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4399 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4401 if (dnAncestor
== 0)
4402 return CR_INVALID_DEVNODE
;
4404 if (ulFlags
& ~CM_REMOVE_BITS
)
4405 return CR_INVALID_FLAG
;
4407 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4408 return CR_INVALID_POINTER
;
4410 if (hMachine
!= NULL
)
4412 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4413 if (BindingHandle
== NULL
)
4416 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4417 if (StringTable
== 0)
4422 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4426 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4427 if (lpDevInst
== NULL
)
4428 return CR_INVALID_DEVNODE
;
4432 ret
= PNP_QueryRemove(BindingHandle
,
4439 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4441 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4449 /***********************************************************************
4450 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4452 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4453 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4456 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4457 ResourceID
, ulFlags
);
4459 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4460 ResourceID
, ulFlags
, NULL
);
4464 /***********************************************************************
4465 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4467 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4470 IN DEVINST dnDevInst
,
4471 IN RESOURCEID ResourceID
,
4473 IN HMACHINE hMachine
)
4475 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4476 HSTRING_TABLE StringTable
= NULL
;
4480 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4481 ResourceID
, ulFlags
, hMachine
);
4483 if (pData
== NULL
|| DataLen
== 0)
4484 return CR_INVALID_POINTER
;
4487 return CR_INVALID_DEVINST
;
4489 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4490 return CR_INVALID_FLAG
;
4492 if (hMachine
!= NULL
)
4494 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4495 if (BindingHandle
== NULL
)
4498 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4499 if (StringTable
== 0)
4504 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4508 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4509 if (lpDevInst
== NULL
)
4510 return CR_INVALID_DEVNODE
;
4514 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4521 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4523 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4531 /***********************************************************************
4532 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4534 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4535 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4537 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4539 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4544 /***********************************************************************
4545 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4547 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4548 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4549 ULONG ulFlags
, HMACHINE hMachine
)
4551 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4552 HSTRING_TABLE StringTable
= NULL
;
4556 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4559 if (pulSize
== NULL
)
4560 return CR_INVALID_POINTER
;
4563 return CR_INVALID_DEVINST
;
4565 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4566 return CR_INVALID_FLAG
;
4568 if (hMachine
!= NULL
)
4570 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4571 if (BindingHandle
== NULL
)
4574 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4575 if (StringTable
== 0)
4580 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4584 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4585 if (lpDevInst
== NULL
)
4586 return CR_INVALID_DEVNODE
;
4590 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4596 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4598 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4606 /***********************************************************************
4607 * CM_Query_Remove_SubTree [SETUPAPI.@]
4609 * This function is obsolete in Windows XP and above.
4611 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4612 DEVINST dnAncestor
, ULONG ulFlags
)
4614 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4615 return CR_CALL_NOT_IMPLEMENTED
;
4619 /***********************************************************************
4620 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4622 * This function is obsolete in Windows XP and above.
4624 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4625 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4627 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4628 return CR_CALL_NOT_IMPLEMENTED
;
4632 /***********************************************************************
4633 * CM_Reenumerate_DevNode [SETUPAPI.@]
4635 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4636 DEVINST dnDevInst
, ULONG ulFlags
)
4638 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4639 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4643 /***********************************************************************
4644 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4647 CM_Reenumerate_DevNode_Ex(
4648 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4650 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4651 HSTRING_TABLE StringTable
= NULL
;
4655 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4658 return CR_INVALID_DEVNODE
;
4660 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4661 return CR_INVALID_FLAG
;
4663 if (hMachine
!= NULL
)
4665 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4666 if (BindingHandle
== NULL
)
4669 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4670 if (StringTable
== 0)
4675 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4679 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4680 if (lpDevInst
== NULL
)
4681 return CR_INVALID_DEVNODE
;
4685 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4686 PNP_DEVINST_REENUMERATE
,
4691 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4693 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4701 /***********************************************************************
4702 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4704 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4705 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4706 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4708 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4709 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4711 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4712 pszReference
, pszDeviceInterface
,
4713 pulLength
, ulFlags
, NULL
);
4717 /***********************************************************************
4718 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4720 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4721 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4722 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4724 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4725 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4727 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4728 pszReference
, pszDeviceInterface
,
4729 pulLength
, ulFlags
, NULL
);
4733 /***********************************************************************
4734 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4736 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4737 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4738 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4740 LPWSTR pszReferenceW
= NULL
;
4741 LPWSTR pszDeviceInterfaceW
= NULL
;
4745 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4746 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4748 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4749 return CR_INVALID_POINTER
;
4751 if (pszReference
!= NULL
)
4753 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4754 return CR_INVALID_DATA
;
4757 ulLength
= *pulLength
;
4759 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4760 if (pszDeviceInterfaceW
== NULL
)
4762 ret
= CR_OUT_OF_MEMORY
;
4766 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4769 pszDeviceInterfaceW
,
4773 if (ret
== CR_SUCCESS
)
4775 if (WideCharToMultiByte(CP_ACP
,
4777 pszDeviceInterfaceW
,
4786 *pulLength
= ulLength
;
4789 if (pszDeviceInterfaceW
!= NULL
)
4790 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4792 if (pszReferenceW
!= NULL
)
4793 MyFree(pszReferenceW
);
4799 /***********************************************************************
4800 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4802 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4803 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4804 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4806 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4807 HSTRING_TABLE StringTable
= NULL
;
4809 ULONG ulTransferLength
;
4812 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4813 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4816 return CR_INVALID_DEVNODE
;
4818 if (InterfaceClassGuid
== NULL
||
4819 pszDeviceInterface
== NULL
||
4821 return CR_INVALID_POINTER
;
4824 return CR_INVALID_FLAG
;
4826 if (hMachine
!= NULL
)
4828 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4829 if (BindingHandle
== NULL
)
4832 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4833 if (StringTable
== 0)
4838 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4842 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4843 if (lpDevInst
== NULL
)
4844 return CR_INVALID_DEVNODE
;
4846 ulTransferLength
= *pulLength
;
4850 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4853 (LPWSTR
)pszReference
,
4859 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4861 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4869 /***********************************************************************
4870 * CM_Register_Device_Driver [SETUPAPI.@]
4872 CONFIGRET WINAPI
CM_Register_Device_Driver(
4873 DEVINST dnDevInst
, ULONG ulFlags
)
4875 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4876 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4880 /***********************************************************************
4881 * CM_Register_Device_Driver [SETUPAPI.@]
4883 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4884 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4886 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4887 HSTRING_TABLE StringTable
= NULL
;
4891 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4894 return CR_INVALID_DEVNODE
;
4896 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4897 return CR_INVALID_FLAG
;
4899 if (hMachine
!= NULL
)
4901 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4902 if (BindingHandle
== NULL
)
4905 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4906 if (StringTable
== 0)
4911 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4915 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4916 if (lpDevInst
== NULL
)
4917 return CR_INVALID_DEVNODE
;
4921 ret
= PNP_RegisterDriver(BindingHandle
,
4925 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4927 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4935 /***********************************************************************
4936 * CM_Remove_SubTree [SETUPAPI.@]
4938 * This function is obsolete in Windows XP and above.
4940 CONFIGRET WINAPI
CM_Remove_SubTree(
4941 DEVINST dnAncestor
, ULONG ulFlags
)
4943 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4944 return CR_CALL_NOT_IMPLEMENTED
;
4948 /***********************************************************************
4949 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4951 * This function is obsolete in Windows XP and above.
4953 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4954 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4956 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4957 return CR_CALL_NOT_IMPLEMENTED
;
4961 /***********************************************************************
4962 * CM_Request_Device_EjectA [SETUPAPI.@]
4964 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4965 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4966 ULONG ulNameLength
, ULONG ulFlags
)
4968 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4969 ulNameLength
, ulFlags
);
4970 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4971 ulNameLength
, ulFlags
, NULL
);
4975 /***********************************************************************
4976 * CM_Request_Device_EjectW [SETUPAPI.@]
4978 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4979 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4980 ULONG ulNameLength
, ULONG ulFlags
)
4982 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4983 ulNameLength
, ulFlags
);
4984 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4985 ulNameLength
, ulFlags
, NULL
);
4989 /***********************************************************************
4990 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4992 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4993 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4994 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4996 LPWSTR lpLocalVetoName
;
4999 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5000 ulNameLength
, ulFlags
, hMachine
);
5002 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5003 return CR_INVALID_POINTER
;
5005 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5006 if (lpLocalVetoName
== NULL
)
5007 return CR_OUT_OF_MEMORY
;
5009 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5010 ulNameLength
, ulFlags
, hMachine
);
5011 if (ret
== CR_REMOVE_VETOED
)
5013 if (WideCharToMultiByte(CP_ACP
,
5024 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5030 /***********************************************************************
5031 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5033 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5034 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5035 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5037 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5038 HSTRING_TABLE StringTable
= NULL
;
5042 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5043 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5046 return CR_INVALID_DEVNODE
;
5049 return CR_INVALID_FLAG
;
5051 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5052 return CR_INVALID_POINTER
;
5054 if (hMachine
!= NULL
)
5056 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5057 if (BindingHandle
== NULL
)
5060 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5061 if (StringTable
== 0)
5066 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5070 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5071 if (lpDevInst
== NULL
)
5072 return CR_INVALID_DEVNODE
;
5076 ret
= PNP_RequestDeviceEject(BindingHandle
,
5083 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5085 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5093 /***********************************************************************
5094 * CM_Request_Eject_PC [SETUPAPI.@]
5096 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
5099 return CM_Request_Eject_PC_Ex(NULL
);
5103 /***********************************************************************
5104 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
5106 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
5109 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5112 TRACE("%lx\n", hMachine
);
5114 if (hMachine
!= NULL
)
5116 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5117 if (BindingHandle
== NULL
)
5122 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5128 ret
= PNP_RequestEjectPC(BindingHandle
);
5130 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5132 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5140 /***********************************************************************
5141 * CM_Run_Detection [SETUPAPI.@]
5143 CONFIGRET WINAPI
CM_Run_Detection(
5146 TRACE("%lx\n", ulFlags
);
5147 return CM_Run_Detection_Ex(ulFlags
, NULL
);
5151 /***********************************************************************
5152 * CM_Run_Detection_Ex [SETUPAPI.@]
5154 CONFIGRET WINAPI
CM_Run_Detection_Ex(
5155 ULONG ulFlags
, HMACHINE hMachine
)
5157 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5160 TRACE("%lx %lx\n", ulFlags
, hMachine
);
5162 if (!pSetupIsUserAdmin())
5163 return CR_ACCESS_DENIED
;
5165 if (ulFlags
& ~CM_DETECT_BITS
)
5166 return CR_INVALID_FLAG
;
5168 if (hMachine
!= NULL
)
5170 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5171 if (BindingHandle
== NULL
)
5176 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5182 ret
= PNP_RunDetection(BindingHandle
,
5185 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5187 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5195 /***********************************************************************
5196 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
5198 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
5199 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5200 ULONG ulFlags
, HMACHINE hMachine
)
5202 FIXME("%p %lx %p %lu %lx %p\n",
5203 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5204 return CR_CALL_NOT_IMPLEMENTED
;
5208 /***********************************************************************
5209 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
5211 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
5212 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5213 ULONG ulFlags
, HMACHINE hMachine
)
5215 FIXME("%p %lx %p %lu %lx %p\n",
5216 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5217 return CR_CALL_NOT_IMPLEMENTED
;
5221 /***********************************************************************
5222 * CM_Set_DevNode_Problem [SETUPAPI.@]
5224 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
5225 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
5227 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
5228 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
5232 /***********************************************************************
5233 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
5235 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
5236 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
5238 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5239 HSTRING_TABLE StringTable
= NULL
;
5243 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
5246 return CR_INVALID_DEVNODE
;
5248 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
5249 return CR_INVALID_FLAG
;
5251 if (hMachine
!= NULL
)
5253 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5254 if (BindingHandle
== NULL
)
5257 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5258 if (StringTable
== 0)
5263 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5267 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5268 if (lpDevInst
== NULL
)
5269 return CR_INVALID_DEVNODE
;
5273 ret
= PNP_SetDeviceProblem(BindingHandle
,
5278 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5280 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5288 /***********************************************************************
5289 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
5291 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
5292 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5295 TRACE("%lx %lu %p %lx %lx\n",
5296 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5297 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
5303 /***********************************************************************
5304 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
5306 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
5307 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5310 TRACE("%lx %lu %p %lx %lx\n",
5311 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5312 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
5318 /***********************************************************************
5319 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
5321 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
5322 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5323 ULONG ulFlags
, HMACHINE hMachine
)
5325 CONFIGRET ret
= CR_SUCCESS
;
5329 FIXME("%lx %lu %p %lx %lx %lx\n",
5330 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5332 if (Buffer
== NULL
&& ulLength
!= 0)
5333 return CR_INVALID_POINTER
;
5337 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5346 /* Get property type */
5349 case CM_DRP_DEVICEDESC
:
5353 case CM_DRP_HARDWAREID
:
5354 ulType
= REG_MULTI_SZ
;
5357 case CM_DRP_COMPATIBLEIDS
:
5358 ulType
= REG_MULTI_SZ
;
5361 case CM_DRP_SERVICE
:
5369 case CM_DRP_CLASSGUID
:
5377 case CM_DRP_CONFIGFLAGS
:
5385 case CM_DRP_FRIENDLYNAME
:
5389 case CM_DRP_LOCATION_INFORMATION
:
5393 case CM_DRP_UPPERFILTERS
:
5394 ulType
= REG_MULTI_SZ
;
5397 case CM_DRP_LOWERFILTERS
:
5398 ulType
= REG_MULTI_SZ
;
5401 case CM_DRP_SECURITY
:
5402 ulType
= REG_BINARY
;
5405 case CM_DRP_DEVTYPE
:
5409 case CM_DRP_EXCLUSIVE
:
5413 case CM_DRP_CHARACTERISTICS
:
5417 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5421 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5426 return CR_INVALID_PROPERTY
;
5429 /* Allocate buffer if needed */
5430 if (ulType
== REG_SZ
||
5431 ulType
== REG_MULTI_SZ
)
5433 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5434 if (lpBuffer
== NULL
)
5436 ret
= CR_OUT_OF_MEMORY
;
5440 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5441 ulLength
, lpBuffer
, ulLength
))
5448 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5451 ulLength
* sizeof(WCHAR
),
5460 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5468 ret
= CR_CALL_NOT_IMPLEMENTED
;
5475 /***********************************************************************
5476 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5478 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5479 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5480 ULONG ulFlags
, HMACHINE hMachine
)
5482 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5483 HSTRING_TABLE StringTable
= NULL
;
5488 TRACE("%lx %lu %p %lx %lx %lx\n",
5489 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5492 return CR_INVALID_DEVNODE
;
5494 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5495 return CR_INVALID_PROPERTY
;
5497 if (Buffer
!= NULL
&& ulLength
== 0)
5498 return CR_INVALID_POINTER
;
5501 return CR_INVALID_FLAG
;
5503 if (hMachine
!= NULL
)
5505 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5506 if (BindingHandle
== NULL
)
5509 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5510 if (StringTable
== 0)
5515 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5519 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5520 if (lpDevInst
== NULL
)
5521 return CR_INVALID_DEVNODE
;
5525 case CM_DRP_DEVICEDESC
:
5529 case CM_DRP_HARDWAREID
:
5530 ulType
= REG_MULTI_SZ
;
5533 case CM_DRP_COMPATIBLEIDS
:
5534 ulType
= REG_MULTI_SZ
;
5537 case CM_DRP_SERVICE
:
5545 case CM_DRP_CLASSGUID
:
5553 case CM_DRP_CONFIGFLAGS
:
5561 case CM_DRP_FRIENDLYNAME
:
5565 case CM_DRP_LOCATION_INFORMATION
:
5569 case CM_DRP_UPPERFILTERS
:
5570 ulType
= REG_MULTI_SZ
;
5573 case CM_DRP_LOWERFILTERS
:
5574 ulType
= REG_MULTI_SZ
;
5577 case CM_DRP_SECURITY
:
5578 ulType
= REG_BINARY
;
5581 case CM_DRP_DEVTYPE
:
5585 case CM_DRP_EXCLUSIVE
:
5589 case CM_DRP_CHARACTERISTICS
:
5593 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5597 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5602 return CR_INVALID_PROPERTY
;
5607 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5615 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5617 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5625 /***********************************************************************
5626 * CM_Set_HW_Prof [SETUPAPI.@]
5628 CONFIGRET WINAPI
CM_Set_HW_Prof(
5629 ULONG ulHardwareProfile
, ULONG ulFlags
)
5631 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5632 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5636 /***********************************************************************
5637 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5639 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5640 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5642 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5645 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5647 if (!pSetupIsUserAdmin())
5648 return CR_ACCESS_DENIED
;
5651 return CR_INVALID_FLAG
;
5653 if (hMachine
!= NULL
)
5655 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5656 if (BindingHandle
== NULL
)
5661 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5667 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5669 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5671 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5679 /***********************************************************************
5680 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5682 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5683 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5686 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5687 ulConfig
, ulValue
, ulFlags
);
5688 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5693 /***********************************************************************
5694 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5696 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5697 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5700 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5701 ulConfig
, ulValue
, ulFlags
);
5702 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5707 /***********************************************************************
5708 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5710 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5711 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5712 ULONG ulFlags
, HMACHINE hMachine
)
5714 DEVINSTID_W pszDevIdW
= NULL
;
5715 CONFIGRET ret
= CR_SUCCESS
;
5717 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5718 ulConfig
, ulValue
, ulFlags
, hMachine
);
5720 if (szDevInstName
!= NULL
)
5722 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5723 return CR_INVALID_DEVICE_ID
;
5726 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5729 if (pszDevIdW
!= NULL
)
5736 /***********************************************************************
5737 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5739 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5740 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5741 ULONG ulFlags
, HMACHINE hMachine
)
5743 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5746 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5747 ulConfig
, ulValue
, ulFlags
, hMachine
);
5749 if (szDevInstName
== NULL
)
5750 return CR_INVALID_POINTER
;
5752 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5753 return CR_INVALID_FLAG
;
5755 /* FIXME: Check whether szDevInstName is valid */
5757 if (hMachine
!= NULL
)
5759 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5760 if (BindingHandle
== NULL
)
5765 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5771 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5772 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5774 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5776 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5784 /***********************************************************************
5785 * CM_Setup_DevNode [SETUPAPI.@]
5787 CONFIGRET WINAPI
CM_Setup_DevNode(
5788 DEVINST dnDevInst
, ULONG ulFlags
)
5790 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5791 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5795 /***********************************************************************
5796 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5798 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5799 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5801 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5802 HSTRING_TABLE StringTable
= NULL
;
5806 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5808 if (!pSetupIsUserAdmin())
5809 return CR_ACCESS_DENIED
;
5812 return CR_INVALID_DEVNODE
;
5814 if (ulFlags
& ~CM_SETUP_BITS
)
5815 return CR_INVALID_FLAG
;
5817 if (hMachine
!= NULL
)
5819 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5820 if (BindingHandle
== NULL
)
5823 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5824 if (StringTable
== 0)
5829 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5833 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5834 if (lpDevInst
== NULL
)
5835 return CR_INVALID_DEVNODE
;
5839 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5845 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5847 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5855 /***********************************************************************
5856 * CM_Uninstall_DevNode [SETUPAPI.@]
5858 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5859 DEVINST dnPhantom
, ULONG ulFlags
)
5861 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5862 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5866 /***********************************************************************
5867 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5869 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5870 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5872 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5873 HSTRING_TABLE StringTable
= NULL
;
5877 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5880 return CR_INVALID_DEVNODE
;
5883 return CR_INVALID_FLAG
;
5885 if (hMachine
!= NULL
)
5887 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5888 if (BindingHandle
== NULL
)
5891 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5892 if (StringTable
== 0)
5897 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5901 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5902 if (lpDevInst
== NULL
)
5903 return CR_INVALID_DEVNODE
;
5907 ret
= PNP_UninstallDevInst(BindingHandle
,
5911 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5913 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5921 /***********************************************************************
5922 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5924 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5925 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5927 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5929 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5934 /***********************************************************************
5935 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5937 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5938 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5940 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5942 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5947 /***********************************************************************
5948 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5950 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5951 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5953 LPWSTR pszDeviceInterfaceW
= NULL
;
5956 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5958 if (pszDeviceInterface
== NULL
)
5959 return CR_INVALID_POINTER
;
5961 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5962 return CR_INVALID_DATA
;
5964 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5967 if (pszDeviceInterfaceW
!= NULL
)
5968 MyFree(pszDeviceInterfaceW
);
5974 /***********************************************************************
5975 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5977 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5978 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5980 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5983 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5985 if (pszDeviceInterface
== NULL
)
5986 return CR_INVALID_POINTER
;
5989 return CR_INVALID_FLAG
;
5991 if (hMachine
!= NULL
)
5993 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5994 if (BindingHandle
== NULL
)
5999 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6005 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6006 (LPWSTR
)pszDeviceInterface
,
6009 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6011 ret
= RpcStatusToCmStatus(RpcExceptionCode());