initialize the handle tables before creating them Modified: trunk/reactos/ntoskrnl/ex/handle.c Modified: trunk/reactos/ntoskrnl/ex/init.c Modified: trunk/reactos/ntoskrnl/ps/process.c Modified: trunk/reactos/ntoskrnl/ps/psmgr.c Modified: trunk/reactos/ntoskrnl/ps/thread.c _____
Modified: trunk/reactos/ntoskrnl/ex/handle.c --- trunk/reactos/ntoskrnl/ex/handle.c 2005-03-13 22:33:13 UTC (rev 14039) +++ trunk/reactos/ntoskrnl/ex/handle.c 2005-03-13 23:03:31 UTC (rev 14040) @@ -77,6 +77,8 @@
#define IS_VALID_EX_HANDLE(index) \ (((index) & ~VALID_HANDLE_MASK) == 0)
+static BOOLEAN ExpInitialized = FALSE; +
/*********************************************************************** *******/
VOID @@ -85,6 +87,8 @@ ExpHandleShortWait.QuadPart = -50000; InitializeListHead(&ExpHandleTableHead); ExInitializeFastMutex(&ExpHandleTableListLock); + + ExpInitialized = TRUE; }
PHANDLE_TABLE @@ -94,6 +98,11 @@
PAGED_CODE();
+ if(!ExpInitialized) + { + KEBUGCHECK(0); + } + if(QuotaProcess != NULL) { /* FIXME - Charge process quota before allocating the handle table! */ _____
Modified: trunk/reactos/ntoskrnl/ex/init.c --- trunk/reactos/ntoskrnl/ex/init.c 2005-03-13 22:33:13 UTC (rev 14039) +++ trunk/reactos/ntoskrnl/ex/init.c 2005-03-13 23:03:31 UTC (rev 14040) @@ -33,6 +33,8 @@
extern KSPIN_LOCK KiProfileLock; #endif
+VOID PspPostInitSystemProcess(VOID); + /* FUNCTIONS ****************************************************************/
static @@ -479,6 +481,18 @@ /* Initialize Basic System Objects and Worker Threads */ ExInit3();
+ /* Create the system handle table, assign it to the system process, create + the client id table and assign a PID for the system process. This needs + to be done before the worker threads are initialized so the system + process gets the first PID (4) */ + PspPostInitSystemProcess(); + + /* initialize the worker threads */ + ExInitializeWorkerThreads(); + + /* initialize callbacks */ + ExpInitializeCallbacks(); + /* Initialize the GDB Stub and break */ KdInit1();
@@ -656,18 +670,16 @@ VOID INIT_FUNCTION ExInit3 (VOID) { - ExInitializeWorkerThreads(); ExpInitializeEventImplementation(); ExpInitializeEventPairImplementation(); ExpInitializeMutantImplementation(); ExpInitializeSemaphoreImplementation(); ExpInitializeTimerImplementation(); - ExpInitializeHandleTables(); LpcpInitSystem(); ExpInitializeProfileImplementation(); ExpWin32kInit(); ExpInitUuids(); - ExpInitializeCallbacks(); + ExpInitializeHandleTables(); }
/* EOF */ _____
Modified: trunk/reactos/ntoskrnl/ps/process.c --- trunk/reactos/ntoskrnl/ps/process.c 2005-03-13 22:33:13 UTC (rev 14039) +++ trunk/reactos/ntoskrnl/ps/process.c 2005-03-13 23:03:31 UTC (rev 14040) @@ -16,6 +16,8 @@
/* GLOBALS ******************************************************************/
+VOID INIT_FUNCTION PsInitClientIDManagment(VOID); + PEPROCESS EXPORTED PsInitialSystemProcess = NULL;
POBJECT_TYPE EXPORTED PsProcessType = NULL; @@ -393,7 +395,6 @@
MmInitializeAddressSpace(PsInitialSystemProcess, &PsInitialSystemProcess->AddressSpace); - ObCreateHandleTable(NULL,FALSE,PsInitialSystemProcess);
KeInitializeEvent(&PsInitialSystemProcess->LockEvent, SynchronizationEvent, FALSE); PsInitialSystemProcess->LockCount = 0; @@ -421,6 +422,28 @@ SepCreateSystemProcessToken(PsInitialSystemProcess); }
+VOID +PspPostInitSystemProcess(VOID) +{ + NTSTATUS Status; + + /* this routine is called directly after the exectuive handle tables were + initialized. We'll set up the Client ID handle table and assign the system + process a PID */ + PsInitClientIDManagment(); + + ObCreateHandleTable(NULL, FALSE, PsInitialSystemProcess); + + Status = PsCreateCidHandle(PsInitialSystemProcess, + PsProcessType, + &PsInitialSystemProcess->UniqueProcessId); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create CID handle (unique process id) for the system process!\n"); + KEBUGCHECK(0); + } +} + VOID STDCALL PiDeleteProcessWorker(PVOID pContext) { _____
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c --- trunk/reactos/ntoskrnl/ps/psmgr.c 2005-03-13 22:33:13 UTC (rev 14039) +++ trunk/reactos/ntoskrnl/ps/psmgr.c 2005-03-13 23:03:31 UTC (rev 14040) @@ -14,8 +14,6 @@
#define NDEBUG #include <internal/debug.h>
-VOID INIT_FUNCTION PsInitClientIDManagment(VOID); - /* FUNCTIONS ***************************************************************/
VOID PiShutdownProcessManager(VOID) @@ -28,23 +26,10 @@ VOID INIT_FUNCTION PiInitProcessManager(VOID) { - NTSTATUS Status; - - PsInitClientIDManagment(); PsInitJobManagment(); PsInitProcessManagment(); PsInitThreadManagment(); PsInitIdleThread(); - - Status = PsCreateCidHandle(PsInitialSystemProcess, - PsProcessType, - &PsInitialSystemProcess->UniqueProcessId); - if(!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create CID handle (unique process id) for the system process!\n"); - KEBUGCHECK(0); - } - PsInitialiseSuspendImplementation(); PsInitialiseW32Call(); } _____
Modified: trunk/reactos/ntoskrnl/ps/thread.c --- trunk/reactos/ntoskrnl/ps/thread.c 2005-03-13 22:33:13 UTC (rev 14039) +++ trunk/reactos/ntoskrnl/ps/thread.c 2005-03-13 23:03:31 UTC (rev 14040) @@ -731,9 +731,9 @@
* FUNCTION: Initialize thread managment */ { - HANDLE PiReaperThreadHandle; - PETHREAD FirstThread; + PETHREAD FirstThread, ReaperThread; ULONG i; + KIRQL oldIrql; NTSTATUS Status;
for (i=0; i < MAXIMUM_PRIORITY; i++) @@ -782,20 +782,27 @@ */ PsInitializeThreadReaper(); KeInitializeEvent(&PiReaperThreadEvent, SynchronizationEvent, FALSE); - Status = PsCreateSystemThread(&PiReaperThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - NULL, - PiReaperThreadMain, - NULL); + Status = PsInitializeThread(NULL, + &ReaperThread, + NULL, + FALSE); if (!NT_SUCCESS(Status)) { DPRINT1("PS: Failed to create reaper thread.\n"); KEBUGCHECK(0); }
- NtClose(PiReaperThreadHandle); + ReaperThread->StartAddress = PiReaperThreadMain; + Status = KiArchInitThread(&ReaperThread->Tcb, PiReaperThreadMain, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("PS: Failed to initialize reaper thread.\n"); + KEBUGCHECK(0); + } + + oldIrql = KeAcquireDispatcherDatabaseLock (); + PsUnblockThread(ReaperThread, NULL, 0); + KeReleaseDispatcherDatabaseLock(oldIrql); }
/*