From 18ab208eeb4e8351ef22609a7b80bb2904a771e1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 31 Oct 2010 10:00:21 +0000 Subject: [PATCH] [SERVICES] Revert r49366. svn path=/trunk/; revision=49371 --- reactos/base/system/services/database.c | 80 +++++++++++++++++++----- reactos/base/system/services/rpcserver.c | 16 ++--- reactos/base/system/services/services.h | 10 +-- 3 files changed, 75 insertions(+), 31 deletions(-) diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index 34727e93ca6..7a9819e4c8b 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -678,10 +678,66 @@ ScmGetBootAndSystemDriverState(VOID) DWORD -ScmSendServiceCommand(PSERVICE Service, - DWORD dwControl, - DWORD argc, - LPWSTR *argv) +ScmControlService(PSERVICE Service, + DWORD dwControl) +{ + PSCM_CONTROL_PACKET ControlPacket; + SCM_REPLY_PACKET ReplyPacket; + + DWORD dwWriteCount = 0; + DWORD dwReadCount = 0; + DWORD TotalLength; + DWORD dwError = ERROR_SUCCESS; + + DPRINT("ScmControlService() called\n"); + + TotalLength = wcslen(Service->lpServiceName) + 1; + + ControlPacket = (SCM_CONTROL_PACKET*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR))); + if (ControlPacket == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + ControlPacket->dwControl = dwControl; + ControlPacket->dwSize = TotalLength; + ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service; + wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName); + + /* Send the control packet */ + WriteFile(Service->ControlPipeHandle, + ControlPacket, + sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)), + &dwWriteCount, + NULL); + + /* Read the reply */ + ReadFile(Service->ControlPipeHandle, + &ReplyPacket, + sizeof(SCM_REPLY_PACKET), + &dwReadCount, + NULL); + + /* Release the contol packet */ + HeapFree(GetProcessHeap(), + 0, + ControlPacket); + + if (dwReadCount == sizeof(SCM_REPLY_PACKET)) + { + dwError = ReplyPacket.dwError; + } + + DPRINT("ScmControlService() done\n"); + + return dwError; +} + + +static DWORD +ScmSendStartCommand(PSERVICE Service, + DWORD argc, + LPWSTR *argv) { PSCM_CONTROL_PACKET ControlPacket; SCM_REPLY_PACKET ReplyPacket; @@ -694,7 +750,7 @@ ScmSendServiceCommand(PSERVICE Service, DWORD dwError = ERROR_SUCCESS; DWORD i; - DPRINT("ScmSendServiceCommand() called\n"); + DPRINT("ScmSendStartCommand() called\n"); /* Calculate the total length of the start command line */ TotalLength = wcslen(Service->lpServiceName) + 1; @@ -718,7 +774,7 @@ ScmSendServiceCommand(PSERVICE Service, if (ControlPacket == NULL) return ERROR_NOT_ENOUGH_MEMORY; - ControlPacket->dwControl = dwControl; + ControlPacket->dwControl = SERVICE_CONTROL_START; ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service; ControlPacket->dwSize = TotalLength; Ptr = &ControlPacket->szArguments[0]; @@ -763,7 +819,7 @@ ScmSendServiceCommand(PSERVICE Service, dwError = ReplyPacket.dwError; } - DPRINT("ScmSendServiceCommand() done\n"); + DPRINT("ScmSendStartCommand() done\n"); return dwError; } @@ -942,10 +998,7 @@ ScmStartUserModeService(PSERVICE Service, DPRINT("Received service process ID %lu\n", dwProcessId); /* Send start command */ - dwError = ScmSendServiceCommand(Service, - SERVICE_CONTROL_START, - argc, - argv); + dwError = ScmSendStartCommand(Service, argc, argv); } } else @@ -1174,10 +1227,7 @@ ScmAutoShutdownServices(VOID) CurrentService->Status.dwCurrentState == SERVICE_START_PENDING) { /* shutdown service */ - ScmSendServiceCommand(CurrentService, - SERVICE_CONTROL_STOP, - 0, - NULL); + ScmControlService(CurrentService, SERVICE_CONTROL_STOP); } ServiceEntry = ServiceEntry->Flink; diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 05f9400101d..30df18d071f 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -699,10 +699,8 @@ DWORD RControlService( } /* Send control code to the service */ - dwError = ScmSendServiceCommand(lpService, - dwControl, - 0, - NULL); + dwError = ScmControlService(lpService, + dwControl); /* Return service status information */ RtlCopyMemory(lpServiceStatus, @@ -2866,10 +2864,7 @@ DWORD RStartServiceW( } /* Start the service */ - dwError = ScmSendServiceCommand(lpService, - SERVICE_CONTROL_START, - argc, - (LPWSTR *)argv); + dwError = ScmStartService(lpService, argc, (LPWSTR *)argv); return dwError; } @@ -4077,10 +4072,7 @@ DWORD RStartServiceA( /* FIXME: Convert argument vector to Unicode */ /* Start the service */ - dwError = ScmSendServiceCommand(lpService, - SERVICE_CONTROL_START, - 0, - NULL); + dwError = ScmStartService(lpService, 0, NULL); /* FIXME: Free argument vector */ diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index bb5e7d39c03..8371ad18b71 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -104,10 +104,9 @@ VOID ScmShutdownServiceDatabase(VOID); VOID ScmGetBootAndSystemDriverState(VOID); VOID ScmAutoStartServices(VOID); VOID ScmAutoShutdownServices(VOID); -DWORD ScmSendServiceCommand(PSERVICE Service, - DWORD dwControl, - DWORD argc, - LPWSTR *argv); +DWORD ScmStartService(PSERVICE Service, + DWORD argc, + LPWSTR *argv); PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName); PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName); @@ -117,6 +116,9 @@ DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, VOID ScmDeleteServiceRecord(PSERVICE lpService); DWORD ScmMarkServiceForDelete(PSERVICE pService); +DWORD ScmControlService(PSERVICE Service, + DWORD dwControl); + BOOL ScmLockDatabaseExclusive(VOID); BOOL ScmLockDatabaseShared(VOID); VOID ScmUnlockDatabase(VOID); -- 2.17.1