- Implement CM_Get_Child_Ex, CM_Get_Parent_Ex, CM_Get_Sibling_Ex and CM_Set_DevNode_Problem[_Ex].
- Clean-up indentation.
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/setupapi.spec
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h

Modified: trunk/reactos/include/idl/pnp.idl
--- trunk/reactos/include/idl/pnp.idl	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/include/idl/pnp.idl	2005-07-23 13:43:52 UTC (rev 16704)
@@ -29,15 +29,15 @@
                                       [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);
+  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,
@@ -49,4 +49,9 @@
                                 [out] unsigned long *Status,
                                 [out] unsigned long *Problem,
                                 [in] DWORD Flags);
+
+  CONFIGRET PNP_SetDeviceProblem(handle_t BindingHandle,
+                                 [in, string] wchar_t *DeviceInstance,
+                                 [in] unsigned long Problem,
+                                 [in] DWORD Flags);
 }

Modified: trunk/reactos/include/wine/cfgmgr32.h
--- trunk/reactos/include/wine/cfgmgr32.h	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/include/wine/cfgmgr32.h	2005-07-23 13:43:52 UTC (rev 16704)
@@ -84,7 +84,16 @@
 #define CM_LOCATE_DEVINST_NOVALIDATION CM_LOCATE_DEVNODE_NOVALIDATION
 #define CM_LOCATE_DEVINST_BITS         CM_LOCATE_DEVNODE_BITS
 
+/* ulFlags for CM_Set_DevNode_Problem[_Ex] */
+#define CM_SET_DEVNODE_PROBLEM_NORMAL   0x00000000
+#define CM_SET_DEVNODE_PROBLEM_OVERRIDE 0x00000001
+#define CM_SET_DEVNODE_PROBLEM_BITS     0x00000001
 
+#define CM_SET_DEVINST_PROBLEM_NORMAL   CM_SET_DEVNODE_PROBLEM_NORMAL
+#define CM_SET_DEVINST_PROBLEM_OVERRIDE CM_SET_DEVNODE_PROBLEM_OVERRIDE
+#define CM_SET_DEVINST_PROBLEM_BITS     CM_SET_DEVNODE_PROBLEM_BITS
+
+
 CONFIGRET WINAPI CM_Connect_MachineA( PCSTR, PHMACHINE );
 CONFIGRET WINAPI CM_Connect_MachineW( PCWSTR, PHMACHINE );
 #define     CM_Connect_Machine WINELIB_NAME_AW(CM_Connect_Machine)
@@ -141,5 +150,7 @@
 CONFIGRET WINAPI CM_Open_Class_Key_ExW(LPGUID, LPCWSTR, REGSAM, REGDISPOSITION, PHKEY, ULONG, HMACHINE);
 #define     CM_Open_Class_Key_Ex WINELIB_NAME_AW(CM_Open_Class_Key_Ex)
 
+CONFIGRET WINAPI CM_Set_DevNode_Problem( DEVINST, ULONG, ULONG );
+CONFIGRET WINAPI CM_Set_DevNode_Problem_Ex( DEVINST, ULONG, ULONG, HMACHINE );
 
 #endif /* _CFGMGR32_H_ */

Modified: trunk/reactos/lib/setupapi/cfgmgr.c
--- trunk/reactos/lib/setupapi/cfgmgr.c	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/lib/setupapi/cfgmgr.c	2005-07-23 13:43:52 UTC (rev 16704)
@@ -251,7 +251,6 @@
 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;
@@ -310,9 +309,6 @@
     *pdnDevInst = dwIndex;
 
     return CR_SUCCESS;
-#endif
-    FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
-    return CR_FAILURE;
 }
 
 
@@ -322,8 +318,7 @@
 CONFIGRET WINAPI CM_Get_Depth(
     PULONG pulDepth, DEVINST dnDevInst, ULONG ulFlags)
 {
-    TRACE("%p %lx %lx\n",
-          pulDepth, dnDevInst, ulFlags);
+    TRACE("%p %lx %lx\n", pulDepth, dnDevInst, ulFlags);
     return CM_Get_Depth_Ex(pulDepth, dnDevInst, ulFlags, NULL);
 }
 
