https://git.reactos.org/?p=reactos.git;a=commitdiff;h=29b46995aa7f3c176e17dc6b25c852ed3a858060

commit 29b46995aa7f3c176e17dc6b25c852ed3a858060
Author:     Pierre Schweitzer <pie...@reactos.org>
AuthorDate: Sun Dec 30 20:45:11 2018 +0100
Commit:     Pierre Schweitzer <pie...@reactos.org>
CommitDate: Sun Dec 30 21:44:39 2018 +0100

    [ADVAPI32] When starting or sending a control to a service, set the tag in 
the TEB
    
    This now allows tracking the threads of the services thanks to their tag.
    
    This fixes the failing test in advapi32:ServiceEnv
---
 dll/win32/advapi32/service/sctrl.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/dll/win32/advapi32/service/sctrl.c 
b/dll/win32/advapi32/service/sctrl.c
index f4a7aa85c4..ec5a4cc4bf 100644
--- a/dll/win32/advapi32/service/sctrl.c
+++ b/dll/win32/advapi32/service/sctrl.c
@@ -22,6 +22,7 @@ typedef struct _SERVICE_THREAD_PARAMSA
     LPSERVICE_MAIN_FUNCTIONA lpServiceMain;
     DWORD dwArgCount;
     LPSTR *lpArgVector;
+    DWORD dwServiceTag;
 } SERVICE_THREAD_PARAMSA, *PSERVICE_THREAD_PARAMSA;
 
 
@@ -30,6 +31,7 @@ typedef struct _SERVICE_THREAD_PARAMSW
     LPSERVICE_MAIN_FUNCTIONW lpServiceMain;
     DWORD dwArgCount;
     LPWSTR *lpArgVector;
+    DWORD dwServiceTag;
 } SERVICE_THREAD_PARAMSW, *PSERVICE_THREAD_PARAMSW;
 
 
@@ -47,6 +49,7 @@ typedef struct _ACTIVE_SERVICE
     LPVOID HandlerContext;
     BOOL bUnicode;
     BOOL bOwnProcess;
+    DWORD dwServiceTag;
 } ACTIVE_SERVICE, *PACTIVE_SERVICE;
 
 
@@ -164,14 +167,22 @@ ScLookupServiceByServiceName(LPCWSTR lpServiceName)
 static DWORD WINAPI
 ScServiceMainStubA(LPVOID Context)
 {
+    PTEB Teb;
     PSERVICE_THREAD_PARAMSA ThreadParams = Context;
 
     TRACE("ScServiceMainStubA(%p)\n", Context);
 
+    /* Set service tag */
+    Teb = NtCurrentTeb();
+    Teb->SubProcessTag = (PVOID)ThreadParams->dwServiceTag;
+
     /* Call the main service routine and free the arguments vector */
     (ThreadParams->lpServiceMain)(ThreadParams->dwArgCount,
                                   ThreadParams->lpArgVector);
 
+    /* Reset service tag */
+    Teb->SubProcessTag = 0;
+
     if (ThreadParams->lpArgVector != NULL)
     {
         HeapFree(GetProcessHeap(), 0, ThreadParams->lpArgVector);
@@ -185,14 +196,22 @@ ScServiceMainStubA(LPVOID Context)
 static DWORD WINAPI
 ScServiceMainStubW(LPVOID Context)
 {
+    PTEB Teb;
     PSERVICE_THREAD_PARAMSW ThreadParams = Context;
 
     TRACE("ScServiceMainStubW(%p)\n", Context);
 
+    /* Set service tag */
+    Teb = NtCurrentTeb();
+    Teb->SubProcessTag = (PVOID)ThreadParams->dwServiceTag;
+
     /* Call the main service routine and free the arguments vector */
     (ThreadParams->lpServiceMain)(ThreadParams->dwArgCount,
                                   ThreadParams->lpArgVector);
 
+    /* Reset service tag */
+    Teb->SubProcessTag = 0;
+
     if (ThreadParams->lpArgVector != NULL)
     {
         HeapFree(GetProcessHeap(), 0, ThreadParams->lpArgVector);
@@ -440,6 +459,8 @@ ScStartService(PACTIVE_SERVICE lpService,
 
     /* Set the service status handle */
     lpService->hServiceStatus = ControlPacket->hServiceStatus;
+    /* Set the service tag */
+    lpService->dwServiceTag = ControlPacket->dwServiceTag;
 
     /* Build the arguments vector */
     if (lpService->bUnicode != FALSE)
@@ -456,6 +477,7 @@ ScStartService(PACTIVE_SERVICE lpService,
             return dwError;
         }
         ThreadParamsW->lpServiceMain = lpService->ServiceMain.W;
+        ThreadParamsW->dwServiceTag = ControlPacket->dwServiceTag;
         ThreadHandle = CreateThread(NULL,
                                     0,
                                     ScServiceMainStubW,
@@ -489,6 +511,7 @@ ScStartService(PACTIVE_SERVICE lpService,
             return dwError;
         }
         ThreadParamsA->lpServiceMain = lpService->ServiceMain.A;
+        ThreadParamsA->dwServiceTag = ControlPacket->dwServiceTag;
         ThreadHandle = CreateThread(NULL,
                                     0,
                                     ScServiceMainStubA,
@@ -528,6 +551,9 @@ ScControlService(PACTIVE_SERVICE lpService,
     TRACE("Size: %lu\n", ControlPacket->dwSize);
     TRACE("Service: %S\n", (PWSTR)((ULONG_PTR)ControlPacket + 
ControlPacket->dwServiceNameOffset));
 
+    /* Set service tag */
+    NtCurrentTeb()->SubProcessTag = (PVOID)lpService->dwServiceTag;
+
     if (lpService->HandlerFunction)
     {
         _SEH2_TRY
@@ -560,6 +586,9 @@ ScControlService(PACTIVE_SERVICE lpService,
         dwError = ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
     }
 
+    /* Reset service tag */
+    NtCurrentTeb()->SubProcessTag = 0;
+
     TRACE("ScControlService() done (Error %lu)\n", dwError);
 
     return dwError;

Reply via email to