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 *pdnDevInst
= pSetupStringTableAddString(StringTable
, pDeviceID
, 1);
685 if (*pdnDevInst
== 0)
686 ret
= CR_NO_SUCH_DEVNODE
;
693 /***********************************************************************
694 * CM_Delete_Class_Key [SETUPAPI.@]
696 CONFIGRET WINAPI
CM_Delete_Class_Key(
697 LPGUID ClassGuid
, ULONG ulFlags
)
699 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
700 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
704 /***********************************************************************
705 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
707 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
708 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
710 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
711 RPC_BINDING_HANDLE BindingHandle
= NULL
;
714 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
716 if (ClassGuid
== NULL
)
717 return CR_INVALID_POINTER
;
719 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
720 return CR_INVALID_FLAG
;
722 if (!GuidToString(ClassGuid
, szGuidString
))
723 return CR_INVALID_DATA
;
725 if (hMachine
!= NULL
)
727 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
728 if (BindingHandle
== NULL
)
733 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
739 ret
= PNP_DeleteClassKey(BindingHandle
,
743 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
745 ret
= RpcStatusToCmStatus(RpcExceptionCode());
753 /***********************************************************************
754 * CM_Delete_DevNode_Key [SETUPAPI.@]
756 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
757 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
759 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
760 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
765 /***********************************************************************
766 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
768 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
769 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
772 FIXME("%p %lu %lx %p\n",
773 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
775 return CR_CALL_NOT_IMPLEMENTED
;
779 /***********************************************************************
780 * CM_Disable_DevNode [SETUPAPI.@]
782 CONFIGRET WINAPI
CM_Disable_DevNode(
783 DEVINST dnDevInst
, ULONG ulFlags
)
785 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
786 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
790 /***********************************************************************
791 * CM_Disable_DevNode_Ex [SETUPAPI.@]
793 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
794 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
796 RPC_BINDING_HANDLE BindingHandle
= NULL
;
797 HSTRING_TABLE StringTable
= NULL
;
801 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
803 if (!pSetupIsUserAdmin())
804 return CR_ACCESS_DENIED
;
807 return CR_INVALID_DEVINST
;
810 return CR_INVALID_FLAG
;
812 if (hMachine
!= NULL
)
814 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
815 if (BindingHandle
== NULL
)
818 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
819 if (StringTable
== 0)
824 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
828 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
829 if (lpDevInst
== NULL
)
830 return CR_INVALID_DEVNODE
;
834 ret
= PNP_DeviceInstanceAction(BindingHandle
,
840 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
842 ret
= RpcStatusToCmStatus(RpcExceptionCode());
850 /***********************************************************************
851 * CM_Disconnect_Machine [SETUPAPI.@]
853 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
855 PMACHINE_INFO pMachine
;
857 TRACE("%lx\n", hMachine
);
859 pMachine
= (PMACHINE_INFO
)hMachine
;
860 if (pMachine
== NULL
)
863 if (pMachine
->bLocal
== FALSE
)
865 if (pMachine
->StringTable
!= NULL
)
866 pSetupStringTableDestroy(pMachine
->StringTable
);
868 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
869 return CR_ACCESS_DENIED
;
872 HeapFree(GetProcessHeap(), 0, pMachine
);
878 /***********************************************************************
879 * CM_Enable_DevNode [SETUPAPI.@]
881 CONFIGRET WINAPI
CM_Enable_DevNode(
882 DEVINST dnDevInst
, ULONG ulFlags
)
884 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
885 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
889 /***********************************************************************
890 * CM_Enable_DevNode_Ex [SETUPAPI.@]
892 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
893 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
895 RPC_BINDING_HANDLE BindingHandle
= NULL
;
896 HSTRING_TABLE StringTable
= NULL
;
900 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
902 if (!pSetupIsUserAdmin())
903 return CR_ACCESS_DENIED
;
906 return CR_INVALID_DEVINST
;
909 return CR_INVALID_FLAG
;
911 if (hMachine
!= NULL
)
913 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
914 if (BindingHandle
== NULL
)
917 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
918 if (StringTable
== 0)
923 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
927 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
928 if (lpDevInst
== NULL
)
929 return CR_INVALID_DEVNODE
;
933 ret
= PNP_DeviceInstanceAction(BindingHandle
,
939 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
941 ret
= RpcStatusToCmStatus(RpcExceptionCode());
949 /***********************************************************************
950 * CM_Enumerate_Classes [SETUPAPI.@]
952 CONFIGRET WINAPI
CM_Enumerate_Classes(
953 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
955 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
956 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
960 /***********************************************************************
961 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
963 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
964 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
966 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
967 RPC_BINDING_HANDLE BindingHandle
= NULL
;
968 CONFIGRET ret
= CR_SUCCESS
;
969 ULONG ulLength
= MAX_GUID_STRING_LEN
;
971 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
973 if (ClassGuid
== NULL
)
974 return CR_INVALID_POINTER
;
977 return CR_INVALID_FLAG
;
979 if (hMachine
!= NULL
)
981 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
982 if (BindingHandle
== NULL
)
987 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
993 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1001 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1003 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1007 if (ret
== CR_SUCCESS
)
1010 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1012 /* Convert the buffer to a GUID */
1013 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1021 /***********************************************************************
1022 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1024 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1025 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1027 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1028 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1033 /***********************************************************************
1034 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1036 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1037 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1039 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1040 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1045 /***********************************************************************
1046 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1048 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1049 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1052 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1055 CONFIGRET ret
= CR_SUCCESS
;
1057 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1060 if (Buffer
== NULL
|| pulLength
== NULL
)
1061 return CR_INVALID_POINTER
;
1064 return CR_INVALID_FLAG
;
1066 ulOrigLength
= *pulLength
;
1069 ulLength
= MAX_DEVICE_ID_LEN
;
1070 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1072 if (ret
== CR_SUCCESS
)
1074 if (WideCharToMultiByte(CP_ACP
,
1084 *pulLength
= lstrlenA(Buffer
) + 1;
1091 /***********************************************************************
1092 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1094 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1095 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1098 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1101 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1104 if (Buffer
== NULL
|| pulLength
== NULL
)
1105 return CR_INVALID_POINTER
;
1108 return CR_INVALID_FLAG
;
1110 *Buffer
= UNICODE_NULL
;
1112 if (hMachine
!= NULL
)
1114 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1115 if (BindingHandle
== NULL
)
1120 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1126 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1127 PNP_ENUMERATOR_SUBKEYS
,
1134 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1136 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1144 /***********************************************************************
1145 * CM_Free_Log_Conf [SETUPAPI.@]
1147 CONFIGRET WINAPI
CM_Free_Log_Conf(
1148 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1150 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1151 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1155 /***********************************************************************
1156 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1158 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1159 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1161 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1162 HSTRING_TABLE StringTable
= NULL
;
1164 PLOG_CONF_INFO pLogConfInfo
;
1167 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1169 if (!pSetupIsUserAdmin())
1170 return CR_ACCESS_DENIED
;
1172 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1173 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1174 return CR_INVALID_LOG_CONF
;
1177 return CR_INVALID_FLAG
;
1179 if (hMachine
!= NULL
)
1181 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1182 if (BindingHandle
== NULL
)
1185 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1186 if (StringTable
== 0)
1191 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1195 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1196 if (lpDevInst
== NULL
)
1197 return CR_INVALID_DEVNODE
;
1201 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1202 pLogConfInfo
->ulTag
, 0);
1204 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1206 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1214 /***********************************************************************
1215 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1217 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1220 PLOG_CONF_INFO pLogConfInfo
;
1222 TRACE("%lx\n", lcLogConf
);
1224 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1225 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1226 return CR_INVALID_LOG_CONF
;
1228 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1234 /***********************************************************************
1235 * CM_Free_Res_Des [SETUPAPI.@]
1237 CONFIGRET WINAPI
CM_Free_Res_Des(
1238 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1240 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1241 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1245 /***********************************************************************
1246 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1248 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1249 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1252 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1254 return CR_CALL_NOT_IMPLEMENTED
;
1258 /***********************************************************************
1259 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1261 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1264 FIXME("%p\n", rdResDes
);
1266 return CR_CALL_NOT_IMPLEMENTED
;
1270 /***********************************************************************
1271 * CM_Get_Child [SETUPAPI.@]
1273 CONFIGRET WINAPI
CM_Get_Child(
1274 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1276 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1277 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1281 /***********************************************************************
1282 * CM_Get_Child_Ex [SETUPAPI.@]
1284 CONFIGRET WINAPI
CM_Get_Child_Ex(
1285 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1287 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1288 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1289 HSTRING_TABLE StringTable
= NULL
;
1291 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1294 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1296 if (pdnDevInst
== NULL
)
1297 return CR_INVALID_POINTER
;
1300 return CR_INVALID_DEVINST
;
1303 return CR_INVALID_FLAG
;
1307 if (hMachine
!= NULL
)
1309 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1310 if (BindingHandle
== NULL
)
1313 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1314 if (StringTable
== 0)
1319 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1323 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1324 if (lpDevInst
== NULL
)
1325 return CR_INVALID_DEVNODE
;
1329 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1330 PNP_GET_CHILD_DEVICE_INSTANCE
,
1336 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1338 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1342 if (ret
!= CR_SUCCESS
)
1345 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1347 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1351 *pdnDevInst
= dwIndex
;
1357 /***********************************************************************
1358 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1360 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1361 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1363 TRACE("%p %p %p %lx\n",
1364 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1365 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1370 /***********************************************************************
1371 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1373 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1374 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1376 TRACE("%p %p %p %lx\n",
1377 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1378 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1383 /***********************************************************************
1384 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1386 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1387 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1390 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1391 CONFIGRET ret
= CR_SUCCESS
;
1395 TRACE("%p %p %p %lx %lx\n",
1396 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1398 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1399 return CR_INVALID_POINTER
;
1401 ulOrigLength
= *pulLength
;
1404 ulLength
= MAX_GUID_STRING_LEN
;
1405 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1407 if (ret
== CR_SUCCESS
)
1409 if (WideCharToMultiByte(CP_ACP
,
1419 *pulLength
= lstrlenA(pszKeyName
) + 1;
1426 /***********************************************************************
1427 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1429 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1430 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1433 TRACE("%p %p %p %lx %lx\n",
1434 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1436 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1437 return CR_INVALID_POINTER
;
1440 return CR_INVALID_FLAG
;
1442 if (*pulLength
< MAX_GUID_STRING_LEN
)
1445 return CR_BUFFER_SMALL
;
1448 if (!GuidToString(ClassGuid
, pszKeyName
))
1449 return CR_INVALID_DATA
;
1451 *pulLength
= MAX_GUID_STRING_LEN
;
1457 /***********************************************************************
1458 * CM_Get_Class_NameA [SETUPAPI.@]
1460 CONFIGRET WINAPI
CM_Get_Class_NameA(
1461 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1463 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1464 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1469 /***********************************************************************
1470 * CM_Get_Class_NameW [SETUPAPI.@]
1472 CONFIGRET WINAPI
CM_Get_Class_NameW(
1473 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1475 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1476 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1481 /***********************************************************************
1482 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1484 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1485 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1488 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1489 CONFIGRET ret
= CR_SUCCESS
;
1493 TRACE("%p %p %p %lx %lx\n",
1494 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1496 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1497 return CR_INVALID_POINTER
;
1499 ulOrigLength
= *pulLength
;
1502 ulLength
= MAX_CLASS_NAME_LEN
;
1503 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1505 if (ret
== CR_SUCCESS
)
1507 if (WideCharToMultiByte(CP_ACP
,
1517 *pulLength
= lstrlenA(Buffer
) + 1;
1524 /***********************************************************************
1525 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1528 CM_Get_Class_Name_ExW(
1529 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1532 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1533 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1536 TRACE("%p %p %p %lx %lx\n",
1537 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1539 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1540 return CR_INVALID_POINTER
;
1543 return CR_INVALID_FLAG
;
1545 if (!GuidToString(ClassGuid
, szGuidString
))
1546 return CR_INVALID_DATA
;
1548 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1550 if (hMachine
!= NULL
)
1552 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1553 if (BindingHandle
== NULL
)
1558 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1564 ret
= PNP_GetClassName(BindingHandle
,
1570 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1572 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1580 /***********************************************************************
1581 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
1583 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
1584 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1585 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1588 return CR_CALL_NOT_IMPLEMENTED
;
1592 /***********************************************************************
1593 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
1595 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
1596 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1597 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1602 if (ClassGuid
== NULL
||
1607 return CR_INVALID_FLAG
;
1609 if (pSetupStringFromGuid(ClassGuid
, ebp_6c
, 0x27) != 0)
1614 return CR_CALL_NOT_IMPLEMENTED
;
1618 /***********************************************************************
1619 * CM_Get_Depth [SETUPAPI.@]
1621 CONFIGRET WINAPI
CM_Get_Depth(
1622 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1624 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1625 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1629 /***********************************************************************
1630 * CM_Get_Depth_Ex [SETUPAPI.@]
1632 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1633 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1635 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1636 HSTRING_TABLE StringTable
= NULL
;
1640 TRACE("%p %lx %lx %lx\n",
1641 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1643 if (pulDepth
== NULL
)
1644 return CR_INVALID_POINTER
;
1647 return CR_INVALID_DEVINST
;
1650 return CR_INVALID_FLAG
;
1652 if (hMachine
!= NULL
)
1654 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1655 if (BindingHandle
== NULL
)
1658 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1659 if (StringTable
== 0)
1664 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1668 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1669 if (lpDevInst
== NULL
)
1670 return CR_INVALID_DEVNODE
;
1674 ret
= PNP_GetDepth(BindingHandle
,
1679 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1681 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1689 /***********************************************************************
1690 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1692 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1693 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1694 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1696 TRACE("%lx %lu %p %p %p %lx\n",
1697 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1699 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1700 pulRegDataType
, Buffer
,
1701 pulLength
, ulFlags
, NULL
);
1705 /***********************************************************************
1706 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1708 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1709 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1710 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1712 TRACE("%lx %lu %p %p %p %lx\n",
1713 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1715 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1716 pulRegDataType
, Buffer
,
1717 pulLength
, ulFlags
, NULL
);
1721 /***********************************************************************
1722 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1724 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1725 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1726 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1730 ULONG RegDataType
= REG_NONE
;
1733 TRACE("%lx %lu %p %p %p %lx %lx\n",
1734 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1738 return CR_INVALID_POINTER
;
1740 LengthW
= *pulLength
* sizeof(WCHAR
);
1741 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1744 return CR_OUT_OF_MEMORY
;
1746 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1754 if (ret
== CR_SUCCESS
)
1756 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1758 /* Do W->A conversion */
1759 *pulLength
= WideCharToMultiByte(CP_ACP
,
1762 lstrlenW(BufferW
) + 1,
1767 if (*pulLength
== 0)
1772 /* Directly copy the value */
1773 if (LengthW
<= *pulLength
)
1774 memcpy(Buffer
, BufferW
, LengthW
);
1777 *pulLength
= LengthW
;
1778 ret
= CR_BUFFER_SMALL
;
1784 *pulRegDataType
= RegDataType
;
1786 HeapFree(GetProcessHeap(), 0, BufferW
);
1792 /***********************************************************************
1793 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1795 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1796 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1797 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1799 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1800 HSTRING_TABLE StringTable
= NULL
;
1801 CONFIGRET ret
= CR_SUCCESS
;
1803 ULONG ulDataType
= 0;
1804 ULONG ulTransferLength
= 0;
1806 TRACE("%lx %lu %p %p %p %lx %lx\n",
1807 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1811 return CR_INVALID_DEVNODE
;
1813 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1814 return CR_INVALID_PROPERTY
;
1816 /* pulRegDataType is optional */
1818 /* Buffer is optional */
1820 if (pulLength
== NULL
)
1821 return CR_INVALID_POINTER
;
1823 if (*pulLength
== 0)
1824 return CR_INVALID_POINTER
;
1827 return CR_INVALID_FLAG
;
1829 if (hMachine
!= NULL
)
1831 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1832 if (BindingHandle
== NULL
)
1835 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1836 if (StringTable
== 0)
1841 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1845 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1846 if (lpDevInst
== NULL
)
1847 return CR_INVALID_DEVNODE
;
1849 ulTransferLength
= *pulLength
;
1853 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1862 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1864 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1868 if (ret
== CR_SUCCESS
)
1870 if (pulRegDataType
!= NULL
)
1871 *pulRegDataType
= ulDataType
;
1878 /***********************************************************************
1879 * CM_Get_DevNode_Status [SETUPAPI.@]
1881 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1882 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1885 TRACE("%p %p %lx %lx\n",
1886 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1887 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1892 /***********************************************************************
1893 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1896 CM_Get_DevNode_Status_Ex(
1897 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1898 ULONG ulFlags
, HMACHINE hMachine
)
1900 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1901 HSTRING_TABLE StringTable
= NULL
;
1905 TRACE("%p %p %lx %lx %lx\n",
1906 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1908 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1909 return CR_INVALID_POINTER
;
1912 return CR_INVALID_DEVINST
;
1915 return CR_INVALID_FLAG
;
1917 if (hMachine
!= NULL
)
1919 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1920 if (BindingHandle
== NULL
)
1923 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1924 if (StringTable
== 0)
1929 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1933 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1934 if (lpDevInst
== NULL
)
1935 return CR_INVALID_DEVNODE
;
1939 ret
= PNP_GetDeviceStatus(BindingHandle
,
1945 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1947 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1955 /***********************************************************************
1956 * CM_Get_Device_IDA [SETUPAPI.@]
1958 CONFIGRET WINAPI
CM_Get_Device_IDA(
1959 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1961 TRACE("%lx %p %ld %ld\n",
1962 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1963 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1967 /***********************************************************************
1968 * CM_Get_Device_IDW [SETUPAPI.@]
1970 CONFIGRET WINAPI
CM_Get_Device_IDW(
1971 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1973 TRACE("%lx %p %ld %ld\n",
1974 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1975 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1979 /***********************************************************************
1980 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1982 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1983 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1986 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1987 CONFIGRET ret
= CR_SUCCESS
;
1989 TRACE("%lx %p %ld %ld %lx\n",
1990 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1993 return CR_INVALID_POINTER
;
1995 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2000 if (ret
== CR_SUCCESS
)
2002 if (WideCharToMultiByte(CP_ACP
,
2005 lstrlenW(szBufferW
) + 1,
2017 /***********************************************************************
2018 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2020 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2021 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2024 HSTRING_TABLE StringTable
= NULL
;
2026 TRACE("%lx %p %ld %ld %lx\n",
2027 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2030 return CR_INVALID_DEVINST
;
2033 return CR_INVALID_POINTER
;
2036 return CR_INVALID_FLAG
;
2038 if (hMachine
!= NULL
)
2040 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2041 if (StringTable
== NULL
)
2046 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2050 if (!pSetupStringTableStringFromIdEx(StringTable
,
2060 /***********************************************************************
2061 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2063 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2064 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2066 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2067 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2072 /***********************************************************************
2073 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2075 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2076 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2078 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2079 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2084 /***********************************************************************
2085 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2087 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2088 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2091 LPWSTR BufferW
= NULL
;
2092 LPWSTR pszFilterW
= NULL
;
2093 CONFIGRET ret
= CR_SUCCESS
;
2095 TRACE("%p %p %ld %ld %lx\n",
2096 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2098 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2099 if (BufferW
== NULL
)
2100 return CR_OUT_OF_MEMORY
;
2102 if (pszFilter
== NULL
)
2104 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2112 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2114 ret
= CR_INVALID_DEVICE_ID
;
2118 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2127 if (WideCharToMultiByte(CP_ACP
,
2130 lstrlenW(BufferW
) + 1,
2144 /***********************************************************************
2145 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2147 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2148 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2151 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2154 TRACE("%p %p %ld %ld %lx\n",
2155 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2157 if (Buffer
== NULL
|| BufferLen
== 0)
2158 return CR_INVALID_POINTER
;
2160 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2161 return CR_INVALID_FLAG
;
2163 if (hMachine
!= NULL
)
2165 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2166 if (BindingHandle
== NULL
)
2171 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2179 ret
= PNP_GetDeviceList(BindingHandle
,
2185 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2187 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2195 /***********************************************************************
2196 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2198 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2199 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2201 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2202 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2206 /***********************************************************************
2207 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2209 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2210 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2212 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2213 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2217 /***********************************************************************
2218 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2220 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2221 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2223 LPWSTR pszFilterW
= NULL
;
2224 CONFIGRET ret
= CR_SUCCESS
;
2226 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2228 if (pszFilter
== NULL
)
2230 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2237 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2238 return CR_INVALID_DEVICE_ID
;
2240 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2252 /***********************************************************************
2253 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2255 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2256 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2258 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2261 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2264 return CR_INVALID_POINTER
;
2266 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2267 return CR_INVALID_FLAG
;
2269 if (hMachine
!= NULL
)
2271 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2272 if (BindingHandle
== NULL
)
2277 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2285 ret
= PNP_GetDeviceListSize(BindingHandle
,
2290 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2292 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2300 /***********************************************************************
2301 * CM_Get_Device_ID_Size [SETUPAPI.@]
2303 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2304 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2306 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2307 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2311 /***********************************************************************
2312 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2314 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2315 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2317 HSTRING_TABLE StringTable
= NULL
;
2320 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2323 return CR_INVALID_POINTER
;
2326 return CR_INVALID_DEVINST
;
2329 return CR_INVALID_FLAG
;
2331 if (hMachine
!= NULL
)
2333 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2334 if (StringTable
== NULL
)
2339 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2343 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2344 if (DeviceId
== NULL
)
2350 *pulLen
= lstrlenW(DeviceId
);
2356 /***********************************************************************
2357 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2359 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2360 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2361 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2363 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2364 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2366 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2367 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2372 /***********************************************************************
2373 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2375 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2376 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2377 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2379 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2380 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2382 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2383 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2388 /***********************************************************************
2389 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2391 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2392 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2393 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2395 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2396 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2398 return CR_CALL_NOT_IMPLEMENTED
;
2402 /***********************************************************************
2403 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2405 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2406 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2407 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2409 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2410 ULONG ulTransferLength
;
2411 CONFIGRET ret
= CR_SUCCESS
;
2413 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2414 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2416 if (pszDeviceInterface
== NULL
||
2417 AliasInterfaceGuid
== NULL
||
2418 pszAliasDeviceInterface
== NULL
||
2420 return CR_INVALID_POINTER
;
2423 return CR_INVALID_FLAG
;
2425 if (hMachine
!= NULL
)
2427 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2428 if (BindingHandle
== NULL
)
2433 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2437 ulTransferLength
= *pulLength
;
2441 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2442 (LPWSTR
)pszDeviceInterface
,
2444 pszAliasDeviceInterface
,
2449 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2451 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2459 /***********************************************************************
2460 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2462 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2463 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2464 ULONG BufferLen
, ULONG ulFlags
)
2466 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2467 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2469 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2470 Buffer
, BufferLen
, ulFlags
, NULL
);
2474 /***********************************************************************
2475 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2477 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2478 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2479 ULONG BufferLen
, ULONG ulFlags
)
2481 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2482 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2484 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2485 Buffer
, BufferLen
, ulFlags
, NULL
);
2489 /***********************************************************************
2490 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2492 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2493 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2494 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2496 DEVINSTID_W pDeviceIdW
= NULL
;
2497 PWCHAR BufferW
= NULL
;
2498 CONFIGRET ret
= CR_SUCCESS
;
2500 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2501 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2503 if (Buffer
== NULL
||
2505 return CR_INVALID_POINTER
;
2507 if (pDeviceID
!= NULL
)
2509 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2510 return CR_INVALID_DEVICE_ID
;
2513 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2514 if (BufferW
== NULL
)
2516 ret
= CR_OUT_OF_MEMORY
;
2520 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2521 BufferW
, BufferLen
, ulFlags
,
2523 if (ret
!= CR_SUCCESS
)
2526 if (WideCharToMultiByte(CP_ACP
,
2529 lstrlenW(BufferW
) + 1,
2537 if (BufferW
!= NULL
)
2540 if (pDeviceIdW
!= NULL
)
2547 /***********************************************************************
2548 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2550 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2551 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2552 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2554 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2555 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2556 CONFIGRET ret
= CR_SUCCESS
;
2558 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2559 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2561 if (Buffer
== NULL
||
2563 return CR_INVALID_POINTER
;
2565 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2566 return CR_INVALID_FLAG
;
2568 if (hMachine
!= NULL
)
2570 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2571 if (BindingHandle
== NULL
)
2576 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2581 BufferSize
= BufferLen
;
2585 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2592 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2594 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2602 /***********************************************************************
2603 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2605 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2606 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2609 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2610 pDeviceId
, ulFlags
);
2612 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2613 pDeviceId
, ulFlags
, NULL
);
2617 /***********************************************************************
2618 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2620 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2621 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2624 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2625 debugstr_w(pDeviceId
), ulFlags
);
2627 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2628 pDeviceId
, ulFlags
, NULL
);
2632 /***********************************************************************
2633 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2635 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2636 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2637 ULONG ulFlags
, HMACHINE hMachine
)
2639 DEVINSTID_W pDeviceIdW
= NULL
;
2640 CONFIGRET ret
= CR_SUCCESS
;
2642 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2643 pDeviceId
, ulFlags
, hMachine
);
2646 return CR_INVALID_POINTER
;
2648 if (pDeviceId
!= NULL
)
2650 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2651 return CR_INVALID_DEVICE_ID
;
2656 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2657 pDeviceIdW
, ulFlags
, hMachine
);
2659 if (pDeviceIdW
!= NULL
)
2666 /***********************************************************************
2667 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2669 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2670 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2671 ULONG ulFlags
, HMACHINE hMachine
)
2673 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2674 CONFIGRET ret
= CR_SUCCESS
;
2676 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2677 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2680 return CR_INVALID_POINTER
;
2682 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2683 return CR_INVALID_FLAG
;
2685 if (hMachine
!= NULL
)
2687 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2688 if (BindingHandle
== NULL
)
2693 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2701 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2707 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2709 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2717 /***********************************************************************
2718 * CM_Get_First_Log_Conf [SETUPAPI.@]
2720 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2721 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2723 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2724 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2728 /***********************************************************************
2729 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2731 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2732 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2734 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2735 HSTRING_TABLE StringTable
= NULL
;
2736 LPWSTR lpDevInst
= NULL
;
2737 CONFIGRET ret
= CR_SUCCESS
;
2739 PLOG_CONF_INFO pLogConfInfo
;
2741 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2744 return CR_INVALID_DEVINST
;
2746 if (ulFlags
& ~LOG_CONF_BITS
)
2747 return CR_INVALID_FLAG
;
2752 if (hMachine
!= NULL
)
2754 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2755 if (BindingHandle
== NULL
)
2758 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2759 if (StringTable
== 0)
2764 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2768 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2769 if (lpDevInst
== NULL
)
2770 return CR_INVALID_DEVNODE
;
2774 ret
= PNP_GetFirstLogConf(BindingHandle
,
2780 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2782 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2786 if (ret
!= CR_SUCCESS
)
2791 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2792 if (pLogConfInfo
== NULL
)
2793 return CR_OUT_OF_MEMORY
;
2795 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2796 pLogConfInfo
->dnDevInst
= dnDevInst
;
2797 pLogConfInfo
->ulFlags
= ulFlags
;
2798 pLogConfInfo
->ulTag
= ulTag
;
2800 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2807 /***********************************************************************
2808 * CM_Get_Global_State [SETUPAPI.@]
2810 CONFIGRET WINAPI
CM_Get_Global_State(
2811 PULONG pulState
, ULONG ulFlags
)
2813 TRACE("%p %lx\n", pulState
, ulFlags
);
2814 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2818 /***********************************************************************
2819 * CM_Get_Global_State_Ex [SETUPAPI.@]
2821 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2822 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2824 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2827 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2829 if (pulState
== NULL
)
2830 return CR_INVALID_POINTER
;
2833 return CR_INVALID_FLAG
;
2835 if (hMachine
!= NULL
)
2837 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2838 if (BindingHandle
== NULL
)
2843 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2849 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2851 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2853 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2861 /***********************************************************************
2862 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2864 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2865 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2868 TRACE("%s %lu %p %lx\n", szDevInstName
,
2869 ulHardwareProfile
, pulValue
, ulFlags
);
2871 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2872 pulValue
, ulFlags
, NULL
);
2876 /***********************************************************************
2877 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2879 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2880 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2883 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2884 ulHardwareProfile
, pulValue
, ulFlags
);
2886 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2887 pulValue
, ulFlags
, NULL
);
2891 /***********************************************************************
2892 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2894 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2895 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2896 ULONG ulFlags
, HMACHINE hMachine
)
2898 DEVINSTID_W pszDevIdW
= NULL
;
2899 CONFIGRET ret
= CR_SUCCESS
;
2901 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2902 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2904 if (szDevInstName
!= NULL
)
2906 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2907 return CR_INVALID_DEVICE_ID
;
2910 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2911 pulValue
, ulFlags
, hMachine
);
2913 if (pszDevIdW
!= NULL
)
2920 /***********************************************************************
2921 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2923 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2924 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2925 ULONG ulFlags
, HMACHINE hMachine
)
2927 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2930 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2931 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2933 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2934 return CR_INVALID_POINTER
;
2937 return CR_INVALID_FLAG
;
2939 /* FIXME: Check whether szDevInstName is valid */
2941 if (hMachine
!= NULL
)
2943 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2944 if (BindingHandle
== NULL
)
2949 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2955 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
2956 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
2958 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2960 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2968 /***********************************************************************
2969 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
2971 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
2972 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
2974 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2976 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
2981 /***********************************************************************
2982 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
2984 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
2985 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
2987 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
2989 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
2994 /***********************************************************************
2995 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
2997 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
2998 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3001 HWPROFILEINFO_W LocalProfileInfo
;
3004 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3006 if (pHWProfileInfo
== NULL
)
3007 return CR_INVALID_POINTER
;
3009 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3011 if (ret
== CR_SUCCESS
)
3013 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3014 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3016 if (WideCharToMultiByte(CP_ACP
,
3018 LocalProfileInfo
.HWPI_szFriendlyName
,
3019 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3020 pHWProfileInfo
->HWPI_szFriendlyName
,
3031 /***********************************************************************
3032 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3034 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3035 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3038 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3041 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3043 if (pHWProfileInfo
== NULL
)
3044 return CR_INVALID_POINTER
;
3047 return CR_INVALID_FLAG
;
3049 if (hMachine
!= NULL
)
3051 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3052 if (BindingHandle
== NULL
)
3057 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3063 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3064 sizeof(HWPROFILEINFO_W
), 0);
3066 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3068 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3076 /***********************************************************************
3077 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3079 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3080 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3082 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3083 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3087 /***********************************************************************
3088 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3090 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3091 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3094 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3095 HSTRING_TABLE StringTable
= NULL
;
3096 PLOG_CONF_INFO pLogConfInfo
;
3100 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3102 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3103 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3104 return CR_INVALID_LOG_CONF
;
3106 if (pPriority
== NULL
)
3107 return CR_INVALID_POINTER
;
3110 return CR_INVALID_FLAG
;
3112 if (hMachine
!= NULL
)
3114 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3115 if (BindingHandle
== NULL
)
3118 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3119 if (StringTable
== 0)
3124 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3128 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3129 if (lpDevInst
== NULL
)
3130 return CR_INVALID_DEVNODE
;
3134 ret
= PNP_GetLogConfPriority(BindingHandle
,
3136 pLogConfInfo
->ulFlags
,
3137 pLogConfInfo
->ulTag
,
3141 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3143 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3151 /***********************************************************************
3152 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3154 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3155 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3157 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3158 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3162 /***********************************************************************
3163 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3165 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3166 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3169 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3170 HSTRING_TABLE StringTable
= NULL
;
3171 PLOG_CONF_INFO pLogConfInfo
;
3172 PLOG_CONF_INFO pNewLogConfInfo
;
3177 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3182 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3183 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3184 return CR_INVALID_LOG_CONF
;
3187 return CR_INVALID_FLAG
;
3189 if (hMachine
!= NULL
)
3191 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3192 if (BindingHandle
== NULL
)
3195 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3196 if (StringTable
== 0)
3201 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3205 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3206 if (lpDevInst
== NULL
)
3207 return CR_INVALID_DEVNODE
;
3211 ret
= PNP_GetNextLogConf(BindingHandle
,
3213 pLogConfInfo
->ulFlags
,
3214 pLogConfInfo
->ulTag
,
3218 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3220 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3224 if (ret
!= CR_SUCCESS
)
3229 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3230 if (pNewLogConfInfo
== NULL
)
3231 return CR_OUT_OF_MEMORY
;
3233 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3234 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3235 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3236 pNewLogConfInfo
->ulTag
= ulNewTag
;
3238 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3245 /***********************************************************************
3246 * CM_Get_Next_Re_Des [SETUPAPI.@]
3248 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3249 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3250 PRESOURCEID pResourceID
, ULONG ulFlags
)
3252 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3253 pResourceID
, ulFlags
);
3254 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3255 pResourceID
, ulFlags
, NULL
);
3259 /***********************************************************************
3260 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3262 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3263 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3264 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3266 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3267 pResourceID
, ulFlags
, hMachine
);
3269 return CR_CALL_NOT_IMPLEMENTED
;
3273 /***********************************************************************
3274 * CM_Get_Parent [SETUPAPI.@]
3276 CONFIGRET WINAPI
CM_Get_Parent(
3277 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3279 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3280 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3284 /***********************************************************************
3285 * CM_Get_Parent_Ex [SETUPAPI.@]
3287 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3288 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3290 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3291 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3292 HSTRING_TABLE StringTable
= NULL
;
3294 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3297 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3299 if (pdnDevInst
== NULL
)
3300 return CR_INVALID_POINTER
;
3303 return CR_INVALID_DEVINST
;
3306 return CR_INVALID_FLAG
;
3310 if (hMachine
!= NULL
)
3312 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3313 if (BindingHandle
== NULL
)
3316 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3317 if (StringTable
== 0)
3322 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3326 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3327 if (lpDevInst
== NULL
)
3328 return CR_INVALID_DEVNODE
;
3332 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3333 PNP_GET_PARENT_DEVICE_INSTANCE
,
3339 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3341 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3345 if (ret
!= CR_SUCCESS
)
3348 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3350 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3354 *pdnDevInst
= dwIndex
;
3360 /***********************************************************************
3361 * CM_Get_Res_Des_Data [SETUPAPI.@]
3363 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3364 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3366 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3367 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3371 /***********************************************************************
3372 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3374 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3375 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3378 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3379 return CR_CALL_NOT_IMPLEMENTED
;
3383 /***********************************************************************
3384 * CM_Get_Res_Des_Size [SETUPAPI.@]
3386 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3387 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3389 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3390 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3394 /***********************************************************************
3395 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3397 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3398 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3400 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3401 return CR_CALL_NOT_IMPLEMENTED
;
3405 /***********************************************************************
3406 * CM_Get_Sibling [SETUPAPI.@]
3408 CONFIGRET WINAPI
CM_Get_Sibling(
3409 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3411 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3412 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3416 /***********************************************************************
3417 * CM_Get_Sibling_Ex [SETUPAPI.@]
3419 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3420 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3422 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3423 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3424 HSTRING_TABLE StringTable
= NULL
;
3426 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3429 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3431 if (pdnDevInst
== NULL
)
3432 return CR_INVALID_POINTER
;
3435 return CR_INVALID_DEVINST
;
3438 return CR_INVALID_FLAG
;
3442 if (hMachine
!= NULL
)
3444 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3445 if (BindingHandle
== NULL
)
3448 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3449 if (StringTable
== 0)
3454 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3458 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3459 if (lpDevInst
== NULL
)
3460 return CR_INVALID_DEVNODE
;
3464 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3465 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3471 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3473 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3477 if (ret
!= CR_SUCCESS
)
3480 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3482 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3486 *pdnDevInst
= dwIndex
;
3492 /***********************************************************************
3493 * CM_Get_Version [SETUPAPI.@]
3495 WORD WINAPI
CM_Get_Version(VOID
)
3498 return CM_Get_Version_Ex(NULL
);
3502 /***********************************************************************
3503 * CM_Get_Version_Ex [SETUPAPI.@]
3505 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3507 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3511 TRACE("%lx\n", hMachine
);
3513 if (hMachine
!= NULL
)
3515 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3516 if (BindingHandle
== NULL
)
3521 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3527 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3529 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3531 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3535 if (ret
!= CR_SUCCESS
)
3542 /***********************************************************************
3543 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3545 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3548 TRACE("%p\n", pbPresent
);
3549 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3553 /***********************************************************************
3554 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3556 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3557 PBOOL pbPresent
, HMACHINE hMachine
)
3559 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3562 TRACE("%p %lx\n", pbPresent
, hMachine
);
3564 if (pbPresent
== NULL
)
3565 return CR_INVALID_POINTER
;
3569 if (hMachine
!= NULL
)
3571 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3572 if (BindingHandle
== NULL
)
3577 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3583 ret
= PNP_IsDockStationPresent(BindingHandle
,
3586 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3588 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3596 /***********************************************************************
3597 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3599 BOOL WINAPI
CM_Is_Version_Available(
3602 TRACE("%hu\n", wVersion
);
3603 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3607 /***********************************************************************
3608 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3610 BOOL WINAPI
CM_Is_Version_Available_Ex(
3611 WORD wVersion
, HMACHINE hMachine
)
3613 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3614 WORD wServerVersion
;
3617 TRACE("%hu %lx\n", wVersion
, hMachine
);
3619 if (wVersion
<= 0x400)
3622 if (hMachine
!= NULL
)
3624 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3625 if (BindingHandle
== NULL
)
3630 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3636 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3638 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3640 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3644 if (ret
!= CR_SUCCESS
)
3647 return (wServerVersion
>= wVersion
);
3651 /***********************************************************************
3652 * CM_Locate_DevNodeA [SETUPAPI.@]
3654 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3655 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3657 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3658 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3662 /***********************************************************************
3663 * CM_Locate_DevNodeW [SETUPAPI.@]
3665 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3666 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3668 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3669 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3673 /***********************************************************************
3674 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3676 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3677 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3679 DEVINSTID_W pDevIdW
= NULL
;
3680 CONFIGRET ret
= CR_SUCCESS
;
3682 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3684 if (pDeviceID
!= NULL
)
3686 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3687 return CR_INVALID_DEVICE_ID
;
3690 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3692 if (pDevIdW
!= NULL
)
3699 /***********************************************************************
3700 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3702 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3703 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3705 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3706 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3707 HSTRING_TABLE StringTable
= NULL
;
3708 CONFIGRET ret
= CR_SUCCESS
;
3710 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3712 if (pdnDevInst
== NULL
)
3713 return CR_INVALID_POINTER
;
3715 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3716 return CR_INVALID_FLAG
;
3718 if (hMachine
!= NULL
)
3720 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3721 if (BindingHandle
== NULL
)
3724 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3725 if (StringTable
== 0)
3730 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3734 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3736 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3742 /* Get the root device ID */
3743 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3747 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3749 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3753 if (ret
!= CR_SUCCESS
)
3756 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3760 /* Validate the device ID */
3761 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3765 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3767 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3771 if (ret
== CR_SUCCESS
)
3773 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3774 if (*pdnDevInst
== -1)
3782 /***********************************************************************
3783 * CM_Modify_Res_Des [SETUPAPI.@]
3785 CONFIGRET WINAPI
CM_Modify_Res_Des(
3786 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
3787 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
3789 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3790 ResourceLen
, ulFlags
);
3791 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3792 ResourceLen
, ulFlags
, NULL
);
3796 /***********************************************************************
3797 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
3799 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
3800 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
3801 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
3803 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
3804 ResourceLen
, ulFlags
, hMachine
);
3805 return CR_CALL_NOT_IMPLEMENTED
;
3809 /***********************************************************************
3810 * CM_Move_DevNode [SETUPAPI.@]
3812 CONFIGRET WINAPI
CM_Move_DevNode(
3813 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3815 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3816 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3820 /***********************************************************************
3821 * CM_Move_DevNode_Ex [SETUPAPI.@]
3823 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3824 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3827 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3828 HSTRING_TABLE StringTable
= NULL
;
3829 LPWSTR lpFromDevInst
;
3833 FIXME("%lx %lx %lx %lx\n",
3834 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3836 if (!pSetupIsUserAdmin())
3837 return CR_ACCESS_DENIED
;
3839 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3840 return CR_INVALID_DEVNODE
;
3843 return CR_INVALID_FLAG
;
3845 if (hMachine
!= NULL
)
3847 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3848 if (BindingHandle
== NULL
)
3851 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3852 if (StringTable
== 0)
3857 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3861 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
3862 if (lpFromDevInst
== NULL
)
3863 return CR_INVALID_DEVNODE
;
3865 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
3866 if (lpToDevInst
== NULL
)
3867 return CR_INVALID_DEVNODE
;
3871 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3877 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3879 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3887 /***********************************************************************
3888 * CM_Open_Class_KeyA [SETUPAPI.@]
3890 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3891 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3892 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3894 TRACE("%p %s %lx %lx %p %lx\n",
3895 debugstr_guid(pClassGuid
), pszClassName
,
3896 samDesired
, Disposition
, phkClass
, ulFlags
);
3898 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3899 Disposition
, phkClass
, ulFlags
, NULL
);
3903 /***********************************************************************
3904 * CM_Open_Class_KeyW [SETUPAPI.@]
3906 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3907 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3908 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3910 TRACE("%p %s %lx %lx %p %lx\n",
3911 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3912 samDesired
, Disposition
, phkClass
, ulFlags
);
3914 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3915 Disposition
, phkClass
, ulFlags
, NULL
);
3919 /***********************************************************************
3920 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3922 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3923 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3924 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3927 CONFIGRET rc
= CR_SUCCESS
;
3928 LPWSTR pszClassNameW
= NULL
;
3930 TRACE("%p %s %lx %lx %p %lx %lx\n",
3931 debugstr_guid(pClassGuid
), pszClassName
,
3932 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3934 if (pszClassName
!= NULL
)
3936 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3937 return CR_INVALID_DATA
;
3940 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3941 Disposition
, phkClass
, ulFlags
, hMachine
);
3943 if (pszClassNameW
!= NULL
)
3944 MyFree(pszClassNameW
);
3950 /***********************************************************************
3951 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3953 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3954 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3955 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3958 WCHAR szKeyName
[MAX_PATH
];
3959 LPWSTR lpGuidString
;
3960 DWORD dwDisposition
;
3964 TRACE("%p %s %lx %lx %p %lx %lx\n",
3965 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3966 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3968 /* Check Disposition and ulFlags */
3969 if ((Disposition
& ~RegDisposition_Bits
) ||
3970 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3971 return CR_INVALID_FLAG
;
3973 /* Check phkClass */
3974 if (phkClass
== NULL
)
3975 return CR_INVALID_POINTER
;
3979 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3980 pszClassName
!= NULL
)
3981 return CR_INVALID_DATA
;
3983 if (hMachine
== NULL
)
3985 hKey
= HKEY_LOCAL_MACHINE
;
3989 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3990 HKEY_LOCAL_MACHINE
, &hKey
))
3991 return CR_REGISTRY_ERROR
;
3994 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3996 lstrcpyW(szKeyName
, DeviceClasses
);
4000 lstrcpyW(szKeyName
, ControlClass
);
4003 if (pClassGuid
!= NULL
)
4005 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
4008 return CR_INVALID_DATA
;
4011 lstrcatW(szKeyName
, Backslash
);
4012 lstrcatW(szKeyName
, lpGuidString
);
4015 if (Disposition
== RegDisposition_OpenAlways
)
4017 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
4018 NULL
, phkClass
, &dwDisposition
);
4022 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
4027 if (pClassGuid
!= NULL
)
4028 RpcStringFreeW(&lpGuidString
);
4030 if (dwError
!= ERROR_SUCCESS
)
4033 return CR_NO_SUCH_REGISTRY_KEY
;
4036 if (pszClassName
!= NULL
)
4038 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
4039 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
4046 /***********************************************************************
4047 * CM_Open_DevNode_Key [SETUPAPI.@]
4049 CONFIGRET WINAPI
CM_Open_DevNode_Key(
4050 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4051 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
4053 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
4054 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
4055 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
4056 Disposition
, phkDevice
, ulFlags
, NULL
);
4060 /***********************************************************************
4061 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
4063 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
4064 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4065 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4068 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4069 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4071 return CR_CALL_NOT_IMPLEMENTED
;
4075 /***********************************************************************
4076 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4078 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4079 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4080 ULONG ulNameLength
, ULONG ulFlags
)
4082 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4083 ulNameLength
, ulFlags
);
4085 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4086 ulNameLength
, ulFlags
, NULL
);
4090 /***********************************************************************
4091 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4093 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4094 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4095 ULONG ulNameLength
, ULONG ulFlags
)
4097 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4098 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4100 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4101 ulNameLength
, ulFlags
, NULL
);
4105 /***********************************************************************
4106 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4108 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4109 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4110 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4112 LPWSTR lpLocalVetoName
;
4115 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4116 ulNameLength
, ulFlags
, hMachine
);
4118 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4119 return CR_INVALID_POINTER
;
4121 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4122 if (lpLocalVetoName
== NULL
)
4123 return CR_OUT_OF_MEMORY
;
4125 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4126 ulNameLength
, ulFlags
, hMachine
);
4127 if (ret
== CR_REMOVE_VETOED
)
4129 if (WideCharToMultiByte(CP_ACP
,
4140 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4146 /***********************************************************************
4147 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4149 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4150 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4151 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4153 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4154 HSTRING_TABLE StringTable
= NULL
;
4158 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4159 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4161 if (dnAncestor
== 0)
4162 return CR_INVALID_DEVNODE
;
4164 if (ulFlags
& ~CM_REMOVE_BITS
)
4165 return CR_INVALID_FLAG
;
4167 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4168 return CR_INVALID_POINTER
;
4170 if (hMachine
!= NULL
)
4172 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4173 if (BindingHandle
== NULL
)
4176 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4177 if (StringTable
== 0)
4182 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4186 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4187 if (lpDevInst
== NULL
)
4188 return CR_INVALID_DEVNODE
;
4192 ret
= PNP_QueryRemove(BindingHandle
,
4199 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4201 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4209 /***********************************************************************
4210 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4212 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4213 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4216 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4217 ResourceID
, ulFlags
);
4219 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4220 ResourceID
, ulFlags
, NULL
);
4224 /***********************************************************************
4225 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4227 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4230 IN DEVINST dnDevInst
,
4231 IN RESOURCEID ResourceID
,
4233 IN HMACHINE hMachine
)
4235 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4236 HSTRING_TABLE StringTable
= NULL
;
4240 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4241 ResourceID
, ulFlags
, hMachine
);
4243 if (pData
== NULL
|| DataLen
== 0)
4244 return CR_INVALID_POINTER
;
4247 return CR_INVALID_DEVINST
;
4249 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4250 return CR_INVALID_FLAG
;
4252 if (hMachine
!= NULL
)
4254 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4255 if (BindingHandle
== NULL
)
4258 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4259 if (StringTable
== 0)
4264 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4268 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4269 if (lpDevInst
== NULL
)
4270 return CR_INVALID_DEVNODE
;
4274 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4281 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4283 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4291 /***********************************************************************
4292 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4294 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4295 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4297 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4299 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4304 /***********************************************************************
4305 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4307 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4308 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4309 ULONG ulFlags
, HMACHINE hMachine
)
4311 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4312 HSTRING_TABLE StringTable
= NULL
;
4316 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4319 if (pulSize
== NULL
)
4320 return CR_INVALID_POINTER
;
4323 return CR_INVALID_DEVINST
;
4325 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4326 return CR_INVALID_FLAG
;
4328 if (hMachine
!= NULL
)
4330 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4331 if (BindingHandle
== NULL
)
4334 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4335 if (StringTable
== 0)
4340 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4344 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4345 if (lpDevInst
== NULL
)
4346 return CR_INVALID_DEVNODE
;
4350 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4356 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4358 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4366 /***********************************************************************
4367 * CM_Query_Remove_SubTree [SETUPAPI.@]
4369 * This function is obsolete in Windows XP and above.
4371 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4372 DEVINST dnAncestor
, ULONG ulFlags
)
4374 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4375 return CR_CALL_NOT_IMPLEMENTED
;
4379 /***********************************************************************
4380 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4382 * This function is obsolete in Windows XP and above.
4384 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4385 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4387 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4388 return CR_CALL_NOT_IMPLEMENTED
;
4392 /***********************************************************************
4393 * CM_Reenumerate_DevNode [SETUPAPI.@]
4395 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4396 DEVINST dnDevInst
, ULONG ulFlags
)
4398 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4399 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4403 /***********************************************************************
4404 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4407 CM_Reenumerate_DevNode_Ex(
4408 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4410 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4411 HSTRING_TABLE StringTable
= NULL
;
4415 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4418 return CR_INVALID_DEVNODE
;
4420 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4421 return CR_INVALID_FLAG
;
4423 if (hMachine
!= NULL
)
4425 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4426 if (BindingHandle
== NULL
)
4429 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4430 if (StringTable
== 0)
4435 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4439 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4440 if (lpDevInst
== NULL
)
4441 return CR_INVALID_DEVNODE
;
4445 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4446 PNP_DEVINST_REENUMERATE
,
4451 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4453 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4461 /***********************************************************************
4462 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4464 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4465 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4466 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4468 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4469 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4471 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4472 pszReference
, pszDeviceInterface
,
4473 pulLength
, ulFlags
, NULL
);
4477 /***********************************************************************
4478 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4480 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4481 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4482 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4484 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4485 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4487 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4488 pszReference
, pszDeviceInterface
,
4489 pulLength
, ulFlags
, NULL
);
4493 /***********************************************************************
4494 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4496 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4497 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4498 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4500 LPWSTR pszReferenceW
= NULL
;
4501 LPWSTR pszDeviceInterfaceW
= NULL
;
4505 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4506 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4508 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4509 return CR_INVALID_POINTER
;
4511 if (pszReference
!= NULL
)
4513 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4514 return CR_INVALID_DATA
;
4517 ulLength
= *pulLength
;
4519 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4520 if (pszDeviceInterfaceW
== NULL
)
4522 ret
= CR_OUT_OF_MEMORY
;
4526 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4529 pszDeviceInterfaceW
,
4533 if (ret
== CR_SUCCESS
)
4535 if (WideCharToMultiByte(CP_ACP
,
4537 pszDeviceInterfaceW
,
4546 *pulLength
= ulLength
;
4549 if (pszDeviceInterfaceW
!= NULL
)
4550 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4552 if (pszReferenceW
!= NULL
)
4553 MyFree(pszReferenceW
);
4559 /***********************************************************************
4560 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4562 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4563 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4564 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4566 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4567 HSTRING_TABLE StringTable
= NULL
;
4569 ULONG ulTransferLength
;
4572 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4573 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4576 return CR_INVALID_DEVNODE
;
4578 if (InterfaceClassGuid
== NULL
||
4579 pszDeviceInterface
== NULL
||
4581 return CR_INVALID_POINTER
;
4584 return CR_INVALID_FLAG
;
4586 if (hMachine
!= NULL
)
4588 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4589 if (BindingHandle
== NULL
)
4592 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4593 if (StringTable
== 0)
4598 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4602 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4603 if (lpDevInst
== NULL
)
4604 return CR_INVALID_DEVNODE
;
4606 ulTransferLength
= *pulLength
;
4610 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4613 (LPWSTR
)pszReference
,
4619 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4621 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4629 /***********************************************************************
4630 * CM_Register_Device_Driver [SETUPAPI.@]
4632 CONFIGRET WINAPI
CM_Register_Device_Driver(
4633 DEVINST dnDevInst
, ULONG ulFlags
)
4635 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4636 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4640 /***********************************************************************
4641 * CM_Register_Device_Driver [SETUPAPI.@]
4643 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4644 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4646 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4647 HSTRING_TABLE StringTable
= NULL
;
4651 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4654 return CR_INVALID_DEVNODE
;
4656 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4657 return CR_INVALID_FLAG
;
4659 if (hMachine
!= NULL
)
4661 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4662 if (BindingHandle
== NULL
)
4665 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4666 if (StringTable
== 0)
4671 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4675 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4676 if (lpDevInst
== NULL
)
4677 return CR_INVALID_DEVNODE
;
4681 ret
= PNP_RegisterDriver(BindingHandle
,
4685 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4687 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4695 /***********************************************************************
4696 * CM_Remove_SubTree [SETUPAPI.@]
4698 * This function is obsolete in Windows XP and above.
4700 CONFIGRET WINAPI
CM_Remove_SubTree(
4701 DEVINST dnAncestor
, ULONG ulFlags
)
4703 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4704 return CR_CALL_NOT_IMPLEMENTED
;
4708 /***********************************************************************
4709 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4711 * This function is obsolete in Windows XP and above.
4713 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4714 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4716 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4717 return CR_CALL_NOT_IMPLEMENTED
;
4721 /***********************************************************************
4722 * CM_Request_Device_EjectA [SETUPAPI.@]
4724 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4725 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4726 ULONG ulNameLength
, ULONG ulFlags
)
4728 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4729 ulNameLength
, ulFlags
);
4730 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4731 ulNameLength
, ulFlags
, NULL
);
4735 /***********************************************************************
4736 * CM_Request_Device_EjectW [SETUPAPI.@]
4738 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4739 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4740 ULONG ulNameLength
, ULONG ulFlags
)
4742 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4743 ulNameLength
, ulFlags
);
4744 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4745 ulNameLength
, ulFlags
, NULL
);
4749 /***********************************************************************
4750 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4752 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4753 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4754 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4756 LPWSTR lpLocalVetoName
;
4759 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4760 ulNameLength
, ulFlags
, hMachine
);
4762 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4763 return CR_INVALID_POINTER
;
4765 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4766 if (lpLocalVetoName
== NULL
)
4767 return CR_OUT_OF_MEMORY
;
4769 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
4770 ulNameLength
, ulFlags
, hMachine
);
4771 if (ret
== CR_REMOVE_VETOED
)
4773 if (WideCharToMultiByte(CP_ACP
,
4784 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4790 /***********************************************************************
4791 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
4793 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
4794 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4795 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4797 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4798 HSTRING_TABLE StringTable
= NULL
;
4802 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
4803 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4806 return CR_INVALID_DEVNODE
;
4809 return CR_INVALID_FLAG
;
4811 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4812 return CR_INVALID_POINTER
;
4814 if (hMachine
!= NULL
)
4816 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4817 if (BindingHandle
== NULL
)
4820 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4821 if (StringTable
== 0)
4826 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4830 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4831 if (lpDevInst
== NULL
)
4832 return CR_INVALID_DEVNODE
;
4836 ret
= PNP_RequestDeviceEject(BindingHandle
,
4843 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4845 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4853 /***********************************************************************
4854 * CM_Request_Eject_PC [SETUPAPI.@]
4856 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
4859 return CM_Request_Eject_PC_Ex(NULL
);
4863 /***********************************************************************
4864 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
4866 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
4869 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4872 TRACE("%lx\n", hMachine
);
4874 if (hMachine
!= NULL
)
4876 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4877 if (BindingHandle
== NULL
)
4882 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4888 ret
= PNP_RequestEjectPC(BindingHandle
);
4890 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4892 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4900 /***********************************************************************
4901 * CM_Run_Detection [SETUPAPI.@]
4903 CONFIGRET WINAPI
CM_Run_Detection(
4906 TRACE("%lx\n", ulFlags
);
4907 return CM_Run_Detection_Ex(ulFlags
, NULL
);
4911 /***********************************************************************
4912 * CM_Run_Detection_Ex [SETUPAPI.@]
4914 CONFIGRET WINAPI
CM_Run_Detection_Ex(
4915 ULONG ulFlags
, HMACHINE hMachine
)
4917 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4920 TRACE("%lx %lx\n", ulFlags
, hMachine
);
4922 if (!pSetupIsUserAdmin())
4923 return CR_ACCESS_DENIED
;
4925 if (ulFlags
& ~CM_DETECT_BITS
)
4926 return CR_INVALID_FLAG
;
4928 if (hMachine
!= NULL
)
4930 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4931 if (BindingHandle
== NULL
)
4936 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4942 ret
= PNP_RunDetection(BindingHandle
,
4945 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4947 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4955 /***********************************************************************
4956 * CM_Set_DevNode_Problem [SETUPAPI.@]
4958 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
4959 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
4961 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
4962 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
4966 /***********************************************************************
4967 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
4969 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
4970 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
4972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4973 HSTRING_TABLE StringTable
= NULL
;
4977 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
4980 return CR_INVALID_DEVNODE
;
4982 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
4983 return CR_INVALID_FLAG
;
4985 if (hMachine
!= NULL
)
4987 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4988 if (BindingHandle
== NULL
)
4991 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4992 if (StringTable
== 0)
4997 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5001 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5002 if (lpDevInst
== NULL
)
5003 return CR_INVALID_DEVNODE
;
5007 ret
= PNP_SetDeviceProblem(BindingHandle
,
5012 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5014 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5022 /***********************************************************************
5023 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
5025 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
5026 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5029 TRACE("%lx %lu %p %lx %lx\n",
5030 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5031 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
5037 /***********************************************************************
5038 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
5040 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
5041 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5044 TRACE("%lx %lu %p %lx %lx\n",
5045 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5046 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
5052 /***********************************************************************
5053 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
5055 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
5056 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5057 ULONG ulFlags
, HMACHINE hMachine
)
5059 CONFIGRET ret
= CR_SUCCESS
;
5063 FIXME("%lx %lu %p %lx %lx %lx\n",
5064 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5066 if (Buffer
== NULL
&& ulLength
!= 0)
5067 return CR_INVALID_POINTER
;
5071 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5080 /* Get property type */
5083 case CM_DRP_DEVICEDESC
:
5087 case CM_DRP_HARDWAREID
:
5088 ulType
= REG_MULTI_SZ
;
5091 case CM_DRP_COMPATIBLEIDS
:
5092 ulType
= REG_MULTI_SZ
;
5095 case CM_DRP_SERVICE
:
5103 case CM_DRP_CLASSGUID
:
5111 case CM_DRP_CONFIGFLAGS
:
5119 case CM_DRP_FRIENDLYNAME
:
5123 case CM_DRP_LOCATION_INFORMATION
:
5127 case CM_DRP_UPPERFILTERS
:
5128 ulType
= REG_MULTI_SZ
;
5131 case CM_DRP_LOWERFILTERS
:
5132 ulType
= REG_MULTI_SZ
;
5136 return CR_INVALID_PROPERTY
;
5139 /* Allocate buffer if needed */
5140 if (ulType
== REG_SZ
||
5141 ulType
== REG_MULTI_SZ
)
5143 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5144 if (lpBuffer
== NULL
)
5146 ret
= CR_OUT_OF_MEMORY
;
5150 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5151 ulLength
, lpBuffer
, ulLength
))
5158 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5161 ulLength
* sizeof(WCHAR
),
5170 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5178 ret
= CR_CALL_NOT_IMPLEMENTED
;
5185 /***********************************************************************
5186 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5188 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5189 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5190 ULONG ulFlags
, HMACHINE hMachine
)
5192 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5193 HSTRING_TABLE StringTable
= NULL
;
5198 TRACE("%lx %lu %p %lx %lx %lx\n",
5199 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5202 return CR_INVALID_DEVNODE
;
5204 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5205 return CR_INVALID_PROPERTY
;
5207 if (Buffer
!= NULL
&& ulLength
== 0)
5208 return CR_INVALID_POINTER
;
5211 return CR_INVALID_FLAG
;
5213 if (hMachine
!= NULL
)
5215 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5216 if (BindingHandle
== NULL
)
5219 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5220 if (StringTable
== 0)
5225 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5229 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5230 if (lpDevInst
== NULL
)
5231 return CR_INVALID_DEVNODE
;
5235 case CM_DRP_DEVICEDESC
:
5239 case CM_DRP_HARDWAREID
:
5240 ulType
= REG_MULTI_SZ
;
5243 case CM_DRP_COMPATIBLEIDS
:
5244 ulType
= REG_MULTI_SZ
;
5247 case CM_DRP_SERVICE
:
5255 case CM_DRP_CLASSGUID
:
5263 case CM_DRP_CONFIGFLAGS
:
5271 case CM_DRP_FRIENDLYNAME
:
5275 case CM_DRP_LOCATION_INFORMATION
:
5279 case CM_DRP_UPPERFILTERS
:
5280 ulType
= REG_MULTI_SZ
;
5283 case CM_DRP_LOWERFILTERS
:
5284 ulType
= REG_MULTI_SZ
;
5288 return CR_INVALID_PROPERTY
;
5293 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5301 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5303 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5311 /***********************************************************************
5312 * CM_Set_HW_Prof [SETUPAPI.@]
5314 CONFIGRET WINAPI
CM_Set_HW_Prof(
5315 ULONG ulHardwareProfile
, ULONG ulFlags
)
5317 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5318 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5322 /***********************************************************************
5323 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5325 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5326 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5328 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5331 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5333 if (!pSetupIsUserAdmin())
5334 return CR_ACCESS_DENIED
;
5337 return CR_INVALID_FLAG
;
5339 if (hMachine
!= NULL
)
5341 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5342 if (BindingHandle
== NULL
)
5347 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5353 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5355 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5357 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5365 /***********************************************************************
5366 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5368 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5369 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5372 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5373 ulConfig
, ulValue
, ulFlags
);
5374 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5379 /***********************************************************************
5380 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5382 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5383 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5386 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5387 ulConfig
, ulValue
, ulFlags
);
5388 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5393 /***********************************************************************
5394 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5396 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5397 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5398 ULONG ulFlags
, HMACHINE hMachine
)
5400 DEVINSTID_W pszDevIdW
= NULL
;
5401 CONFIGRET ret
= CR_SUCCESS
;
5403 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5404 ulConfig
, ulValue
, ulFlags
, hMachine
);
5406 if (szDevInstName
!= NULL
)
5408 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5409 return CR_INVALID_DEVICE_ID
;
5412 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5415 if (pszDevIdW
!= NULL
)
5422 /***********************************************************************
5423 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5425 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5426 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5427 ULONG ulFlags
, HMACHINE hMachine
)
5429 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5432 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5433 ulConfig
, ulValue
, ulFlags
, hMachine
);
5435 if (szDevInstName
== NULL
)
5436 return CR_INVALID_POINTER
;
5438 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5439 return CR_INVALID_FLAG
;
5441 /* FIXME: Check whether szDevInstName is valid */
5443 if (hMachine
!= NULL
)
5445 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5446 if (BindingHandle
== NULL
)
5451 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5457 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5458 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5460 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5462 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5470 /***********************************************************************
5471 * CM_Setup_DevNode [SETUPAPI.@]
5473 CONFIGRET WINAPI
CM_Setup_DevNode(
5474 DEVINST dnDevInst
, ULONG ulFlags
)
5476 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5477 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5481 /***********************************************************************
5482 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5484 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5485 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5487 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5488 HSTRING_TABLE StringTable
= NULL
;
5492 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5494 if (!pSetupIsUserAdmin())
5495 return CR_ACCESS_DENIED
;
5498 return CR_INVALID_DEVNODE
;
5500 if (ulFlags
& ~CM_SETUP_BITS
)
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 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5531 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5533 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5541 /***********************************************************************
5542 * CM_Uninstall_DevNode [SETUPAPI.@]
5544 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5545 DEVINST dnPhantom
, ULONG ulFlags
)
5547 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5548 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5552 /***********************************************************************
5553 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5555 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5556 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5558 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5559 HSTRING_TABLE StringTable
= NULL
;
5563 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5566 return CR_INVALID_DEVNODE
;
5569 return CR_INVALID_FLAG
;
5571 if (hMachine
!= NULL
)
5573 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5574 if (BindingHandle
== NULL
)
5577 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5578 if (StringTable
== 0)
5583 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5587 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5588 if (lpDevInst
== NULL
)
5589 return CR_INVALID_DEVNODE
;
5593 ret
= PNP_UninstallDevInst(BindingHandle
,
5597 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5599 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5607 /***********************************************************************
5608 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5610 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5611 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5613 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5615 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5620 /***********************************************************************
5621 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5623 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5624 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5626 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5628 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5633 /***********************************************************************
5634 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5636 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5637 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5639 LPWSTR pszDeviceInterfaceW
= NULL
;
5642 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5644 if (pszDeviceInterface
== NULL
)
5645 return CR_INVALID_POINTER
;
5647 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5648 return CR_INVALID_DATA
;
5650 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5653 if (pszDeviceInterfaceW
!= NULL
)
5654 MyFree(pszDeviceInterfaceW
);
5660 /***********************************************************************
5661 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5663 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5664 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5666 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5669 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5671 if (pszDeviceInterface
== NULL
)
5672 return CR_INVALID_POINTER
;
5675 return CR_INVALID_FLAG
;
5677 if (hMachine
!= NULL
)
5679 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5680 if (BindingHandle
== NULL
)
5685 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5691 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
5692 (LPWSTR
)pszDeviceInterface
,
5695 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5697 ret
= RpcStatusToCmStatus(RpcExceptionCode());