@@ -738,7 +733,6 @@
 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;
@@ -797,9 +791,6 @@
     *pdnDevInst = dwIndex;
 
     return CR_SUCCESS;
-#endif
-    FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
-    return CR_FAILURE;
 }
 
 
@@ -820,7 +811,6 @@
 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;
@@ -879,9 +869,6 @@
     *pdnDevInst = dwIndex;
 
     return CR_SUCCESS;
-#endif
-    FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
-    return CR_FAILURE;
 }
 
 
@@ -1035,3 +1022,60 @@
 
     return rc;
 }
+
+
+/***********************************************************************
+ * CM_Set_DevNode_Problem [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Set_DevNode_Problem(
+    DEVINST dnDevInst, ULONG ulProblem, ULONG ulFlags)
+{
+    TRACE("%lx %lx %lx\n", dnDevInst, ulProblem, ulFlags);
+    return CM_Set_DevNode_Problem_Ex(dnDevInst, ulProblem, ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Set_DevNode_Problem_Ex(
+    DEVINST dnDevInst, ULONG ulProblem, ULONG ulFlags, HMACHINE hMachine)
+{
+    RPC_BINDING_HANDLE BindingHandle = NULL;
+    HSTRING_TABLE StringTable = NULL;
+    LPWSTR lpDevInst;
+    CONFIGRET rc = CR_SUCCESS;
+
+    TRACE("%lx %lx %lx %lx\n", dnDevInst, ulProblem, ulFlags, hMachine);
+
+    if (dnDevInst == 0)
+        return CR_INVALID_DEVNODE;
+
+    if (ulFlags & ~CM_SET_DEVNODE_PROBLEM_BITS)
+        return CR_INVALID_FLAG;
+
+    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_SetDeviceProblem(BindingHandle,
+                                lpDevInst,
+                                ulProblem,
+                                ulFlags);
+}

Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/lib/setupapi/setupapi.spec	2005-07-23 13:43:52 UTC (rev 16704)
@@ -170,8 +170,8 @@
 @ stub CM_Reset_Children_Marks_Ex
 @ stub CM_Run_Detection
 @ stub CM_Run_Detection_Ex
-@ stub CM_Set_DevNode_Problem
-@ stub CM_Set_DevNode_Problem_Ex
+@ stdcall CM_Set_DevNode_Problem(long long long)
+@ stdcall CM_Set_DevNode_Problem_Ex(long long long long)
 @ stub CM_Set_DevNode_Registry_PropertyA
 @ stub CM_Set_DevNode_Registry_PropertyW
 @ stub CM_Set_DevNode_Registry_Property_ExA

Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
--- trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-07-23 13:43:52 UTC (rev 16704)
@@ -48,8 +48,8 @@
 
 static SERVICE_TABLE_ENTRY ServiceTable[2] =
 {
-  {TEXT("PlugPlay"), ServiceMain},
-  {NULL, NULL}
+    {TEXT("PlugPlay"), ServiceMain},
+    {NULL, NULL}
 };
 
 static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
@@ -59,41 +59,41 @@
 static DWORD WINAPI
 RpcServerThread(LPVOID lpParameter)
 {
-  RPC_STATUS Status;
+    RPC_STATUS Status;
 
-  DPRINT("RpcServerThread() called\n");
+    DPRINT("RpcServerThread() called\n");
 
-  Status = RpcServerUseProtseqEpW(L"ncacn_np",
-                                  20,
-                                  L"\\pipe\\umpnpmgr",
-                                  NULL);  // Security descriptor
-  if (Status != RPC_S_OK)
-  {
-    DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
-    return 0;
-  }
+    Status = RpcServerUseProtseqEpW(L"ncacn_np",
+                                    20,
+                                    L"\\pipe\\umpnpmgr",
+                                    NULL);  // Security descriptor
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+        return 0;
+    }
 
-  Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
-                               NULL,
-                               NULL);
-  if (Status != RPC_S_OK)
-  {
-    DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
-    return 0;
-  }
+    Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
+                                 NULL,
+                                 NULL);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);
+        return 0;
+    }
 
-  Status = RpcServerListen(1,
-                           20,
-                           FALSE);
-  if (Status != RPC_S_OK)
-  {
-    DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
-    return 0;
-  }
+    Status = RpcServerListen(1,
+                             20,
+                             FALSE);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);
+        return 0;
+    }
 
-  DPRINT("RpcServerThread() done\n");
+    DPRINT("RpcServerThread() done\n");
 
-  return 0;
+    return 0;
 }
 
 
@@ -202,7 +202,6 @@
 }
 
 
-#if 0
 CONFIGRET
 PNP_GetRelatedDeviceInstance(handle_t BindingHandle,
                              unsigned long Relationship,
@@ -211,21 +210,40 @@
                              unsigned long Length,
                              unsigned long Flags)
 {
+    PLUGPLAY_CONTROL_RELATED_DEVICE_DATA PlugPlayData;
     CONFIGRET ret = CR_SUCCESS;
+    NTSTATUS Status;
 
-    DPRINT1("PNP_GetRelatedDeviceInstance() called\n");
-    DPRINT1("  Relationship %ld\n", Relationship);
-    DPRINT1("  DeviceId %S\n", DeviceId);
+    DPRINT("PNP_GetRelatedDeviceInstance() called\n");
+    DPRINT("  Relationship %ld\n", Relationship);
+    DPRINT("  DeviceId %S\n", DeviceId);
 
-    lstrcpyW(RelatedDeviceId,
-             szRootDeviceId);
+    RtlInitUnicodeString(&PlugPlayData.TargetDeviceInstance,
+                         DeviceId);
 
-//Done:
-    DPRINT1("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);
+    PlugPlayData.Relation = Relationship;
 
+    PlugPlayData.RelatedDeviceInstance.Length = 0;
+    PlugPlayData.RelatedDeviceInstance.MaximumLength = Length;
+    PlugPlayData.RelatedDeviceInstance.Buffer = RelatedDeviceId;
+
+    Status = NtPlugPlayControl(PlugPlayControlGetRelatedDevice,
+                               (PVOID)&PlugPlayData,
+                               sizeof(PLUGPLAY_CONTROL_RELATED_DEVICE_DATA));
+    if (!NT_SUCCESS(Status))
+    {
+        /* FIXME: Map Status to ret */
+        ret = CR_FAILURE;
+    }
+
+    DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);
+    if (ret == 0)
+    {
+        DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance);
+    }
+
     return ret;
 }
