[CSRSRV]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 4 Dec 2012 23:01:54 +0000 (23:01 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 4 Dec 2012 23:01:54 +0000 (23:01 +0000)
- Correct a misspelling 'CsrThreadAltertable' -> 'CsrThreadAlertable'.
- Introduce CSR_REPLY_CODEs instead of using hardcoded values, and use them with CSR_API_ROUTINE-type functions. They correspond to which decision CSRSRV should take after a server function is called: answer to the client or not, and perform according tasks.

[BASESRV]
Use CSR_REPLY_CODEs.

svn path=/branches/ros-csrss/; revision=57801

include/reactos/subsys/csr/csrsrv.h
subsystems/win/basesrv/server.c
subsystems/win32/csrsrv/api.c
subsystems/win32/csrsrv/server.c

index ae0db7d..87337ca 100644 (file)
@@ -21,7 +21,8 @@
 
 #include "csrmsg.h"
 
 
 #include "csrmsg.h"
 
-/* TYPES **********************************************************************/
+
+/* STRUCTURES *****************************************************************/
 
 // Used in ntdll/csr/connect.c
 #define CSR_CSRSS_SECTION_SIZE  65536
 
 // Used in ntdll/csr/connect.c
 #define CSR_CSRSS_SECTION_SIZE  65536
@@ -102,7 +103,7 @@ typedef enum _CSR_PROCESS_FLAGS
 
 typedef enum _CSR_THREAD_FLAGS
 {
 
 typedef enum _CSR_THREAD_FLAGS
 {
-    CsrThreadAltertable     = 0x1,
+    CsrThreadAlertable      = 0x1,
     CsrThreadInTermination  = 0x2,
     CsrThreadTerminated     = 0x4,
     CsrThreadIsServerThread = 0x10
     CsrThreadInTermination  = 0x2,
     CsrThreadTerminated     = 0x4,
     CsrThreadIsServerThread = 0x10
@@ -127,6 +128,16 @@ typedef enum _CSR_DEBUG_FLAGS
     CsrDebugProcessChildren = 2
 } CSR_PROCESS_DEBUG_FLAGS, *PCSR_PROCESS_DEBUG_FLAGS;
 
     CsrDebugProcessChildren = 2
 } CSR_PROCESS_DEBUG_FLAGS, *PCSR_PROCESS_DEBUG_FLAGS;
 
+typedef enum _CSR_REPLY_CODE
+{
+    CsrReplyImmediately = 0,
+    CsrReplyPending     = 1,
+    CsrReplyDeadClient  = 2,
+    CsrReplyAlreadyDone = 3
+} CSR_REPLY_CODE, *PCSR_REPLY_CODE;
+
+
+/* FUNCTION TYPES AND STRUCTURES **********************************************/
 
 /*
  * Wait block
 
 /*
  * Wait block
@@ -162,13 +173,12 @@ typedef
 NTSTATUS
 (NTAPI *PCSR_API_ROUTINE)(
     IN OUT PCSR_API_MESSAGE ApiMessage,
 NTSTATUS
 (NTAPI *PCSR_API_ROUTINE)(
     IN OUT PCSR_API_MESSAGE ApiMessage,
-    OUT PULONG Reply
+    IN OUT PCSR_REPLY_CODE  ReplyCode OPTIONAL
 );
 
 #define CSR_API(n)                                          \
     NTSTATUS NTAPI n(IN OUT PCSR_API_MESSAGE ApiMessage,    \
 );
 
 #define CSR_API(n)                                          \
     NTSTATUS NTAPI n(IN OUT PCSR_API_MESSAGE ApiMessage,    \
-                     OUT PULONG Reply)
-                     // IN OUT PCSR_REPLY_STATUS ReplyStatus)
+                     IN OUT PCSR_REPLY_CODE  ReplyCode OPTIONAL)
 
 typedef
 NTSTATUS
 
 typedef
 NTSTATUS
@@ -228,8 +238,6 @@ typedef struct _CSR_SERVER_DLL
 } CSR_SERVER_DLL, *PCSR_SERVER_DLL;
 
 
 } CSR_SERVER_DLL, *PCSR_SERVER_DLL;
 
 
-/* FUNCTION TYPES *************************************************************/
-
 typedef
 NTSTATUS
 (NTAPI *PCSR_SERVER_DLL_INIT_CALLBACK)(IN PCSR_SERVER_DLL LoadedServerDll);
 typedef
 NTSTATUS
 (NTAPI *PCSR_SERVER_DLL_INIT_CALLBACK)(IN PCSR_SERVER_DLL LoadedServerDll);
index ec567b0..f30ca3b 100644 (file)
@@ -94,6 +94,10 @@ CSR_API(BaseSrvCreateProcess)
     if (Status == STATUS_THREAD_IS_TERMINATING)
     {
         DPRINT1("Thread already dead\n");
     if (Status == STATUS_THREAD_IS_TERMINATING)
     {
         DPRINT1("Thread already dead\n");
+
+        /* Set the special reply value so we don't reply this message back */
+        *ReplyCode = CsrReplyDeadClient;
+
         return Status;
     }
 
         return Status;
     }
 
@@ -189,7 +193,7 @@ CSR_API(BaseSrvExitProcess)
     ASSERT(CsrThread != NULL);
 
     /* Set the special reply value so we don't reply this message back */
     ASSERT(CsrThread != NULL);
 
     /* Set the special reply value so we don't reply this message back */
-    *Reply = 2;
+    *ReplyCode = CsrReplyDeadClient;
 
     /* Remove the CSR_THREADs and CSR_PROCESS */
     return CsrDestroyProcess(&CsrThread->ClientId,
 
     /* Remove the CSR_THREADs and CSR_PROCESS */
     return CsrDestroyProcess(&CsrThread->ClientId,
index 9446400..d203013 100644 (file)
@@ -52,8 +52,7 @@ CsrCallServerFromServer(IN PCSR_API_MESSAGE ReceiveMsg,
     ULONG ServerId;
     PCSR_SERVER_DLL ServerDll;
     ULONG ApiId;
     ULONG ServerId;
     PCSR_SERVER_DLL ServerDll;
     ULONG ApiId;
-    ULONG Reply;
-    NTSTATUS Status;
+    CSR_REPLY_CODE ReplyCode = CsrReplyImmediately;
 
     /* Get the Server ID */
     ServerId = CSR_API_NUMBER_TO_SERVER_ID(ReceiveMsg->ApiNumber);
 
     /* Get the Server ID */
     ServerId = CSR_API_NUMBER_TO_SERVER_ID(ReceiveMsg->ApiNumber);
@@ -97,12 +96,8 @@ CsrCallServerFromServer(IN PCSR_API_MESSAGE ReceiveMsg,
     /* Validation complete, start SEH */
     _SEH2_TRY
     {
     /* Validation complete, start SEH */
     _SEH2_TRY
     {
-        /* Call the API and get the result */
-        /// CsrApiCallHandler(ReplyMsg, /*ProcessData*/ &ReplyCode); ///
-        Status = (ServerDll->DispatchTable[ApiId])(ReceiveMsg, &Reply);
-
-        /* Return the result, no matter what it is */
-        ReplyMsg->Status = Status;
+        /* Call the API, get the reply code and return the result */
+        ReplyMsg->Status = ServerDll->DispatchTable[ApiId](ReceiveMsg, &ReplyCode);
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
@@ -350,6 +345,7 @@ CsrApiRequestThread(IN PVOID Parameter)
     LARGE_INTEGER TimeOut;
     PCSR_THREAD CurrentThread, CsrThread;
     NTSTATUS Status;
     LARGE_INTEGER TimeOut;
     PCSR_THREAD CurrentThread, CsrThread;
     NTSTATUS Status;
+    CSR_REPLY_CODE ReplyCode;
     PCSR_API_MESSAGE ReplyMsg;
     CSR_API_MESSAGE ReceiveMsg;
     PCSR_PROCESS CsrProcess;
     PCSR_API_MESSAGE ReplyMsg;
     CSR_API_MESSAGE ReceiveMsg;
     PCSR_PROCESS CsrProcess;
@@ -358,7 +354,7 @@ CsrApiRequestThread(IN PVOID Parameter)
     PCSR_SERVER_DLL ServerDll;
     PCLIENT_DIED_MSG ClientDiedMsg;
     PDBGKM_MSG DebugMessage;
     PCSR_SERVER_DLL ServerDll;
     PCLIENT_DIED_MSG ClientDiedMsg;
     PDBGKM_MSG DebugMessage;
-    ULONG ServerId, ApiId, Reply, MessageType, i;
+    ULONG ServerId, ApiId, MessageType, i;
     HANDLE ReplyPort;
 
     /* Setup LPC loop port and message */
     HANDLE ReplyPort;
 
     /* Setup LPC loop port and message */
@@ -453,8 +449,9 @@ CsrApiRequestThread(IN PVOID Parameter)
         {
             /* Handle the Connection Request */
             CsrApiHandleConnectionRequest(&ReceiveMsg);
         {
             /* Handle the Connection Request */
             CsrApiHandleConnectionRequest(&ReceiveMsg);
-            ReplyPort = CsrApiPort;
+
             ReplyMsg = NULL;
             ReplyMsg = NULL;
+            ReplyPort = CsrApiPort;
             continue;
         }
 
             continue;
         }
 
@@ -550,8 +547,9 @@ CsrApiRequestThread(IN PVOID Parameter)
                     DPRINT1("CSRSS: %lx is invalid ServerDllIndex (%08x)\n",
                             ServerId, ServerDll);
                     DbgBreakPoint();
                     DPRINT1("CSRSS: %lx is invalid ServerDllIndex (%08x)\n",
                             ServerId, ServerDll);
                     DbgBreakPoint();
-                    ReplyPort = CsrApiPort;
+
                     ReplyMsg = NULL;
                     ReplyMsg = NULL;
+                    ReplyPort = CsrApiPort;
                     continue;
                 }
 
                     continue;
                 }
 
@@ -565,6 +563,7 @@ CsrApiRequestThread(IN PVOID Parameter)
                     DPRINT1("CSRSS: %lx is invalid ApiTableIndex for %Z\n",
                             CSR_API_NUMBER_TO_API_ID(ReceiveMsg.ApiNumber),
                             &ServerDll->Name);
                     DPRINT1("CSRSS: %lx is invalid ApiTableIndex for %Z\n",
                             CSR_API_NUMBER_TO_API_ID(ReceiveMsg.ApiNumber),
                             &ServerDll->Name);
+
                     ReplyPort = CsrApiPort;
                     ReplyMsg = NULL;
                     continue;
                     ReplyPort = CsrApiPort;
                     ReplyMsg = NULL;
                     continue;
@@ -589,10 +588,10 @@ CsrApiRequestThread(IN PVOID Parameter)
                     /* Make sure we have enough threads */
                     CsrpCheckRequestThreads();
 
                     /* Make sure we have enough threads */
                     CsrpCheckRequestThreads();
 
-                    /* Call the API and get the result */
+                    /* Call the API and get the reply code */
                     ReplyMsg = NULL;
                     ReplyPort = CsrApiPort;
                     ReplyMsg = NULL;
                     ReplyPort = CsrApiPort;
-                    ServerDll->DispatchTable[ApiId](&ReceiveMsg, &Reply);
+                    ServerDll->DispatchTable[ApiId](&ReceiveMsg, &ReplyCode);
 
                     /* Increase the static thread count */
                     _InterlockedIncrement(&CsrpStaticThreadCount);
 
                     /* Increase the static thread count */
                     _InterlockedIncrement(&CsrpStaticThreadCount);
@@ -644,6 +643,7 @@ CsrApiRequestThread(IN PVOID Parameter)
 
                 /* Release the lock and keep looping */
                 CsrReleaseProcessLock();
 
                 /* Release the lock and keep looping */
                 CsrReleaseProcessLock();
+
                 ReplyMsg = NULL;
                 ReplyPort = CsrApiPort;
                 continue;
                 ReplyMsg = NULL;
                 ReplyPort = CsrApiPort;
                 continue;
@@ -807,36 +807,40 @@ CsrApiRequestThread(IN PVOID Parameter)
 
             Teb->CsrClientThread = CsrThread;
 
 
             Teb->CsrClientThread = CsrThread;
 
-            /* Call the API and get the result */
-            Reply = 0;
-            ServerDll->DispatchTable[ApiId](&ReceiveMsg, &Reply);
+            /* Call the API, get the reply code and return the result */
+            ReplyCode = CsrReplyImmediately;
+            ReplyMsg->Status = ServerDll->DispatchTable[ApiId](&ReceiveMsg, &ReplyCode);
 
             /* Increase the static thread count */
             _InterlockedIncrement(&CsrpStaticThreadCount);
 
             Teb->CsrClientThread = CurrentThread;
 
 
             /* Increase the static thread count */
             _InterlockedIncrement(&CsrpStaticThreadCount);
 
             Teb->CsrClientThread = CurrentThread;
 
-            if (Reply == 3)
+            if (ReplyCode == CsrReplyAlreadyDone)
             {
             {
-                ReplyMsg = NULL;
                 if (ReceiveMsg.CsrCaptureData)
                 {
                     CsrReleaseCapturedArguments(&ReceiveMsg);
                 }
                 if (ReceiveMsg.CsrCaptureData)
                 {
                     CsrReleaseCapturedArguments(&ReceiveMsg);
                 }
-                CsrDereferenceThread(CsrThread);
+                ReplyMsg = NULL;
                 ReplyPort = CsrApiPort;
                 ReplyPort = CsrApiPort;
+                CsrDereferenceThread(CsrThread);
             }
             }
-            else if (Reply == 2)
+            else if (ReplyCode == CsrReplyDeadClient)
             {
             {
+                /* Reply to the death message */
                 NtReplyPort(ReplyPort, &ReplyMsg->Header);
                 NtReplyPort(ReplyPort, &ReplyMsg->Header);
-                ReplyPort = CsrApiPort;
+
+                /* Reply back to the API port now */
                 ReplyMsg = NULL;
                 ReplyMsg = NULL;
+                ReplyPort = CsrApiPort;
+
                 CsrDereferenceThread(CsrThread);
             }
                 CsrDereferenceThread(CsrThread);
             }
-            else if (Reply == 1)
+            else if (ReplyCode == CsrReplyPending)
             {
             {
-                ReplyPort = CsrApiPort;
                 ReplyMsg = NULL;
                 ReplyMsg = NULL;
+                ReplyPort = CsrApiPort;
             }
             else
             {
             }
             else
             {
index 9f176db..c20ec56 100644 (file)
@@ -253,7 +253,7 @@ LoadFailed:
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
- * @param Reply
+ * @param ReplyCode
  *        Optional reply to this request.
  *
  * @return STATUS_SUCCESS in case of success, STATUS_INVALID_PARAMETER
  *        Optional reply to this request.
  *
  * @return STATUS_SUCCESS in case of success, STATUS_INVALID_PARAMETER
@@ -262,10 +262,7 @@ LoadFailed:
  * @remarks None.
  *
  *--*/
  * @remarks None.
  *
  *--*/
-NTSTATUS
-NTAPI
-CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage,
-                    IN OUT PULONG Reply OPTIONAL)
+CSR_API(CsrSrvClientConnect)
 {
     NTSTATUS Status;
     PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage->Data.CsrClientConnect;
 {
     NTSTATUS Status;
     PCSR_CLIENT_CONNECT ClientConnect = &ApiMessage->Data.CsrClientConnect;
@@ -273,7 +270,7 @@ CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage,
     PCSR_PROCESS CurrentProcess = CsrGetClientThread()->Process;
 
     /* Set default reply */
     PCSR_PROCESS CurrentProcess = CsrGetClientThread()->Process;
 
     /* Set default reply */
-    *Reply = 0;
+    *ReplyCode = CsrReplyImmediately;
 
     /* Validate the ServerID */
     if (ClientConnect->ServerId >= CSR_SERVER_DLL_MAX)
 
     /* Validate the ServerID */
     if (ClientConnect->ServerId >= CSR_SERVER_DLL_MAX)
@@ -498,7 +495,7 @@ CsrSrvAttachSharedSection(IN PCSR_PROCESS CsrProcess OPTIONAL,
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
- * @param Reply
+ * @param ReplyCode
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_SUCCESS.
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_SUCCESS.
@@ -506,15 +503,12 @@ CsrSrvAttachSharedSection(IN PCSR_PROCESS CsrProcess OPTIONAL,
  * @remarks None.
  *
  *--*/
  * @remarks None.
  *
  *--*/
-NTSTATUS
-NTAPI
-CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage,
-                              IN OUT PULONG Reply)
+CSR_API(CsrSrvIdentifyAlertableThread)
 {
     PCSR_THREAD CsrThread = CsrGetClientThread();
 
     /* Set the alertable flag */
 {
     PCSR_THREAD CsrThread = CsrGetClientThread();
 
     /* Set the alertable flag */
-    CsrThread->Flags |= CsrThreadAltertable;
+    CsrThread->Flags |= CsrThreadAlertable;
 
     /* Return success */
     return STATUS_SUCCESS;
 
     /* Return success */
     return STATUS_SUCCESS;
@@ -529,7 +523,7 @@ CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage,
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
- * @param Reply
+ * @param ReplyCode
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_SUCCESS.
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_SUCCESS.
@@ -537,10 +531,7 @@ CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage,
  * @remarks None.
  *
  *--*/
  * @remarks None.
  *
  *--*/
-NTSTATUS
-NTAPI
-CsrSrvSetPriorityClass(IN OUT PCSR_API_MESSAGE ApiMessage,
-                       IN OUT PULONG Reply)
+CSR_API(CsrSrvSetPriorityClass)
 {
     /* Deprecated */
     return STATUS_SUCCESS;
 {
     /* Deprecated */
     return STATUS_SUCCESS;
@@ -557,7 +548,7 @@ CsrSrvSetPriorityClass(IN OUT PCSR_API_MESSAGE ApiMessage,
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
  * @param ApiMessage
  *        Pointer to the CSR API Message for this request.
  *
- * @param Reply
+ * @param ReplyCode
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_INVALID_PARAMETER.
  *        Pointer to an optional reply to this request.
  *
  * @return STATUS_INVALID_PARAMETER.
@@ -566,10 +557,7 @@ CsrSrvSetPriorityClass(IN OUT PCSR_API_MESSAGE ApiMessage,
  *          return success.
  *
  *--*/
  *          return success.
  *
  *--*/
-NTSTATUS
-NTAPI
-CsrSrvUnusedFunction(IN OUT PCSR_API_MESSAGE ApiMessage,
-                     IN OUT PULONG Reply)
+CSR_API(CsrSrvUnusedFunction)
 {
     /* Deprecated */
     return STATUS_INVALID_PARAMETER;
 {
     /* Deprecated */
     return STATUS_INVALID_PARAMETER;