- Implement CM_Locate_DevNode_ExW, CM_Get_Device_ID_Size[_Ex] and CM_Get_Device_ID[_Ex]W.
- Add flags for CM_Get_Global_State[_Ex].
Modified: trunk/reactos/include/idl/pnp.idl
Modified: trunk/reactos/include/wine/cfgmgr32.h
Modified: trunk/reactos/lib/setupapi/cfgmgr.c
Modified: trunk/reactos/lib/setupapi/rpc.c
Modified: trunk/reactos/lib/setupapi/rpc_private.h
Modified: trunk/reactos/lib/setupapi/setupapi.spec
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
Modified: trunk/reactos/w32api/include/ddk/cfg.h
Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h

Modified: trunk/reactos/include/idl/pnp.idl
--- trunk/reactos/include/idl/pnp.idl	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/include/idl/pnp.idl	2005-07-17 09:43:54 UTC (rev 16603)
@@ -21,7 +21,7 @@
                                [out] unsigned long *State,
                                [in] unsigned long Flags);
 
-//  CONFIGRET PNP_GetRootDeviceInstance(handle_t BindingHandle,
-//                                      [out, string, size_is(Length)] wchar_t *DeviceInstance,
-//                                      [in] DWORD Length);
+  CONFIGRET PNP_ValidateDeviceInstance(handle_t BindingHandle,
+                                       [in, string] wchar_t *DeviceInstance,
+                                       [in] DWORD Flags);
 }

Modified: trunk/reactos/include/wine/cfgmgr32.h
--- trunk/reactos/include/wine/cfgmgr32.h	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/include/wine/cfgmgr32.h	2005-07-17 09:43:54 UTC (rev 16603)
@@ -81,6 +81,12 @@
 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_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)
+CONFIGRET WINAPI CM_Get_Device_ID_ExW( DEVINST, PWCHAR, ULONG, ULONG, HMACHINE );
+CONFIGRET WINAPI CM_Get_Device_ID_ExA( DEVINST, PCHAR, ULONG, ULONG, HMACHINE );
+#define     CM_Get_Device_ID_Ex WINELIB_NAME_AW(CM_Get_Device_ID_Ex)
 CONFIGRET WINAPI CM_Get_Device_ID_ListA( PCSTR, PCHAR, ULONG, ULONG );
 CONFIGRET WINAPI CM_Get_Device_ID_ListW( PCWSTR, PWCHAR, ULONG, ULONG );
 #define     CM_Get_Device_ID_List WINELIB_NAME_AW(CM_Get_Device_ID_List)
@@ -93,6 +99,8 @@
 CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA( PULONG, PCSTR, ULONG, HMACHINE );
 CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW( PULONG, PCWSTR, ULONG, HMACHINE );
 #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_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/setupapi/cfgmgr.c
--- trunk/reactos/lib/setupapi/cfgmgr.c	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/lib/setupapi/cfgmgr.c	2005-07-17 09:43:54 UTC (rev 16603)
@@ -49,7 +49,9 @@
 
 typedef struct _MACHINE_INFO
 {
-  RPC_BINDING_HANDLE BindingHandle;
+    WCHAR szMachineName[MAX_PATH];
+    RPC_BINDING_HANDLE BindingHandle;
+    HSTRING_TABLE StringTable;
 } MACHINE_INFO, *PMACHINE_INFO;
 
 
@@ -86,13 +88,25 @@
 
     TRACE("%s %p\n", debugstr_w(UNCServerName), phMachine);
 
-    pMachine = (PMACHINE_INFO)GlobalAlloc(GPTR, sizeof(MACHINE_INFO));
+    pMachine = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MACHINE_INFO));
     if (pMachine == NULL)
         return CR_OUT_OF_MEMORY;
 