-#endif
 
 
 CONFIGRET
@@ -297,104 +315,124 @@
 }
 
 
+CONFIGRET
+PNP_SetDeviceProblem(handle_t BindingHandle,
+                     wchar_t *DeviceInstance,
+                     unsigned long Problem,
+                     DWORD Flags)
+{
+    CONFIGRET ret = CR_SUCCESS;
+
+    DPRINT1("PNP_SetDeviceProblem() called\n");
+
+    /* FIXME */
+
+    DPRINT1("PNP_SetDeviceProblem() done (returns %lx)\n", ret);
+
+    return ret;
+}
+
+
 static DWORD WINAPI
 PnpEventThread(LPVOID lpParameter)
 {
-  PPLUGPLAY_EVENT_BLOCK PnpEvent;
-  ULONG PnpEventSize;
-  NTSTATUS Status;
-  RPC_STATUS RpcStatus;
+    PPLUGPLAY_EVENT_BLOCK PnpEvent;
+    ULONG PnpEventSize;
+    NTSTATUS Status;
+    RPC_STATUS RpcStatus;
 
-  PnpEventSize = 0x1000;
-  PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);
-  if (PnpEvent == NULL)
-    return ERROR_OUTOFMEMORY;
-
-  for (;;)
-  {
-    DPRINT("Calling NtGetPlugPlayEvent()\n");
-
-    /* Wait for the next pnp event */
-    Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);
-    /* Resize the buffer for the PnP event if it's too small. */
-    if (Status == STATUS_BUFFER_TOO_SMALL)
-    {
-      PnpEventSize += 0x400;
-      PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);
-      if (PnpEvent == NULL)
+    PnpEventSize = 0x1000;
+    PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);
+    if (PnpEvent == NULL)
         return ERROR_OUTOFMEMORY;
