Author: ion
Date: Thu Feb 16 21:46:59 2012
New Revision: 55650
URL:
http://svn.reactos.org/svn/reactos?rev=55650&view=rev
Log:
[CSRSRV]: Call the fake BaseSrv Init function during Server DLL load, not during
SharedSection load, to be closer to where it should be.
[CSRSRV]: Enable some disabled code-paths and fix some locking patterns to be closer to
what the code should look/be like. Correct ref count management is one of the things where
regressions could show up later, so trying to nail these down now.
Modified:
trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
trunk/reactos/subsystems/win32/csrss/csrsrv/init.c
trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c
trunk/reactos/subsystems/win32/csrss/csrsrv/thredsup.c
trunk/reactos/subsystems/win32/csrss/include/api.h
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c [iso-8859-1] Thu Feb 16
21:46:59 2012
@@ -106,7 +106,9 @@
Thread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
NextEntry = NextEntry->Flink;
+ ASSERT(ProcessStructureListLocked());
CsrThreadRefcountZero(Thread);
+ LOCK;
}
if (pProcessData->ClientViewBase)
@@ -233,17 +235,21 @@
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ LOCK;
+
NextEntry = ProcessData->ThreadList.Flink;
while (NextEntry != &ProcessData->ThreadList)
{
Thread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
NextEntry = NextEntry->Flink;
+ ASSERT(ProcessStructureListLocked());
CsrThreadRefcountZero(Thread);
+ LOCK;
}
-
+ UNLOCK;
ProcessData->Flags |= CsrProcessTerminated;
return STATUS_SUCCESS;
}
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] Thu Feb 16 21:46:59
2012
@@ -783,9 +783,6 @@
return Status;
}
- /* Hackito ergo sum */
- BasepFakeStaticServerData();
-
/* Load us */
Status = CsrLoadServerDll("CSRSS", NULL, CSR_SRV_SERVER);
}
@@ -825,6 +822,10 @@
/* Load it */
if (CsrDebug & 1) DPRINT1("CSRSS: Should be loading
ServerDll=%s:%s\n", ParameterValue, EntryPoint);
+
+ /* Hackito ergo sum */
+ BasepFakeStaticServerData();
+
Status = STATUS_SUCCESS;
if (!NT_SUCCESS(Status))
{
@@ -1061,7 +1062,7 @@
__FUNCTION__, Status);
return Status;
}
-
+
/* Set up Session Support */
Status = CsrInitializeNtSessionList();
if (!NT_SUCCESS(Status))
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c [iso-8859-1] Thu Feb 16 21:46:59
2012
@@ -382,12 +382,141 @@
return Status;
}
+/*++
+ * @name CsrProcessRefcountZero
+ *
+ * The CsrProcessRefcountZero routine is executed when a CSR Process has lost
+ * all its active references. It removes and de-allocates the CSR Process.
+ *
+ * @param CsrProcess
+ * Pointer to the CSR Process that is to be deleted.
+ *
+ * @return None.
+ *
+ * @remarks Do not call this routine. It is reserved for the internal
+ * thread management routines when a CSR Process has lost all
+ * its references.
+ *
+ * This routine is called with the Process Lock held.
+ *
+ *--*/
+VOID
+NTAPI
+CsrProcessRefcountZero(IN PCSR_PROCESS CsrProcess)
+{
+ ASSERT(ProcessStructureListLocked());
+
+ /* Remove the Process from the list */
+ CsrRemoveProcess(CsrProcess);
+
+ /* Check if there's a session */
+ if (CsrProcess->NtSession)
+ {
+ /* Dereference the Session */
+ //CsrDereferenceNtSession(CsrProcess->NtSession, 0);
+ }
+
+ /* Close the Client Port if there is one */
+ if (CsrProcess->ClientPort) NtClose(CsrProcess->ClientPort);
+
+ /* Close the process handle */
+ NtClose(CsrProcess->ProcessHandle);
+
+ /* Free the Proces Object */
+ CsrDeallocateProcess(CsrProcess);
+}
+
+/*++
+ * @name CsrLockedDereferenceProcess
+ *
+ * The CsrLockedDereferenceProcess dereferences a CSR Process while the
+ * Process Lock is already being held.
+ *
+ * @param CsrProcess
+ * Pointer to the CSR Process to be dereferenced.
+ *
+ * @return None.
+ *
+ * @remarks This routine will return with the Process Lock held.
+ *
+ *--*/
+VOID
+NTAPI
+CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess)
+{
+ LONG LockCount;
+
+ /* Decrease reference count */
+ LockCount = --CsrProcess->ReferenceCount;
+ ASSERT(LockCount >= 0);
+ if (!LockCount)
+ {
+ /* Call the generic cleanup code */
+ DPRINT1("Should kill process: %p\n", CsrProcess);
+ //CsrProcessRefcountZero(CsrProcess);
+ CsrAcquireProcessLock();
+ }
+}
+
+/*++
+ * @name CsrDereferenceProcess
+ * @implemented NT4
+ *
+ * The CsrDereferenceProcess routine removes a reference from a CSR Process.
+ *
+ * @param CsrThread
+ * Pointer to the CSR Process to dereference.
+ *
+ * @return None.
+ *
+ * @remarks If the reference count has reached zero (ie: the CSR Process has
+ * no more active references), it will be deleted.
+ *
+ *--*/
+VOID
+NTAPI
+CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess)
+{
+ LONG LockCount;
+
+ /* Acquire process lock */
+ CsrAcquireProcessLock();
+
+ /* Decrease reference count */
+ LockCount = --CsrProcess->ReferenceCount;
+ ASSERT(LockCount >= 0);
+ if (!LockCount)
+ {
+ /* Call the generic cleanup code */
+ CsrProcessRefcountZero(CsrProcess);
+ }
+ else
+ {
+ /* Just release the lock */
+ CsrReleaseProcessLock();
+ }
+}
+
+/*++
+ * @name CsrUnlockProcess
+ * @implemented NT4
+ *
+ * The CsrUnlockProcess undoes a previous CsrLockProcessByClientId operation.
+ *
+ * @param CsrProcess
+ * Pointer to a previously locked CSR Process.
+ *
+ * @return STATUS_SUCCESS.
+ *
+ * @remarks This routine must be called with the Process Lock held.
+ *
+ *--*/
NTSTATUS
NTAPI
CsrUnlockProcess(IN PCSR_PROCESS CsrProcess)
{
/* Dereference the process */
- //CsrLockedDereferenceProcess(CsrProcess);
+ CsrLockedDereferenceProcess(CsrProcess);
/* Release the lock and return */
CsrReleaseProcessLock();
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/thredsup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/thredsup.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/thredsup.c [iso-8859-1] Thu Feb 16
21:46:59 2012
@@ -113,7 +113,7 @@
/* Reference the Thread and Process */
CsrThread->ReferenceCount++;
- // CsrProcess->ReferenceCount++;
+ CsrProcess->ReferenceCount++;
/* Set the Parent Process */
CsrThread->Process = CsrProcess;
@@ -230,6 +230,8 @@
NTAPI
CsrRemoveThread(IN PCSR_THREAD CsrThread)
{
+ ASSERT(ProcessStructureListLocked());
+
/* Remove it from the List */
RemoveEntryList(&CsrThread->Link);
@@ -246,10 +248,10 @@
if (!(CsrThread->Process->Flags & CsrProcessLastThreadTerminated))
{
/* Let everyone know this process is about to lose the thread */
- //CsrThread->Process->Flags |= CsrProcessLastThreadTerminated;
+ CsrThread->Process->Flags |= CsrProcessLastThreadTerminated;
/* Reference the Process */
- //CsrLockedDereferenceProcess(CsrThread->Process);
+ CsrLockedDereferenceProcess(CsrThread->Process);
}
}
@@ -261,13 +263,15 @@
NTAPI
CsrThreadRefcountZero(IN PCSR_THREAD CsrThread)
{
+ PCSR_PROCESS CsrProcess = CsrThread->Process;
NTSTATUS Status;
+ ASSERT(ProcessStructureListLocked());
/* Remove this thread */
CsrRemoveThread(CsrThread);
/* Release the Process Lock */
- //CsrReleaseProcessLock();
+ CsrReleaseProcessLock();
/* Close the NT Thread Handle */
if (CsrThread->ThreadHandle)
@@ -281,7 +285,7 @@
CsrDeallocateThread(CsrThread);
/* Remove a reference from the process */
- //CsrDereferenceProcess(CsrProcess);
+ CsrDereferenceProcess(CsrProcess);
}
NTSTATUS
Modified: trunk/reactos/subsystems/win32/csrss/include/api.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/inc…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/include/api.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/include/api.h [iso-8859-1] Thu Feb 16 21:46:59
2012
@@ -385,12 +385,20 @@
IN OUT PULONG Reply
);
+VOID
+NTAPI
+CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess);
+
+VOID
+NTAPI
+CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess);
+
NTSTATUS
NTAPI
CsrLoadServerDll(IN PCHAR DllString,
IN PCHAR EntryPoint OPTIONAL,
IN ULONG ServerId);
-
+
/* api/user.c */
CSR_API(CsrRegisterServicesProcess);