+    lstrcpyW(pMachine->szMachineName, UNCServerName);
+
+    pMachine->StringTable = StringTableInitialize();
+    if (pMachine->StringTable == NULL)
+    {
+        HeapFree(GetProcessHeap(), 0, pMachine);
+        return CR_FAILURE;
+    }
+
+    StringTableAddString(pMachine->StringTable, L"PLT", 1);
+
     if (!PnpBindRpc(UNCServerName, &pMachine->BindingHandle))
     {
-        GlobalFree(pMachine);
+        StringTableDestroy(pMachine->StringTable);
+        HeapFree(GetProcessHeap(), 0, pMachine);
         return CR_INVALID_MACHINENAME;
     }
 
@@ -111,14 +125,17 @@
 
     TRACE("%lx\n", hMachine);
 
-    if (hMachine == NULL)
+    pMachine = (PMACHINE_INFO)hMachine;
+    if (pMachine == NULL)
         return CR_SUCCESS;
 
-    pMachine = (PMACHINE_INFO)hMachine;
+    if (pMachine->StringTable != NULL)
+        StringTableDestroy(pMachine->StringTable);
+
     if (!PnpUnbindRpc(pMachine->BindingHandle))
         return CR_ACCESS_DENIED;
 
-    GlobalFree(pMachine);
+    HeapFree(GetProcessHeap(), 0, pMachine);
 
     return CR_SUCCESS;
 }
