- Update KTHREAD and KUSER_SHARED_DATA to latest versions. This should make 2K3 drive...
[reactos.git] / reactos / ntoskrnl / ex / init.c
index 08aae21..5150cb0 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include <ntoskrnl.h>
-#include <ntos/bootvid.h>
 #define NDEBUG
 #include <internal/debug.h>
 
@@ -230,6 +229,7 @@ ExecuteRuntimeAsserts(VOID)
      * Fail at runtime if someone has changed various structures without
      * updating the offsets used for the assembler code.
      */
+    ASSERT(FIELD_OFFSET(KUSER_SHARED_DATA, SystemCall) == 0x300);
     ASSERT(FIELD_OFFSET(KTHREAD, InitialStack) == KTHREAD_INITIAL_STACK);
     ASSERT(FIELD_OFFSET(KTHREAD, Teb) == KTHREAD_TEB);
     ASSERT(FIELD_OFFSET(KTHREAD, KernelStack) == KTHREAD_KERNEL_STACK);
@@ -242,14 +242,13 @@ ExecuteRuntimeAsserts(VOID)
     ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_BASE);
     ASSERT(FIELD_OFFSET(KPROCESS, IopmOffset) == KPROCESS_IOPM_OFFSET);
     ASSERT(FIELD_OFFSET(KPROCESS, LdtDescriptor) == KPROCESS_LDT_DESCRIPTOR0);
-    ASSERT(FIELD_OFFSET(KTRAP_FRAME, Reserved9) == KTRAP_FRAME_RESERVED9);
     ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, SavedExceptionStack) == TF_SAVED_EXCEPTION_STACK);
     ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, regs) == TF_REGS);
     ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP);
     ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
     ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
-    ASSERT(FIELD_OFFSET(KPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD);
-    ASSERT(FIELD_OFFSET(KPCR, PrcbData) + FIELD_OFFSET(KPRCB, NpxThread) == KPCR_NPX_THREAD);
+    ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD);
+    ASSERT(FIELD_OFFSET(KIPCR, PrcbData) + FIELD_OFFSET(KPRCB, NpxThread) == KPCR_NPX_THREAD);
     ASSERT(FIELD_OFFSET(KTSS, Esp0) == KTSS_ESP0);
     ASSERT(FIELD_OFFSET(KTSS, Eflags) == KTSS_EFLAGS);
     ASSERT(FIELD_OFFSET(KTSS, IoMapBase) == KTSS_IOMAPBASE);
@@ -406,6 +405,79 @@ ExpDisplayNotice(VOID)
     HalDisplayString(str);
     
 }
+
+INIT_FUNCTION
+NTSTATUS
+ExpLoadInitialProcess(PHANDLE ProcessHandle,
+                      PHANDLE ThreadHandle)
+{
+    UNICODE_STRING ImagePath = RTL_CONSTANT_STRING(L"\\SystemRoot\\system32\\smss.exe");
+    HANDLE SystemProcessHandle;
+    NTSTATUS Status;
+    PRTL_USER_PROCESS_PARAMETERS Params=NULL;
+    RTL_USER_PROCESS_INFORMATION Info;
+
+    /* Create a handle to the process */
+    Status = ObpCreateHandle(PsGetCurrentProcess(),
+                             PsInitialSystemProcess,
+                             PROCESS_CREATE_PROCESS | PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION,
+                             FALSE,
+                             &SystemProcessHandle);
+    if(!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create a handle for the system process!\n");
+        return Status;
+    }
+
+    /* Create the Parameters */
+    Status = RtlCreateProcessParameters(&Params,
+                                        &ImagePath,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL,
+                                        NULL);
+    if(!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to create ppb!\n");
+        ZwClose(SystemProcessHandle);
+        return Status;
+    }
+
+    DPRINT("Creating process\n");
+    Status = RtlCreateUserProcess(&ImagePath,
+                                  OBJ_CASE_INSENSITIVE,
+                                  Params,
+                                  NULL,
+                                  NULL,
+                                  SystemProcessHandle,
+                                  FALSE,
+                                  NULL,
+                                  NULL,
+                                  &Info);
+    
+    /* Close the handle and free the params */
+    ZwClose(SystemProcessHandle);
+    RtlDestroyProcessParameters(Params);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtCreateProcess() failed (Status %lx)\n", Status);
+        return(Status);
+    }
+
+    /* Start it up */
+    ZwResumeThread(Info.ThreadHandle, NULL);
+
+    /* Return Handles */
+    *ProcessHandle = Info.ProcessHandle;
+    *ThreadHandle = Info.ThreadHandle;
+    DPRINT("Process created successfully\n");
+    return STATUS_SUCCESS;
+}
    
 VOID
 INIT_FUNCTION
