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
);
79 /***********************************************************************
80 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
82 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
88 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
92 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
98 /***********************************************************************
99 * CMP_Init_Detection [SETUPAPI.@]
101 CONFIGRET WINAPI
CMP_Init_Detection(
104 RPC_BINDING_HANDLE BindingHandle
= NULL
;
106 TRACE("%lu\n", dwMagic
);
108 if (dwMagic
!= CMP_MAGIC
)
109 return CR_INVALID_DATA
;
111 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
114 return PNP_InitDetection(BindingHandle
);
118 /***********************************************************************
119 * CMP_Report_LogOn [SETUPAPI.@]
121 CONFIGRET WINAPI
CMP_Report_LogOn(
125 RPC_BINDING_HANDLE BindingHandle
= NULL
;
126 CONFIGRET ret
= CR_SUCCESS
;
130 TRACE("%lu\n", dwMagic
);
132 if (dwMagic
!= CMP_MAGIC
)
133 return CR_INVALID_DATA
;
135 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
138 bAdmin
= IsUserAnAdmin();
140 for (i
= 0; i
< 30; i
++)
142 ret
= PNP_ReportLogOn(BindingHandle
,
145 if (ret
== CR_SUCCESS
)
155 /***********************************************************************
156 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
158 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
159 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
162 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
163 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
168 /***********************************************************************
169 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
171 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
172 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
173 ULONG ulFlags
, HMACHINE hMachine
)
175 RPC_BINDING_HANDLE BindingHandle
= NULL
;
176 HSTRING_TABLE StringTable
= NULL
;
177 ULONG ulLogConfTag
= 0;
179 PLOG_CONF_INFO pLogConfInfo
;
180 CONFIGRET ret
= CR_SUCCESS
;
182 FIXME("%p %p %lu %lx %p\n",
183 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
185 if (!IsUserAnAdmin())
186 return CR_ACCESS_DENIED
;
188 if (plcLogConf
== NULL
)
189 return CR_INVALID_POINTER
;
192 return CR_INVALID_DEVINST
;
194 if (Priority
> 0xFFFF)
195 return CR_INVALID_PRIORITY
;
197 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
198 return CR_INVALID_FLAG
;
200 if (hMachine
!= NULL
)
202 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
203 if (BindingHandle
== NULL
)
206 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
207 if (StringTable
== 0)
212 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
216 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
217 if (lpDevInst
== NULL
)
218 return CR_INVALID_DEVNODE
;
220 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
, &ulLogConfTag
, ulFlags
);
221 if (ret
== CR_SUCCESS
)
223 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
224 if (pLogConfInfo
== NULL
)
226 ret
= CR_OUT_OF_MEMORY
;
230 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
231 pLogConfInfo
->dnDevInst
= dnDevInst
;
232 pLogConfInfo
->ulFlags
= ulFlags
;
233 pLogConfInfo
->ulTag
= ulLogConfTag
;
235 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
245 /***********************************************************************
246 * CM_Add_IDA [SETUPAPI.@]
248 CONFIGRET WINAPI
CM_Add_IDA(
249 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
251 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
252 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
256 /***********************************************************************
257 * CM_Add_IDW [SETUPAPI.@]
259 CONFIGRET WINAPI
CM_Add_IDW(
260 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
262 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
263 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
267 /***********************************************************************
268 * CM_Add_ID_ExA [SETUPAPI.@]
270 CONFIGRET WINAPI
CM_Add_ID_ExA(
271 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
276 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
278 if (CaptureAndConvertAnsiArg(pszID
, &pszIDW
))
279 return CR_INVALID_DATA
;
281 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
289 /***********************************************************************
290 * CM_Add_ID_ExW [SETUPAPI.@]
292 CONFIGRET WINAPI
CM_Add_ID_ExW(
293 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
295 RPC_BINDING_HANDLE BindingHandle
= NULL
;
296 HSTRING_TABLE StringTable
= NULL
;
299 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
301 if (!IsUserAnAdmin())
302 return CR_ACCESS_DENIED
;
305 return CR_INVALID_DEVINST
;
308 return CR_INVALID_POINTER
;
310 if (ulFlags
& ~CM_ADD_ID_BITS
)
311 return CR_INVALID_FLAG
;
313 if (hMachine
!= NULL
)
315 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
316 if (BindingHandle
== NULL
)
319 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
320 if (StringTable
== 0)
325 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
329 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
330 if (lpDevInst
== NULL
)
331 return CR_INVALID_DEVNODE
;
333 return PNP_AddID(BindingHandle
,
340 /***********************************************************************
341 * CM_Connect_MachineA [SETUPAPI.@]
343 CONFIGRET WINAPI
CM_Connect_MachineA(
344 PCSTR UNCServerName
, PHMACHINE phMachine
)
349 TRACE("%s %p\n", UNCServerName
, phMachine
);
351 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
352 return CM_Connect_MachineW(NULL
, phMachine
);
354 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
355 return CR_INVALID_DATA
;
357 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
359 MyFree(pServerNameW
);
365 /***********************************************************************
366 * CM_Connect_MachineW [SETUPAPI.@]
368 CONFIGRET WINAPI
CM_Connect_MachineW(
369 PCWSTR UNCServerName
, PHMACHINE phMachine
)
371 PMACHINE_INFO pMachine
;
373 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
375 if (phMachine
== NULL
)
376 return CR_INVALID_POINTER
;
380 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
381 if (pMachine
== NULL
)
382 return CR_OUT_OF_MEMORY
;
384 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
386 pMachine
->bLocal
= TRUE
;
388 /* FIXME: store the computers name in pMachine->szMachineName */
390 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
391 &pMachine
->StringTable
))
393 HeapFree(GetProcessHeap(), 0, pMachine
);
399 pMachine
->bLocal
= FALSE
;
400 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
402 HeapFree(GetProcessHeap(), 0, pMachine
);
403 return CR_INVALID_MACHINENAME
;
405 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
407 pMachine
->StringTable
= StringTableInitialize();
408 if (pMachine
->StringTable
== NULL
)
410 HeapFree(GetProcessHeap(), 0, pMachine
);
414 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
416 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
418 StringTableDestroy(pMachine
->StringTable
);
419 HeapFree(GetProcessHeap(), 0, pMachine
);
420 return CR_INVALID_MACHINENAME
;
424 phMachine
= (PHMACHINE
)pMachine
;
430 /***********************************************************************
431 * CM_Create_DevNodeA [SETUPAPI.@]
433 CONFIGRET WINAPI
CM_Create_DevNodeA(
434 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
437 TRACE("%p %s %p %lx\n",
438 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
439 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
444 /***********************************************************************
445 * CM_Create_DevNodeW [SETUPAPI.@]
447 CONFIGRET WINAPI
CM_Create_DevNodeW(
448 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
451 TRACE("%p %s %p %lx\n",
452 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
453 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
458 /***********************************************************************
459 * CM_Create_DevNode_ExA [SETUPAPI.@]
461 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
462 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
463 ULONG ulFlags
, HANDLE hMachine
)
465 DEVINSTID_W pDeviceIDW
;
468 TRACE("%p %s %p %lx %p\n",
469 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
471 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
472 return CR_INVALID_DATA
;
474 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
483 /***********************************************************************
484 * CM_Create_DevNode_ExW [SETUPAPI.@]
486 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
487 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
488 ULONG ulFlags
, HANDLE hMachine
)
490 RPC_BINDING_HANDLE BindingHandle
= NULL
;
491 HSTRING_TABLE StringTable
= NULL
;
492 LPWSTR lpParentDevInst
;
493 CONFIGRET ret
= CR_SUCCESS
;
495 FIXME("%p %s %p %lx %p\n",
496 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
498 if (!IsUserAnAdmin())
499 return CR_ACCESS_DENIED
;
501 if (pdnDevInst
== NULL
)
502 return CR_INVALID_POINTER
;
504 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0)
505 return CR_INVALID_DEVICE_ID
;
508 return CR_INVALID_DEVNODE
;
510 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
511 return CR_INVALID_FLAG
;
513 if (hMachine
!= NULL
)
515 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
516 if (BindingHandle
== NULL
)
519 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
520 if (StringTable
== 0)
525 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
529 lpParentDevInst
= StringTableStringFromId(StringTable
, dnParent
);
530 if (lpParentDevInst
== NULL
)
531 return CR_INVALID_DEVNODE
;
533 ret
= PNP_CreateDevInst(BindingHandle
,
538 if (ret
== CR_SUCCESS
)
540 *pdnDevInst
= StringTableAddString(StringTable
, pDeviceID
, 1);
541 if (*pdnDevInst
== 0)
542 ret
= CR_NO_SUCH_DEVNODE
;
549 /***********************************************************************
550 * CM_Delete_Class_Key [SETUPAPI.@]
552 CONFIGRET WINAPI
CM_Delete_Class_Key(
553 LPGUID ClassGuid
, ULONG ulFlags
)
555 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
556 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
560 /***********************************************************************
561 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
563 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
564 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
566 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
567 RPC_BINDING_HANDLE BindingHandle
= NULL
;
569 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
571 if (ClassGuid
== NULL
)
572 return CR_INVALID_POINTER
;
574 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
575 return CR_INVALID_FLAG
;
577 if (!GuidToString(ClassGuid
, szGuidString
))
578 return CR_INVALID_DATA
;
580 if (hMachine
!= NULL
)
582 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
583 if (BindingHandle
== NULL
)
588 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
592 return PNP_DeleteClassKey(BindingHandle
,
597 /***********************************************************************
598 * CM_Delete_DevNode_Key [SETUPAPI.@]
600 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
601 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
603 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
604 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
608 /***********************************************************************
609 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
611 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
612 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
615 FIXME("%p %lu %lx %p\n",
616 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
618 return CR_CALL_NOT_IMPLEMENTED
;
622 /***********************************************************************
623 * CM_Disable_DevNode [SETUPAPI.@]
625 CONFIGRET WINAPI
CM_Disable_DevNode(
626 DEVINST dnDevInst
, ULONG ulFlags
)
628 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
629 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
633 /***********************************************************************
634 * CM_Disable_DevNode_Ex [SETUPAPI.@]
636 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
637 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
639 RPC_BINDING_HANDLE BindingHandle
= NULL
;
640 HSTRING_TABLE StringTable
= NULL
;
643 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
645 if (!IsUserAnAdmin())
646 return CR_ACCESS_DENIED
;
649 return CR_INVALID_DEVINST
;
652 return CR_INVALID_FLAG
;
654 if (hMachine
!= NULL
)
656 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
657 if (BindingHandle
== NULL
)
660 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
661 if (StringTable
== 0)
666 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
670 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
671 if (lpDevInst
== NULL
)
672 return CR_INVALID_DEVNODE
;
674 return PNP_DeviceInstanceAction(BindingHandle
,
682 /***********************************************************************
683 * CM_Disconnect_Machine [SETUPAPI.@]
685 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
687 PMACHINE_INFO pMachine
;
689 TRACE("%lx\n", hMachine
);
691 pMachine
= (PMACHINE_INFO
)hMachine
;
692 if (pMachine
== NULL
)
695 if (pMachine
->bLocal
== FALSE
)
697 if (pMachine
->StringTable
!= NULL
)
698 StringTableDestroy(pMachine
->StringTable
);
700 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
701 return CR_ACCESS_DENIED
;
704 HeapFree(GetProcessHeap(), 0, pMachine
);
710 /***********************************************************************
711 * CM_Enable_DevNode [SETUPAPI.@]
713 CONFIGRET WINAPI
CM_Enable_DevNode(
714 DEVINST dnDevInst
, ULONG ulFlags
)
716 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
717 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
721 /***********************************************************************
722 * CM_Enable_DevNode_Ex [SETUPAPI.@]
724 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
725 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
727 RPC_BINDING_HANDLE BindingHandle
= NULL
;
728 HSTRING_TABLE StringTable
= NULL
;
731 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
733 if (!IsUserAnAdmin())
734 return CR_ACCESS_DENIED
;
737 return CR_INVALID_DEVINST
;
740 return CR_INVALID_FLAG
;
742 if (hMachine
!= NULL
)
744 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
745 if (BindingHandle
== NULL
)
748 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
749 if (StringTable
== 0)
754 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
758 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
759 if (lpDevInst
== NULL
)
760 return CR_INVALID_DEVNODE
;
762 return PNP_DeviceInstanceAction(BindingHandle
,
770 /***********************************************************************
771 * CM_Enumerate_Classes [SETUPAPI.@]
773 CONFIGRET WINAPI
CM_Enumerate_Classes(
774 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
776 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
777 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
781 /***********************************************************************
782 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
784 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
785 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
787 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
788 RPC_BINDING_HANDLE BindingHandle
= NULL
;
789 CONFIGRET ret
= CR_SUCCESS
;
790 ULONG ulLength
= MAX_GUID_STRING_LEN
;
792 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
794 if (ClassGuid
== NULL
)
795 return CR_INVALID_POINTER
;
798 return CR_INVALID_FLAG
;
800 if (hMachine
!= NULL
)
802 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
803 if (BindingHandle
== NULL
)
808 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
812 ret
= PNP_EnumerateSubKeys(BindingHandle
,
819 if (ret
== CR_SUCCESS
)
822 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
824 /* Convert the buffer to a GUID */
825 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
833 /***********************************************************************
834 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
836 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
837 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
839 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
840 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
845 /***********************************************************************
846 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
848 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
849 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
851 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
852 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
857 /***********************************************************************
858 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
860 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
861 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
864 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
867 CONFIGRET ret
= CR_SUCCESS
;
869 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
872 if (Buffer
== NULL
|| pulLength
== NULL
)
873 return CR_INVALID_POINTER
;
876 return CR_INVALID_FLAG
;
878 ulOrigLength
= *pulLength
;
881 ulLength
= MAX_DEVICE_ID_LEN
;
882 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
884 if (ret
== CR_SUCCESS
)
886 if (WideCharToMultiByte(CP_ACP
,
896 *pulLength
= lstrlenA(Buffer
) + 1;
903 /***********************************************************************
904 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
906 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
907 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
910 RPC_BINDING_HANDLE BindingHandle
= NULL
;
912 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
915 if (Buffer
== NULL
|| pulLength
== NULL
)
916 return CR_INVALID_POINTER
;
919 return CR_INVALID_FLAG
;
921 *Buffer
= UNICODE_NULL
;
923 if (hMachine
!= NULL
)
925 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
926 if (BindingHandle
== NULL
)
931 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
935 return PNP_EnumerateSubKeys(BindingHandle
,
945 /***********************************************************************
946 * CM_Free_Log_Conf [SETUPAPI.@]
948 CONFIGRET WINAPI
CM_Free_Log_Conf(
949 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
951 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
952 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
956 /***********************************************************************
957 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
959 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
960 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
962 RPC_BINDING_HANDLE BindingHandle
= NULL
;
963 HSTRING_TABLE StringTable
= NULL
;
965 PLOG_CONF_INFO pLogConfInfo
;
967 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
969 if (!IsUserAnAdmin())
970 return CR_ACCESS_DENIED
;
972 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
973 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
974 return CR_INVALID_LOG_CONF
;
977 return CR_INVALID_FLAG
;
979 if (hMachine
!= NULL
)
981 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
982 if (BindingHandle
== NULL
)
985 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
986 if (StringTable
== 0)
991 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
995 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
996 if (lpDevInst
== NULL
)
997 return CR_INVALID_DEVNODE
;
999 return PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1000 pLogConfInfo
->ulTag
, 0);
1004 /***********************************************************************
1005 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1007 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1010 PLOG_CONF_INFO pLogConfInfo
;
1012 TRACE("%lx\n", lcLogConf
);
1014 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1015 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1016 return CR_INVALID_LOG_CONF
;
1018 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1024 /***********************************************************************
1025 * CM_Get_Child [SETUPAPI.@]
1027 CONFIGRET WINAPI
CM_Get_Child(
1028 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1030 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1031 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1035 /***********************************************************************
1036 * CM_Get_Child_Ex [SETUPAPI.@]
1038 CONFIGRET WINAPI
CM_Get_Child_Ex(
1039 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1041 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1042 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1043 HSTRING_TABLE StringTable
= NULL
;
1048 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1050 if (pdnDevInst
== NULL
)
1051 return CR_INVALID_POINTER
;
1054 return CR_INVALID_DEVINST
;
1057 return CR_INVALID_FLAG
;
1061 if (hMachine
!= NULL
)
1063 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1064 if (BindingHandle
== NULL
)
1067 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1068 if (StringTable
== 0)
1073 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1077 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1078 if (lpDevInst
== NULL
)
1079 return CR_INVALID_DEVNODE
;
1081 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1087 if (ret
!= CR_SUCCESS
)
1090 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1092 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1096 *pdnDevInst
= dwIndex
;
1102 /***********************************************************************
1103 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1105 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1106 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1108 TRACE("%p %p %p %lx\n",
1109 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1110 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1115 /***********************************************************************
1116 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1118 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1119 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1121 TRACE("%p %p %p %lx\n",
1122 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1123 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1128 /***********************************************************************
1129 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1131 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1132 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1135 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1136 CONFIGRET ret
= CR_SUCCESS
;
1140 TRACE("%p %p %p %lx %lx\n",
1141 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1143 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1144 return CR_INVALID_POINTER
;
1146 ulOrigLength
= *pulLength
;
1149 ulLength
= MAX_GUID_STRING_LEN
;
1150 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1152 if (ret
== CR_SUCCESS
)
1154 if (WideCharToMultiByte(CP_ACP
,
1164 *pulLength
= lstrlenA(pszKeyName
) + 1;
1171 /***********************************************************************
1172 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1174 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1175 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1178 TRACE("%p %p %p %lx %lx\n",
1179 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1181 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1182 return CR_INVALID_POINTER
;
1185 return CR_INVALID_FLAG
;
1187 if (*pulLength
< MAX_GUID_STRING_LEN
)
1190 return CR_BUFFER_SMALL
;
1193 if (!GuidToString(ClassGuid
, pszKeyName
))
1194 return CR_INVALID_DATA
;
1196 *pulLength
= MAX_GUID_STRING_LEN
;
1202 /***********************************************************************
1203 * CM_Get_Class_NameA [SETUPAPI.@]
1205 CONFIGRET WINAPI
CM_Get_Class_NameA(
1206 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1208 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1209 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1214 /***********************************************************************
1215 * CM_Get_Class_NameW [SETUPAPI.@]
1217 CONFIGRET WINAPI
CM_Get_Class_NameW(
1218 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1220 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1221 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1226 /***********************************************************************
1227 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1229 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1230 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1233 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1234 CONFIGRET ret
= CR_SUCCESS
;
1238 TRACE("%p %p %p %lx %lx\n",
1239 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1241 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1242 return CR_INVALID_POINTER
;
1244 ulOrigLength
= *pulLength
;
1247 ulLength
= MAX_CLASS_NAME_LEN
;
1248 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1250 if (ret
== CR_SUCCESS
)
1252 if (WideCharToMultiByte(CP_ACP
,
1262 *pulLength
= lstrlenA(Buffer
) + 1;
1269 /***********************************************************************
1270 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1273 CM_Get_Class_Name_ExW(
1274 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1277 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1278 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1280 TRACE("%p %p %p %lx %lx\n",
1281 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1283 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1284 return CR_INVALID_POINTER
;
1287 return CR_INVALID_FLAG
;
1289 if (!GuidToString(ClassGuid
, szGuidString
))
1290 return CR_INVALID_DATA
;
1292 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1294 if (hMachine
!= NULL
)
1296 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1297 if (BindingHandle
== NULL
)
1302 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1306 return PNP_GetClassName(BindingHandle
,
1314 /***********************************************************************
1315 * CM_Get_Depth [SETUPAPI.@]
1317 CONFIGRET WINAPI
CM_Get_Depth(
1318 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1320 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1321 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1325 /***********************************************************************
1326 * CM_Get_Depth_Ex [SETUPAPI.@]
1328 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1329 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1331 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1332 HSTRING_TABLE StringTable
= NULL
;
1335 TRACE("%p %lx %lx %lx\n",
1336 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1338 if (pulDepth
== NULL
)
1339 return CR_INVALID_POINTER
;
1342 return CR_INVALID_DEVINST
;
1345 return CR_INVALID_FLAG
;
1347 if (hMachine
!= NULL
)
1349 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1350 if (BindingHandle
== NULL
)
1353 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1354 if (StringTable
== 0)
1359 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1363 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1364 if (lpDevInst
== NULL
)
1365 return CR_INVALID_DEVNODE
;
1367 return PNP_GetDepth(BindingHandle
,
1374 /***********************************************************************
1375 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1377 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1378 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1379 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1381 TRACE("%lx %lu %p %p %p %lx\n",
1382 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1384 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1385 pulRegDataType
, Buffer
,
1386 pulLength
, ulFlags
, NULL
);
1390 /***********************************************************************
1391 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1393 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1394 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1395 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1397 TRACE("%lx %lu %p %p %p %lx\n",
1398 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1400 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1401 pulRegDataType
, Buffer
,
1402 pulLength
, ulFlags
, NULL
);
1406 /***********************************************************************
1407 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1409 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1410 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1411 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1415 ULONG RegDataType
= REG_NONE
;
1418 TRACE("%lx %lu %p %p %p %lx %lx\n",
1419 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1423 return CR_INVALID_POINTER
;
1425 LengthW
= *pulLength
* sizeof(WCHAR
);
1426 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1429 return CR_OUT_OF_MEMORY
;
1431 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1439 if (ret
== CR_SUCCESS
)
1441 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1443 /* Do W->A conversion */
1444 *pulLength
= WideCharToMultiByte(CP_ACP
,
1447 lstrlenW(BufferW
) + 1,
1452 if (*pulLength
== 0)
1457 /* Directly copy the value */
1458 if (LengthW
<= *pulLength
)
1459 memcpy(Buffer
, BufferW
, LengthW
);
1462 *pulLength
= LengthW
;
1463 ret
= CR_BUFFER_SMALL
;
1469 *pulRegDataType
= RegDataType
;
1471 HeapFree(GetProcessHeap(), 0, BufferW
);
1477 /***********************************************************************
1478 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1480 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1481 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1482 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1484 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1485 HSTRING_TABLE StringTable
= NULL
;
1486 CONFIGRET ret
= CR_SUCCESS
;
1488 ULONG ulDataType
= 0;
1489 ULONG ulTransferLength
= 0;
1491 TRACE("%lx %lu %p %p %p %lx %lx\n",
1492 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1496 return CR_INVALID_DEVNODE
;
1498 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1499 return CR_INVALID_PROPERTY
;
1501 /* pulRegDataType is optional */
1503 /* Buffer is optional */
1505 if (pulLength
== NULL
)
1506 return CR_INVALID_POINTER
;
1508 if (*pulLength
== 0)
1509 return CR_INVALID_POINTER
;
1512 return CR_INVALID_FLAG
;
1514 if (hMachine
!= NULL
)
1516 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1517 if (BindingHandle
== NULL
)
1520 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1521 if (StringTable
== 0)
1526 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1530 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1531 if (lpDevInst
== NULL
)
1532 return CR_INVALID_DEVNODE
;
1534 ulTransferLength
= *pulLength
;
1535 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1543 if (ret
== CR_SUCCESS
)
1545 if (pulRegDataType
!= NULL
)
1546 *pulRegDataType
= ulDataType
;
1553 /***********************************************************************
1554 * CM_Get_DevNode_Status [SETUPAPI.@]
1556 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1557 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1560 TRACE("%p %p %lx %lx\n",
1561 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1562 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1567 /***********************************************************************
1568 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1571 CM_Get_DevNode_Status_Ex(
1572 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1573 ULONG ulFlags
, HMACHINE hMachine
)
1575 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1576 HSTRING_TABLE StringTable
= NULL
;
1579 TRACE("%p %p %lx %lx %lx\n",
1580 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1582 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1583 return CR_INVALID_POINTER
;
1586 return CR_INVALID_DEVINST
;
1589 return CR_INVALID_FLAG
;
1591 if (hMachine
!= NULL
)
1593 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1594 if (BindingHandle
== NULL
)
1597 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1598 if (StringTable
== 0)
1603 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1607 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1608 if (lpDevInst
== NULL
)
1609 return CR_INVALID_DEVNODE
;
1611 return PNP_GetDeviceStatus(BindingHandle
,
1619 /***********************************************************************
1620 * CM_Get_Device_IDA [SETUPAPI.@]
1622 CONFIGRET WINAPI
CM_Get_Device_IDA(
1623 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1625 TRACE("%lx %p %ld %ld\n",
1626 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1627 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1631 /***********************************************************************
1632 * CM_Get_Device_IDW [SETUPAPI.@]
1634 CONFIGRET WINAPI
CM_Get_Device_IDW(
1635 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1637 TRACE("%lx %p %ld %ld\n",
1638 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1639 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1643 /***********************************************************************
1644 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1646 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1647 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1650 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1651 CONFIGRET ret
= CR_SUCCESS
;
1653 FIXME("%lx %p %ld %ld %lx\n",
1654 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1657 return CR_INVALID_POINTER
;
1659 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1664 if (ret
== CR_SUCCESS
)
1666 if (WideCharToMultiByte(CP_ACP
,
1669 lstrlenW(szBufferW
) + 1,
1681 /***********************************************************************
1682 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1684 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1685 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1688 HSTRING_TABLE StringTable
= NULL
;
1690 TRACE("%lx %p %ld %ld %lx\n",
1691 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1694 return CR_INVALID_DEVINST
;
1697 return CR_INVALID_POINTER
;
1700 return CR_INVALID_FLAG
;
1702 if (hMachine
!= NULL
)
1704 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1705 if (StringTable
== NULL
)
1710 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1714 if (!StringTableStringFromIdEx(StringTable
,
1724 /***********************************************************************
1725 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1727 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1728 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1730 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1731 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1736 /***********************************************************************
1737 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1739 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1740 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1742 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1743 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1748 /***********************************************************************
1749 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1751 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1752 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1755 LPWSTR BufferW
= NULL
;
1756 LPWSTR pszFilterW
= NULL
;
1757 CONFIGRET ret
= CR_SUCCESS
;
1759 FIXME("%p %p %ld %ld %lx\n",
1760 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1762 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1763 if (BufferW
== NULL
)
1764 return CR_OUT_OF_MEMORY
;
1766 if (pszFilter
== NULL
)
1768 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1776 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1778 ret
= CR_INVALID_DEVICE_ID
;
1782 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1791 if (WideCharToMultiByte(CP_ACP
,
1794 lstrlenW(BufferW
) + 1,
1808 /***********************************************************************
1809 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1811 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1812 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1815 FIXME("%p %p %ld %ld %lx\n",
1816 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1822 /***********************************************************************
1823 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
1825 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
1826 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
1828 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
1829 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
1833 /***********************************************************************
1834 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
1836 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
1837 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
1839 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
1840 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
1844 /***********************************************************************
1845 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
1847 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
1848 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1850 LPWSTR pszFilterW
= NULL
;
1851 CONFIGRET ret
= CR_SUCCESS
;
1853 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
1855 if (pszFilter
== NULL
)
1857 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1864 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1865 return CR_INVALID_DEVICE_ID
;
1867 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1879 /***********************************************************************
1880 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1882 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1883 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1885 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1887 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1890 return CR_INVALID_POINTER
;
1892 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
1893 return CR_INVALID_FLAG
;
1895 if (hMachine
!= NULL
)
1897 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1898 if (BindingHandle
== NULL
)
1903 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1909 return PNP_GetDeviceListSize(BindingHandle
,
1916 /***********************************************************************
1917 * CM_Get_Device_ID_Size [SETUPAPI.@]
1919 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1920 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1922 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1923 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1927 /***********************************************************************
1928 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1930 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1931 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1933 HSTRING_TABLE StringTable
= NULL
;
1936 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1939 return CR_INVALID_POINTER
;
1942 return CR_INVALID_DEVINST
;
1945 return CR_INVALID_FLAG
;
1947 if (hMachine
!= NULL
)
1949 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1950 if (StringTable
== NULL
)
1955 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1959 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1960 if (DeviceId
== NULL
)
1966 *pulLen
= lstrlenW(DeviceId
);
1972 /***********************************************************************
1973 * CM_Get_First_Log_Conf [SETUPAPI.@]
1975 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
1976 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
1978 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
1979 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
1983 /***********************************************************************
1984 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
1986 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
1987 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1989 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1990 HSTRING_TABLE StringTable
= NULL
;
1991 LPWSTR lpDevInst
= NULL
;
1992 CONFIGRET ret
= CR_SUCCESS
;
1994 PLOG_CONF_INFO pLogConfInfo
;
1996 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
1999 return CR_INVALID_DEVINST
;
2001 if (ulFlags
& ~LOG_CONF_BITS
)
2002 return CR_INVALID_FLAG
;
2007 if (hMachine
!= NULL
)
2009 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2010 if (BindingHandle
== NULL
)
2013 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2014 if (StringTable
== 0)
2019 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2023 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2024 if (lpDevInst
== NULL
)
2025 return CR_INVALID_DEVNODE
;
2027 ret
= PNP_GetFirstLogConf(BindingHandle
,
2032 if (ret
!= CR_SUCCESS
)
2035 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2036 if (pLogConfInfo
== NULL
)
2037 return CR_OUT_OF_MEMORY
;
2039 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2040 pLogConfInfo
->dnDevInst
= dnDevInst
;
2041 pLogConfInfo
->ulFlags
= ulFlags
;
2042 pLogConfInfo
->ulTag
= ulTag
;
2044 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2050 /***********************************************************************
2051 * CM_Get_Global_State [SETUPAPI.@]
2053 CONFIGRET WINAPI
CM_Get_Global_State(
2054 PULONG pulState
, ULONG ulFlags
)
2056 TRACE("%p %lx\n", pulState
, ulFlags
);
2057 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2061 /***********************************************************************
2062 * CM_Get_Global_State_Ex [SETUPAPI.@]
2064 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2065 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2067 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2069 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2071 if (pulState
== NULL
)
2072 return CR_INVALID_POINTER
;
2075 return CR_INVALID_FLAG
;
2077 if (hMachine
!= NULL
)
2079 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2080 if (BindingHandle
== NULL
)
2085 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2089 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2093 /***********************************************************************
2094 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2096 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2097 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2100 TRACE("%s %lu %p %lx\n", szDevInstName
,
2101 ulHardwareProfile
, pulValue
, ulFlags
);
2103 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2104 pulValue
, ulFlags
, NULL
);
2108 /***********************************************************************
2109 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2111 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2112 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2115 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2116 ulHardwareProfile
, pulValue
, ulFlags
);
2118 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2119 pulValue
, ulFlags
, NULL
);
2123 /***********************************************************************
2124 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2126 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2127 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2128 ULONG ulFlags
, HMACHINE hMachine
)
2130 DEVINSTID_W pszDevIdW
= NULL
;
2131 CONFIGRET ret
= CR_SUCCESS
;
2133 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2134 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2136 if (szDevInstName
!= NULL
)
2138 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2139 return CR_INVALID_DEVICE_ID
;
2142 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2143 pulValue
, ulFlags
, hMachine
);
2145 if (pszDevIdW
!= NULL
)
2152 /***********************************************************************
2153 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2155 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2156 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2157 ULONG ulFlags
, HMACHINE hMachine
)
2159 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2161 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2162 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2164 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2165 return CR_INVALID_POINTER
;
2168 return CR_INVALID_FLAG
;
2170 /* FIXME: Check whether szDevInstName is valid */
2172 if (hMachine
!= NULL
)
2174 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2175 if (BindingHandle
== NULL
)
2180 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2184 return PNP_HwProfFlags(BindingHandle
, PNP_GET_HW_PROFILE_FLAGS
, szDevInstName
,
2185 ulHardwareProfile
, pulValue
, 0);
2189 /***********************************************************************
2190 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
2192 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
2193 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
2195 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
2196 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
2200 /***********************************************************************
2201 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
2203 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
2204 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
2207 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2208 HSTRING_TABLE StringTable
= NULL
;
2209 PLOG_CONF_INFO pLogConfInfo
;
2212 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
2214 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2215 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2216 return CR_INVALID_LOG_CONF
;
2218 if (pPriority
== NULL
)
2219 return CR_INVALID_POINTER
;
2222 return CR_INVALID_FLAG
;
2224 if (hMachine
!= NULL
)
2226 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2227 if (BindingHandle
== NULL
)
2230 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2231 if (StringTable
== 0)
2236 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2240 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2241 if (lpDevInst
== NULL
)
2242 return CR_INVALID_DEVNODE
;
2244 return PNP_GetLogConfPriority(BindingHandle
,
2246 pLogConfInfo
->ulFlags
,
2247 pLogConfInfo
->ulTag
,
2253 /***********************************************************************
2254 * CM_Get_Next_Log_Conf [SETUPAPI.@]
2256 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
2257 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
2259 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
2260 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
2264 /***********************************************************************
2265 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
2267 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
2268 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
2271 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2272 HSTRING_TABLE StringTable
= NULL
;
2273 PLOG_CONF_INFO pLogConfInfo
;
2274 PLOG_CONF_INFO pNewLogConfInfo
;
2279 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
2284 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2285 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2286 return CR_INVALID_LOG_CONF
;
2289 return CR_INVALID_FLAG
;
2291 if (hMachine
!= NULL
)
2293 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2294 if (BindingHandle
== NULL
)
2297 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2298 if (StringTable
== 0)
2303 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2307 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2308 if (lpDevInst
== NULL
)
2309 return CR_INVALID_DEVNODE
;
2311 ret
= PNP_GetNextLogConf(BindingHandle
,
2313 pLogConfInfo
->ulFlags
,
2314 pLogConfInfo
->ulTag
,
2317 if (ret
!= CR_SUCCESS
)
2322 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2323 if (pNewLogConfInfo
== NULL
)
2324 return CR_OUT_OF_MEMORY
;
2326 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2327 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
2328 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
2329 pNewLogConfInfo
->ulTag
= ulNewTag
;
2331 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
2338 /***********************************************************************
2339 * CM_Get_Parent [SETUPAPI.@]
2341 CONFIGRET WINAPI
CM_Get_Parent(
2342 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2344 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2345 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2349 /***********************************************************************
2350 * CM_Get_Parent_Ex [SETUPAPI.@]
2352 CONFIGRET WINAPI
CM_Get_Parent_Ex(
2353 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2355 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2356 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2357 HSTRING_TABLE StringTable
= NULL
;
2362 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2364 if (pdnDevInst
== NULL
)
2365 return CR_INVALID_POINTER
;
2368 return CR_INVALID_DEVINST
;
2371 return CR_INVALID_FLAG
;
2375 if (hMachine
!= NULL
)
2377 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2378 if (BindingHandle
== NULL
)
2381 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2382 if (StringTable
== 0)
2387 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2391 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2392 if (lpDevInst
== NULL
)
2393 return CR_INVALID_DEVNODE
;
2395 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2401 if (ret
!= CR_SUCCESS
)
2404 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2406 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2410 *pdnDevInst
= dwIndex
;
2416 /***********************************************************************
2417 * CM_Get_Sibling [SETUPAPI.@]
2419 CONFIGRET WINAPI
CM_Get_Sibling(
2420 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2422 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2423 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2427 /***********************************************************************
2428 * CM_Get_Sibling_Ex [SETUPAPI.@]
2430 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
2431 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2433 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2434 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2435 HSTRING_TABLE StringTable
= NULL
;
2440 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2442 if (pdnDevInst
== NULL
)
2443 return CR_INVALID_POINTER
;
2446 return CR_INVALID_DEVINST
;
2449 return CR_INVALID_FLAG
;
2453 if (hMachine
!= NULL
)
2455 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2456 if (BindingHandle
== NULL
)
2459 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2460 if (StringTable
== 0)
2465 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2469 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2470 if (lpDevInst
== NULL
)
2471 return CR_INVALID_DEVNODE
;
2473 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2479 if (ret
!= CR_SUCCESS
)
2482 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2484 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2488 *pdnDevInst
= dwIndex
;
2494 /***********************************************************************
2495 * CM_Get_Version [SETUPAPI.@]
2497 WORD WINAPI
CM_Get_Version(VOID
)
2500 return CM_Get_Version_Ex(NULL
);
2504 /***********************************************************************
2505 * CM_Get_Version_Ex [SETUPAPI.@]
2507 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
2509 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2512 TRACE("%lx\n", hMachine
);
2514 if (hMachine
!= NULL
)
2516 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2517 if (BindingHandle
== NULL
)
2522 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2526 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
2533 /***********************************************************************
2534 * CM_Is_Dock_Station_Present [SETUPAPI.@]
2536 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
2539 TRACE("%p\n", pbPresent
);
2540 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
2544 /***********************************************************************
2545 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
2547 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
2548 PBOOL pbPresent
, HMACHINE hMachine
)
2550 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2552 TRACE("%p %lx\n", pbPresent
, hMachine
);
2554 if (pbPresent
== NULL
)
2555 return CR_INVALID_POINTER
;
2559 if (hMachine
!= NULL
)
2561 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2562 if (BindingHandle
== NULL
)
2567 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2571 return PNP_IsDockStationPresent(BindingHandle
,
2572 (unsigned long *)pbPresent
);
2576 /***********************************************************************
2577 * CM_Locate_DevNodeA [SETUPAPI.@]
2579 CONFIGRET WINAPI
CM_Locate_DevNodeA(
2580 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
2582 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
2583 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2587 /***********************************************************************
2588 * CM_Locate_DevNodeW [SETUPAPI.@]
2590 CONFIGRET WINAPI
CM_Locate_DevNodeW(
2591 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
2593 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
2594 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2598 /***********************************************************************
2599 * CM_Locate_DevNode_ExA [SETUPAPI.@]
2601 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
2602 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2604 DEVINSTID_W pDevIdW
= NULL
;
2605 CONFIGRET ret
= CR_SUCCESS
;
2607 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
2609 if (pDeviceID
!= NULL
)
2611 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
2612 return CR_INVALID_DEVICE_ID
;
2615 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
2617 if (pDevIdW
!= NULL
)
2624 /***********************************************************************
2625 * CM_Locate_DevNode_ExW [SETUPAPI.@]
2627 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
2628 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2630 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
2631 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2632 HSTRING_TABLE StringTable
= NULL
;
2633 CONFIGRET ret
= CR_SUCCESS
;
2635 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
2637 if (pdnDevInst
== NULL
)
2638 return CR_INVALID_POINTER
;
2640 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
2641 return CR_INVALID_FLAG
;
2643 if (hMachine
!= NULL
)
2645 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2646 if (BindingHandle
== NULL
)
2649 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2650 if (StringTable
== 0)
2655 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2659 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
2661 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
2665 /* Get the root device ID */
2666 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
2669 if (ret
!= CR_SUCCESS
)
2672 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
2674 /* Validate the device ID */
2675 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
2678 if (ret
== CR_SUCCESS
)
2680 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
2681 if (*pdnDevInst
== -1)
2689 /***********************************************************************
2690 * CM_Move_DevNode [SETUPAPI.@]
2692 CONFIGRET WINAPI
CM_Move_DevNode(
2693 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
2695 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
2696 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
2700 /***********************************************************************
2701 * CM_Move_DevNode_Ex [SETUPAPI.@]
2703 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
2704 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
2707 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2708 HSTRING_TABLE StringTable
= NULL
;
2709 LPWSTR lpFromDevInst
;
2712 FIXME("%lx %lx %lx %lx\n",
2713 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
2715 if (!IsUserAnAdmin())
2716 return CR_ACCESS_DENIED
;
2718 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
2719 return CR_INVALID_DEVNODE
;
2722 return CR_INVALID_FLAG
;
2724 if (hMachine
!= NULL
)
2726 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2727 if (BindingHandle
== NULL
)
2730 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2731 if (StringTable
== 0)
2736 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2740 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
2741 if (lpFromDevInst
== NULL
)
2742 return CR_INVALID_DEVNODE
;
2744 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
2745 if (lpToDevInst
== NULL
)
2746 return CR_INVALID_DEVNODE
;
2748 return PNP_DeviceInstanceAction(BindingHandle
,
2756 /***********************************************************************
2757 * CM_Open_Class_KeyA [SETUPAPI.@]
2759 CONFIGRET WINAPI
CM_Open_Class_KeyA(
2760 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
2761 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
2763 TRACE("%p %s %lx %lx %p %lx\n",
2764 debugstr_guid(pClassGuid
), pszClassName
,
2765 samDesired
, Disposition
, phkClass
, ulFlags
);
2767 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
2768 Disposition
, phkClass
, ulFlags
, NULL
);
2772 /***********************************************************************
2773 * CM_Open_Class_KeyW [SETUPAPI.@]
2775 CONFIGRET WINAPI
CM_Open_Class_KeyW(
2776 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
2777 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
2779 TRACE("%p %s %lx %lx %p %lx\n",
2780 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
2781 samDesired
, Disposition
, phkClass
, ulFlags
);
2783 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
2784 Disposition
, phkClass
, ulFlags
, NULL
);
2788 /***********************************************************************
2789 * CM_Open_Class_Key_ExA [SETUPAPI.@]
2791 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
2792 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
2793 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2796 CONFIGRET rc
= CR_SUCCESS
;
2797 LPWSTR pszClassNameW
= NULL
;
2799 TRACE("%p %s %lx %lx %p %lx %lx\n",
2800 debugstr_guid(pClassGuid
), pszClassName
,
2801 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2803 if (pszClassName
!= NULL
)
2805 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
2806 return CR_INVALID_DATA
;
2809 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
2810 Disposition
, phkClass
, ulFlags
, hMachine
);
2812 if (pszClassNameW
!= NULL
)
2813 MyFree(pszClassNameW
);
2819 /***********************************************************************
2820 * CM_Open_Class_Key_ExW [SETUPAPI.@]
2822 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
2823 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
2824 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2827 WCHAR szKeyName
[MAX_PATH
];
2828 LPWSTR lpGuidString
;
2829 DWORD dwDisposition
;
2833 TRACE("%p %s %lx %lx %p %lx %lx\n",
2834 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
2835 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2837 /* Check Disposition and ulFlags */
2838 if ((Disposition
& ~RegDisposition_Bits
) ||
2839 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
2840 return CR_INVALID_FLAG
;
2842 /* Check phkClass */
2843 if (phkClass
== NULL
)
2844 return CR_INVALID_POINTER
;
2848 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
2849 pszClassName
!= NULL
)
2850 return CR_INVALID_DATA
;
2852 if (hMachine
== NULL
)
2854 hKey
= HKEY_LOCAL_MACHINE
;
2858 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
2859 HKEY_LOCAL_MACHINE
, &hKey
))
2860 return CR_REGISTRY_ERROR
;
2863 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
2865 lstrcpyW(szKeyName
, DeviceClasses
);
2869 lstrcpyW(szKeyName
, ControlClass
);
2872 if (pClassGuid
!= NULL
)
2874 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
2877 return CR_INVALID_DATA
;
2880 lstrcatW(szKeyName
, Backslash
);
2881 lstrcatW(szKeyName
, lpGuidString
);
2884 if (Disposition
== RegDisposition_OpenAlways
)
2886 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
2887 NULL
, phkClass
, &dwDisposition
);
2891 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
2896 if (pClassGuid
!= NULL
)
2897 RpcStringFreeW(&lpGuidString
);
2899 if (dwError
!= ERROR_SUCCESS
)
2902 return CR_NO_SUCH_REGISTRY_KEY
;
2905 if (pszClassName
!= NULL
)
2907 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
2908 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
2915 /***********************************************************************
2916 * CM_Open_DevNode_Key [SETUPAPI.@]
2918 CONFIGRET WINAPI
CM_Open_DevNode_Key(
2919 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
2920 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
2922 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
2923 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
2924 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
2925 Disposition
, phkDevice
, ulFlags
, NULL
);
2929 /***********************************************************************
2930 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
2932 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
2933 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
2934 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
2937 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
2938 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
2940 return CR_CALL_NOT_IMPLEMENTED
;
2944 /***********************************************************************
2945 * CM_Reenumerate_DevNode [SETUPAPI.@]
2947 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
2948 DEVINST dnDevInst
, ULONG ulFlags
)
2950 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
2951 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
2955 /***********************************************************************
2956 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
2959 CM_Reenumerate_DevNode_Ex(
2960 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2962 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2963 HSTRING_TABLE StringTable
= NULL
;
2966 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
2969 return CR_INVALID_DEVNODE
;
2971 if (ulFlags
& ~CM_REENUMERATE_BITS
)
2972 return CR_INVALID_FLAG
;
2974 if (hMachine
!= NULL
)
2976 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2977 if (BindingHandle
== NULL
)
2980 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2981 if (StringTable
== 0)
2986 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2990 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2991 if (lpDevInst
== NULL
)
2992 return CR_INVALID_DEVNODE
;
2994 return PNP_DeviceInstanceAction(BindingHandle
,
3002 /***********************************************************************
3003 * CM_Request_Eject_PC [SETUPAPI.@]
3005 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
3008 return CM_Request_Eject_PC_Ex(NULL
);
3012 /***********************************************************************
3013 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
3015 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
3018 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3020 TRACE("%lx\n", hMachine
);
3022 if (hMachine
!= NULL
)
3024 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3025 if (BindingHandle
== NULL
)
3030 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3034 return PNP_RequestEjectPC(BindingHandle
);
3038 /***********************************************************************
3039 * CM_Run_Detection [SETUPAPI.@]
3041 CONFIGRET WINAPI
CM_Run_Detection(
3044 TRACE("%lx\n", ulFlags
);
3045 return CM_Run_Detection_Ex(ulFlags
, NULL
);
3049 /***********************************************************************
3050 * CM_Run_Detection_Ex [SETUPAPI.@]
3052 CONFIGRET WINAPI
CM_Run_Detection_Ex(
3053 ULONG ulFlags
, HMACHINE hMachine
)
3055 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3057 TRACE("%lx %lx\n", ulFlags
, hMachine
);
3059 if (!IsUserAnAdmin())
3060 return CR_ACCESS_DENIED
;
3062 if (ulFlags
& ~CM_DETECT_BITS
)
3063 return CR_INVALID_FLAG
;
3065 if (hMachine
!= NULL
)
3067 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3068 if (BindingHandle
== NULL
)
3073 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3077 return PNP_RunDetection(BindingHandle
,
3082 /***********************************************************************
3083 * CM_Set_DevNode_Problem [SETUPAPI.@]
3085 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
3086 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
3088 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
3089 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
3093 /***********************************************************************
3094 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
3096 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
3097 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
3099 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3100 HSTRING_TABLE StringTable
= NULL
;
3103 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
3106 return CR_INVALID_DEVNODE
;
3108 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
3109 return CR_INVALID_FLAG
;
3111 if (hMachine
!= NULL
)
3113 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3114 if (BindingHandle
== NULL
)
3117 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3118 if (StringTable
== 0)
3123 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3127 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3128 if (lpDevInst
== NULL
)
3129 return CR_INVALID_DEVNODE
;
3131 return PNP_SetDeviceProblem(BindingHandle
,
3138 /***********************************************************************
3139 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
3141 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
3142 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3145 TRACE("%lx %lu %p %lx %lx\n",
3146 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3147 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3153 /***********************************************************************
3154 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
3156 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
3157 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3160 TRACE("%lx %lu %p %lx %lx\n",
3161 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3162 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3168 /***********************************************************************
3169 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
3171 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
3172 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3173 ULONG ulFlags
, HMACHINE hMachine
)
3175 CONFIGRET ret
= CR_SUCCESS
;
3179 FIXME("%lx %lu %p %lx %lx %lx\n",
3180 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3182 if (Buffer
== NULL
&& ulLength
!= 0)
3183 return CR_INVALID_POINTER
;
3187 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3196 /* Get property type */
3199 case CM_DRP_DEVICEDESC
:
3203 case CM_DRP_HARDWAREID
:
3204 ulType
= REG_MULTI_SZ
;
3207 case CM_DRP_COMPATIBLEIDS
:
3208 ulType
= REG_MULTI_SZ
;
3211 case CM_DRP_SERVICE
:
3219 case CM_DRP_CLASSGUID
:
3227 case CM_DRP_CONFIGFLAGS
:
3235 case CM_DRP_FRIENDLYNAME
:
3239 case CM_DRP_LOCATION_INFORMATION
:
3243 case CM_DRP_UPPERFILTERS
:
3244 ulType
= REG_MULTI_SZ
;
3247 case CM_DRP_LOWERFILTERS
:
3248 ulType
= REG_MULTI_SZ
;
3252 return CR_INVALID_PROPERTY
;
3255 /* Allocate buffer if needed */
3256 if (ulType
== REG_SZ
||
3257 ulType
== REG_MULTI_SZ
)
3259 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
3260 if (lpBuffer
== NULL
)
3262 ret
= CR_OUT_OF_MEMORY
;
3266 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
3267 ulLength
, lpBuffer
, ulLength
))
3274 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3277 ulLength
* sizeof(WCHAR
),
3286 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3294 ret
= CR_CALL_NOT_IMPLEMENTED
;
3301 /***********************************************************************
3302 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
3304 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
3305 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3306 ULONG ulFlags
, HMACHINE hMachine
)
3308 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3309 HSTRING_TABLE StringTable
= NULL
;
3313 TRACE("%lx %lu %p %lx %lx %lx\n",
3314 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3317 return CR_INVALID_DEVNODE
;
3319 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3320 return CR_INVALID_PROPERTY
;
3322 if (Buffer
!= NULL
&& ulLength
== 0)
3323 return CR_INVALID_POINTER
;
3326 return CR_INVALID_FLAG
;
3328 if (hMachine
!= NULL
)
3330 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3331 if (BindingHandle
== NULL
)
3334 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3335 if (StringTable
== 0)
3340 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3344 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3345 if (lpDevInst
== NULL
)
3346 return CR_INVALID_DEVNODE
;
3350 case CM_DRP_DEVICEDESC
:
3354 case CM_DRP_HARDWAREID
:
3355 ulType
= REG_MULTI_SZ
;
3358 case CM_DRP_COMPATIBLEIDS
:
3359 ulType
= REG_MULTI_SZ
;
3362 case CM_DRP_SERVICE
:
3370 case CM_DRP_CLASSGUID
:
3378 case CM_DRP_CONFIGFLAGS
:
3386 case CM_DRP_FRIENDLYNAME
:
3390 case CM_DRP_LOCATION_INFORMATION
:
3394 case CM_DRP_UPPERFILTERS
:
3395 ulType
= REG_MULTI_SZ
;
3398 case CM_DRP_LOWERFILTERS
:
3399 ulType
= REG_MULTI_SZ
;
3403 return CR_INVALID_PROPERTY
;
3406 return PNP_SetDeviceRegProp(BindingHandle
,
3416 /***********************************************************************
3417 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
3419 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
3420 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3423 TRACE("%s %lu %lu %lx\n", szDevInstName
,
3424 ulConfig
, ulValue
, ulFlags
);
3425 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
3430 /***********************************************************************
3431 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
3433 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
3434 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3437 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
3438 ulConfig
, ulValue
, ulFlags
);
3439 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
3444 /***********************************************************************
3445 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
3447 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
3448 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3449 ULONG ulFlags
, HMACHINE hMachine
)
3451 DEVINSTID_W pszDevIdW
= NULL
;
3452 CONFIGRET ret
= CR_SUCCESS
;
3454 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
3455 ulConfig
, ulValue
, ulFlags
, hMachine
);
3457 if (szDevInstName
!= NULL
)
3459 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3460 return CR_INVALID_DEVICE_ID
;
3463 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
3466 if (pszDevIdW
!= NULL
)
3473 /***********************************************************************
3474 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
3476 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
3477 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3478 ULONG ulFlags
, HMACHINE hMachine
)
3480 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3482 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
3483 ulConfig
, ulValue
, ulFlags
, hMachine
);
3485 if (szDevInstName
== NULL
)
3486 return CR_INVALID_POINTER
;
3488 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
3489 return CR_INVALID_FLAG
;
3491 /* FIXME: Check whether szDevInstName is valid */
3493 if (hMachine
!= NULL
)
3495 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3496 if (BindingHandle
== NULL
)
3501 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3505 return PNP_HwProfFlags(BindingHandle
, PNP_SET_HW_PROFILE_FLAGS
, szDevInstName
,
3506 ulConfig
, &ulValue
, 0);
3510 /***********************************************************************
3511 * CM_Setup_DevNode [SETUPAPI.@]
3513 CONFIGRET WINAPI
CM_Setup_DevNode(
3514 DEVINST dnDevInst
, ULONG ulFlags
)
3516 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
3517 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
3521 /***********************************************************************
3522 * CM_Setup_DevNode_Ex [SETUPAPI.@]
3524 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
3525 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3527 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3528 HSTRING_TABLE StringTable
= NULL
;
3531 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
3533 if (!IsUserAnAdmin())
3534 return CR_ACCESS_DENIED
;
3537 return CR_INVALID_DEVNODE
;
3539 if (ulFlags
& ~CM_SETUP_BITS
)
3540 return CR_INVALID_FLAG
;
3542 if (hMachine
!= NULL
)
3544 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3545 if (BindingHandle
== NULL
)
3548 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3549 if (StringTable
== 0)
3554 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3558 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3559 if (lpDevInst
== NULL
)
3560 return CR_INVALID_DEVNODE
;
3562 return PNP_DeviceInstanceAction(BindingHandle
,
3570 /***********************************************************************
3571 * CM_Uninstall_DevNode [SETUPAPI.@]
3573 CONFIGRET WINAPI
CM_Uninstall_DevNode(
3574 DEVINST dnPhantom
, ULONG ulFlags
)
3576 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
3577 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
3581 /***********************************************************************
3582 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
3584 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
3585 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
3587 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3588 HSTRING_TABLE StringTable
= NULL
;
3591 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
3594 return CR_INVALID_DEVNODE
;
3597 return CR_INVALID_FLAG
;
3599 if (hMachine
!= NULL
)
3601 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3602 if (BindingHandle
== NULL
)
3605 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3606 if (StringTable
== 0)
3611 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3615 lpDevInst
= StringTableStringFromId(StringTable
, dnPhantom
);
3616 if (lpDevInst
== NULL
)
3617 return CR_INVALID_DEVNODE
;
3619 return PNP_UninstallDevInst(BindingHandle
,