@@ -240,10 +257,84 @@
 
 
 /***********************************************************************
+ * CM_Get_Device_IDA [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_IDA(
+    DEVINST dnDevInst, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
+{
+    TRACE("%lx %p %ld %ld\n",
+          dnDevInst, Buffer, BufferLen, ulFlags);
+    return CM_Get_Device_ID_ExA(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Get_Device_IDW [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_IDW(
+    DEVINST dnDevInst, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
+{
+    TRACE("%lx %p %ld %ld\n",
+          dnDevInst, Buffer, BufferLen, ulFlags);
+    return CM_Get_Device_ID_ExW(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Get_Device_ID_ExA [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_ID_ExA(
+    DEVINST dnDevInst, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags,
+    HMACHINE hMachine)
+{
+    FIXME("%lx %p %ld %ld %lx\n",
+          dnDevInst, Buffer, BufferLen, ulFlags, hMachine);
+
+    return CR_SUCCESS;
+}
+
+
+/***********************************************************************
+ * CM_Get_Device_ID_ExW [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_ID_ExW(
+    DEVINST dnDevInst, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags,
+    HMACHINE hMachine)
+{
+    HSTRING_TABLE StringTable = NULL;
+
+    TRACE("%lx %p %ld %ld %lx\n",
+          dnDevInst, Buffer, BufferLen, ulFlags, hMachine);
+
+    if (hMachine != NULL)
+    {
+        StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+        if (StringTable == NULL)
+            return CR_FAILURE;
+    }
+    else
+    {
+        if (!PnpGetLocalHandles(NULL, &StringTable))
+            return CR_FAILURE;
+    }
+
+    if (!StringTableStringFromIdEx(StringTable,
+                                   dnDevInst,
+                                   Buffer,
+                                   &BufferLen))
+    {
+        return CR_FAILURE;
+    }
+
+    return CR_SUCCESS;
+}
+
+
+/***********************************************************************
  * CM_Get_Device_ID_ListA [SETUPAPI.@]
  */
 CONFIGRET WINAPI CM_Get_Device_ID_ListA(
-    PCSTR pszFilter, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags )
+    PCSTR pszFilter, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
 {
     TRACE("%p %p %ld %ld\n", pszFilter, Buffer, BufferLen, ulFlags);
     return CM_Get_Device_ID_List_ExA(pszFilter, Buffer, BufferLen,
@@ -255,7 +346,7 @@
  * CM_Get_Device_ID_ListW [SETUPAPI.@]
  */
 CONFIGRET WINAPI CM_Get_Device_ID_ListW(
-    PCWSTR pszFilter, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags )
+    PCWSTR pszFilter, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags)
 {
     TRACE("%p %p %ld %ld\n", pszFilter, Buffer, BufferLen, ulFlags);
     return CM_Get_Device_ID_List_ExW(pszFilter, Buffer, BufferLen,
@@ -268,7 +359,7 @@
  */
 CONFIGRET WINAPI CM_Get_Device_ID_List_ExA(
     PCSTR pszFilter, PCHAR Buffer, ULONG BufferLen, ULONG ulFlags,
-    HMACHINE hMachine )
+    HMACHINE hMachine)
 {
     FIXME("%p %p %ld %ld %lx\n",
           pszFilter, Buffer, BufferLen, ulFlags, hMachine);
@@ -282,7 +373,7 @@
  */
 CONFIGRET WINAPI CM_Get_Device_ID_List_ExW(
     PCWSTR pszFilter, PWCHAR Buffer, ULONG BufferLen, ULONG ulFlags,
-    HMACHINE hMachine )
+    HMACHINE hMachine)
 {
     FIXME("%p %p %ld %ld %lx\n",
           pszFilter, Buffer, BufferLen, ulFlags, hMachine);
@@ -338,6 +429,53 @@
 
 
 /***********************************************************************
+ * CM_Get_Device_ID_Size [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_ID_Size(
+    PULONG pulLen, DEVINST dnDevInst, ULONG ulFlags)
+{
+    TRACE("%p %p %lx\n", pulLen, dnDevInst, ulFlags);
+    return CM_Get_Device_ID_Size_Ex(pulLen, dnDevInst, ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Get_Device_ID_Size_Ex(
+    PULONG pulLen, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine)
+{
+    HSTRING_TABLE StringTable = NULL;
+    LPWSTR DeviceId;
+
+    TRACE("%p %p %lx %lx\n", pulLen, dnDevInst, ulFlags, hMachine);
+
+    if (hMachine != NULL)
+    {
+        StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
+        if (StringTable == NULL)
+            return CR_FAILURE;
+    }
+    else
+    {
+        if (!PnpGetLocalHandles(NULL, &StringTable))
+            return CR_FAILURE;
+    }
+
+    DeviceId = StringTableStringFromId(StringTable, dnDevInst);
+    if (DeviceId == NULL)
+    {
+        *pulLen = 0;
+        return CR_SUCCESS;
+    }
+
+    *pulLen = lstrlenW(DeviceId);
+
+    return CR_SUCCESS;
+}
+
+
+/***********************************************************************
  * CM_Get_Global_State [SETUPAPI.@]
  */
 CONFIGRET WINAPI CM_Get_Global_State(
@@ -355,7 +493,6 @@
     PULONG pulState, ULONG ulFlags, HMACHINE hMachine)
 {
     RPC_BINDING_HANDLE BindingHandle = NULL;
-    RPC_STATUS Status;
 
     TRACE("%p %lx %lx\n", pulState, ulFlags, hMachine);
 
@@ -373,8 +510,7 @@
     }
     else
     {
-        Status = PnpGetLocalBindingHandle(&BindingHandle);
-        if (Status != RPC_S_OK)
+        if (!PnpGetLocalHandles(&BindingHandle, NULL))
             return CR_FAILURE;
     }
 
@@ -442,7 +578,6 @@
 WORD WINAPI CM_Get_Version_Ex(HMACHINE hMachine)
 {
     RPC_BINDING_HANDLE BindingHandle = NULL;
-    RPC_STATUS Status;
     WORD Version = 0;
 
     TRACE("%lx\n", hMachine);
@@ -455,9 +590,8 @@
     }
     else
     {
-        Status = PnpGetLocalBindingHandle(&BindingHandle);
-        if (Status != RPC_S_OK)
-            return 0;
+        if (!PnpGetLocalHandles(&BindingHandle, NULL))
+            return CR_FAILURE;
     }
 
     if (PNP_GetVersion(BindingHandle, &Version) != CR_SUCCESS)
@@ -521,6 +655,49 @@
 CONFIGRET WINAPI CM_Locate_DevNode_ExW(
     PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags, HMACHINE hMachine)
 {
-    FIXME("%p %s %lu %lx\n", pdnDevInst, debugstr_w(pDeviceID), ulFlags, hMachine);
-    return CR_SUCCESS;
+    WCHAR DeviceIdBuffer[MAX_DEVICE_ID_LEN];
+    RPC_BINDING_HANDLE BindingHandle = NULL;
+    HSTRING_TABLE StringTable = NULL;
+    CONFIGRET rc = CR_SUCCESS;
+
+    TRACE("%p %s %lu %lx\n", pdnDevInst, debugstr_w(pDeviceID), 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;
+    }
+
+    if (pDeviceID != NULL && wcslen(pDeviceID) != 0)
+    {
+        lstrcpyW(DeviceIdBuffer, pDeviceID);
+    }
+    else
+    {
+        /* Get the root device ID */
+        lstrcpyW(DeviceIdBuffer, L"HTREE\\ROOT\\0");
+    }
+
+    /* Validate the device ID */
+    rc = PNP_ValidateDeviceInstance(BindingHandle,
+                                    DeviceIdBuffer,
+                                    ulFlags);
+    if (rc == CR_SUCCESS)
+    {
+        *pdnDevInst = StringTableAddString(StringTable, DeviceIdBuffer, 1);
+        if (*pdnDevInst == -1)
+            rc = CR_FAILURE;
+    }
+
+    return rc;
 }

Modified: trunk/reactos/lib/setupapi/rpc.c
--- trunk/reactos/lib/setupapi/rpc.c	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/lib/setupapi/rpc.c	2005-07-17 09:43:54 UTC (rev 16603)
@@ -21,10 +21,12 @@
 #include <windows.h>
 #include <rpc.h>
 #include <rpcdce.h>
+#include <setupapi.h>
 #include "rpc_private.h"
 
 
 static RPC_BINDING_HANDLE LocalBindingHandle = NULL;
+static HSTRING_TABLE LocalStringTable = NULL;
 
 
 RPC_STATUS
@@ -65,22 +67,48 @@
 }
 
 
-RPC_STATUS
-PnpGetLocalBindingHandle(RPC_BINDING_HANDLE *BindingHandle)
+BOOL
+PnpGetLocalHandles(RPC_BINDING_HANDLE *BindingHandle,
+                   HSTRING_TABLE *StringTable)
 {
     if (LocalBindingHandle != NULL)
     {
-        BindingHandle = LocalBindingHandle;
-        return RPC_S_OK;
+        if (BindingHandle != NULL)
+            *BindingHandle = LocalBindingHandle;
+
+        if (StringTable != NULL)
+            *StringTable = LocalStringTable;
+
+        return TRUE;
     }
 
-    return PnpBindRpc(NULL, BindingHandle);
+    LocalStringTable = StringTableInitialize();
+    if (LocalStringTable == NULL)
+        return FALSE;
+
+    if (PnpBindRpc(NULL, &LocalBindingHandle) != RPC_S_OK)
+    {
+        StringTableDestroy(LocalStringTable);
+        return FALSE;
+    }
+
+    StringTableAddString(LocalStringTable, L"PLT", 1);
+
+    if (BindingHandle != NULL)
+        *BindingHandle = LocalBindingHandle;
+
+    if (StringTable != NULL)
+        *StringTable = LocalStringTable;
+
+    return TRUE;
 }
 
 
 RPC_STATUS
 PnpUnbindLocalBindingHandle(VOID)
 {
+    StringTableDestroy(LocalStringTable);
+    LocalStringTable = NULL;
     return PnpUnbindRpc(&LocalBindingHandle);
 }
 

Modified: trunk/reactos/lib/setupapi/rpc_private.h
--- trunk/reactos/lib/setupapi/rpc_private.h	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/lib/setupapi/rpc_private.h	2005-07-17 09:43:54 UTC (rev 16603)
@@ -23,7 +23,9 @@
                       RPC_BINDING_HANDLE* BindingHandle);
 RPC_STATUS PnpUnbindRpc(RPC_BINDING_HANDLE *BindingHandle);
 
-RPC_STATUS PnpGetLocalBindingHandle(RPC_BINDING_HANDLE *BindingHandle);
+BOOL
+PnpGetLocalHandles(RPC_BINDING_HANDLE *BindingHandle,
+                   HSTRING_TABLE *StringTable);
 RPC_STATUS PnpUnbindLocalHandles(VOID);
 
 #endif /* __RPC_PRIVATE_H */

Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/lib/setupapi/setupapi.spec	2005-07-17 09:43:54 UTC (rev 16603)
@@ -71,10 +71,10 @@
 @ stub CM_Get_DevNode_Registry_Property_ExW
 @ stub CM_Get_DevNode_Status
 @ stub CM_Get_DevNode_Status_Ex
-@ stub CM_Get_Device_IDA
-@ stub CM_Get_Device_IDW
-@ stub CM_Get_Device_ID_ExA
-@ stub CM_Get_Device_ID_ExW
+@ 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)
+@ stdcall CM_Get_Device_ID_ExW(long wstr long long long)
 @ stdcall CM_Get_Device_ID_ListA(str str long long)
 @ stdcall CM_Get_Device_ID_ListW(wstr wstr long long)
 @ stdcall CM_Get_Device_ID_List_ExA(str str long long long)