@@ -450,8 +522,6 @@ ExpInitializeExecutive(VOID)
     /* Parse the Loaded Modules (by FreeLoader) and cache the ones we'll need */
     ParseAndCacheLoadedModules();
 
-    /* Initialize the kernel debugger parameters */
-    KdInitSystem(0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
 
     /* Initialize the Dispatcher, Clock and Bug Check Mechanisms. */
     KeInit2();
@@ -471,7 +541,7 @@ ExpInitializeExecutive(VOID)
     ObInit();
 
     /* Initialize Lookaside Lists */
-    ExInit2();
+    ExpInitLookasideLists();
 
     /* Set up Region Maps, Sections and the Paging File */
     MmInit2();
@@ -481,10 +551,10 @@ ExpInitializeExecutive(VOID)
 
     /* Set 1 CPU for now, we'll increment this later */
     KeNumberProcessors = 1;
-
+    
     /* Initalize the Process Manager */
     PiInitProcessManager();
-
+    
     /* Break into the Debugger if requested */
     if (KdPollBreakIn()) DbgBreakPointWithStatus (DBG_STATUS_CONTROL_C);
 
@@ -498,7 +568,7 @@ ExpInitializeExecutive(VOID)
         KeCreateApplicationProcessorIdleThread(KeNumberProcessors);
 
         /* Allocate a stack for use when booting the processor */
-        ProcessorStack = Ki386InitialStackArray[((int)KeNumberProcessors)] + MM_STACK_SIZE;
+        ProcessorStack = RVA(Ki386InitialStackArray[((int)KeNumberProcessors)], MM_STACK_SIZE);
 
         /* Tell HAL a new CPU is being started */
         HalStartNextProcessor(0, (ULONG)ProcessorStack - 2*sizeof(FX_SAVE_AREA));
@@ -509,7 +579,7 @@ ExpInitializeExecutive(VOID)
     HalInitSystem(1, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
 
     /* Initialize Basic System Objects and Worker Threads */
-    ExInit3();
+    ExInit2();
 
     /* 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
@@ -546,7 +616,7 @@ ExpInitializeExecutive(VOID)
 
     /* Report all resources used by hal */
     HalReportResourceUsage();
-    
+
     /* Clear the screen to blue */
     HalInitSystem(2, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
 
@@ -566,7 +636,8 @@ ExpInitializeExecutive(VOID)
     ExpInitTimeZoneInfo();
 
     /* Enter the kernel debugger before starting up the boot drivers */
-    if (KdDebuggerEnabled) KdbEnter();
+    if (KdDebuggerEnabled && KdpEarlyBreak)
+        DbgBreakPoint();
 
     /* Setup Drivers and Root Device Node */
     IoInit2(BootLog);
@@ -578,7 +649,7 @@ ExpInitializeExecutive(VOID)
     IoInit3();
 
     /* Load the System DLL and its Entrypoints */
-    LdrpInitializeSystemDll();
+    PsLocateSystemDll();
 
     /* Initialize the Default Locale */
     PiInitDefaultLocale();
@@ -607,7 +678,7 @@ ExpInitializeExecutive(VOID)
     }
 
     /* Launch initial process */
-    Status = LdrLoadInitialProcess(&ProcessHandle,
+    Status = ExpLoadInitialProcess(&ProcessHandle,
                                    &ThreadHandle);
 
     /* Check for success, Bugcheck if we failed */
@@ -674,25 +745,21 @@ ExpInitializeExecutive(VOID)
     ZwClose(ProcessHandle);
 }
 
-VOID INIT_FUNCTION
+VOID
+STDCALL
+INIT_FUNCTION
 ExInit2(VOID)
 {
-  ExpInitLookasideLists();
-}
-
-VOID INIT_FUNCTION
-ExInit3 (VOID)
-{
-  ExpInitializeEventImplementation();
-  ExpInitializeEventPairImplementation();
-  ExpInitializeMutantImplementation();
-  ExpInitializeSemaphoreImplementation();
-  ExpInitializeTimerImplementation();
-  LpcpInitSystem();
-  ExpInitializeProfileImplementation();
-  ExpWin32kInit();
-  ExpInitUuids();
-  ExpInitializeHandleTables();
+    ExpInitializeEventImplementation();
+    ExpInitializeEventPairImplementation();
+    ExpInitializeMutantImplementation();
+    ExpInitializeSemaphoreImplementation();
+    ExpInitializeTimerImplementation();
+    LpcpInitSystem();
+    ExpInitializeProfileImplementation();
+    ExpWin32kInit();
+    ExpInitUuids();
+    ExpInitializeHandleTables();
 }
 
 /* EOF */