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
)
1587 FIXME("%p %lu %p %p %p %lx %lx\n",
1588 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1590 return CR_CALL_NOT_IMPLEMENTED
;
1594 /***********************************************************************
1595 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
1597 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
1598 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
1599 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1601 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1602 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
1604 ULONG ulTransferLength
= 0;
1607 TRACE("%p %lu %p %p %p %lx %lx\n",
1608 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1611 if (ClassGuid
== NULL
|| pulLength
== NULL
)
1612 return CR_INVALID_POINTER
;
1615 return CR_INVALID_FLAG
;
1617 if (pSetupStringFromGuid(ClassGuid
,
1619 PNP_MAX_GUID_STRING_LEN
) != 0)
1620 return CR_INVALID_DATA
;
1622 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
1623 return CR_INVALID_PROPERTY
;
1625 if (hMachine
!= NULL
)
1627 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1628 if (BindingHandle
== NULL
)
1633 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1637 ulTransferLength
= *pulLength
;
1641 ret
= PNP_GetClassRegProp(BindingHandle
,
1650 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1652 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1656 if (ret
== CR_SUCCESS
)
1658 if (pulRegDataType
!= NULL
)
1659 *pulRegDataType
= ulType
;
1666 /***********************************************************************
1667 * CM_Get_Depth [SETUPAPI.@]
1669 CONFIGRET WINAPI
CM_Get_Depth(
1670 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1672 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1673 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1677 /***********************************************************************
1678 * CM_Get_Depth_Ex [SETUPAPI.@]
1680 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1681 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1683 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1684 HSTRING_TABLE StringTable
= NULL
;
1688 TRACE("%p %lx %lx %lx\n",
1689 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1691 if (pulDepth
== NULL
)
1692 return CR_INVALID_POINTER
;
1695 return CR_INVALID_DEVINST
;
1698 return CR_INVALID_FLAG
;
1700 if (hMachine
!= NULL
)
1702 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1703 if (BindingHandle
== NULL
)
1706 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1707 if (StringTable
== 0)
1712 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1716 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1717 if (lpDevInst
== NULL
)
1718 return CR_INVALID_DEVNODE
;
1722 ret
= PNP_GetDepth(BindingHandle
,
1727 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1729 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1737 /***********************************************************************
1738 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
1740 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
1741 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1742 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1744 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
1745 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1746 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
1747 pulRegDataType
, Buffer
,
1748 pulLength
, ulFlags
, NULL
);
1752 /***********************************************************************
1753 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
1755 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
1756 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1757 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1759 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
1760 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1761 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
1762 pulRegDataType
, Buffer
,
1763 pulLength
, ulFlags
, NULL
);
1767 /***********************************************************************
1768 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
1770 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
1771 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1772 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1774 LPWSTR pszPropertyNameW
= NULL
;
1777 ULONG ulDataType
= REG_NONE
;
1780 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
1781 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
1784 return CR_INVALID_POINTER
;
1786 ulLengthW
= *pulLength
* sizeof(WCHAR
);
1787 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
1789 return CR_OUT_OF_MEMORY
;
1791 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
1793 if (pszPropertyNameW
== NULL
)
1795 HeapFree(GetProcessHeap(), 0, BufferW
);
1796 return CR_OUT_OF_MEMORY
;
1799 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
1806 if (ret
== CR_SUCCESS
)
1808 if (ulDataType
== REG_SZ
||
1809 ulDataType
== REG_EXPAND_SZ
||
1810 ulDataType
== REG_MULTI_SZ
)
1812 /* Do W->A conversion */
1813 *pulLength
= WideCharToMultiByte(CP_ACP
,
1816 lstrlenW(BufferW
) + 1,
1821 if (*pulLength
== 0)
1826 /* Directly copy the value */
1827 if (ulLengthW
<= *pulLength
)
1828 memcpy(Buffer
, BufferW
, ulLengthW
);
1831 *pulLength
= ulLengthW
;
1832 ret
= CR_BUFFER_SMALL
;
1838 *pulRegDataType
= ulDataType
;
1840 HeapFree(GetProcessHeap(), 0, BufferW
);
1841 MyFree(pszPropertyNameW
);
1847 /***********************************************************************
1848 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
1850 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
1851 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
1852 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1854 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1855 HSTRING_TABLE StringTable
= NULL
;
1857 ULONG ulDataType
= REG_NONE
;
1858 ULONG ulTransferLength
;
1859 CONFIGRET ret
= CR_SUCCESS
;
1861 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
1862 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
1863 pulLength
, ulFlags
, hMachine
);
1866 return CR_INVALID_DEVNODE
;
1868 if (pszCustomPropertyName
== NULL
||
1869 pulLength
== NULL
||
1871 return CR_INVALID_POINTER
;
1873 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
1874 return CR_INVALID_FLAG
;
1876 if (hMachine
!= NULL
)
1878 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1879 if (BindingHandle
== NULL
)
1882 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1883 if (StringTable
== 0)
1888 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1892 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1893 if (lpDevInst
== NULL
)
1894 return CR_INVALID_DEVNODE
;
1896 ulTransferLength
= *pulLength
;
1900 ret
= PNP_GetCustomDevProp(BindingHandle
,
1902 (LPWSTR
)pszCustomPropertyName
,
1909 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1911 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1915 if (ret
== CR_SUCCESS
)
1917 if (pulRegDataType
!= NULL
)
1918 *pulRegDataType
= ulDataType
;
1925 /***********************************************************************
1926 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1928 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1929 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1930 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1932 TRACE("%lx %lu %p %p %p %lx\n",
1933 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1935 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1936 pulRegDataType
, Buffer
,
1937 pulLength
, ulFlags
, NULL
);
1941 /***********************************************************************
1942 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1944 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1945 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1946 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1948 TRACE("%lx %lu %p %p %p %lx\n",
1949 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1951 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1952 pulRegDataType
, Buffer
,
1953 pulLength
, ulFlags
, NULL
);
1957 /***********************************************************************
1958 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1960 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1961 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1962 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1966 ULONG ulDataType
= REG_NONE
;
1969 TRACE("%lx %lu %p %p %p %lx %lx\n",
1970 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1974 return CR_INVALID_POINTER
;
1976 LengthW
= *pulLength
* sizeof(WCHAR
);
1977 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1980 return CR_OUT_OF_MEMORY
;
1982 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1990 if (ret
== CR_SUCCESS
)
1992 if (ulDataType
== REG_SZ
||
1993 ulDataType
== REG_EXPAND_SZ
||
1994 ulDataType
== REG_MULTI_SZ
)
1996 /* Do W->A conversion */
1997 *pulLength
= WideCharToMultiByte(CP_ACP
,
2000 lstrlenW(BufferW
) + 1,
2005 if (*pulLength
== 0)
2010 /* Directly copy the value */
2011 if (LengthW
<= *pulLength
)
2012 memcpy(Buffer
, BufferW
, LengthW
);
2015 *pulLength
= LengthW
;
2016 ret
= CR_BUFFER_SMALL
;
2022 *pulRegDataType
= ulDataType
;
2024 HeapFree(GetProcessHeap(), 0, BufferW
);
2030 /***********************************************************************
2031 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2033 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2034 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2035 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2037 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2038 HSTRING_TABLE StringTable
= NULL
;
2039 CONFIGRET ret
= CR_SUCCESS
;
2041 ULONG ulDataType
= REG_NONE
;
2042 ULONG ulTransferLength
= 0;
2044 TRACE("%lx %lu %p %p %p %lx %lx\n",
2045 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2049 return CR_INVALID_DEVNODE
;
2051 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2052 return CR_INVALID_PROPERTY
;
2054 /* pulRegDataType is optional */
2056 /* Buffer is optional */
2058 if (pulLength
== NULL
)
2059 return CR_INVALID_POINTER
;
2061 if (*pulLength
== 0)
2062 return CR_INVALID_POINTER
;
2065 return CR_INVALID_FLAG
;
2067 if (hMachine
!= NULL
)
2069 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2070 if (BindingHandle
== NULL
)
2073 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2074 if (StringTable
== 0)
2079 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2083 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2084 if (lpDevInst
== NULL
)
2085 return CR_INVALID_DEVNODE
;
2087 ulTransferLength
= *pulLength
;
2091 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2100 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2102 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2106 if (ret
== CR_SUCCESS
)
2108 if (pulRegDataType
!= NULL
)
2109 *pulRegDataType
= ulDataType
;
2116 /***********************************************************************
2117 * CM_Get_DevNode_Status [SETUPAPI.@]
2119 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2120 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2123 TRACE("%p %p %lx %lx\n",
2124 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2125 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2130 /***********************************************************************
2131 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2134 CM_Get_DevNode_Status_Ex(
2135 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2136 ULONG ulFlags
, HMACHINE hMachine
)
2138 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2139 HSTRING_TABLE StringTable
= NULL
;
2143 TRACE("%p %p %lx %lx %lx\n",
2144 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2146 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2147 return CR_INVALID_POINTER
;
2150 return CR_INVALID_DEVINST
;
2153 return CR_INVALID_FLAG
;
2155 if (hMachine
!= NULL
)
2157 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2158 if (BindingHandle
== NULL
)
2161 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2162 if (StringTable
== 0)
2167 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2171 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2172 if (lpDevInst
== NULL
)
2173 return CR_INVALID_DEVNODE
;
2177 ret
= PNP_GetDeviceStatus(BindingHandle
,
2183 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2185 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2193 /***********************************************************************
2194 * CM_Get_Device_IDA [SETUPAPI.@]
2196 CONFIGRET WINAPI
CM_Get_Device_IDA(
2197 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2199 TRACE("%lx %p %ld %ld\n",
2200 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2201 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2205 /***********************************************************************
2206 * CM_Get_Device_IDW [SETUPAPI.@]
2208 CONFIGRET WINAPI
CM_Get_Device_IDW(
2209 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2211 TRACE("%lx %p %ld %ld\n",
2212 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2213 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2217 /***********************************************************************
2218 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2220 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2221 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2224 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2225 CONFIGRET ret
= CR_SUCCESS
;
2227 TRACE("%lx %p %ld %ld %lx\n",
2228 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2231 return CR_INVALID_POINTER
;
2233 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2238 if (ret
== CR_SUCCESS
)
2240 if (WideCharToMultiByte(CP_ACP
,
2243 lstrlenW(szBufferW
) + 1,
2255 /***********************************************************************
2256 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2258 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2259 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2262 HSTRING_TABLE StringTable
= NULL
;
2264 TRACE("%lx %p %ld %ld %lx\n",
2265 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2268 return CR_INVALID_DEVINST
;
2271 return CR_INVALID_POINTER
;
2274 return CR_INVALID_FLAG
;
2276 if (hMachine
!= NULL
)
2278 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2279 if (StringTable
== NULL
)
2284 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2288 if (!pSetupStringTableStringFromIdEx(StringTable
,
2298 /***********************************************************************
2299 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2301 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2302 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2304 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2305 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2310 /***********************************************************************
2311 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2313 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2314 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2316 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2317 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2322 /***********************************************************************
2323 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2325 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2326 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2329 LPWSTR BufferW
= NULL
;
2330 LPWSTR pszFilterW
= NULL
;
2331 CONFIGRET ret
= CR_SUCCESS
;
2333 TRACE("%p %p %ld %ld %lx\n",
2334 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2336 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2337 if (BufferW
== NULL
)
2338 return CR_OUT_OF_MEMORY
;
2340 if (pszFilter
== NULL
)
2342 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2350 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2352 ret
= CR_INVALID_DEVICE_ID
;
2356 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2365 if (WideCharToMultiByte(CP_ACP
,
2368 lstrlenW(BufferW
) + 1,
2382 /***********************************************************************
2383 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2385 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2386 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2389 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2392 TRACE("%p %p %ld %ld %lx\n",
2393 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2395 if (Buffer
== NULL
|| BufferLen
== 0)
2396 return CR_INVALID_POINTER
;
2398 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2399 return CR_INVALID_FLAG
;
2401 if (hMachine
!= NULL
)
2403 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2404 if (BindingHandle
== NULL
)
2409 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2417 ret
= PNP_GetDeviceList(BindingHandle
,
2423 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2425 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2433 /***********************************************************************
2434 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2436 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2437 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2439 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2440 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2444 /***********************************************************************
2445 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2447 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2448 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2450 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2451 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2455 /***********************************************************************
2456 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2458 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2459 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2461 LPWSTR pszFilterW
= NULL
;
2462 CONFIGRET ret
= CR_SUCCESS
;
2464 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2466 if (pszFilter
== NULL
)
2468 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2475 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2476 return CR_INVALID_DEVICE_ID
;
2478 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2490 /***********************************************************************
2491 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2493 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2494 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2496 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2499 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2502 return CR_INVALID_POINTER
;
2504 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2505 return CR_INVALID_FLAG
;
2507 if (hMachine
!= NULL
)
2509 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2510 if (BindingHandle
== NULL
)
2515 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2523 ret
= PNP_GetDeviceListSize(BindingHandle
,
2528 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2530 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2538 /***********************************************************************
2539 * CM_Get_Device_ID_Size [SETUPAPI.@]
2541 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2542 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2544 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2545 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2549 /***********************************************************************
2550 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2552 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2553 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2555 HSTRING_TABLE StringTable
= NULL
;
2558 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2561 return CR_INVALID_POINTER
;
2564 return CR_INVALID_DEVINST
;
2567 return CR_INVALID_FLAG
;
2569 if (hMachine
!= NULL
)
2571 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2572 if (StringTable
== NULL
)
2577 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2581 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2582 if (DeviceId
== NULL
)
2588 *pulLen
= lstrlenW(DeviceId
);
2594 /***********************************************************************
2595 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
2597 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
2598 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2599 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2601 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2602 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2604 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
2605 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2610 /***********************************************************************
2611 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
2613 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
2614 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
2615 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
2617 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
2618 pszAliasDeviceInterface
, pulLength
, ulFlags
);
2620 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
2621 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
2626 /***********************************************************************
2627 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
2629 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
2630 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
2631 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2633 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2634 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2636 return CR_CALL_NOT_IMPLEMENTED
;
2640 /***********************************************************************
2641 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
2643 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
2644 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
2645 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2647 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2648 ULONG ulTransferLength
;
2649 CONFIGRET ret
= CR_SUCCESS
;
2651 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
2652 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
2654 if (pszDeviceInterface
== NULL
||
2655 AliasInterfaceGuid
== NULL
||
2656 pszAliasDeviceInterface
== NULL
||
2658 return CR_INVALID_POINTER
;
2661 return CR_INVALID_FLAG
;
2663 if (hMachine
!= NULL
)
2665 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2666 if (BindingHandle
== NULL
)
2671 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2675 ulTransferLength
= *pulLength
;
2679 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
2680 (LPWSTR
)pszDeviceInterface
,
2682 pszAliasDeviceInterface
,
2687 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2689 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2697 /***********************************************************************
2698 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
2700 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
2701 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2702 ULONG BufferLen
, ULONG ulFlags
)
2704 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2705 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
2707 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
2708 Buffer
, BufferLen
, ulFlags
, NULL
);
2712 /***********************************************************************
2713 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
2715 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
2716 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2717 ULONG BufferLen
, ULONG ulFlags
)
2719 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
2720 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
2722 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
2723 Buffer
, BufferLen
, ulFlags
, NULL
);
2727 /***********************************************************************
2728 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
2730 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
2731 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
2732 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2734 DEVINSTID_W pDeviceIdW
= NULL
;
2735 PWCHAR BufferW
= NULL
;
2736 CONFIGRET ret
= CR_SUCCESS
;
2738 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2739 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2741 if (Buffer
== NULL
||
2743 return CR_INVALID_POINTER
;
2745 if (pDeviceID
!= NULL
)
2747 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
2748 return CR_INVALID_DEVICE_ID
;
2751 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2752 if (BufferW
== NULL
)
2754 ret
= CR_OUT_OF_MEMORY
;
2758 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
2759 BufferW
, BufferLen
, ulFlags
,
2761 if (ret
!= CR_SUCCESS
)
2764 if (WideCharToMultiByte(CP_ACP
,
2767 lstrlenW(BufferW
) + 1,
2775 if (BufferW
!= NULL
)
2778 if (pDeviceIdW
!= NULL
)
2785 /***********************************************************************
2786 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
2788 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
2789 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
2790 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
2792 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2793 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
2794 CONFIGRET ret
= CR_SUCCESS
;
2796 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
2797 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
2799 if (Buffer
== NULL
||
2801 return CR_INVALID_POINTER
;
2803 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2804 return CR_INVALID_FLAG
;
2806 if (hMachine
!= NULL
)
2808 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2809 if (BindingHandle
== NULL
)
2814 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2819 BufferSize
= BufferLen
;
2823 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
2830 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2832 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2840 /***********************************************************************
2841 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
2843 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
2844 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2847 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2848 pDeviceId
, ulFlags
);
2850 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
2851 pDeviceId
, ulFlags
, NULL
);
2855 /***********************************************************************
2856 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
2858 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
2859 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2862 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
2863 debugstr_w(pDeviceId
), ulFlags
);
2865 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2866 pDeviceId
, ulFlags
, NULL
);
2870 /***********************************************************************
2871 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
2873 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
2874 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
2875 ULONG ulFlags
, HMACHINE hMachine
)
2877 DEVINSTID_W pDeviceIdW
= NULL
;
2878 CONFIGRET ret
= CR_SUCCESS
;
2880 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2881 pDeviceId
, ulFlags
, hMachine
);
2884 return CR_INVALID_POINTER
;
2886 if (pDeviceId
!= NULL
)
2888 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
2889 return CR_INVALID_DEVICE_ID
;
2894 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
2895 pDeviceIdW
, ulFlags
, hMachine
);
2897 if (pDeviceIdW
!= NULL
)
2904 /***********************************************************************
2905 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
2907 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
2908 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
2909 ULONG ulFlags
, HMACHINE hMachine
)
2911 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2912 CONFIGRET ret
= CR_SUCCESS
;
2914 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
2915 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
2918 return CR_INVALID_POINTER
;
2920 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
2921 return CR_INVALID_FLAG
;
2923 if (hMachine
!= NULL
)
2925 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2926 if (BindingHandle
== NULL
)
2931 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2939 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
2945 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2947 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2955 /***********************************************************************
2956 * CM_Get_First_Log_Conf [SETUPAPI.@]
2958 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2959 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2961 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2962 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2966 /***********************************************************************
2967 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2969 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2970 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2973 HSTRING_TABLE StringTable
= NULL
;
2974 LPWSTR lpDevInst
= NULL
;
2975 CONFIGRET ret
= CR_SUCCESS
;
2977 PLOG_CONF_INFO pLogConfInfo
;
2979 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2982 return CR_INVALID_DEVINST
;
2984 if (ulFlags
& ~LOG_CONF_BITS
)
2985 return CR_INVALID_FLAG
;
2990 if (hMachine
!= NULL
)
2992 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2993 if (BindingHandle
== NULL
)
2996 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2997 if (StringTable
== 0)
3002 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3006 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3007 if (lpDevInst
== NULL
)
3008 return CR_INVALID_DEVNODE
;
3012 ret
= PNP_GetFirstLogConf(BindingHandle
,
3018 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3020 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3024 if (ret
!= CR_SUCCESS
)
3029 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3030 if (pLogConfInfo
== NULL
)
3031 return CR_OUT_OF_MEMORY
;
3033 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3034 pLogConfInfo
->dnDevInst
= dnDevInst
;
3035 pLogConfInfo
->ulFlags
= ulFlags
;
3036 pLogConfInfo
->ulTag
= ulTag
;
3038 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3045 /***********************************************************************
3046 * CM_Get_Global_State [SETUPAPI.@]
3048 CONFIGRET WINAPI
CM_Get_Global_State(
3049 PULONG pulState
, ULONG ulFlags
)
3051 TRACE("%p %lx\n", pulState
, ulFlags
);
3052 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3056 /***********************************************************************
3057 * CM_Get_Global_State_Ex [SETUPAPI.@]
3059 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3060 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3062 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3065 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3067 if (pulState
== NULL
)
3068 return CR_INVALID_POINTER
;
3071 return CR_INVALID_FLAG
;
3073 if (hMachine
!= NULL
)
3075 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3076 if (BindingHandle
== NULL
)
3081 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3087 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3089 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3091 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3099 /***********************************************************************
3100 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3102 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3103 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3106 TRACE("%s %lu %p %lx\n", szDevInstName
,
3107 ulHardwareProfile
, pulValue
, ulFlags
);
3109 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3110 pulValue
, ulFlags
, NULL
);
3114 /***********************************************************************
3115 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3117 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3118 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3121 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3122 ulHardwareProfile
, pulValue
, ulFlags
);
3124 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3125 pulValue
, ulFlags
, NULL
);
3129 /***********************************************************************
3130 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3132 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3133 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3134 ULONG ulFlags
, HMACHINE hMachine
)
3136 DEVINSTID_W pszDevIdW
= NULL
;
3137 CONFIGRET ret
= CR_SUCCESS
;
3139 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3140 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3142 if (szDevInstName
!= NULL
)
3144 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3145 return CR_INVALID_DEVICE_ID
;
3148 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3149 pulValue
, ulFlags
, hMachine
);
3151 if (pszDevIdW
!= NULL
)
3158 /***********************************************************************
3159 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3161 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3162 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3163 ULONG ulFlags
, HMACHINE hMachine
)
3165 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3168 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3169 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3171 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3172 return CR_INVALID_POINTER
;
3175 return CR_INVALID_FLAG
;
3177 /* FIXME: Check whether szDevInstName is valid */
3179 if (hMachine
!= NULL
)
3181 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3182 if (BindingHandle
== NULL
)
3187 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3193 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3194 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3196 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3198 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3206 /***********************************************************************
3207 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3209 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3210 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3212 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3214 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3219 /***********************************************************************
3220 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3222 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3223 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3225 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3227 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3232 /***********************************************************************
3233 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3235 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3236 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3239 HWPROFILEINFO_W LocalProfileInfo
;
3242 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3244 if (pHWProfileInfo
== NULL
)
3245 return CR_INVALID_POINTER
;
3247 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3249 if (ret
== CR_SUCCESS
)
3251 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3252 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3254 if (WideCharToMultiByte(CP_ACP
,
3256 LocalProfileInfo
.HWPI_szFriendlyName
,
3257 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3258 pHWProfileInfo
->HWPI_szFriendlyName
,
3269 /***********************************************************************
3270 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3272 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3273 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3276 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3279 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3281 if (pHWProfileInfo
== NULL
)
3282 return CR_INVALID_POINTER
;
3285 return CR_INVALID_FLAG
;
3287 if (hMachine
!= NULL
)
3289 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3290 if (BindingHandle
== NULL
)
3295 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3301 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3302 sizeof(HWPROFILEINFO_W
), 0);
3304 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3306 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3314 /***********************************************************************
3315 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3317 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3318 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3320 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3321 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3325 /***********************************************************************
3326 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3328 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3329 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3332 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3333 HSTRING_TABLE StringTable
= NULL
;
3334 PLOG_CONF_INFO pLogConfInfo
;
3338 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3340 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3341 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3342 return CR_INVALID_LOG_CONF
;
3344 if (pPriority
== NULL
)
3345 return CR_INVALID_POINTER
;
3348 return CR_INVALID_FLAG
;
3350 if (hMachine
!= NULL
)
3352 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3353 if (BindingHandle
== NULL
)
3356 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3357 if (StringTable
== 0)
3362 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3366 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3367 if (lpDevInst
== NULL
)
3368 return CR_INVALID_DEVNODE
;
3372 ret
= PNP_GetLogConfPriority(BindingHandle
,
3374 pLogConfInfo
->ulFlags
,
3375 pLogConfInfo
->ulTag
,
3379 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3381 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3389 /***********************************************************************
3390 * CM_Get_Next_Log_Conf [SETUPAPI.@]
3392 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
3393 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
3395 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
3396 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
3400 /***********************************************************************
3401 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
3403 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
3404 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
3407 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3408 HSTRING_TABLE StringTable
= NULL
;
3409 PLOG_CONF_INFO pLogConfInfo
;
3410 PLOG_CONF_INFO pNewLogConfInfo
;
3415 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
3420 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3421 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3422 return CR_INVALID_LOG_CONF
;
3425 return CR_INVALID_FLAG
;
3427 if (hMachine
!= NULL
)
3429 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3430 if (BindingHandle
== NULL
)
3433 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3434 if (StringTable
== 0)
3439 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3443 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3444 if (lpDevInst
== NULL
)
3445 return CR_INVALID_DEVNODE
;
3449 ret
= PNP_GetNextLogConf(BindingHandle
,
3451 pLogConfInfo
->ulFlags
,
3452 pLogConfInfo
->ulTag
,
3456 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3458 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3462 if (ret
!= CR_SUCCESS
)
3467 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3468 if (pNewLogConfInfo
== NULL
)
3469 return CR_OUT_OF_MEMORY
;
3471 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3472 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
3473 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
3474 pNewLogConfInfo
->ulTag
= ulNewTag
;
3476 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
3483 /***********************************************************************
3484 * CM_Get_Next_Re_Des [SETUPAPI.@]
3486 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
3487 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3488 PRESOURCEID pResourceID
, ULONG ulFlags
)
3490 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
3491 pResourceID
, ulFlags
);
3492 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
3493 pResourceID
, ulFlags
, NULL
);
3497 /***********************************************************************
3498 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
3500 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
3501 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
3502 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
3504 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
3505 pResourceID
, ulFlags
, hMachine
);
3507 return CR_CALL_NOT_IMPLEMENTED
;
3511 /***********************************************************************
3512 * CM_Get_Parent [SETUPAPI.@]
3514 CONFIGRET WINAPI
CM_Get_Parent(
3515 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3517 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3518 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3522 /***********************************************************************
3523 * CM_Get_Parent_Ex [SETUPAPI.@]
3525 CONFIGRET WINAPI
CM_Get_Parent_Ex(
3526 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3528 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3529 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3530 HSTRING_TABLE StringTable
= NULL
;
3532 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3535 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3537 if (pdnDevInst
== NULL
)
3538 return CR_INVALID_POINTER
;
3541 return CR_INVALID_DEVINST
;
3544 return CR_INVALID_FLAG
;
3548 if (hMachine
!= NULL
)
3550 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3551 if (BindingHandle
== NULL
)
3554 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3555 if (StringTable
== 0)
3560 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3564 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3565 if (lpDevInst
== NULL
)
3566 return CR_INVALID_DEVNODE
;
3570 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3571 PNP_GET_PARENT_DEVICE_INSTANCE
,
3577 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3579 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3583 if (ret
!= CR_SUCCESS
)
3586 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3588 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3592 *pdnDevInst
= dwIndex
;
3598 /***********************************************************************
3599 * CM_Get_Res_Des_Data [SETUPAPI.@]
3601 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
3602 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3604 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
3605 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
3609 /***********************************************************************
3610 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
3612 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
3613 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3616 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3617 return CR_CALL_NOT_IMPLEMENTED
;
3621 /***********************************************************************
3622 * CM_Get_Res_Des_Size [SETUPAPI.@]
3624 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
3625 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
3627 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
3628 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
3632 /***********************************************************************
3633 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
3635 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
3636 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
3638 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
3639 return CR_CALL_NOT_IMPLEMENTED
;
3643 /***********************************************************************
3644 * CM_Get_Sibling [SETUPAPI.@]
3646 CONFIGRET WINAPI
CM_Get_Sibling(
3647 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
3649 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
3650 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
3654 /***********************************************************************
3655 * CM_Get_Sibling_Ex [SETUPAPI.@]
3657 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
3658 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3660 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
3661 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3662 HSTRING_TABLE StringTable
= NULL
;
3664 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
3667 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
3669 if (pdnDevInst
== NULL
)
3670 return CR_INVALID_POINTER
;
3673 return CR_INVALID_DEVINST
;
3676 return CR_INVALID_FLAG
;
3680 if (hMachine
!= NULL
)
3682 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3683 if (BindingHandle
== NULL
)
3686 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3687 if (StringTable
== 0)
3692 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3696 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3697 if (lpDevInst
== NULL
)
3698 return CR_INVALID_DEVNODE
;
3702 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
3703 PNP_GET_SIBLING_DEVICE_INSTANCE
,
3709 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3711 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3715 if (ret
!= CR_SUCCESS
)
3718 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
3720 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
3724 *pdnDevInst
= dwIndex
;
3730 /***********************************************************************
3731 * CM_Get_Version [SETUPAPI.@]
3733 WORD WINAPI
CM_Get_Version(VOID
)
3736 return CM_Get_Version_Ex(NULL
);
3740 /***********************************************************************
3741 * CM_Get_Version_Ex [SETUPAPI.@]
3743 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
3745 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3749 TRACE("%lx\n", hMachine
);
3751 if (hMachine
!= NULL
)
3753 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3754 if (BindingHandle
== NULL
)
3759 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3765 ret
= PNP_GetVersion(BindingHandle
, &Version
);
3767 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3769 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3773 if (ret
!= CR_SUCCESS
)
3780 /***********************************************************************
3781 * CM_Is_Dock_Station_Present [SETUPAPI.@]
3783 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
3786 TRACE("%p\n", pbPresent
);
3787 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
3791 /***********************************************************************
3792 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
3794 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
3795 PBOOL pbPresent
, HMACHINE hMachine
)
3797 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3800 TRACE("%p %lx\n", pbPresent
, hMachine
);
3802 if (pbPresent
== NULL
)
3803 return CR_INVALID_POINTER
;
3807 if (hMachine
!= NULL
)
3809 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3810 if (BindingHandle
== NULL
)
3815 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3821 ret
= PNP_IsDockStationPresent(BindingHandle
,
3824 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3826 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3834 /***********************************************************************
3835 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3837 BOOL WINAPI
CM_Is_Version_Available(
3840 TRACE("%hu\n", wVersion
);
3841 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
3845 /***********************************************************************
3846 * CM_Is_Version_Available_Ex [SETUPAPI.@]
3848 BOOL WINAPI
CM_Is_Version_Available_Ex(
3849 WORD wVersion
, HMACHINE hMachine
)
3851 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3852 WORD wServerVersion
;
3855 TRACE("%hu %lx\n", wVersion
, hMachine
);
3857 if (wVersion
<= 0x400)
3860 if (hMachine
!= NULL
)
3862 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3863 if (BindingHandle
== NULL
)
3868 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3874 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
3876 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3878 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3882 if (ret
!= CR_SUCCESS
)
3885 return (wServerVersion
>= wVersion
);
3889 /***********************************************************************
3890 * CM_Locate_DevNodeA [SETUPAPI.@]
3892 CONFIGRET WINAPI
CM_Locate_DevNodeA(
3893 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
3895 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
3896 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3900 /***********************************************************************
3901 * CM_Locate_DevNodeW [SETUPAPI.@]
3903 CONFIGRET WINAPI
CM_Locate_DevNodeW(
3904 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
3906 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
3907 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
3911 /***********************************************************************
3912 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3914 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3915 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3917 DEVINSTID_W pDevIdW
= NULL
;
3918 CONFIGRET ret
= CR_SUCCESS
;
3920 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3922 if (pDeviceID
!= NULL
)
3924 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3925 return CR_INVALID_DEVICE_ID
;
3928 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3930 if (pDevIdW
!= NULL
)
3937 /***********************************************************************
3938 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3940 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3941 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3943 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3944 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3945 HSTRING_TABLE StringTable
= NULL
;
3946 CONFIGRET ret
= CR_SUCCESS
;
3948 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3950 if (pdnDevInst
== NULL
)
3951 return CR_INVALID_POINTER
;
3953 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3954 return CR_INVALID_FLAG
;
3956 if (hMachine
!= NULL
)
3958 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3959 if (BindingHandle
== NULL
)
3962 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3963 if (StringTable
== 0)
3968 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3972 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3974 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3980 /* Get the root device ID */
3981 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3985 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3987 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3991 if (ret
!= CR_SUCCESS
)
3994 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3998 /* Validate the device ID */
3999 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4003 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4005 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4009 if (ret
== CR_SUCCESS
)
4011 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4012 if (*pdnDevInst
== -1)
4020 /***********************************************************************
4021 * CM_Modify_Res_Des [SETUPAPI.@]
4023 CONFIGRET WINAPI
CM_Modify_Res_Des(
4024 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
,
4025 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
4027 TRACE("%p %p %lx %p %lu %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4028 ResourceLen
, ulFlags
);
4029 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4030 ResourceLen
, ulFlags
, NULL
);
4034 /***********************************************************************
4035 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4037 CONFIGRET WINAPI
CM_Modify_Res_Des_Ex(
4038 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ResourceID
, PCVOID ResourceData
,
4039 ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
4041 FIXME("%p %p %lx %p %lu %lx %lx", prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4042 ResourceLen
, ulFlags
, hMachine
);
4043 return CR_CALL_NOT_IMPLEMENTED
;
4047 /***********************************************************************
4048 * CM_Move_DevNode [SETUPAPI.@]
4050 CONFIGRET WINAPI
CM_Move_DevNode(
4051 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
4053 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
4054 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4058 /***********************************************************************
4059 * CM_Move_DevNode_Ex [SETUPAPI.@]
4061 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
4062 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
4065 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4066 HSTRING_TABLE StringTable
= NULL
;
4067 LPWSTR lpFromDevInst
;
4071 FIXME("%lx %lx %lx %lx\n",
4072 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4074 if (!pSetupIsUserAdmin())
4075 return CR_ACCESS_DENIED
;
4077 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4078 return CR_INVALID_DEVNODE
;
4081 return CR_INVALID_FLAG
;
4083 if (hMachine
!= NULL
)
4085 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4086 if (BindingHandle
== NULL
)
4089 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4090 if (StringTable
== 0)
4095 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4099 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4100 if (lpFromDevInst
== NULL
)
4101 return CR_INVALID_DEVNODE
;
4103 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4104 if (lpToDevInst
== NULL
)
4105 return CR_INVALID_DEVNODE
;
4109 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4115 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4117 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4125 /***********************************************************************
4126 * CM_Open_Class_KeyA [SETUPAPI.@]
4128 CONFIGRET WINAPI
CM_Open_Class_KeyA(
4129 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4130 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4132 TRACE("%p %s %lx %lx %p %lx\n",
4133 debugstr_guid(pClassGuid
), pszClassName
,
4134 samDesired
, Disposition
, phkClass
, ulFlags
);
4136 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4137 Disposition
, phkClass
, ulFlags
, NULL
);
4141 /***********************************************************************
4142 * CM_Open_Class_KeyW [SETUPAPI.@]
4144 CONFIGRET WINAPI
CM_Open_Class_KeyW(
4145 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4146 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
4148 TRACE("%p %s %lx %lx %p %lx\n",
4149 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4150 samDesired
, Disposition
, phkClass
, ulFlags
);
4152 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4153 Disposition
, phkClass
, ulFlags
, NULL
);
4157 /***********************************************************************
4158 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4160 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
4161 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
4162 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4165 LPWSTR pszClassNameW
= NULL
;
4168 TRACE("%p %s %lx %lx %p %lx %lx\n",
4169 debugstr_guid(pClassGuid
), pszClassName
,
4170 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4172 if (pszClassName
!= NULL
)
4174 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4175 return CR_INVALID_DATA
;
4178 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4179 Disposition
, phkClass
, ulFlags
, hMachine
);
4181 if (pszClassNameW
!= NULL
)
4182 MyFree(pszClassNameW
);
4188 /***********************************************************************
4189 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4191 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
4192 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
4193 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
4196 WCHAR szKeyName
[MAX_PATH
];
4197 LPWSTR lpGuidString
;
4198 DWORD dwDisposition
;
4202 TRACE("%p %s %lx %lx %p %lx %lx\n",
4203 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4204 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4206 /* Check Disposition and ulFlags */
4207 if ((Disposition
& ~RegDisposition_Bits
) ||
4208 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
4209 return CR_INVALID_FLAG
;
4211 /* Check phkClass */
4212 if (phkClass
== NULL
)
4213 return CR_INVALID_POINTER
;
4217 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
4218 pszClassName
!= NULL
)
4219 return CR_INVALID_DATA
;
4221 if (hMachine
== NULL
)
4223 hKey
= HKEY_LOCAL_MACHINE
;
4227 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
4228 HKEY_LOCAL_MACHINE
, &hKey
))
4229 return CR_REGISTRY_ERROR
;
4232 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
4234 lstrcpyW(szKeyName
, DeviceClasses
);
4238 lstrcpyW(szKeyName
, ControlClass
);
4241 if (pClassGuid
!= NULL
)
4243 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
4246 return CR_INVALID_DATA
;
4249 lstrcatW(szKeyName
, Backslash
);
4250 lstrcatW(szKeyName
, lpGuidString
);
4253 if (Disposition
== RegDisposition_OpenAlways
)
4255 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
4256 NULL
, phkClass
, &dwDisposition
);
4260 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
4265 if (pClassGuid
!= NULL
)
4266 RpcStringFreeW(&lpGuidString
);
4268 if (dwError
!= ERROR_SUCCESS
)
4271 return CR_NO_SUCH_REGISTRY_KEY
;
4274 if (pszClassName
!= NULL
)
4276 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
4277 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
4284 /***********************************************************************
4285 * CM_Open_DevNode_Key [SETUPAPI.@]
4287 CONFIGRET WINAPI
CM_Open_DevNode_Key(
4288 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4289 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
4291 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
4292 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
4293 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
4294 Disposition
, phkDevice
, ulFlags
, NULL
);
4298 /***********************************************************************
4299 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
4301 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
4302 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
4303 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
4306 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
4307 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
4309 return CR_CALL_NOT_IMPLEMENTED
;
4313 /***********************************************************************
4314 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
4316 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
4317 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4318 ULONG ulNameLength
, ULONG ulFlags
)
4320 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4321 ulNameLength
, ulFlags
);
4323 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
4324 ulNameLength
, ulFlags
, NULL
);
4328 /***********************************************************************
4329 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
4331 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
4332 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4333 ULONG ulNameLength
, ULONG ulFlags
)
4335 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
4336 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
4338 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
4339 ulNameLength
, ulFlags
, NULL
);
4343 /***********************************************************************
4344 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
4346 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
4347 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4348 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4350 LPWSTR lpLocalVetoName
;
4353 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
4354 ulNameLength
, ulFlags
, hMachine
);
4356 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4357 return CR_INVALID_POINTER
;
4359 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
4360 if (lpLocalVetoName
== NULL
)
4361 return CR_OUT_OF_MEMORY
;
4363 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
4364 ulNameLength
, ulFlags
, hMachine
);
4365 if (ret
== CR_REMOVE_VETOED
)
4367 if (WideCharToMultiByte(CP_ACP
,
4378 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
4384 /***********************************************************************
4385 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
4387 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
4388 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4389 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4391 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4392 HSTRING_TABLE StringTable
= NULL
;
4396 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
4397 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
4399 if (dnAncestor
== 0)
4400 return CR_INVALID_DEVNODE
;
4402 if (ulFlags
& ~CM_REMOVE_BITS
)
4403 return CR_INVALID_FLAG
;
4405 if (pszVetoName
== NULL
&& ulNameLength
== 0)
4406 return CR_INVALID_POINTER
;
4408 if (hMachine
!= NULL
)
4410 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4411 if (BindingHandle
== NULL
)
4414 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4415 if (StringTable
== 0)
4420 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4424 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
4425 if (lpDevInst
== NULL
)
4426 return CR_INVALID_DEVNODE
;
4430 ret
= PNP_QueryRemove(BindingHandle
,
4437 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4439 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4447 /***********************************************************************
4448 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
4450 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
4451 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4454 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
4455 ResourceID
, ulFlags
);
4457 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
4458 ResourceID
, ulFlags
, NULL
);
4462 /***********************************************************************
4463 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
4465 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
4468 IN DEVINST dnDevInst
,
4469 IN RESOURCEID ResourceID
,
4471 IN HMACHINE hMachine
)
4473 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4474 HSTRING_TABLE StringTable
= NULL
;
4478 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
4479 ResourceID
, ulFlags
, hMachine
);
4481 if (pData
== NULL
|| DataLen
== 0)
4482 return CR_INVALID_POINTER
;
4485 return CR_INVALID_DEVINST
;
4487 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4488 return CR_INVALID_FLAG
;
4490 if (hMachine
!= NULL
)
4492 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4493 if (BindingHandle
== NULL
)
4496 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4497 if (StringTable
== 0)
4502 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4506 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4507 if (lpDevInst
== NULL
)
4508 return CR_INVALID_DEVNODE
;
4512 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
4519 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4521 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4529 /***********************************************************************
4530 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
4532 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
4533 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
4535 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
4537 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
4542 /***********************************************************************
4543 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
4545 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
4546 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
4547 ULONG ulFlags
, HMACHINE hMachine
)
4549 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4550 HSTRING_TABLE StringTable
= NULL
;
4554 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
4557 if (pulSize
== NULL
)
4558 return CR_INVALID_POINTER
;
4561 return CR_INVALID_DEVINST
;
4563 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
4564 return CR_INVALID_FLAG
;
4566 if (hMachine
!= NULL
)
4568 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4569 if (BindingHandle
== NULL
)
4572 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4573 if (StringTable
== 0)
4578 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4582 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4583 if (lpDevInst
== NULL
)
4584 return CR_INVALID_DEVNODE
;
4588 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
4594 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4596 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4604 /***********************************************************************
4605 * CM_Query_Remove_SubTree [SETUPAPI.@]
4607 * This function is obsolete in Windows XP and above.
4609 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
4610 DEVINST dnAncestor
, ULONG ulFlags
)
4612 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4613 return CR_CALL_NOT_IMPLEMENTED
;
4617 /***********************************************************************
4618 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
4620 * This function is obsolete in Windows XP and above.
4622 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
4623 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4625 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4626 return CR_CALL_NOT_IMPLEMENTED
;
4630 /***********************************************************************
4631 * CM_Reenumerate_DevNode [SETUPAPI.@]
4633 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
4634 DEVINST dnDevInst
, ULONG ulFlags
)
4636 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4637 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4641 /***********************************************************************
4642 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
4645 CM_Reenumerate_DevNode_Ex(
4646 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4648 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4649 HSTRING_TABLE StringTable
= NULL
;
4653 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4656 return CR_INVALID_DEVNODE
;
4658 if (ulFlags
& ~CM_REENUMERATE_BITS
)
4659 return CR_INVALID_FLAG
;
4661 if (hMachine
!= NULL
)
4663 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4664 if (BindingHandle
== NULL
)
4667 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4668 if (StringTable
== 0)
4673 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4677 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4678 if (lpDevInst
== NULL
)
4679 return CR_INVALID_DEVNODE
;
4683 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4684 PNP_DEVINST_REENUMERATE
,
4689 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4691 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4699 /***********************************************************************
4700 * CM_Register_Device_InterfaceA [SETUPAPI.@]
4702 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
4703 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4704 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4706 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4707 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
4709 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
4710 pszReference
, pszDeviceInterface
,
4711 pulLength
, ulFlags
, NULL
);
4715 /***********************************************************************
4716 * CM_Register_Device_InterfaceW [SETUPAPI.@]
4718 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
4719 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4720 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
4722 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4723 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
4725 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
4726 pszReference
, pszDeviceInterface
,
4727 pulLength
, ulFlags
, NULL
);
4731 /***********************************************************************
4732 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
4734 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
4735 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
4736 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4738 LPWSTR pszReferenceW
= NULL
;
4739 LPWSTR pszDeviceInterfaceW
= NULL
;
4743 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4744 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4746 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
4747 return CR_INVALID_POINTER
;
4749 if (pszReference
!= NULL
)
4751 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
4752 return CR_INVALID_DATA
;
4755 ulLength
= *pulLength
;
4757 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
4758 if (pszDeviceInterfaceW
== NULL
)
4760 ret
= CR_OUT_OF_MEMORY
;
4764 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
4767 pszDeviceInterfaceW
,
4771 if (ret
== CR_SUCCESS
)
4773 if (WideCharToMultiByte(CP_ACP
,
4775 pszDeviceInterfaceW
,
4784 *pulLength
= ulLength
;
4787 if (pszDeviceInterfaceW
!= NULL
)
4788 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
4790 if (pszReferenceW
!= NULL
)
4791 MyFree(pszReferenceW
);
4797 /***********************************************************************
4798 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
4800 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
4801 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
4802 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
4804 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4805 HSTRING_TABLE StringTable
= NULL
;
4807 ULONG ulTransferLength
;
4810 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
4811 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4814 return CR_INVALID_DEVNODE
;
4816 if (InterfaceClassGuid
== NULL
||
4817 pszDeviceInterface
== NULL
||
4819 return CR_INVALID_POINTER
;
4822 return CR_INVALID_FLAG
;
4824 if (hMachine
!= NULL
)
4826 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4827 if (BindingHandle
== NULL
)
4830 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4831 if (StringTable
== 0)
4836 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4840 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4841 if (lpDevInst
== NULL
)
4842 return CR_INVALID_DEVNODE
;
4844 ulTransferLength
= *pulLength
;
4848 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
4851 (LPWSTR
)pszReference
,
4857 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4859 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4867 /***********************************************************************
4868 * CM_Register_Device_Driver [SETUPAPI.@]
4870 CONFIGRET WINAPI
CM_Register_Device_Driver(
4871 DEVINST dnDevInst
, ULONG ulFlags
)
4873 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
4874 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
4878 /***********************************************************************
4879 * CM_Register_Device_Driver [SETUPAPI.@]
4881 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
4882 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4884 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4885 HSTRING_TABLE StringTable
= NULL
;
4889 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
4892 return CR_INVALID_DEVNODE
;
4894 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
4895 return CR_INVALID_FLAG
;
4897 if (hMachine
!= NULL
)
4899 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4900 if (BindingHandle
== NULL
)
4903 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4904 if (StringTable
== 0)
4909 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4913 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4914 if (lpDevInst
== NULL
)
4915 return CR_INVALID_DEVNODE
;
4919 ret
= PNP_RegisterDriver(BindingHandle
,
4923 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4925 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4933 /***********************************************************************
4934 * CM_Remove_SubTree [SETUPAPI.@]
4936 * This function is obsolete in Windows XP and above.
4938 CONFIGRET WINAPI
CM_Remove_SubTree(
4939 DEVINST dnAncestor
, ULONG ulFlags
)
4941 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
4942 return CR_CALL_NOT_IMPLEMENTED
;
4946 /***********************************************************************
4947 * CM_Remove_SubTree_Ex [SETUPAPI.@]
4949 * This function is obsolete in Windows XP and above.
4951 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
4952 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
4954 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
4955 return CR_CALL_NOT_IMPLEMENTED
;
4959 /***********************************************************************
4960 * CM_Request_Device_EjectA [SETUPAPI.@]
4962 CONFIGRET WINAPI
CM_Request_Device_EjectA(
4963 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4964 ULONG ulNameLength
, ULONG ulFlags
)
4966 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4967 ulNameLength
, ulFlags
);
4968 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
4969 ulNameLength
, ulFlags
, NULL
);
4973 /***********************************************************************
4974 * CM_Request_Device_EjectW [SETUPAPI.@]
4976 CONFIGRET WINAPI
CM_Request_Device_EjectW(
4977 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
4978 ULONG ulNameLength
, ULONG ulFlags
)
4980 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
4981 ulNameLength
, ulFlags
);
4982 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
4983 ulNameLength
, ulFlags
, NULL
);
4987 /***********************************************************************
4988 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
4990 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
4991 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
4992 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
4994 LPWSTR lpLocalVetoName
;
4997 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
4998 ulNameLength
, ulFlags
, hMachine
);
5000 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5001 return CR_INVALID_POINTER
;
5003 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5004 if (lpLocalVetoName
== NULL
)
5005 return CR_OUT_OF_MEMORY
;
5007 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5008 ulNameLength
, ulFlags
, hMachine
);
5009 if (ret
== CR_REMOVE_VETOED
)
5011 if (WideCharToMultiByte(CP_ACP
,
5022 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5028 /***********************************************************************
5029 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5031 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5032 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5033 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5035 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5036 HSTRING_TABLE StringTable
= NULL
;
5040 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5041 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5044 return CR_INVALID_DEVNODE
;
5047 return CR_INVALID_FLAG
;
5049 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5050 return CR_INVALID_POINTER
;
5052 if (hMachine
!= NULL
)
5054 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5055 if (BindingHandle
== NULL
)
5058 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5059 if (StringTable
== 0)
5064 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5068 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5069 if (lpDevInst
== NULL
)
5070 return CR_INVALID_DEVNODE
;
5074 ret
= PNP_RequestDeviceEject(BindingHandle
,
5081 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5083 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5091 /***********************************************************************
5092 * CM_Request_Eject_PC [SETUPAPI.@]
5094 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
5097 return CM_Request_Eject_PC_Ex(NULL
);
5101 /***********************************************************************
5102 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
5104 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
5107 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5110 TRACE("%lx\n", hMachine
);
5112 if (hMachine
!= NULL
)
5114 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5115 if (BindingHandle
== NULL
)
5120 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5126 ret
= PNP_RequestEjectPC(BindingHandle
);
5128 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5130 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5138 /***********************************************************************
5139 * CM_Run_Detection [SETUPAPI.@]
5141 CONFIGRET WINAPI
CM_Run_Detection(
5144 TRACE("%lx\n", ulFlags
);
5145 return CM_Run_Detection_Ex(ulFlags
, NULL
);
5149 /***********************************************************************
5150 * CM_Run_Detection_Ex [SETUPAPI.@]
5152 CONFIGRET WINAPI
CM_Run_Detection_Ex(
5153 ULONG ulFlags
, HMACHINE hMachine
)
5155 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5158 TRACE("%lx %lx\n", ulFlags
, hMachine
);
5160 if (!pSetupIsUserAdmin())
5161 return CR_ACCESS_DENIED
;
5163 if (ulFlags
& ~CM_DETECT_BITS
)
5164 return CR_INVALID_FLAG
;
5166 if (hMachine
!= NULL
)
5168 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5169 if (BindingHandle
== NULL
)
5174 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5180 ret
= PNP_RunDetection(BindingHandle
,
5183 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5185 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5193 /***********************************************************************
5194 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
5196 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
5197 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5198 ULONG ulFlags
, HMACHINE hMachine
)
5200 FIXME("%p %lx %p %lu %lx %p\n",
5201 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5202 return CR_CALL_NOT_IMPLEMENTED
;
5206 /***********************************************************************
5207 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
5209 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
5210 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5211 ULONG ulFlags
, HMACHINE hMachine
)
5213 FIXME("%p %lx %p %lu %lx %p\n",
5214 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5215 return CR_CALL_NOT_IMPLEMENTED
;
5219 /***********************************************************************
5220 * CM_Set_DevNode_Problem [SETUPAPI.@]
5222 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
5223 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
5225 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
5226 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
5230 /***********************************************************************
5231 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
5233 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
5234 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
5236 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5237 HSTRING_TABLE StringTable
= NULL
;
5241 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
5244 return CR_INVALID_DEVNODE
;
5246 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
5247 return CR_INVALID_FLAG
;
5249 if (hMachine
!= NULL
)
5251 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5252 if (BindingHandle
== NULL
)
5255 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5256 if (StringTable
== 0)
5261 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5265 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5266 if (lpDevInst
== NULL
)
5267 return CR_INVALID_DEVNODE
;
5271 ret
= PNP_SetDeviceProblem(BindingHandle
,
5276 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5278 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5286 /***********************************************************************
5287 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
5289 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
5290 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5293 TRACE("%lx %lu %p %lx %lx\n",
5294 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5295 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
5301 /***********************************************************************
5302 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
5304 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
5305 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5308 TRACE("%lx %lu %p %lx %lx\n",
5309 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
5310 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
5316 /***********************************************************************
5317 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
5319 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
5320 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5321 ULONG ulFlags
, HMACHINE hMachine
)
5323 CONFIGRET ret
= CR_SUCCESS
;
5327 FIXME("%lx %lu %p %lx %lx %lx\n",
5328 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5330 if (Buffer
== NULL
&& ulLength
!= 0)
5331 return CR_INVALID_POINTER
;
5335 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5344 /* Get property type */
5347 case CM_DRP_DEVICEDESC
:
5351 case CM_DRP_HARDWAREID
:
5352 ulType
= REG_MULTI_SZ
;
5355 case CM_DRP_COMPATIBLEIDS
:
5356 ulType
= REG_MULTI_SZ
;
5359 case CM_DRP_SERVICE
:
5367 case CM_DRP_CLASSGUID
:
5375 case CM_DRP_CONFIGFLAGS
:
5383 case CM_DRP_FRIENDLYNAME
:
5387 case CM_DRP_LOCATION_INFORMATION
:
5391 case CM_DRP_UPPERFILTERS
:
5392 ulType
= REG_MULTI_SZ
;
5395 case CM_DRP_LOWERFILTERS
:
5396 ulType
= REG_MULTI_SZ
;
5399 case CM_DRP_SECURITY
:
5400 ulType
= REG_BINARY
;
5403 case CM_DRP_DEVTYPE
:
5407 case CM_DRP_EXCLUSIVE
:
5411 case CM_DRP_CHARACTERISTICS
:
5415 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5419 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5424 return CR_INVALID_PROPERTY
;
5427 /* Allocate buffer if needed */
5428 if (ulType
== REG_SZ
||
5429 ulType
== REG_MULTI_SZ
)
5431 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
5432 if (lpBuffer
== NULL
)
5434 ret
= CR_OUT_OF_MEMORY
;
5438 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
5439 ulLength
, lpBuffer
, ulLength
))
5446 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5449 ulLength
* sizeof(WCHAR
),
5458 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
5466 ret
= CR_CALL_NOT_IMPLEMENTED
;
5473 /***********************************************************************
5474 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
5476 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
5477 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
5478 ULONG ulFlags
, HMACHINE hMachine
)
5480 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5481 HSTRING_TABLE StringTable
= NULL
;
5486 TRACE("%lx %lu %p %lx %lx %lx\n",
5487 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
5490 return CR_INVALID_DEVNODE
;
5492 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
5493 return CR_INVALID_PROPERTY
;
5495 if (Buffer
!= NULL
&& ulLength
== 0)
5496 return CR_INVALID_POINTER
;
5499 return CR_INVALID_FLAG
;
5501 if (hMachine
!= NULL
)
5503 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5504 if (BindingHandle
== NULL
)
5507 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5508 if (StringTable
== 0)
5513 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5517 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5518 if (lpDevInst
== NULL
)
5519 return CR_INVALID_DEVNODE
;
5523 case CM_DRP_DEVICEDESC
:
5527 case CM_DRP_HARDWAREID
:
5528 ulType
= REG_MULTI_SZ
;
5531 case CM_DRP_COMPATIBLEIDS
:
5532 ulType
= REG_MULTI_SZ
;
5535 case CM_DRP_SERVICE
:
5543 case CM_DRP_CLASSGUID
:
5551 case CM_DRP_CONFIGFLAGS
:
5559 case CM_DRP_FRIENDLYNAME
:
5563 case CM_DRP_LOCATION_INFORMATION
:
5567 case CM_DRP_UPPERFILTERS
:
5568 ulType
= REG_MULTI_SZ
;
5571 case CM_DRP_LOWERFILTERS
:
5572 ulType
= REG_MULTI_SZ
;
5575 case CM_DRP_SECURITY
:
5576 ulType
= REG_BINARY
;
5579 case CM_DRP_DEVTYPE
:
5583 case CM_DRP_EXCLUSIVE
:
5587 case CM_DRP_CHARACTERISTICS
:
5591 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
5595 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
5600 return CR_INVALID_PROPERTY
;
5605 ret
= PNP_SetDeviceRegProp(BindingHandle
,
5613 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5615 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5623 /***********************************************************************
5624 * CM_Set_HW_Prof [SETUPAPI.@]
5626 CONFIGRET WINAPI
CM_Set_HW_Prof(
5627 ULONG ulHardwareProfile
, ULONG ulFlags
)
5629 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
5630 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
5634 /***********************************************************************
5635 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
5637 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
5638 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
5640 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5643 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
5645 if (!pSetupIsUserAdmin())
5646 return CR_ACCESS_DENIED
;
5649 return CR_INVALID_FLAG
;
5651 if (hMachine
!= NULL
)
5653 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5654 if (BindingHandle
== NULL
)
5659 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5665 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
5667 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5669 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5677 /***********************************************************************
5678 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
5680 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
5681 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5684 TRACE("%s %lu %lu %lx\n", szDevInstName
,
5685 ulConfig
, ulValue
, ulFlags
);
5686 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
5691 /***********************************************************************
5692 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
5694 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
5695 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5698 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
5699 ulConfig
, ulValue
, ulFlags
);
5700 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
5705 /***********************************************************************
5706 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
5708 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
5709 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5710 ULONG ulFlags
, HMACHINE hMachine
)
5712 DEVINSTID_W pszDevIdW
= NULL
;
5713 CONFIGRET ret
= CR_SUCCESS
;
5715 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
5716 ulConfig
, ulValue
, ulFlags
, hMachine
);
5718 if (szDevInstName
!= NULL
)
5720 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
5721 return CR_INVALID_DEVICE_ID
;
5724 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
5727 if (pszDevIdW
!= NULL
)
5734 /***********************************************************************
5735 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
5737 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
5738 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
5739 ULONG ulFlags
, HMACHINE hMachine
)
5741 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5744 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
5745 ulConfig
, ulValue
, ulFlags
, hMachine
);
5747 if (szDevInstName
== NULL
)
5748 return CR_INVALID_POINTER
;
5750 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
5751 return CR_INVALID_FLAG
;
5753 /* FIXME: Check whether szDevInstName is valid */
5755 if (hMachine
!= NULL
)
5757 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5758 if (BindingHandle
== NULL
)
5763 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5769 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
5770 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
5772 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5774 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5782 /***********************************************************************
5783 * CM_Setup_DevNode [SETUPAPI.@]
5785 CONFIGRET WINAPI
CM_Setup_DevNode(
5786 DEVINST dnDevInst
, ULONG ulFlags
)
5788 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5789 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5793 /***********************************************************************
5794 * CM_Setup_DevNode_Ex [SETUPAPI.@]
5796 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
5797 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5799 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5800 HSTRING_TABLE StringTable
= NULL
;
5804 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5806 if (!pSetupIsUserAdmin())
5807 return CR_ACCESS_DENIED
;
5810 return CR_INVALID_DEVNODE
;
5812 if (ulFlags
& ~CM_SETUP_BITS
)
5813 return CR_INVALID_FLAG
;
5815 if (hMachine
!= NULL
)
5817 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5818 if (BindingHandle
== NULL
)
5821 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5822 if (StringTable
== 0)
5827 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5831 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5832 if (lpDevInst
== NULL
)
5833 return CR_INVALID_DEVNODE
;
5837 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5843 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5845 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5853 /***********************************************************************
5854 * CM_Uninstall_DevNode [SETUPAPI.@]
5856 CONFIGRET WINAPI
CM_Uninstall_DevNode(
5857 DEVINST dnPhantom
, ULONG ulFlags
)
5859 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
5860 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
5864 /***********************************************************************
5865 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
5867 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
5868 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
5870 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5871 HSTRING_TABLE StringTable
= NULL
;
5875 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
5878 return CR_INVALID_DEVNODE
;
5881 return CR_INVALID_FLAG
;
5883 if (hMachine
!= NULL
)
5885 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5886 if (BindingHandle
== NULL
)
5889 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5890 if (StringTable
== 0)
5895 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5899 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
5900 if (lpDevInst
== NULL
)
5901 return CR_INVALID_DEVNODE
;
5905 ret
= PNP_UninstallDevInst(BindingHandle
,
5909 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5911 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5919 /***********************************************************************
5920 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
5922 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
5923 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
5925 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
5927 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
5932 /***********************************************************************
5933 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
5935 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
5936 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
5938 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
5940 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
5945 /***********************************************************************
5946 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
5948 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
5949 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5951 LPWSTR pszDeviceInterfaceW
= NULL
;
5954 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
5956 if (pszDeviceInterface
== NULL
)
5957 return CR_INVALID_POINTER
;
5959 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
5960 return CR_INVALID_DATA
;
5962 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
5965 if (pszDeviceInterfaceW
!= NULL
)
5966 MyFree(pszDeviceInterfaceW
);
5972 /***********************************************************************
5973 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
5975 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
5976 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
5978 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5981 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
5983 if (pszDeviceInterface
== NULL
)
5984 return CR_INVALID_POINTER
;
5987 return CR_INVALID_FLAG
;
5989 if (hMachine
!= NULL
)
5991 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5992 if (BindingHandle
== NULL
)
5997 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6003 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6004 (LPWSTR
)pszDeviceInterface
,
6007 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6009 ret
= RpcStatusToCmStatus(RpcExceptionCode());