@@ -83,8 +83,8 @@
 @ stdcall CM_Get_Device_ID_List_SizeW(ptr wstr long)
 @ stdcall CM_Get_Device_ID_List_Size_ExA(ptr str long long)
 @ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long long)
-@ stub CM_Get_Device_ID_Size
-@ stub CM_Get_Device_ID_Size_Ex
+@ stdcall CM_Get_Device_ID_Size(ptr long long)
+@ stdcall CM_Get_Device_ID_Size_Ex(ptr long long long)
 @ stub CM_Get_Device_Interface_AliasA
 @ stub CM_Get_Device_Interface_AliasW
 @ stub CM_Get_Device_Interface_Alias_ExA
@@ -128,6 +128,7 @@
 @ stub CM_Intersect_Range_List
 @ stub CM_Invert_Range_List
 @ stub CM_Is_Dock_Station_Present
+@ stub CM_Is_Dock_Station_Present_Ex
 @ stdcall CM_Locate_DevNodeA(ptr str long)
 @ stdcall CM_Locate_DevNodeW(ptr wstr long)
 @ stdcall CM_Locate_DevNode_ExA(ptr str long long)

Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
--- trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-07-17 09:43:54 UTC (rev 16603)
@@ -31,6 +31,7 @@
 #include <ndk/ntndk.h>
 #include <ndk/sysguid.h>
 #include <ddk/wdmguid.h>
