- Implement CM_Get_Depth[_Ex] and CM_Get_DevNode_Status[_Ex].
- Add dummy code for CM_Get_Child_Ex, CM_Get_Parent_Ex and
CM_Get_Sibling_Ex. WIDL doesn't support this yet.
Modified: trunk/reactos/include/idl/pnp.idl
Modified: trunk/reactos/include/wine/cfgmgr32.h
Modified: trunk/reactos/lib/cfgmgr32/cfgmgr32.def
Modified: trunk/reactos/lib/setupapi/cfgmgr.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
_____
Modified: trunk/reactos/include/idl/pnp.idl
--- trunk/reactos/include/idl/pnp.idl 2005-07-19 14:11:53 UTC (rev
16644)
+++ trunk/reactos/include/idl/pnp.idl 2005-07-19 15:57:30 UTC (rev
16645)
@@ -24,4 +24,29 @@
CONFIGRET PNP_ValidateDeviceInstance(handle_t BindingHandle,
[in, string] wchar_t
*DeviceInstance,
[in] DWORD Flags);
+
+ CONFIGRET PNP_GetRootDeviceInstance(handle_t BindingHandle,
+ [out, string, size_is(Length)]
wchar_t *DeviceInstance,
+ [in] DWORD Length);
+
+// cpp_quote("#define PNP_DEVICE_PARENT 1")
+// cpp_quote("#define PNP_DEVICE_CHILD 2")
+// cpp_quote("#define PNP_DEVICE_SIBLING 3")
+// CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle,
+// [in] DWORD Relationship,
+// [in, string] wchar_t
*DeviceId,
+// [out, string,
size_is(Length)] wchar_t *RelatedDeviceId,
+// [in] DWORD Length,
+// [in] DWORD Flags);
+
+ CONFIGRET PNP_GetDepth(handle_t BindingHandle,
+ [in, string] wchar_t *DeviceInstance,
+ [out] unsigned long *Depth,
+ [in] DWORD Flags);
+
+ CONFIGRET PNP_GetDeviceStatus(handle_t BindingHandle,
+ [in, string] wchar_t *DeviceInstance,
+ [out] unsigned long *Status,
+ [out] unsigned long *Problem,
+ [in] DWORD Flags);
}
_____
Modified: trunk/reactos/include/wine/cfgmgr32.h
--- trunk/reactos/include/wine/cfgmgr32.h 2005-07-19 14:11:53 UTC
(rev 16644)
+++ trunk/reactos/include/wine/cfgmgr32.h 2005-07-19 15:57:30 UTC
(rev 16645)
@@ -81,6 +81,8 @@
CONFIGRET WINAPI CM_Enumerate_Classes_Ex( ULONG, LPGUID, ULONG,
HMACHINE );
CONFIGRET WINAPI CM_Get_Child( PDEVINST, DEVINST, ULONG );
CONFIGRET WINAPI CM_Get_Child_Ex( PDEVINST, DEVINST, ULONG, HMACHINE );
+CONFIGRET WINAPI CM_Get_Depth( PULONG, DEVINST, ULONG );
+CONFIGRET WINAPI CM_Get_Depth_Ex( PULONG, DEVINST, ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Device_IDA( DEVINST, PCHAR, ULONG, ULONG );
CONFIGRET WINAPI CM_Get_Device_IDW( DEVINST, PWCHAR, ULONG, ULONG );
#define CM_Get_Device_ID WINELIB_NAME_AW(CM_Get_Device_ID)
@@ -101,6 +103,8 @@
#define CM_Get_Device_ID_List_Size_Ex
WINELIB_NAME_AW(CM_Get_Device_ID_List_Size_Ex)
CONFIGRET WINAPI CM_Get_Device_ID_Size( PULONG, DEVINST, ULONG );
CONFIGRET WINAPI CM_Get_Device_ID_Size_Ex( PULONG, DEVINST, ULONG,
HMACHINE );
+CONFIGRET WINAPI CM_Get_DevNode_Status( PULONG, PULONG, DEVINST, ULONG
);
+CONFIGRET WINAPI CM_Get_DevNode_Status_Ex( PULONG, PULONG, DEVINST,
ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Global_State( PULONG, ULONG );
CONFIGRET WINAPI CM_Get_Global_State_Ex( PULONG, ULONG, HMACHINE );
CONFIGRET WINAPI CM_Get_Parent( PDEVINST, DEVINST, ULONG );
_____
Modified: trunk/reactos/lib/cfgmgr32/cfgmgr32.def
--- trunk/reactos/lib/cfgmgr32/cfgmgr32.def 2005-07-19 14:11:53 UTC
(rev 16644)
+++ trunk/reactos/lib/cfgmgr32/cfgmgr32.def 2005-07-19 15:57:30 UTC
(rev 16645)
@@ -79,18 +79,18 @@
;CM_Get_Class_NameW
;CM_Get_Class_Name_ExA
;CM_Get_Class_Name_ExW
-;CM_Get_Depth
-;CM_Get_Depth_Ex
+CM_Get_Depth(a)12=SETUPAPI.CM_Get_Depth
+CM_Get_Depth_Ex(a)16=SETUPAPI.CM_Get_Depth_Ex
CM_Get_DevNode_Registry_PropertyA(a)24=SETUPAPI.CM_Get_DevNode_Registry_Pr
opertyA
CM_Get_DevNode_Registry_PropertyW(a)24=SETUPAPI.CM_Get_DevNode_Registry_Pr
opertyW
CM_Get_DevNode_Registry_Property_ExA(a)28=SETUPAPI.CM_Get_DevNode_Registry
_Property_ExA
CM_Get_DevNode_Registry_Property_ExW(a)28=SETUPAPI.CM_Get_DevNode_Registry
_Property_ExW
-;CM_Get_DevNode_Status
-;CM_Get_DevNode_Status_Ex
-;CM_Get_Device_IDA
-;CM_Get_Device_IDW
-;CM_Get_Device_ID_ExA
-;CM_Get_Device_ID_ExW
+CM_Get_DevNode_Status(a)16=SETUPAPI.CM_Get_DevNode_Status
+CM_Get_DevNode_Status_Ex(a)20=SETUPAPI.CM_Get_DevNode_Status_Ex
+CM_Get_Device_IDA(a)16=SETUPAPI.CM_Get_Device_IDA
+CM_Get_Device_IDW(a)16=SETUPAPI.CM_Get_Device_IDW
+CM_Get_Device_ID_ExA(a)20=SETUPAPI.CM_Get_Device_ID_ExA
+CM_Get_Device_ID_ExW(a)20=SETUPAPI.CM_Get_Device_ID_ExW
CM_Get_Device_ID_ListA(a)16=SETUPAPI.CM_Get_Device_ID_ListA
CM_Get_Device_ID_ListW(a)16=SETUPAPI.CM_Get_Device_ID_ListW
CM_Get_Device_ID_List_ExA(a)20=SETUPAPI.CM_Get_Device_ID_List_ExA
@@ -99,8 +99,8 @@
CM_Get_Device_ID_List_SizeW(a)12=SETUPAPI.CM_Get_Device_ID_List_SizeW
CM_Get_Device_ID_List_Size_ExA(a)16=SETUPAPI.CM_Get_Device_ID_List_Size_Ex
A
CM_Get_Device_ID_List_Size_ExW(a)16=SETUPAPI.CM_Get_Device_ID_List_Size_Ex
A
-;CM_Get_Device_ID_Size
-;CM_Get_Device_ID_Size_Ex
+CM_Get_Device_ID_Size(a)12=SETUPAPI.CM_Get_Device_ID_Size
+CM_Get_Device_ID_Size_Ex(a)16=SETUPAPI.CM_Get_Device_ID_Size_Ex
;CM_Get_Device_Interface_AliasA
;CM_Get_Device_Interface_AliasW
;CM_Get_Device_Interface_Alias_ExA
@@ -115,8 +115,8 @@
;CM_Get_Device_Interface_List_Size_ExW
;CM_Get_First_Log_Conf
;CM_Get_First_Log_Conf_Ex
-;CM_Get_Global_State
-;CM_Get_Global_State_Ex
+CM_Get_Global_State(a)8=SETUPAPI.CM_Get_Global_State
+CM_Get_Global_State_Ex(a)12=SETUPAPI.CM_Get_Global_State_Ex
;CM_Get_HW_Prof_FlagsA
;CM_Get_HW_Prof_FlagsW
;CM_Get_HW_Prof_Flags_ExA
@@ -144,6 +144,7 @@
;CM_Intersect_Range_List
;CM_Invert_Range_List
;CM_Is_Dock_Station_Present
+;CM_Is_Dock_Station_Present_Ex
CM_Locate_DevNodeA(a)12=SETUPAPI.CM_Locate_DevNodeA
CM_Locate_DevNodeW(a)12=SETUPAPI.CM_Locate_DevNodeW
CM_Locate_DevNode_ExA(a)16=SETUPAPI.CM_Locate_DevNode_ExA
_____
Modified: trunk/reactos/lib/setupapi/cfgmgr.c
--- trunk/reactos/lib/setupapi/cfgmgr.c 2005-07-19 14:11:53 UTC (rev
16644)
+++ trunk/reactos/lib/setupapi/cfgmgr.c 2005-07-19 15:57:30 UTC (rev
16645)
@@ -251,12 +251,124 @@
CONFIGRET WINAPI CM_Get_Child_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE
hMachine)
{
+#if 0
+ WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
+ RPC_BINDING_HANDLE BindingHandle = NULL;
+ HSTRING_TABLE StringTable = NULL;
+ LPWSTR lpDevInst;
+ DWORD dwIndex;
+ CONFIGRET ret;
+
+ TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
+
+ if (pdnDevInst == NULL)
+ return CR_INVALID_POINTER;
+
+ if (dnDevInst == 0)
+ return CR_INVALID_DEVINST;
+
+ if (ulFlags != 0)
+ return CR_INVALID_FLAG;
+
+ *pdnDevInst = -1;
+
+ if (hMachine != NULL)
+ {
+ BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+ if (BindingHandle == NULL)
+ return CR_FAILURE;
+
+ StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+ if (StringTable == 0)
+ return CR_FAILURE;
+ }
+ else
+ {
+ if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+ return CR_FAILURE;
+ }
+
+ lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
+ if (lpDevInst == NULL)
+ return CR_INVALID_DEVNODE;
+
+ ret = PNP_GetRelatedDeviceInstance(BindingHandle,
+ PNP_DEVICE_CHILD,
+ lpDevInst,
+ szRelatedDevInst,
+ MAX_DEVICE_ID_LEN,
+ 0);
+ if (ret != CR_SUCCESS)
+ return ret;
+
+ TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
+
+ dwIndex = StringTableAddString(StringTable, szRelatedDevInst, 1);
+ if (dwIndex == -1)
+ return CR_FAILURE;
+
+ *pdnDevInst = dwIndex;
+
+ return CR_SUCCESS;
+#endif
FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
return CR_FAILURE;
}
/***********************************************************************
+ * CM_Get_Depth [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Depth(
+ PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags)
+{
+ TRACE("%p %lx %lx\n",
+ pulDepth, dnDevInst, ulFlags);
+ return CM_Get_Depth_Ex(pulDepth, dnDevInst, ulFlags, NULL);
+}
+
+
+/**********************************************************************
*
+ * CM_Get_Depth_Ex [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Depth_Ex(
+ PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags, HMACHINE
hMachine)
+{
+ RPC_BINDING_HANDLE BindingHandle = NULL;
+ HSTRING_TABLE StringTable = NULL;
+ LPWSTR lpDevInst;
+
+ TRACE("%p %lx %lx %lx\n",
+ pulDepth, dnDevInst, ulFlags, hMachine);
+
+ if (hMachine != NULL)
+ {
+ BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+ if (BindingHandle == NULL)
+ return CR_FAILURE;
+
+ StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+ if (StringTable == 0)
+ return CR_FAILURE;
+ }
+ else
+ {
+ if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+ return CR_FAILURE;
+ }
+
+ lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
+ if (lpDevInst == NULL)
+ return CR_INVALID_DEVNODE;
+
+ return PNP_GetDepth(BindingHandle,
+ lpDevInst,
+ pulDepth,
+ ulFlags);
+}
+
+
+/**********************************************************************
*
* CM_Get_Device_IDA [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Device_IDA(
@@ -322,9 +434,7 @@
dnDevInst,
Buffer,
&BufferLen))
- {
return CR_FAILURE;
- }
return CR_SUCCESS;
}
@@ -434,7 +544,7 @@
CONFIGRET WINAPI CM_Get_Device_ID_Size(
PULONG pulLen, DEVINST dnDevInst, ULONG ulFlags)
{
- TRACE("%p %p %lx\n", pulLen, dnDevInst, ulFlags);
+ TRACE("%p %lx %lx\n", pulLen, dnDevInst, ulFlags);
return CM_Get_Device_ID_Size_Ex(pulLen, dnDevInst, ulFlags, NULL);
}
@@ -448,7 +558,7 @@
HSTRING_TABLE StringTable = NULL;
LPWSTR DeviceId;
- TRACE("%p %p %lx %lx\n", pulLen, dnDevInst, ulFlags, hMachine);
+ TRACE("%p %lx %lx %lx\n", pulLen, dnDevInst, ulFlags, hMachine);
if (hMachine != NULL)
{
@@ -476,6 +586,63 @@
/***********************************************************************
+ * CM_Get_DevNode_Status [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_DevNode_Status(
+ PULONG pulStatus, PULONG pulProblemNumber, DEVINST dnDevInst,
+ ULONG ulFlags)
+{
+ TRACE("%p %p %lx %lx\n",
+ pulStatus, pulProblemNumber, dnDevInst, ulFlags);
+ return CM_Get_DevNode_Status_Ex(pulStatus, pulProblemNumber,
dnDevInst,
+ ulFlags, NULL);
+}
+
+
+/**********************************************************************
*
+ * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
+ */
+CONFIGRET WINAPI
+CM_Get_DevNode_Status_Ex(
+ PULONG pulStatus, PULONG pulProblemNumber, DEVINST dnDevInst,
+ ULONG ulFlags, HMACHINE hMachine)
+{
+ RPC_BINDING_HANDLE BindingHandle = NULL;
+ HSTRING_TABLE StringTable = NULL;
+ LPWSTR lpDevInst;
+
+ TRACE("%p %p %lx %lx %lx\n",
+ pulStatus, pulProblemNumber, dnDevInst, ulFlags, hMachine);
+
+ if (hMachine != NULL)
+ {
+ BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+ if (BindingHandle == NULL)
+ return CR_FAILURE;
+
+ StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+ if (StringTable == 0)
+ return CR_FAILURE;
+ }
+ else
+ {
+ if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+ return CR_FAILURE;
+ }
+
+ lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
+ if (lpDevInst == NULL)
+ return CR_INVALID_DEVNODE;
+
+ return PNP_GetDeviceStatus(BindingHandle,
+ lpDevInst,
+ pulStatus,
+ pulProblemNumber,
+ ulFlags);
+}
+
+
+/**********************************************************************
*
* CM_Get_Global_State [SETUPAPI.@]
*/
CONFIGRET WINAPI CM_Get_Global_State(
@@ -535,6 +702,66 @@
CONFIGRET WINAPI CM_Get_Parent_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE
hMachine)
{
+#if 0
+ WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
+ RPC_BINDING_HANDLE BindingHandle = NULL;
+ HSTRING_TABLE StringTable = NULL;
+ LPWSTR lpDevInst;
+ DWORD dwIndex;
+ CONFIGRET ret;
+
+ TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
+
+ if (pdnDevInst == NULL)
+ return CR_INVALID_POINTER;
+
+ if (dnDevInst == 0)
+ return CR_INVALID_DEVINST;
+
+ if (ulFlags != 0)
+ return CR_INVALID_FLAG;
+
+ *pdnDevInst = -1;
+
+ if (hMachine != NULL)
+ {
+ BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+ if (BindingHandle == NULL)
+ return CR_FAILURE;
+
+ StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+ if (StringTable == 0)
+ return CR_FAILURE;
+ }
+ else
+ {
+ if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+ return CR_FAILURE;
+ }
+
+ lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
+ if (lpDevInst == NULL)
+ return CR_INVALID_DEVNODE;
+
+ ret = PNP_GetRelatedDeviceInstance(BindingHandle,
+ PNP_DEVICE_PARENT,
+ lpDevInst,
+ szRelatedDevInst,
+ MAX_DEVICE_ID_LEN,
+ 0);
+ if (ret != CR_SUCCESS)
+ return ret;
+
+ TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
+
+ dwIndex = StringTableAddString(StringTable, szRelatedDevInst, 1);
+ if (dwIndex == -1)
+ return CR_FAILURE;
+
+ *pdnDevInst = dwIndex;
+
+ return CR_SUCCESS;
+#endif
FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
return CR_FAILURE;
}
@@ -557,6 +784,66 @@
CONFIGRET WINAPI CM_Get_Sibling_Ex(
PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE
hMachine)
{
+#if 0
+ WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
+ RPC_BINDING_HANDLE BindingHandle = NULL;
+ HSTRING_TABLE StringTable = NULL;
+ LPWSTR lpDevInst;
+ DWORD dwIndex;
+ CONFIGRET ret;
+
+ TRACE("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
+
+ if (pdnDevInst == NULL)
+ return CR_INVALID_POINTER;
+
+ if (dnDevInst == 0)
+ return CR_INVALID_DEVINST;
+
+ if (ulFlags != 0)
+ return CR_INVALID_FLAG;
+
+ *pdnDevInst = -1;
+
+ if (hMachine != NULL)
+ {
+ BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+ if (BindingHandle == NULL)
+ return CR_FAILURE;
+
+ StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+ if (StringTable == 0)
+ return CR_FAILURE;
+ }
+ else
+ {
+ if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
+ return CR_FAILURE;
+ }
+
+ lpDevInst = StringTableStringFromId(StringTable, dnDevInst);
+ if (lpDevInst == NULL)
+ return CR_INVALID_DEVNODE;
+
+ ret = PNP_GetRelatedDeviceInstance(BindingHandle,
+ PNP_DEVICE_SIBLING,
+ lpDevInst,
+ szRelatedDevInst,
+ MAX_DEVICE_ID_LEN,
+ 0);
+ if (ret != CR_SUCCESS)
+ return ret;
+
+ TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
+
+ dwIndex = StringTableAddString(StringTable, szRelatedDevInst, 1);
+ if (dwIndex == -1)
+ return CR_FAILURE;
+
+ *pdnDevInst = dwIndex;
+
+ return CR_SUCCESS;
+#endif
FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags,
hMachine);
return CR_FAILURE;
}
@@ -678,15 +965,20 @@
return CR_FAILURE;
}
- if (pDeviceID != NULL && wcslen(pDeviceID) != 0)
+ if (pDeviceID != NULL && lstrlenW(pDeviceID) != 0)
{
lstrcpyW(DeviceIdBuffer, pDeviceID);
}
else
{
/* Get the root device ID */
- lstrcpyW(DeviceIdBuffer, L"HTREE\\ROOT\\0");
+ rc = PNP_GetRootDeviceInstance(BindingHandle,
+ DeviceIdBuffer,
+ MAX_DEVICE_ID_LEN);
+ if (rc != CR_SUCCESS)
+ return CR_FAILURE;
}
+ TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer));
/* Validate the device ID */
rc = PNP_ValidateDeviceInstance(BindingHandle,
_____
Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec 2005-07-19 14:11:53 UTC
(rev 16644)
+++ trunk/reactos/lib/setupapi/setupapi.spec 2005-07-19 15:57:30 UTC
(rev 16645)
@@ -63,14 +63,14 @@
@ stub CM_Get_Class_NameW
@ stub CM_Get_Class_Name_ExA
@ stub CM_Get_Class_Name_ExW
-@ stub CM_Get_Depth
-@ stub CM_Get_Depth_Ex
+@ stdcall CM_Get_Depth(ptr long long)
+@ stdcall CM_Get_Depth_Ex(ptr long long long)
@ stub CM_Get_DevNode_Registry_PropertyA
@ stub CM_Get_DevNode_Registry_PropertyW
@ stub CM_Get_DevNode_Registry_Property_ExA
@ stub CM_Get_DevNode_Registry_Property_ExW
-@ stub CM_Get_DevNode_Status
-@ stub CM_Get_DevNode_Status_Ex
+@ stdcall CM_Get_DevNode_Status(ptr ptr long long)
+@ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long long)
@ stdcall CM_Get_Device_IDA(long str long long)
@ stdcall CM_Get_Device_IDW(long wstr long long)
@ stdcall CM_Get_Device_ID_ExA(long str long long long)
_____
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
--- trunk/reactos/services/umpnpmgr/umpnpmgr.c 2005-07-19 14:11:53 UTC
(rev 16644)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.c 2005-07-19 15:57:30 UTC
(rev 16645)
@@ -52,6 +52,7 @@
{NULL, NULL}
};
+static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
/* FUNCTIONS
*****************************************************************/
@@ -98,13 +99,13 @@
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
- return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+ return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
- HeapFree(GetProcessHeap(), 0, ptr);
+ HeapFree(GetProcessHeap(), 0, ptr);
}
@@ -176,6 +177,126 @@
}
+CONFIGRET
+PNP_GetRootDeviceInstance(handle_t BindingHandle,
+ wchar_t *DeviceInstance,
+ unsigned long Length)
+{
+ CONFIGRET ret = CR_SUCCESS;
+
+ DPRINT("PNP_GetRootDeviceInstance() called\n");
+
+ if (Length < lstrlenW(szRootDeviceId) + 1)
+ {
+ ret = CR_BUFFER_SMALL;
+ goto Done;
+ }
+
+ lstrcpyW(DeviceInstance,
+ szRootDeviceId);
+
+Done:
+ DPRINT("PNP_GetRootDeviceInstance() done (returns %lx)\n", ret);
+
+ return ret;
+}
+
+
+#if 0
+CONFIGRET
+PNP_GetRelatedDeviceInstance(handle_t BindingHandle,
+ unsigned long Relationship,
+ wchar_t *DeviceId,
+ wchar_t *RelatedDeviceId,
+ unsigned long Length,
+ unsigned long Flags)
+{
+ CONFIGRET ret = CR_SUCCESS;
+
+ DPRINT1("PNP_GetRelatedDeviceInstance() called\n");
+ DPRINT1(" Relationship %ld\n", Relationship);
+ DPRINT1(" DeviceId %S\n", DeviceId);
+
+ lstrcpyW(RelatedDeviceId,
+ szRootDeviceId);
+
+//Done:
+ DPRINT1("PNP_GetRelatedDeviceInstance() done (returns %lx)\n",
ret);
+
+ return ret;
+}
+#endif
+
+
+CONFIGRET
+PNP_GetDepth(handle_t BindingHandle,
+ wchar_t *DeviceInstance,
+ unsigned long *Depth,
+ DWORD Flags)
+{
+ PLUGPLAY_CONTROL_DEPTH_DATA PlugPlayData;
+ CONFIGRET ret = CR_SUCCESS;
+ NTSTATUS Status;
+
+ DPRINT1("PNP_GetDepth() called\n");
+
+ RtlInitUnicodeString(&PlugPlayData.DeviceInstance,
+ DeviceInstance);
+
+ Status = NtPlugPlayControl(PlugPlayControlGetDeviceDepth,
+ (PVOID)&PlugPlayData,
+ sizeof(PLUGPLAY_CONTROL_DEPTH_DATA));
+ if (NT_SUCCESS(Status))
+ {
+ *Depth = PlugPlayData.Depth;
+ }
+ else
+ {
+ ret = CR_FAILURE; /* FIXME */
+ }
+
+ DPRINT1("PNP_GetDepth() done (returns %lx)\n", ret);
+
+ return ret;
+}
+
+
+CONFIGRET
+PNP_GetDeviceStatus(handle_t BindingHandle,
+ wchar_t *DeviceInstance,
+ unsigned long *pStatus,
+ unsigned long *pProblem,
+ DWORD Flags)
+{
+ PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
+ CONFIGRET ret = CR_SUCCESS;
+ NTSTATUS Status;
+
+ DPRINT1("PNP_GetDeviceStatus() called\n");
+
+ RtlInitUnicodeString(&PlugPlayData.DeviceInstance,
+ DeviceInstance);
+ PlugPlayData.Operation = 0; /* Get status */
+
+ Status = NtPlugPlayControl(PlugPlayControlDeviceStatus,
+ (PVOID)&PlugPlayData,
+ sizeof(PLUGPLAY_CONTROL_STATUS_DATA));
+ if (NT_SUCCESS(Status))
+ {
+ *pStatus = PlugPlayData.DeviceStatus;
+ *pProblem = PlugPlayData.DeviceProblem;
+ }
+ else
+ {
+ ret = CR_FAILURE; /* FIXME */
+ }
+
+ DPRINT1("PNP_GetDeviceStatus() done (returns %lx)\n", ret);
+
+ return ret;
+}
+
+
static DWORD WINAPI
PnpEventThread(LPVOID lpParameter)
{