-      continue;
-    }
-    if (!NT_SUCCESS(Status))
-    {
-      DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);
-      break;
-    }
 
-    DPRINT("Received PnP Event\n");
-    if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))
+    for (;;)
     {
-      DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);
-    }
-    else
-    {
-      DPRINT1("Unknown event\n");
-    }
+        DPRINT("Calling NtGetPlugPlayEvent()\n");
 
-    /* FIXME: Process the pnp event */
+        /* Wait for the next pnp event */
+        Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);
 
-    /* Dequeue the current pnp event and signal the next one */
-    NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);
-  }
+        /* Resize the buffer for the PnP event if it's too small. */
+        if (Status == STATUS_BUFFER_TOO_SMALL)
+        {
+            PnpEventSize += 0x400;
+            PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);
+            if (PnpEvent == NULL)
+                return ERROR_OUTOFMEMORY;
+            continue;
+        }
 
-  HeapFree(GetProcessHeap(), 0, PnpEvent);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);
+            break;
+        }
 
-  return ERROR_SUCCESS;
+        DPRINT("Received PnP Event\n");
+        if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))
+        {
+            DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);
+        }
+        else
+        {
+            DPRINT1("Unknown event\n");
+        }
+
+        /* FIXME: Process the pnp event */
+
+        /* Dequeue the current pnp event and signal the next one */
+        NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);
+    }
+
+    HeapFree(GetProcessHeap(), 0, PnpEvent);
+
+    return ERROR_SUCCESS;
 }
 
 
 static VOID CALLBACK
 ServiceMain(DWORD argc, LPTSTR *argv)
 {
-  HANDLE hThread;
-  DWORD dwThreadId;
+    HANDLE hThread;
+    DWORD dwThreadId;
 
-  DPRINT("ServiceMain() called\n");
+    DPRINT("ServiceMain() called\n");
 
-  hThread = CreateThread(NULL,
-			 0,
-			 PnpEventThread,
-			 NULL,
-			 0,
-			 &dwThreadId);
-  if (hThread != NULL)
-    CloseHandle(hThread);
+    hThread = CreateThread(NULL,
+                           0,
+                           PnpEventThread,
+                           NULL,
+                           0,
+                           &dwThreadId);
+    if (hThread != NULL)
+        CloseHandle(hThread);
 
-  hThread = CreateThread(NULL,
-			 0,
-			 RpcServerThread,
-			 NULL,
-			 0,
-			 &dwThreadId);
-  if (hThread != NULL)
-    CloseHandle(hThread);
+    hThread = CreateThread(NULL,
+                           0,
+                           RpcServerThread,
+                           NULL,
+                           0,
+                           &dwThreadId);
+    if (hThread != NULL)
+        CloseHandle(hThread);
 
-  DPRINT("ServiceMain() done\n");
+    DPRINT("ServiceMain() done\n");
 }
 
 
 int
 main(int argc, char *argv[])
 {
-  DPRINT("Umpnpmgr: main() started\n");
+    DPRINT("Umpnpmgr: main() started\n");
 
-  StartServiceCtrlDispatcher(ServiceTable);
+    StartServiceCtrlDispatcher(ServiceTable);
 
-  DPRINT("Umpnpmgr: main() done\n");
+    DPRINT("Umpnpmgr: main() done\n");
 
-  ExitThread(0);
+    ExitThread(0);
 
-  return 0;
+    return 0;
 }
 
 /* EOF */

Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h
--- trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-07-23 11:55:33 UTC (rev 16703)
+++ trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-07-23 13:43:52 UTC (rev 16704)
@@ -108,7 +108,7 @@
 
 
 typedef DWORD RETURN_TYPE;
-typedef RETURN_TYPE	CONFIGRET;
+typedef RETURN_TYPE CONFIGRET;
 
 typedef HANDLE HMACHINE;
 typedef HMACHINE *PHMACHINE;