+#include <ddk/cfgmgr32.h>
 
 #include <rpc.h>
 #include <rpcdce.h>
@@ -107,25 +108,74 @@
 }
 
 
-//CONFIRET PNP_GetVersion(RPC_BINDING_HANDLE BindingHandle,
-//                        WORD *Version)
-unsigned long PNP_GetVersion(handle_t BindingHandle,
-                             unsigned short *Version)
+CONFIGRET
+PNP_GetVersion(handle_t BindingHandle,
+               unsigned short *Version)
 {
-  *Version = 0x0400;
-  return 0; /* CR_SUCCESS */
+    *Version = 0x0400;
+    return CR_SUCCESS;
 }
 
 
-unsigned long PNP_GetGlobalState(handle_t BindingHandle,
-                                 unsigned long *State,
-                                 unsigned long Flags)
+CONFIGRET
+PNP_GetGlobalState(handle_t BindingHandle,
+                   unsigned long *State,
+                   unsigned long Flags)
 {
-    *State = 5;
-    return 0; /* CR_SUCCESS */
+    *State = CM_GLOBAL_STATE_CAN_DO_UI | CM_GLOBAL_STATE_SERVICES_AVAILABLE;
+    return CR_SUCCESS;
 }
 
 
+CONFIGRET
+PNP_ValidateDeviceInstance(handle_t BindingHandle,
+                           wchar_t *DeviceInstance,
+                           unsigned long Flags)
+{
+    CONFIGRET ret = CR_SUCCESS;
+    HKEY hEnumKey = NULL;
+    HKEY hDeviceKey = NULL;
+
+    DPRINT("PNP_ValidateDeviceInstance(%S %lx) called\n",
+           DeviceInstance, Flags);
+
+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                      L"System\\CurrentControlSet\\Enum",
+                      0,
+                      KEY_ALL_ACCESS,
+                      &hEnumKey))
+    {
+        DPRINT("Could not open the Enum Key!\n");
+        ret = CR_FAILURE;
+        goto Done;
+    }
+
+    if (RegOpenKeyExW(hEnumKey,
+                      DeviceInstance,
+                      0,
+                      KEY_READ,
+                      &hDeviceKey))
+    {
+        DPRINT("Could not open the Device Key!\n");
+        ret = CR_NO_SUCH_DEVNODE;
+        goto Done;
+    }
+
+    /* FIXME: add more tests */
+
+Done:
+    if (hDeviceKey != NULL)
+        RegCloseKey(hDeviceKey);
+
+    if (hEnumKey != NULL)
+        RegCloseKey(hEnumKey);
+
+    DPRINT("PNP_ValidateDeviceInstance() done (returns %lx)\n", ret);
+
+    return ret;
+}
+
+
 static DWORD WINAPI
 PnpEventThread(LPVOID lpParameter)
 {

Modified: trunk/reactos/w32api/include/ddk/cfg.h
--- trunk/reactos/w32api/include/ddk/cfg.h	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/w32api/include/ddk/cfg.h	2005-07-17 09:43:54 UTC (rev 16603)
@@ -132,6 +132,12 @@
   PNP_VetoLegacyDriver
 } PNP_VETO_TYPE, *PPNP_VETO_TYPE;
 
