- Implement CM_Get_Child_Ex, CM_Get_Parent_Ex, CM_Get_Sibling_Ex and CM_Set_DevNode_P...
authorEric Kohl <eric.kohl@reactos.org>
Sat, 23 Jul 2005 13:43:52 +0000 (13:43 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 23 Jul 2005 13:43:52 +0000 (13:43 +0000)
- Clean-up indentation.

svn path=/trunk/; revision=16704

reactos/include/idl/pnp.idl
reactos/include/wine/cfgmgr32.h
reactos/lib/setupapi/cfgmgr.c
reactos/lib/setupapi/setupapi.spec
reactos/services/umpnpmgr/umpnpmgr.c
reactos/w32api/include/ddk/cfgmgr32.h

index 738afac..0f44d89 100644 (file)
@@ -29,15 +29,15 @@ interface pnp
                                       [out, string, size_is(Length)] wchar_t *DeviceInstance,\r
                                       [in] DWORD Length);\r
 \r
-//  cpp_quote("#define PNP_DEVICE_PARENT  1")\r
-//  cpp_quote("#define PNP_DEVICE_CHILD   2")\r
-//  cpp_quote("#define PNP_DEVICE_SIBLING 3")\r
-//  CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
-//                                         [in] DWORD Relationship,\r
-//                                         [in, string] wchar_t *DeviceId,\r
-//                                         [out, string, size_is(Length)] wchar_t *RelatedDeviceId,\r
-//                                         [in] DWORD Length,\r
-//                                         [in] DWORD Flags);\r
+  cpp_quote("#define PNP_DEVICE_PARENT  1")\r
+  cpp_quote("#define PNP_DEVICE_CHILD   2")\r
+  cpp_quote("#define PNP_DEVICE_SIBLING 3")\r
+  CONFIGRET PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
+                                         [in] DWORD Relationship,\r
+                                         [in, string] wchar_t *DeviceId,\r
+                                         [out, string, size_is(Length)] wchar_t *RelatedDeviceId,\r
+                                         [in] DWORD Length,\r
+                                         [in] DWORD Flags);\r
 \r
   CONFIGRET PNP_GetDepth(handle_t BindingHandle,\r
                          [in, string] wchar_t *DeviceInstance,\r
@@ -49,4 +49,9 @@ interface pnp
                                 [out] unsigned long *Status,\r
                                 [out] unsigned long *Problem,\r
                                 [in] DWORD Flags);\r
+\r
+  CONFIGRET PNP_SetDeviceProblem(handle_t BindingHandle,\r
+                                 [in, string] wchar_t *DeviceInstance,\r
+                                 [in] unsigned long Problem,\r
+                                 [in] DWORD Flags);\r
 }\r
index c64c360..c4babda 100644 (file)
@@ -84,6 +84,15 @@ DECL_WINELIB_CFGMGR32_TYPE_AW(DEVINSTID)
 #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 );
