2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "setupapi_private.h"
35 #include "rpc_private.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
43 /* Registry key and value names */
44 static const WCHAR Backslash
[] = {'\\', 0};
45 static const WCHAR Class
[] = {'C','l','a','s','s',0};
47 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
48 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
49 'C','o','n','t','r','o','l','\\',
50 'C','l','a','s','s',0};
52 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
53 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
54 'C','o','n','t','r','o','l','\\',
55 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
57 typedef struct _MACHINE_INFO
59 WCHAR szMachineName
[MAX_PATH
];
60 RPC_BINDING_HANDLE BindingHandle
;
61 HSTRING_TABLE StringTable
;
62 } MACHINE_INFO
, *PMACHINE_INFO
;
65 /***********************************************************************
66 * CM_Connect_MachineA [SETUPAPI.@]
68 CONFIGRET WINAPI
CM_Connect_MachineA(PCSTR UNCServerName
, PHMACHINE phMachine
)
73 TRACE("%s %p\n", UNCServerName
, phMachine
);
75 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
76 return CM_Connect_MachineW(NULL
, phMachine
);
78 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
79 return CR_INVALID_DATA
;
81 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
89 /***********************************************************************
90 * CM_Connect_MachineW [SETUPAPI.@]
92 CONFIGRET WINAPI
CM_Connect_MachineW(PCWSTR UNCServerName
, PHMACHINE phMachine
)
94 PMACHINE_INFO pMachine
;
96 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
98 pMachine
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(MACHINE_INFO
));
100 return CR_OUT_OF_MEMORY
;
102 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
104 pMachine
->StringTable
= StringTableInitialize();
105 if (pMachine
->StringTable
== NULL
)
107 HeapFree(GetProcessHeap(), 0, pMachine
);
111 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
113 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
115 StringTableDestroy(pMachine
->StringTable
);
116 HeapFree(GetProcessHeap(), 0, pMachine
);
117 return CR_INVALID_MACHINENAME
;
120 phMachine
= (PHMACHINE
)pMachine
;
126 /***********************************************************************
127 * CM_Disconnect_Machine [SETUPAPI.@]
129 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
131 PMACHINE_INFO pMachine
;
133 TRACE("%lx\n", hMachine
);
135 pMachine
= (PMACHINE_INFO
)hMachine
;
136 if (pMachine
== NULL
)
139 if (pMachine
->StringTable
!= NULL
)
140 StringTableDestroy(pMachine
->StringTable
);
142 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
143 return CR_ACCESS_DENIED
;
145 HeapFree(GetProcessHeap(), 0, pMachine
);
151 /***********************************************************************
152 * CM_Enumerate_Classes [SETUPAPI.@]
154 CONFIGRET WINAPI
CM_Enumerate_Classes(
155 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
157 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
158 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
162 static CONFIGRET
GetCmCodeFromErrorCode(DWORD ErrorCode
)
169 case ERROR_ACCESS_DENIED
:
170 return CR_ACCESS_DENIED
;
172 case ERROR_INSUFFICIENT_BUFFER
:
173 return CR_BUFFER_SMALL
;
175 case ERROR_INVALID_DATA
:
176 return CR_INVALID_DATA
;
178 case ERROR_INVALID_PARAMETER
:
179 return CR_INVALID_DATA
;
181 case ERROR_NO_MORE_ITEMS
:
182 return CR_NO_SUCH_VALUE
;
184 case ERROR_NO_SYSTEM_RESOURCES
:
185 return CR_OUT_OF_MEMORY
;
193 /***********************************************************************
194 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
196 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
197 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
199 HKEY hRelativeKey
, hKey
;
201 WCHAR Buffer
[MAX_GUID_STRING_LEN
];
203 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
205 if (ClassGuid
== NULL
)
206 return CR_INVALID_POINTER
;
209 return CR_INVALID_FLAG
;
211 if (hMachine
!= NULL
)
213 FIXME("hMachine argument ignored\n");
214 hRelativeKey
= HKEY_LOCAL_MACHINE
; /* FIXME: use here a field in hMachine */
217 hRelativeKey
= HKEY_LOCAL_MACHINE
;
223 KEY_ENUMERATE_SUB_KEYS
,
225 if (rc
!= ERROR_SUCCESS
)
226 return GetCmCodeFromErrorCode(rc
);
232 sizeof(Buffer
) / sizeof(WCHAR
));
236 if (rc
== ERROR_SUCCESS
)
239 Buffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
240 /* Convert the buffer to a GUID */
241 if (UuidFromStringW(&Buffer
[1], ClassGuid
) != RPC_S_OK
)
245 return GetCmCodeFromErrorCode(rc
);
249 /***********************************************************************
250 * CM_Get_Child [SETUPAPI.@]
252 CONFIGRET WINAPI
CM_Get_Child(
253 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
255 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
256 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
260 /***********************************************************************
261 * CM_Get_Child_Ex [SETUPAPI.@]
263 CONFIGRET WINAPI
CM_Get_Child_Ex(
264 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
266 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
267 RPC_BINDING_HANDLE BindingHandle
= NULL
;
268 HSTRING_TABLE StringTable
= NULL
;
273 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
275 if (pdnDevInst
== NULL
)
276 return CR_INVALID_POINTER
;
279 return CR_INVALID_DEVINST
;
282 return CR_INVALID_FLAG
;
286 if (hMachine
!= NULL
)
288 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
289 if (BindingHandle
== NULL
)
292 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
293 if (StringTable
== 0)
298 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
302 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
303 if (lpDevInst
== NULL
)
304 return CR_INVALID_DEVNODE
;
306 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
312 if (ret
!= CR_SUCCESS
)
315 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
317 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
321 *pdnDevInst
= dwIndex
;
327 /***********************************************************************
328 * CM_Get_Class_Key_NameA [SETUPAPI.@]
330 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
331 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
333 TRACE("%p %p %p %lx\n",
334 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
335 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
340 /***********************************************************************
341 * CM_Get_Class_Key_NameW [SETUPAPI.@]
343 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
344 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
346 TRACE("%p %p %p %lx\n",
347 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
348 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
353 /***********************************************************************
354 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
356 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
357 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
360 FIXME("%p %p %p %lx %lx\n",
361 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
366 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
370 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
373 lstrcpyW(String
, lpString
);
375 RpcStringFree(&lpString
);
381 /***********************************************************************
382 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
384 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
385 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
388 TRACE("%p %p %p %lx %lx\n",
389 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
391 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
392 return CR_INVALID_POINTER
;
395 return CR_INVALID_FLAG
;
397 if (*pulLength
< MAX_GUID_STRING_LEN
)
400 return CR_BUFFER_SMALL
;
403 if (!GuidToString(ClassGuid
, pszKeyName
))
404 return CR_INVALID_DATA
;
406 *pulLength
= MAX_GUID_STRING_LEN
;
412 /***********************************************************************
413 * CM_Get_Class_NameA [SETUPAPI.@]
415 CONFIGRET WINAPI
CM_Get_Class_NameA(
416 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
418 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
419 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
424 /***********************************************************************
425 * CM_Get_Class_NameW [SETUPAPI.@]
427 CONFIGRET WINAPI
CM_Get_Class_NameW(
428 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
430 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
431 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
436 /***********************************************************************
437 * CM_Get_Class_Name_ExA [SETUPAPI.@]
439 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
440 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
443 FIXME("%p %p %p %lx %lx\n",
444 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
449 /***********************************************************************
450 * CM_Get_Class_Name_ExW [SETUPAPI.@]
453 CM_Get_Class_Name_ExW(
454 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
457 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
458 RPC_BINDING_HANDLE BindingHandle
= NULL
;
460 TRACE("%p %p %p %lx %lx\n",
461 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
463 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
464 return CR_INVALID_POINTER
;
467 return CR_INVALID_FLAG
;
469 if (!GuidToString(ClassGuid
, szGuidString
))
470 return CR_INVALID_DATA
;
472 TRACE("Guid %s\n", debugstr_w(szGuidString
));
474 if (hMachine
!= NULL
)
476 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
477 if (BindingHandle
== NULL
)
482 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
486 return PNP_GetClassName(BindingHandle
,
494 /***********************************************************************
495 * CM_Get_Depth [SETUPAPI.@]
497 CONFIGRET WINAPI
CM_Get_Depth(
498 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
500 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
501 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
505 /***********************************************************************
506 * CM_Get_Depth_Ex [SETUPAPI.@]
508 CONFIGRET WINAPI
CM_Get_Depth_Ex(
509 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
511 RPC_BINDING_HANDLE BindingHandle
= NULL
;
512 HSTRING_TABLE StringTable
= NULL
;
515 TRACE("%p %lx %lx %lx\n",
516 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
518 if (pulDepth
== NULL
)
519 return CR_INVALID_POINTER
;
522 return CR_INVALID_DEVINST
;
525 return CR_INVALID_FLAG
;
527 if (hMachine
!= NULL
)
529 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
530 if (BindingHandle
== NULL
)
533 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
534 if (StringTable
== 0)
539 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
543 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
544 if (lpDevInst
== NULL
)
545 return CR_INVALID_DEVNODE
;
547 return PNP_GetDepth(BindingHandle
,
554 /***********************************************************************
555 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
557 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
558 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
559 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
561 TRACE("%lx %lu %p %p %p %lx\n",
562 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
564 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
565 pulRegDataType
, Buffer
,
566 pulLength
, ulFlags
, NULL
);
570 /***********************************************************************
571 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
573 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
574 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
575 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
577 TRACE("%lx %lu %p %p %p %lx\n",
578 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
580 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
581 pulRegDataType
, Buffer
,
582 pulLength
, ulFlags
, NULL
);
586 /***********************************************************************
587 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
589 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
590 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
591 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
593 FIXME("%lx %lu %p %p %p %lx %lx\n",
594 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
597 return CR_CALL_NOT_IMPLEMENTED
;
601 /***********************************************************************
602 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
604 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
605 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
606 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
608 RPC_BINDING_HANDLE BindingHandle
= NULL
;
609 HSTRING_TABLE StringTable
= NULL
;
610 CONFIGRET ret
= CR_SUCCESS
;
612 ULONG ulDataType
= 0;
613 ULONG ulTransferLength
= 0;
615 FIXME("%lx %lu %p %p %p %lx %lx\n",
616 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
620 return CR_INVALID_DEVNODE
;
622 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
623 return CR_INVALID_PROPERTY
;
625 /* pulRegDataType is optional */
627 /* Buffer is optional */
629 if (pulLength
== NULL
)
630 return CR_INVALID_POINTER
;
633 return CR_INVALID_POINTER
;
636 return CR_INVALID_FLAG
;
638 if (hMachine
!= NULL
)
640 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
641 if (BindingHandle
== NULL
)
644 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
645 if (StringTable
== 0)
650 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
654 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
655 if (lpDevInst
== NULL
)
656 return CR_INVALID_DEVNODE
;
658 ulTransferLength
= *pulLength
;
659 ret
= PNP_GetDeviceRegProp(BindingHandle
,
667 if (ret
== CR_SUCCESS
)
669 if (pulRegDataType
!= NULL
)
670 *pulRegDataType
= ulDataType
;
677 /***********************************************************************
678 * CM_Get_DevNode_Status [SETUPAPI.@]
680 CONFIGRET WINAPI
CM_Get_DevNode_Status(
681 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
684 TRACE("%p %p %lx %lx\n",
685 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
686 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
691 /***********************************************************************
692 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
695 CM_Get_DevNode_Status_Ex(
696 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
697 ULONG ulFlags
, HMACHINE hMachine
)
699 RPC_BINDING_HANDLE BindingHandle
= NULL
;
700 HSTRING_TABLE StringTable
= NULL
;
703 TRACE("%p %p %lx %lx %lx\n",
704 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
706 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
707 return CR_INVALID_POINTER
;
710 return CR_INVALID_DEVINST
;
713 return CR_INVALID_FLAG
;
715 if (hMachine
!= NULL
)
717 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
718 if (BindingHandle
== NULL
)
721 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
722 if (StringTable
== 0)
727 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
731 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
732 if (lpDevInst
== NULL
)
733 return CR_INVALID_DEVNODE
;
735 return PNP_GetDeviceStatus(BindingHandle
,
743 /***********************************************************************
744 * CM_Get_Device_IDA [SETUPAPI.@]
746 CONFIGRET WINAPI
CM_Get_Device_IDA(
747 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
749 TRACE("%lx %p %ld %ld\n",
750 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
751 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
755 /***********************************************************************
756 * CM_Get_Device_IDW [SETUPAPI.@]
758 CONFIGRET WINAPI
CM_Get_Device_IDW(
759 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
761 TRACE("%lx %p %ld %ld\n",
762 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
763 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
767 /***********************************************************************
768 * CM_Get_Device_ID_ExA [SETUPAPI.@]
770 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
771 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
774 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
775 CONFIGRET ret
= CR_SUCCESS
;
777 FIXME("%lx %p %ld %ld %lx\n",
778 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
781 return CR_INVALID_POINTER
;
783 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
788 if (ret
== CR_SUCCESS
)
790 if (WideCharToMultiByte(CP_ACP
,
793 lstrlenW(szBufferW
) + 1,
805 /***********************************************************************
806 * CM_Get_Device_ID_ExW [SETUPAPI.@]
808 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
809 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
812 HSTRING_TABLE StringTable
= NULL
;
814 TRACE("%lx %p %ld %ld %lx\n",
815 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
818 return CR_INVALID_DEVINST
;
821 return CR_INVALID_POINTER
;
824 return CR_INVALID_FLAG
;
826 if (hMachine
!= NULL
)
828 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
829 if (StringTable
== NULL
)
834 if (!PnpGetLocalHandles(NULL
, &StringTable
))
838 if (!StringTableStringFromIdEx(StringTable
,
848 /***********************************************************************
849 * CM_Get_Device_ID_ListA [SETUPAPI.@]
851 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
852 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
854 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
855 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
860 /***********************************************************************
861 * CM_Get_Device_ID_ListW [SETUPAPI.@]
863 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
864 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
866 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
867 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
872 /***********************************************************************
873 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
875 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
876 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
879 LPWSTR BufferW
= NULL
;
880 LPWSTR pszFilterW
= NULL
;
881 CONFIGRET ret
= CR_SUCCESS
;
883 FIXME("%p %p %ld %ld %lx\n",
884 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
886 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
888 return CR_OUT_OF_MEMORY
;
890 if (pszFilter
== NULL
)
892 ret
= CM_Get_Device_ID_List_ExW(NULL
,
900 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
902 ret
= CR_INVALID_DEVICE_ID
;
906 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
915 if (WideCharToMultiByte(CP_ACP
,
918 lstrlenW(BufferW
) + 1,
932 /***********************************************************************
933 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
935 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
936 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
939 FIXME("%p %p %ld %ld %lx\n",
940 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
946 /***********************************************************************
947 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
949 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
950 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
952 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
953 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
957 /***********************************************************************
958 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
960 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
961 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
963 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
964 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
968 /***********************************************************************
969 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
971 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
972 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
974 LPWSTR pszFilterW
= NULL
;
975 CONFIGRET ret
= CR_SUCCESS
;
977 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
979 if (pszFilter
== NULL
)
981 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
988 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
989 return CR_INVALID_DEVICE_ID
;
991 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1003 /***********************************************************************
1004 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1006 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1007 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1009 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1015 /***********************************************************************
1016 * CM_Get_Device_ID_Size [SETUPAPI.@]
1018 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1019 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1021 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1022 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1026 /***********************************************************************
1027 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1029 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1030 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1032 HSTRING_TABLE StringTable
= NULL
;
1035 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1038 return CR_INVALID_POINTER
;
1041 return CR_INVALID_DEVINST
;
1044 return CR_INVALID_FLAG
;
1046 if (hMachine
!= NULL
)
1048 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1049 if (StringTable
== NULL
)
1054 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1058 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1059 if (DeviceId
== NULL
)
1065 *pulLen
= lstrlenW(DeviceId
);
1071 /***********************************************************************
1072 * CM_Get_Global_State [SETUPAPI.@]
1074 CONFIGRET WINAPI
CM_Get_Global_State(
1075 PULONG pulState
, ULONG ulFlags
)
1077 TRACE("%p %lx\n", pulState
, ulFlags
);
1078 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
1082 /***********************************************************************
1083 * CM_Get_Global_State_Ex [SETUPAPI.@]
1085 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
1086 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
1088 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1090 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
1092 if (pulState
== NULL
)
1093 return CR_INVALID_POINTER
;
1096 return CR_INVALID_FLAG
;
1098 if (hMachine
!= NULL
)
1100 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1101 if (BindingHandle
== NULL
)
1106 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1110 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
1114 /***********************************************************************
1115 * CM_Get_Parent [SETUPAPI.@]
1117 CONFIGRET WINAPI
CM_Get_Parent(
1118 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1120 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1121 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1125 /***********************************************************************
1126 * CM_Get_Parent_Ex [SETUPAPI.@]
1128 CONFIGRET WINAPI
CM_Get_Parent_Ex(
1129 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1131 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1132 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1133 HSTRING_TABLE StringTable
= NULL
;
1138 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1140 if (pdnDevInst
== NULL
)
1141 return CR_INVALID_POINTER
;
1144 return CR_INVALID_DEVINST
;
1147 return CR_INVALID_FLAG
;
1151 if (hMachine
!= NULL
)
1153 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1154 if (BindingHandle
== NULL
)
1157 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1158 if (StringTable
== 0)
1163 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1167 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1168 if (lpDevInst
== NULL
)
1169 return CR_INVALID_DEVNODE
;
1171 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1177 if (ret
!= CR_SUCCESS
)
1180 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1182 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1186 *pdnDevInst
= dwIndex
;
1192 /***********************************************************************
1193 * CM_Get_Sibling [SETUPAPI.@]
1195 CONFIGRET WINAPI
CM_Get_Sibling(
1196 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1198 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1199 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1203 /***********************************************************************
1204 * CM_Get_Sibling_Ex [SETUPAPI.@]
1206 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
1207 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1209 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1210 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1211 HSTRING_TABLE StringTable
= NULL
;
1216 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1218 if (pdnDevInst
== NULL
)
1219 return CR_INVALID_POINTER
;
1222 return CR_INVALID_DEVINST
;
1225 return CR_INVALID_FLAG
;
1229 if (hMachine
!= NULL
)
1231 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1232 if (BindingHandle
== NULL
)
1235 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1236 if (StringTable
== 0)
1241 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1245 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1246 if (lpDevInst
== NULL
)
1247 return CR_INVALID_DEVNODE
;
1249 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1255 if (ret
!= CR_SUCCESS
)
1258 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1260 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1264 *pdnDevInst
= dwIndex
;
1270 /***********************************************************************
1271 * CM_Get_Version [SETUPAPI.@]
1273 WORD WINAPI
CM_Get_Version(VOID
)
1276 return CM_Get_Version_Ex(NULL
);
1280 /***********************************************************************
1281 * CM_Get_Version_Ex [SETUPAPI.@]
1283 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
1285 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1288 TRACE("%lx\n", hMachine
);
1290 if (hMachine
!= NULL
)
1292 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1293 if (BindingHandle
== NULL
)
1298 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1302 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
1309 /***********************************************************************
1310 * CM_Locate_DevNodeA [SETUPAPI.@]
1312 CONFIGRET WINAPI
CM_Locate_DevNodeA(
1313 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
1315 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
1316 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1320 /***********************************************************************
1321 * CM_Locate_DevNodeW [SETUPAPI.@]
1323 CONFIGRET WINAPI
CM_Locate_DevNodeW(
1324 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
1326 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
1327 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1331 /***********************************************************************
1332 * CM_Locate_DevNode_ExA [SETUPAPI.@]
1334 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
1335 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1337 DEVINSTID_W pDevIdW
= NULL
;
1338 CONFIGRET ret
= CR_SUCCESS
;
1340 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
1342 if (pDeviceID
!= NULL
)
1344 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
1345 return CR_INVALID_DEVICE_ID
;
1348 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
1350 if (pDevIdW
!= NULL
)
1357 /***********************************************************************
1358 * CM_Locate_DevNode_ExW [SETUPAPI.@]
1360 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
1361 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1363 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
1364 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1365 HSTRING_TABLE StringTable
= NULL
;
1366 CONFIGRET ret
= CR_SUCCESS
;
1368 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
1370 if (pdnDevInst
== NULL
)
1371 return CR_INVALID_POINTER
;
1373 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
1374 return CR_INVALID_FLAG
;
1376 if (hMachine
!= NULL
)
1378 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1379 if (BindingHandle
== NULL
)
1382 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1383 if (StringTable
== 0)
1388 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1392 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
1394 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
1398 /* Get the root device ID */
1399 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
1402 if (ret
!= CR_SUCCESS
)
1405 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
1407 /* Validate the device ID */
1408 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
1411 if (ret
== CR_SUCCESS
)
1413 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
1414 if (*pdnDevInst
== -1)
1422 /***********************************************************************
1423 * CM_Open_Class_KeyA [SETUPAPI.@]
1425 CONFIGRET WINAPI
CM_Open_Class_KeyA(
1426 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1427 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1429 TRACE("%p %s %lx %lx %p %lx\n",
1430 debugstr_guid(pClassGuid
), pszClassName
,
1431 samDesired
, Disposition
, phkClass
, ulFlags
);
1433 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
1434 Disposition
, phkClass
, ulFlags
, NULL
);
1438 /***********************************************************************
1439 * CM_Open_Class_KeyW [SETUPAPI.@]
1441 CONFIGRET WINAPI
CM_Open_Class_KeyW(
1442 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1443 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1445 TRACE("%p %s %lx %lx %p %lx\n",
1446 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1447 samDesired
, Disposition
, phkClass
, ulFlags
);
1449 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
1450 Disposition
, phkClass
, ulFlags
, NULL
);
1454 /***********************************************************************
1455 * CM_Open_Class_Key_ExA [SETUPAPI.@]
1457 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
1458 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1459 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1462 CONFIGRET rc
= CR_SUCCESS
;
1463 LPWSTR pszClassNameW
= NULL
;
1465 TRACE("%p %s %lx %lx %p %lx %lx\n",
1466 debugstr_guid(pClassGuid
), pszClassName
,
1467 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1469 if (pszClassName
!= NULL
)
1471 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
1472 return CR_INVALID_DATA
;
1475 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
1476 Disposition
, phkClass
, ulFlags
, hMachine
);
1478 if (pszClassNameW
!= NULL
)
1479 MyFree(pszClassNameW
);
1485 /***********************************************************************
1486 * CM_Open_Class_Key_ExW [SETUPAPI.@]
1488 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
1489 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1490 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1493 WCHAR szKeyName
[MAX_PATH
];
1494 LPWSTR lpGuidString
;
1495 DWORD dwDisposition
;
1499 TRACE("%p %s %lx %lx %p %lx %lx\n",
1500 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1501 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1503 /* Check Disposition and ulFlags */
1504 if ((Disposition
& ~RegDisposition_Bits
) ||
1505 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
1506 return CR_INVALID_FLAG
;
1508 /* Check phkClass */
1509 if (phkClass
== NULL
)
1510 return CR_INVALID_POINTER
;
1514 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
1515 pszClassName
!= NULL
)
1516 return CR_INVALID_DATA
;
1518 if (hMachine
== NULL
)
1520 hKey
= HKEY_LOCAL_MACHINE
;
1524 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
1525 HKEY_LOCAL_MACHINE
, &hKey
))
1526 return CR_REGISTRY_ERROR
;
1529 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
1531 lstrcpyW(szKeyName
, DeviceClasses
);
1535 lstrcpyW(szKeyName
, ControlClass
);
1538 if (pClassGuid
!= NULL
)
1540 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
1543 return CR_INVALID_DATA
;
1546 lstrcatW(szKeyName
, Backslash
);
1547 lstrcatW(szKeyName
, lpGuidString
);
1550 if (Disposition
== RegDisposition_OpenAlways
)
1552 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
1553 NULL
, phkClass
, &dwDisposition
);
1557 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
1562 if (pClassGuid
!= NULL
)
1563 RpcStringFreeW(&lpGuidString
);
1565 if (dwError
!= ERROR_SUCCESS
)
1568 return CR_NO_SUCH_REGISTRY_KEY
;
1571 if (pszClassName
!= NULL
)
1573 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
1574 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
1581 /***********************************************************************
1582 * CM_Set_DevNode_Problem [SETUPAPI.@]
1584 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
1585 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
1587 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
1588 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
1592 /***********************************************************************
1593 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
1595 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
1596 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
1598 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1599 HSTRING_TABLE StringTable
= NULL
;
1602 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
1605 return CR_INVALID_DEVNODE
;
1607 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
1608 return CR_INVALID_FLAG
;
1610 if (hMachine
!= NULL
)
1612 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1613 if (BindingHandle
== NULL
)
1616 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1617 if (StringTable
== 0)
1622 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1626 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1627 if (lpDevInst
== NULL
)
1628 return CR_INVALID_DEVNODE
;
1630 return PNP_SetDeviceProblem(BindingHandle
,
1637 /***********************************************************************
1638 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
1640 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
1641 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1644 TRACE("%lx %lu %p %lx %lx\n",
1645 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1646 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1652 /***********************************************************************
1653 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
1655 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
1656 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1659 TRACE("%lx %lu %p %lx %lx\n",
1660 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1661 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1667 /***********************************************************************
1668 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
1670 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
1671 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1672 ULONG ulFlags
, HMACHINE hMachine
)
1674 CONFIGRET ret
= CR_SUCCESS
;
1678 FIXME("%lx %lu %p %lx %lx %lx\n",
1679 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
1681 if (Buffer
== NULL
&& ulLength
!= 0)
1682 return CR_INVALID_POINTER
;
1686 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1695 /* Get property type */
1698 case CM_DRP_DEVICEDESC
:
1702 case CM_DRP_HARDWAREID
:
1703 ulType
= REG_MULTI_SZ
;
1706 case CM_DRP_COMPATIBLEIDS
:
1707 ulType
= REG_MULTI_SZ
;
1710 case CM_DRP_SERVICE
:
1718 case CM_DRP_CLASSGUID
:
1726 case CM_DRP_CONFIGFLAGS
:
1734 case CM_DRP_FRIENDLYNAME
:
1738 case CM_DRP_LOCATION_INFORMATION
:
1742 case CM_DRP_UPPERFILTERS
:
1743 ulType
= REG_MULTI_SZ
;
1746 case CM_DRP_LOWERFILTERS
:
1747 ulType
= REG_MULTI_SZ
;
1751 return CR_INVALID_PROPERTY
;
1754 /* Allocate buffer if needed */
1755 if (ulType
== REG_SZ
||
1756 ulType
== REG_MULTI_SZ
)
1758 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
1759 if (lpBuffer
== NULL
)
1761 ret
= CR_OUT_OF_MEMORY
;
1765 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
1766 ulLength
, lpBuffer
, ulLength
))
1773 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1776 ulLength
* sizeof(WCHAR
),
1785 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1793 ret
= CR_CALL_NOT_IMPLEMENTED
;
1800 /***********************************************************************
1801 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
1803 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
1804 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1805 ULONG ulFlags
, HMACHINE hMachine
)
1807 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1808 HSTRING_TABLE StringTable
= NULL
;
1812 TRACE("%lx %lu %p %lx %lx %lx\n",
1813 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
1816 return CR_INVALID_DEVNODE
;
1818 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1819 return CR_INVALID_PROPERTY
;
1821 if (Buffer
!= NULL
&& ulLength
== 0)
1822 return CR_INVALID_POINTER
;
1825 return CR_INVALID_FLAG
;
1827 if (hMachine
!= NULL
)
1829 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1830 if (BindingHandle
== NULL
)
1833 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1834 if (StringTable
== 0)
1839 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1843 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1844 if (lpDevInst
== NULL
)
1845 return CR_INVALID_DEVNODE
;
1849 case CM_DRP_DEVICEDESC
:
1853 case CM_DRP_HARDWAREID
:
1854 ulType
= REG_MULTI_SZ
;
1857 case CM_DRP_COMPATIBLEIDS
:
1858 ulType
= REG_MULTI_SZ
;
1861 case CM_DRP_SERVICE
:
1869 case CM_DRP_CLASSGUID
:
1877 case CM_DRP_CONFIGFLAGS
:
1885 case CM_DRP_FRIENDLYNAME
:
1889 case CM_DRP_LOCATION_INFORMATION
:
1893 case CM_DRP_UPPERFILTERS
:
1894 ulType
= REG_MULTI_SZ
;
1897 case CM_DRP_LOWERFILTERS
:
1898 ulType
= REG_MULTI_SZ
;
1902 return CR_INVALID_PROPERTY
;
1905 return PNP_SetDeviceRegProp(BindingHandle
,