+#define CM_GLOBAL_STATE_CAN_DO_UI           0x00000001
+#define CM_GLOBAL_STATE_ON_BIG_STACK        0x00000002
+#define CM_GLOBAL_STATE_SERVICES_AVAILABLE  0x00000004
+#define CM_GLOBAL_STATE_SHUTTING_DOWN       0x00000008
+#define CM_GLOBAL_STATE_DETECTION_PENDING   0x00000010
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h
--- trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-07-17 07:02:20 UTC (rev 16602)
+++ trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-07-17 09:43:54 UTC (rev 16603)
@@ -243,9 +243,9 @@
 } DEVPRIVATE_DES, *PDEVPRIVATE_DES;
 
 typedef struct DevPrivate_Range_s {
-	DWORD  PR_Data1;
-	DWORD  PR_Data2;
-	DWORD  PR_Data3;
+  DWORD  PR_Data1;
+  DWORD  PR_Data2;
+  DWORD  PR_Data3;
 } DEVPRIVATE_RANGE, *PDEVPRIVATE_RANGE;
 
 #define PType_Range sizeof(DEVPRIVATE_RANGE)
@@ -293,16 +293,16 @@
 } DMA_RESOURCE, *PDMA_RESOURCE;
 
 /* IO_DES.Type constants and masks */
-#define fIOD_PortType   									0x1
-#define fIOD_Memory     									0x0
-#define fIOD_IO         									0x1
-#define fIOD_DECODE     									0x00fc
-#define fIOD_10_BIT_DECODE    						0x0004
-#define fIOD_12_BIT_DECODE    						0x0008
-#define fIOD_16_BIT_DECODE    						0x0010
-#define fIOD_POSITIVE_DECODE  						0x0020
-#define fIOD_PASSIVE_DECODE   						0x0040
-#define fIOD_WINDOW_DECODE    						0x0080
+#define fIOD_PortType                     0x1
+#define fIOD_Memory                       0x0
+#define fIOD_IO                           0x1
+#define fIOD_DECODE                       0x00fc
+#define fIOD_10_BIT_DECODE                0x0004
+#define fIOD_12_BIT_DECODE                0x0008
+#define fIOD_16_BIT_DECODE                0x0010
+#define fIOD_POSITIVE_DECODE              0x0020
+#define fIOD_PASSIVE_DECODE               0x0040
+#define fIOD_WINDOW_DECODE                0x0080
 
 typedef struct IO_Des_s {
   DWORD  IOD_Count;
@@ -313,10 +313,10 @@
 } IO_DES, *PIO_DES;
 
 /* IO_RANGE.IOR_Alias constants */