@@ -141,5 +150,7 @@ CONFIGRET WINAPI CM_Open_Class_Key_ExA(LPGUID, LPCSTR, REGSAM, REGDISPOSITION, P
 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_ */
index fe644d2..bab775a 100644 (file)
@@ -251,7 +251,6 @@ CONFIGRET WINAPI CM_Get_Child(
 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 @@ CONFIGRET WINAPI CM_Get_Child_Ex(
     *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_Child_Ex(
 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(
 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 @@ CONFIGRET WINAPI CM_Get_Parent_Ex(
     *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(
 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 @@ CONFIGRET WINAPI CM_Get_Sibling_Ex(
     *pdnDevInst = dwIndex;
 
     return CR_SUCCESS;
-#endif
-    FIXME("%p %lx %lx %lx\n", pdnDevInst, dnDevInst, ulFlags, hMachine);
-    return CR_FAILURE;
 }
 
 
@@ -1035,3 +1022,60 @@ CONFIGRET WINAPI CM_Locate_DevNode_ExW(
 
     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);
+}
index de0e4d1..53ffbd1 100644 (file)
 @ 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
index aa3db11..8c22568 100644 (file)
@@ -48,8 +48,8 @@ ServiceMain(DWORD argc, LPTSTR *argv);
 \r
 static SERVICE_TABLE_ENTRY ServiceTable[2] =\r
 {\r
-  {TEXT("PlugPlay"), ServiceMain},\r
-  {NULL, NULL}\r
+    {TEXT("PlugPlay"), ServiceMain},\r
+    {NULL, NULL}\r
 };\r
 \r
 static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";\r
@@ -59,41 +59,41 @@ static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
 static DWORD WINAPI\r
 RpcServerThread(LPVOID lpParameter)\r
 {\r
-  RPC_STATUS Status;\r
+    RPC_STATUS Status;\r
 \r
-  DPRINT("RpcServerThread() called\n");\r
+    DPRINT("RpcServerThread() called\n");\r
 \r
-  Status = RpcServerUseProtseqEpW(L"ncacn_np",\r
-                                  20,\r
-                                  L"\\pipe\\umpnpmgr",\r
-                                  NULL);  // Security descriptor\r
-  if (Status != RPC_S_OK)\r
-  {\r
-    DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);\r
-    return 0;\r
-  }\r
-\r
-  Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,\r
-                               NULL,\r
-                               NULL);\r
-  if (Status != RPC_S_OK)\r
-  {\r
-    DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);\r
-    return 0;\r
-  }\r
-\r
-  Status = RpcServerListen(1,\r
-                           20,\r
-                           FALSE);\r
-  if (Status != RPC_S_OK)\r
-  {\r
-    DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);\r
-    return 0;\r
-  }\r
+    Status = RpcServerUseProtseqEpW(L"ncacn_np",\r
+                                    20,\r
+                                    L"\\pipe\\umpnpmgr",\r
+                                    NULL);  // Security descriptor\r
+    if (Status != RPC_S_OK)\r
+    {\r
+        DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);\r
+        return 0;\r
+    }\r
+\r
+    Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,\r
+                                 NULL,\r
+                                 NULL);\r
+    if (Status != RPC_S_OK)\r
+    {\r
+        DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status);\r
+        return 0;\r
+    }\r
+\r
+    Status = RpcServerListen(1,\r
+                             20,\r
+                             FALSE);\r
+    if (Status != RPC_S_OK)\r
+    {\r
+        DPRINT1("RpcServerListen() failed (Status %lx)\n", Status);\r
+        return 0;\r
+    }\r
 \r
-  DPRINT("RpcServerThread() done\n");\r
+    DPRINT("RpcServerThread() done\n");\r
 \r
-  return 0;\r
+    return 0;\r
 }\r
 \r
 \r
@@ -202,7 +202,6 @@ Done:
 }\r
 \r
 \r
