[ros-diffs] [cwittich] 40133: -allow to stop the service -listen for rpc calls

cwittich at svn.reactos.org cwittich at svn.reactos.org
Fri Mar 20 14:43:44 CET 2009


Author: cwittich
Date: Fri Mar 20 16:43:43 2009
New Revision: 40133

URL: http://svn.reactos.org/svn/reactos?rev=40133&view=rev
Log:
-allow to stop the service
-listen for rpc calls

Modified:
    trunk/reactos/base/services/wlansvc/wlansvc.c

Modified: trunk/reactos/base/services/wlansvc/wlansvc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/wlansvc/wlansvc.c?rev=40133&r1=40132&r2=40133&view=diff
==============================================================================
--- trunk/reactos/base/services/wlansvc/wlansvc.c [iso-8859-1] (original)
+++ trunk/reactos/base/services/wlansvc/wlansvc.c [iso-8859-1] Fri Mar 20 16:43:43 2009
@@ -10,8 +10,9 @@
 
 #define WIN32_NO_STATUS
 #include <windows.h>
+#include "wlansvc_s.h"
 
-#define NDEBUG
+//#define NDEBUG
 #include <debug.h>
 
 /* GLOBALS ******************************************************************/
@@ -19,10 +20,47 @@
 #define SERVICE_NAME L"WLAN Service"
 
 SERVICE_STATUS_HANDLE ServiceStatusHandle;
-
+SERVICE_STATUS SvcStatus;
 
 /* FUNCTIONS *****************************************************************/
+static DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter)
+{
+    RPC_STATUS Status;
 
+    Status = RpcServerUseProtseqEpW(L"ncalrpc", 20, L"wlansvc", NULL);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+        return 0;
+    }
+
+    Status = RpcServerRegisterIf(wlansvc_interface_v1_0_s_ifspec, NULL, NULL);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT("RpcServerRegisterIf() failed (Status %lx)\n", Status);
+        return 0;
+    }
+
+    Status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, 0);
+    if (Status != RPC_S_OK)
+    {
+        DPRINT("RpcServerListen() failed (Status %lx)\n", Status);
+    }
+
+    DPRINT("RpcServerListen finished\n");
+    return 0;
+}
+
+static void UpdateServiceStatus(HANDLE hServiceStatus, DWORD NewStatus, DWORD Increment)
+{
+    if (Increment > 0)
+        SvcStatus.dwCheckPoint += Increment;
+    else
+        SvcStatus.dwCheckPoint = 0;
+
+    SvcStatus.dwCurrentState = NewStatus;
+    SetServiceStatus(hServiceStatus, &SvcStatus);
+}
 
 static DWORD WINAPI
 ServiceControlHandler(DWORD dwControl,
@@ -32,34 +70,62 @@
 {
     switch (dwControl)
     {
+        case SERVICE_CONTROL_SHUTDOWN:
         case SERVICE_CONTROL_STOP:
-        case SERVICE_CONTROL_SHUTDOWN:
-            return ERROR_SUCCESS;
-
-        default :
+            UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOP_PENDING, 1);
+            RpcMgmtStopServerListening(NULL);
+            break;
+        case SERVICE_CONTROL_INTERROGATE:
+            return NO_ERROR;
+        default:
             return ERROR_CALL_NOT_IMPLEMENTED;
     }
+    return NO_ERROR;
 }
-
-
 
 static VOID CALLBACK
 ServiceMain(DWORD argc, LPWSTR *argv)
 {
+    HANDLE hThread;
+
     UNREFERENCED_PARAMETER(argc);
     UNREFERENCED_PARAMETER(argv);
 
     DPRINT("ServiceMain() called\n");
 
+    SvcStatus.dwServiceType             = SERVICE_WIN32_OWN_PROCESS;
+    SvcStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+    SvcStatus.dwCheckPoint              = 0;
+    SvcStatus.dwWin32ExitCode           = 0;
+    SvcStatus.dwServiceSpecificExitCode = 0;
+    SvcStatus.dwWaitHint                = 4000;
+
     ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
                                                         ServiceControlHandler,
                                                         NULL);
 
+    UpdateServiceStatus(ServiceStatusHandle, SERVICE_RUNNING, 0);
 
+    hThread = CreateThread(NULL,
+                           0,
+                           (LPTHREAD_START_ROUTINE)
+                           RpcThreadRoutine,
+                           NULL,
+                           0,
+                           NULL);
+
+    if (!hThread)
+        DPRINT("Can't create RpcThread\n");
+    else
+    {
+        WaitForSingleObject(hThread, INFINITE);
+        CloseHandle(hThread);
+    }
+
+    UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0);
 
     DPRINT("ServiceMain() done\n");
 }
-
 
 int
 wmain(int argc, WCHAR *argv[])



More information about the Ros-diffs mailing list