-#define IO_ALIAS_10_BIT_DECODE      			0x00000004
-#define IO_ALIAS_12_BIT_DECODE      			0x00000010
-#define IO_ALIAS_16_BIT_DECODE      			0x00000000
-#define IO_ALIAS_POSITIVE_DECODE    			0x000000FF
+#define IO_ALIAS_10_BIT_DECODE            0x00000004
+#define IO_ALIAS_12_BIT_DECODE            0x00000010
+#define IO_ALIAS_16_BIT_DECODE            0x00000000
+#define IO_ALIAS_POSITIVE_DECODE          0x000000FF
 
 typedef struct IO_Range_s {
   DWORDLONG  IOR_Align;
@@ -335,16 +335,16 @@
 } IO_RESOURCE, *PIO_RESOURCE;
 
 /* IRQ_DES.IRQD_flags constants */
-#define mIRQD_Share        								0x1
-#define fIRQD_Exclusive    								0x0
-#define fIRQD_Share        								0x1
+#define mIRQD_Share                       0x1
+#define fIRQD_Exclusive                   0x0
+#define fIRQD_Share                       0x1
 
-#define fIRQD_Share_Bit    								0
-#define fIRQD_Level_Bit    							  1
+#define fIRQD_Share_Bit                   0
+#define fIRQD_Level_Bit                   1
 
-#define mIRQD_Edge_Level   								0x2
-#define fIRQD_Level        								0x0
-#define fIRQD_Edge         								0x2
+#define mIRQD_Edge_Level                  0x2
+#define fIRQD_Level                       0x0
+#define fIRQD_Edge                        0x2
 
 typedef struct IRQ_Des_32_s {
   DWORD  IRQD_Count;
@@ -469,51 +469,51 @@
   DWORD  PCD_MemoryCardBase2;
 } PCCARD_DES, *PPCCARD_DES;
 
-#define mPCD_IO_8_16        							0x1
-#define fPCD_IO_8           							0x0
-#define fPCD_IO_16          							0x1
-#define mPCD_MEM_8_16       							0x2
-#define fPCD_MEM_8          							0x0
-#define fPCD_MEM_16         							0x2
-#define mPCD_MEM_A_C        							0xC
-#define fPCD_MEM1_A         							0x4
-#define fPCD_MEM2_A         							0x8
-#define fPCD_IO_ZW_8        							0x10
-#define fPCD_IO_SRC_16      							0x20
-#define fPCD_IO_WS_16       							0x40
-#define mPCD_MEM_WS         							0x300
-#define fPCD_MEM_WS_ONE     							0x100
-#define fPCD_MEM_WS_TWO     							0x200
-#define fPCD_MEM_WS_THREE   							0x300
+#define mPCD_IO_8_16                      0x1
+#define fPCD_IO_8                         0x0
+#define fPCD_IO_16                        0x1
+#define mPCD_MEM_8_16                     0x2
+#define fPCD_MEM_8                        0x0
+#define fPCD_MEM_16                       0x2
+#define mPCD_MEM_A_C                      0xC
+#define fPCD_MEM1_A                       0x4
+#define fPCD_MEM2_A                       0x8
+#define fPCD_IO_ZW_8                      0x10
+#define fPCD_IO_SRC_16                    0x20
+#define fPCD_IO_WS_16                     0x40
+#define mPCD_MEM_WS                       0x300
+#define fPCD_MEM_WS_ONE                   0x100
+#define fPCD_MEM_WS_TWO                   0x200
+#define fPCD_MEM_WS_THREE                 0x300
 
-#define fPCD_MEM_A          							0x4
+#define fPCD_MEM_A                        0x4
 
-#define fPCD_ATTRIBUTES_PER_WINDOW 				0x8000
+#define fPCD_ATTRIBUTES_PER_WINDOW        0x8000
 
-#define fPCD_IO1_16         							0x00010000
-#define fPCD_IO1_ZW_8       							0x00020000
-#define fPCD_IO1_SRC_16     							0x00040000
-#define fPCD_IO1_WS_16      							0x00080000
+#define fPCD_IO1_16                       0x00010000
+#define fPCD_IO1_ZW_8                     0x00020000
+#define fPCD_IO1_SRC_16                   0x00040000
+#define fPCD_IO1_WS_16                    0x00080000
 