-#if 0\r
 CONFIGRET\r
 PNP_GetRelatedDeviceInstance(handle_t BindingHandle,\r
                              unsigned long Relationship,\r
@@ -211,21 +210,40 @@ PNP_GetRelatedDeviceInstance(handle_t BindingHandle,
                              unsigned long Length,\r
                              unsigned long Flags)\r
 {\r
+    PLUGPLAY_CONTROL_RELATED_DEVICE_DATA PlugPlayData;\r
     CONFIGRET ret = CR_SUCCESS;\r
+    NTSTATUS Status;\r
 \r
-    DPRINT1("PNP_GetRelatedDeviceInstance() called\n");\r
-    DPRINT1("  Relationship %ld\n", Relationship);\r
-    DPRINT1("  DeviceId %S\n", DeviceId);\r
+    DPRINT("PNP_GetRelatedDeviceInstance() called\n");\r
+    DPRINT("  Relationship %ld\n", Relationship);\r
+    DPRINT("  DeviceId %S\n", DeviceId);\r
 \r
-    lstrcpyW(RelatedDeviceId,\r
-             szRootDeviceId);\r
+    RtlInitUnicodeString(&PlugPlayData.TargetDeviceInstance,\r
+                         DeviceId);\r
+\r
+    PlugPlayData.Relation = Relationship;\r
+\r
+    PlugPlayData.RelatedDeviceInstance.Length = 0;\r
+    PlugPlayData.RelatedDeviceInstance.MaximumLength = Length;\r
+    PlugPlayData.RelatedDeviceInstance.Buffer = RelatedDeviceId;\r
+\r
+    Status = NtPlugPlayControl(PlugPlayControlGetRelatedDevice,\r
+                               (PVOID)&PlugPlayData,\r
+                               sizeof(PLUGPLAY_CONTROL_RELATED_DEVICE_DATA));\r
+    if (!NT_SUCCESS(Status))\r
+    {\r
+        /* FIXME: Map Status to ret */\r
+        ret = CR_FAILURE;\r
+    }\r
 \r
-//Done:\r
-    DPRINT1("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);\r
+    DPRINT("PNP_GetRelatedDeviceInstance() done (returns %lx)\n", ret);\r
+    if (ret == 0)\r
+    {\r
+        DPRINT("RelatedDevice: %wZ\n", &PlugPlayData.RelatedDeviceInstance);\r
+    }\r
 \r
     return ret;\r
 }\r
-#endif\r
 \r
 \r
 CONFIGRET\r
@@ -297,104 +315,124 @@ PNP_GetDeviceStatus(handle_t BindingHandle,
 }\r
 \r
 \r
+CONFIGRET\r
+PNP_SetDeviceProblem(handle_t BindingHandle,\r
+                     wchar_t *DeviceInstance,\r
+                     unsigned long Problem,\r
+                     DWORD Flags)\r
+{\r
+    CONFIGRET ret = CR_SUCCESS;\r
+\r
+    DPRINT1("PNP_SetDeviceProblem() called\n");\r
+\r
+    /* FIXME */\r
+\r
+    DPRINT1("PNP_SetDeviceProblem() done (returns %lx)\n", ret);\r
+\r
+    return ret;\r
+}\r
+\r
+\r
 static DWORD WINAPI\r
 PnpEventThread(LPVOID lpParameter)\r
 {\r
-  PPLUGPLAY_EVENT_BLOCK PnpEvent;\r
-  ULONG PnpEventSize;\r
-  NTSTATUS Status;\r
-  RPC_STATUS RpcStatus;\r
-\r
-  PnpEventSize = 0x1000;\r
-  PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);\r
-  if (PnpEvent == NULL)\r
-    return ERROR_OUTOFMEMORY;\r
-\r
-  for (;;)\r
-  {\r
-    DPRINT("Calling NtGetPlugPlayEvent()\n");\r
-\r
-    /* Wait for the next pnp event */\r
-    Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);\r
-    /* Resize the buffer for the PnP event if it's too small. */\r
-    if (Status == STATUS_BUFFER_TOO_SMALL)\r
-    {\r
-      PnpEventSize += 0x400;\r
-      PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);\r
-      if (PnpEvent == NULL)\r
+    PPLUGPLAY_EVENT_BLOCK PnpEvent;\r
+    ULONG PnpEventSize;\r
+    NTSTATUS Status;\r
+    RPC_STATUS RpcStatus;\r
+\r
+    PnpEventSize = 0x1000;\r
+    PnpEvent = HeapAlloc(GetProcessHeap(), 0, PnpEventSize);\r
+    if (PnpEvent == NULL)\r
         return ERROR_OUTOFMEMORY;\r
-      continue;\r
-    }\r
-    if (!NT_SUCCESS(Status))\r
-    {\r
-      DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);\r
-      break;\r
-    }\r
 \r
