Fix PNP_QueryArbitratorFreeData() and PNP_QueryArbitratorFreeSize() prototypes.
[reactos.git] / reactos / base / services / umpnpmgr / umpnpmgr.c
index 75080d5..64d8b45 100644 (file)
@@ -51,7 +51,7 @@
 
 /* GLOBALS ******************************************************************/
 
-static VOID CALLBACK ServiceMain(DWORD, LPWSTR *);
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
 static WCHAR ServiceName[] = L"PlugPlay";
 static SERVICE_TABLE_ENTRYW ServiceTable[] =
 {
@@ -59,6 +59,9 @@ static SERVICE_TABLE_ENTRYW ServiceTable[] =
     {NULL, NULL}
 };
 
+static SERVICE_STATUS_HANDLE ServiceStatusHandle;
+static SERVICE_STATUS ServiceStatus;
+
 static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
 
 static HKEY hEnumKey = NULL;
@@ -91,20 +94,37 @@ static DWORD WINAPI
 RpcServerThread(LPVOID lpParameter)
 {
     RPC_STATUS Status;
+    BOOLEAN RegisteredProtSeq = FALSE;
 
     UNREFERENCED_PARAMETER(lpParameter);
 
     DPRINT("RpcServerThread() called\n");
 
+#if 0
+    /* XP-compatible protocol sequence/endpoint */
     Status = RpcServerUseProtseqEpW(L"ncacn_np",
                                     20,
-                                    L"\\pipe\\umpnpmgr",
+                                    L"\\pipe\\ntsvcs",
                                     NULL);  // Security descriptor
-    if (Status != RPC_S_OK)
-    {
+    if (Status == RPC_S_OK)
+        RegisteredProtSeq = TRUE;
+    else
+        DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+#endif
+
+    /* Vista-compatible protocol sequence/endpoint */
+    Status = RpcServerUseProtseqEpW(L"ncacn_np",
+                                    20,
+                                    L"\\pipe\\plugplay",
+                                    NULL);  // Security descriptor
+    if (Status == RPC_S_OK)
+        RegisteredProtSeq = TRUE;
+    else
         DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+
+    /* Make sure there's a usable endpoint */
+    if (RegisteredProtSeq == FALSE)
         return 0;
-    }
 
     Status = RpcServerRegisterIf(pnp_v1_0_s_ifspec,
                                  NULL,
@@ -1835,7 +1855,12 @@ DWORD PNP_SetHwProf(
 
 /* Function 56 */
 DWORD PNP_QueryArbitratorFreeData(
-    handle_t hBinding)
+    handle_t hBinding,
+    BYTE *pData,
+    DWORD DataLen,
+    LPWSTR pDeviceID,
+    RESOURCEID ResourceID,
+    DWORD ulFlags)
 {
     UNIMPLEMENTED;
     return CR_CALL_NOT_IMPLEMENTED;
@@ -1844,7 +1869,11 @@ DWORD PNP_QueryArbitratorFreeData(
 
 /* Function 57 */
 DWORD PNP_QueryArbitratorFreeSize(
-    handle_t hBinding)
+    handle_t hBinding,
+    DWORD *pulSize,
+    LPWSTR pDeviceID,
+    RESOURCEID ResourceID,
+    DWORD ulFlags)
 {
     UNIMPLEMENTED;
     return CR_CALL_NOT_IMPLEMENTED;
@@ -2445,36 +2474,142 @@ PnpEventThread(LPVOID lpParameter)
 }
 
 
+static VOID
+UpdateServiceStatus(DWORD dwState)
+{
+    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState = dwState;
+    ServiceStatus.dwControlsAccepted = 0;
+    ServiceStatus.dwWin32ExitCode = 0;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint = 0;
+
+    if (dwState == SERVICE_START_PENDING ||
+        dwState == SERVICE_STOP_PENDING ||
+        dwState == SERVICE_PAUSE_PENDING ||
+        dwState == SERVICE_CONTINUE_PENDING)
+        ServiceStatus.dwWaitHint = 10000;
+    else
+        ServiceStatus.dwWaitHint = 0;
+
+    SetServiceStatus(ServiceStatusHandle,
+                     &ServiceStatus);
+}
+
+
 static DWORD WINAPI
 ServiceControlHandler(DWORD dwControl,
                       DWORD dwEventType,
                       LPVOID lpEventData,
                       LPVOID lpContext)
 {
-    /* FIXME */
-    DPRINT1("ServiceControlHandler() called (control code %lu)\n", dwControl);
-    return ERROR_SUCCESS;
+    DPRINT1("ServiceControlHandler() called\n");
+
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+            DPRINT1("  SERVICE_CONTROL_STOP received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_PAUSE:
+            DPRINT1("  SERVICE_CONTROL_PAUSE received\n");
+            UpdateServiceStatus(SERVICE_PAUSED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_CONTINUE:
+            DPRINT1("  SERVICE_CONTROL_CONTINUE received\n");
+            UpdateServiceStatus(SERVICE_RUNNING);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            DPRINT1("  SERVICE_CONTROL_INTERROGATE received\n");
+            SetServiceStatus(ServiceStatusHandle,
+                             &ServiceStatus);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_SHUTDOWN:
+            DPRINT1("  SERVICE_CONTROL_SHUTDOWN received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        default :
+            DPRINT1("  Control %lu received\n");
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
 }
 
 
-static DWORD
-ServiceInit(VOID)
+static VOID CALLBACK
+ServiceMain(DWORD argc, LPTSTR *argv)
 {
     HANDLE hThread;
     DWORD dwThreadId;
-    DWORD dwError;
+
+    UNREFERENCED_PARAMETER(argc);
+    UNREFERENCED_PARAMETER(argv);
+
+    DPRINT("ServiceMain() called\n");
+
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        DPRINT1("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_START_PENDING);
+
+    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,
+                           DeviceInstallThread,
+                           NULL,
+                           0,
+                           &dwThreadId);
+    if (hThread != NULL)
+        CloseHandle(hThread);
+
+    UpdateServiceStatus(SERVICE_RUNNING);
+
+    DPRINT("ServiceMain() done\n");
+}
+
+
+int
+wmain(int argc, WCHAR *argv[])
+{
     BOOLEAN OldValue;
+    DWORD dwError;
+
+    UNREFERENCED_PARAMETER(argc);
+    UNREFERENCED_PARAMETER(argv);
+
+    DPRINT("Umpnpmgr: main() started\n");
 
     /* We need this privilege for using CreateProcessAsUserW */
-    RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE,
-                       TRUE,
-                       FALSE,
-                       &OldValue);
-
-    hInstallEvent = CreateEvent(NULL,
-                                TRUE,
-                                SetupIsActive()/*FALSE*/,
-                                NULL);
+    RtlAdjustPrivilege(SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, TRUE, FALSE, &OldValue);
+
+    hInstallEvent = CreateEvent(NULL, TRUE, SetupIsActive()/*FALSE*/, NULL);
     if (hInstallEvent == NULL)
     {
         dwError = GetLastError();
@@ -2482,10 +2617,7 @@ ServiceInit(VOID)
         return dwError;
     }
 
-    hDeviceInstallListNotEmpty = CreateEvent(NULL,
-                                             FALSE,
-                                             FALSE,
-                                             NULL);
+    hDeviceInstallListNotEmpty = CreateEvent(NULL, FALSE, FALSE, NULL);
     if (hDeviceInstallListNotEmpty == NULL)
     {
         dwError = GetLastError();
@@ -2532,110 +2664,11 @@ ServiceInit(VOID)
         return dwError;
     }
 
-    hThread = CreateThread(NULL,
-                           0,
-                           PnpEventThread,
-                           NULL,
-                           0,
-                           &dwThreadId);
-    if (hThread == NULL)
-    {
-        return GetLastError();
-    }
-    CloseHandle(hThread);
-
-    hThread = CreateThread(NULL,
-                           0,
-                           RpcServerThread,
-                           NULL,
-                           0,
-                           &dwThreadId);
-    if (hThread == NULL)
-    {
-        return GetLastError();
-    }
-    CloseHandle(hThread);
-
-    hThread = CreateThread(NULL,
-                           0,
-                           DeviceInstallThread,
-                           NULL,
-                           0,
-                           &dwThreadId);
-    if (hThread == NULL)
-    {
-        return GetLastError();
-    }
-    CloseHandle(hThread);
-
-    return ERROR_SUCCESS;
-}
-
-
-static VOID CALLBACK
-ServiceMain(DWORD argc,
-            LPWSTR *argv)
-{
-    SERVICE_STATUS ServiceStatus;
-    SERVICE_STATUS_HANDLE ServiceStatusHandle;
-    DWORD dwError;
-
-    UNREFERENCED_PARAMETER(argc);
-    UNREFERENCED_PARAMETER(argv);
-
-    DPRINT("ServiceMain() called\n");
-
-    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
-                                                        ServiceControlHandler,
-                                                        NULL);
-    if (!ServiceStatusHandle)
-    {
-        dwError = GetLastError();
-        DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError);
-        return;
-    }
-
-    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
-    ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
-    ServiceStatus.dwControlsAccepted = 0;
-    ServiceStatus.dwWin32ExitCode = NO_ERROR;
-    ServiceStatus.dwServiceSpecificExitCode = 0;
-    ServiceStatus.dwCheckPoint = 0;
-    ServiceStatus.dwWaitHint = 2000;
-
-    SetServiceStatus(ServiceStatusHandle,
-                     &ServiceStatus);
-
-    dwError = ServiceInit();
-    if (dwError != ERROR_SUCCESS)
-    {
-        DPRINT1("Service stopped\n");
-        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
-    }
-    else
-    {
-        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
-    }
-
-    SetServiceStatus(ServiceStatusHandle,
-                     &ServiceStatus);
-
-    DPRINT("ServiceMain() done\n");
-}
-
-
-int
-wmain(int argc,
-      WCHAR *argv[])
-{
-    UNREFERENCED_PARAMETER(argc);
-    UNREFERENCED_PARAMETER(argv);
-
-    DPRINT1("Umpnpmgr: main() started\n");
+    StartServiceCtrlDispatcher(ServiceTable);
 
-    StartServiceCtrlDispatcherW(ServiceTable);
+    DPRINT("Umpnpmgr: main() done\n");
 
-    DPRINT1("Umpnpmgr: main() done\n");
+    ExitThread(0);
 
     return 0;
 }