-#define fPCD_IO2_16         							0x00100000
-#define fPCD_IO2_ZW_8       							0x00200000
-#define fPCD_IO2_SRC_16     							0x00400000
-#define fPCD_IO2_WS_16      							0x00800000
+#define fPCD_IO2_16                       0x00100000
+#define fPCD_IO2_ZW_8                     0x00200000
+#define fPCD_IO2_SRC_16                   0x00400000
+#define fPCD_IO2_WS_16                    0x00800000
 
-#define mPCD_MEM1_WS        							0x03000000
-#define fPCD_MEM1_WS_ONE    							0x01000000
-#define fPCD_MEM1_WS_TWO    							0x02000000
-#define fPCD_MEM1_WS_THREE  							0x03000000
-#define fPCD_MEM1_16        							0x04000000
+#define mPCD_MEM1_WS                      0x03000000
+#define fPCD_MEM1_WS_ONE                  0x01000000
+#define fPCD_MEM1_WS_TWO                  0x02000000
+#define fPCD_MEM1_WS_THREE                0x03000000
+#define fPCD_MEM1_16                      0x04000000
 
-#define mPCD_MEM2_WS        							0x30000000
-#define fPCD_MEM2_WS_ONE    							0x10000000
-#define fPCD_MEM2_WS_TWO    							0x20000000
-#define fPCD_MEM2_WS_THREE  							0x30000000
-#define fPCD_MEM2_16        							0x40000000
+#define mPCD_MEM2_WS                      0x30000000
+#define fPCD_MEM2_WS_ONE                  0x10000000
+#define fPCD_MEM2_WS_TWO                  0x20000000
+#define fPCD_MEM2_WS_THREE                0x30000000
+#define fPCD_MEM2_16                      0x40000000
 
-#define PCD_MAX_MEMORY   									2
-#define PCD_MAX_IO       									2
+#define PCD_MAX_MEMORY                    2
+#define PCD_MAX_IO                        2
 
 typedef struct PcCard_Resource_s {
   PCCARD_DES  PcCard_Header;
@@ -521,16 +521,16 @@
 
 
 /* CONFLICT_DETAILS.CD.ulMask constants */
-#define CM_CDMASK_DEVINST      						0x00000001
-#define CM_CDMASK_RESDES       						0x00000002
-#define CM_CDMASK_FLAGS        						0x00000004
-#define CM_CDMASK_DESCRIPTION  						0x00000008
-#define CM_CDMASK_VALID        					  0x0000000F
+#define CM_CDMASK_DEVINST                 0x00000001
+#define CM_CDMASK_RESDES                  0x00000002
+#define CM_CDMASK_FLAGS                   0x00000004
+#define CM_CDMASK_DESCRIPTION             0x00000008
+#define CM_CDMASK_VALID                   0x0000000F
 
 /* CONFLICT_DETAILS.CD.ulFlags constants */
-#define CM_CDFLAGS_DRIVER      						0x00000001
-#define CM_CDFLAGS_ROOT_OWNED  						0x00000002
-#define CM_CDFLAGS_RESERVED    						0x00000004
+#define CM_CDFLAGS_DRIVER                 0x00000001
+#define CM_CDFLAGS_ROOT_OWNED             0x00000002
+#define CM_CDFLAGS_RESERVED               0x00000004
 
 typedef struct _CONFLICT_DETAILS_A {
   ULONG  CD_ulSize;
@@ -561,9 +561,9 @@
 
 
 /* CM_Add_Empty_Log_Conf.ulFlags constants */
-#define PRIORITY_EQUAL_FIRST  						0x00000008
-#define PRIORITY_EQUAL_LAST   						0x00000000
-#define PRIORITY_BIT          						0x00000008
+#define PRIORITY_EQUAL_FIRST              0x00000008
+#define PRIORITY_EQUAL_LAST               0x00000000
+#define PRIORITY_BIT                      0x00000008
 
 CMAPI
 CONFIGRET