-    DPRINT("Received PnP Event\n");\r
-    if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))\r
+    for (;;)\r
     {\r
-      DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);\r
-    }\r
-    else\r
-    {\r
-      DPRINT1("Unknown event\n");\r
+        DPRINT("Calling NtGetPlugPlayEvent()\n");\r
+\r
+        /* Wait for the next pnp event */\r
+        Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize);\r
+\r
+        /* Resize the buffer for the PnP event if it's too small. */\r
+        if (Status == STATUS_BUFFER_TOO_SMALL)\r
+        {\r
+            PnpEventSize += 0x400;\r
+            PnpEvent = HeapReAlloc(GetProcessHeap(), 0, PnpEvent, PnpEventSize);\r
+            if (PnpEvent == NULL)\r
+                return ERROR_OUTOFMEMORY;\r
+            continue;\r
+        }\r
+\r
+        if (!NT_SUCCESS(Status))\r
+        {\r
+            DPRINT("NtPlugPlayEvent() failed (Status %lx)\n", Status);\r
+            break;\r
+        }\r
+\r
+        DPRINT("Received PnP Event\n");\r
+        if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus))\r
+        {\r
+            DPRINT1("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds);\r
+        }\r
+        else\r
+        {\r
+            DPRINT1("Unknown event\n");\r
+        }\r
+\r
+        /* FIXME: Process the pnp event */\r
+\r
+        /* Dequeue the current pnp event and signal the next one */\r
+        NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);\r
     }\r
 \r
-    /* FIXME: Process the pnp event */\r
+    HeapFree(GetProcessHeap(), 0, PnpEvent);\r
 \r
-    /* Dequeue the current pnp event and signal the next one */\r
-    NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);\r
-  }\r
-\r
-  HeapFree(GetProcessHeap(), 0, PnpEvent);\r
-\r
-  return ERROR_SUCCESS;\r
+    return ERROR_SUCCESS;\r
 }\r
 \r
 \r
 static VOID CALLBACK\r
 ServiceMain(DWORD argc, LPTSTR *argv)\r
 {\r
-  HANDLE hThread;\r
-  DWORD dwThreadId;\r
-\r
-  DPRINT("ServiceMain() called\n");\r
-\r
-  hThread = CreateThread(NULL,\r
-                        0,\r
-                        PnpEventThread,\r
-                        NULL,\r
-                        0,\r
-                        &dwThreadId);\r
-  if (hThread != NULL)\r
-    CloseHandle(hThread);\r
-\r
-  hThread = CreateThread(NULL,\r
-                        0,\r
-                        RpcServerThread,\r
-                        NULL,\r
-                        0,\r
-                        &dwThreadId);\r
-  if (hThread != NULL)\r
-    CloseHandle(hThread);\r
-\r
-  DPRINT("ServiceMain() done\n");\r
+    HANDLE hThread;\r
+    DWORD dwThreadId;\r
+\r
+    DPRINT("ServiceMain() called\n");\r
+\r
+    hThread = CreateThread(NULL,\r
+                           0,\r
+                           PnpEventThread,\r
+                           NULL,\r
+                           0,\r
+                           &dwThreadId);\r
+    if (hThread != NULL)\r
+        CloseHandle(hThread);\r
+\r
+    hThread = CreateThread(NULL,\r
+                           0,\r
+                           RpcServerThread,\r
+                           NULL,\r
+                           0,\r
+                           &dwThreadId);\r
+    if (hThread != NULL)\r
+        CloseHandle(hThread);\r
+\r
+    DPRINT("ServiceMain() done\n");\r
 }\r
 \r
 \r
 int\r
 main(int argc, char *argv[])\r
 {\r
-  DPRINT("Umpnpmgr: main() started\n");\r
+    DPRINT("Umpnpmgr: main() started\n");\r
 \r
-  StartServiceCtrlDispatcher(ServiceTable);\r
+    StartServiceCtrlDispatcher(ServiceTable);\r
 \r
-  DPRINT("Umpnpmgr: main() done\n");\r
+    DPRINT("Umpnpmgr: main() done\n");\r
 \r
-  ExitThread(0);\r
+    ExitThread(0);\r
 \r
-  return 0;\r
+    return 0;\r
 }\r
 \r
 /* EOF */\r
index 948b528..b49e0da 100644 (file)
@@ -108,7 +108,7 @@ extern "C" {
 
 
 typedef DWORD RETURN_TYPE;
-typedef RETURN_TYPE    CONFIGRET;
+typedef RETURN_TYPE CONFIGRET;
 
 typedef HANDLE HMACHINE;
 typedef HMACHINE *PHMACHINE;