/* INCLUDES ******************************************************************/
#include <ntoskrnl.h>
+#include <reactos/buildno.h>
#define NDEBUG
#include <debug.h>
PLIST_ENTRY ListHead, NextEntry;
PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
ULONG NlsTablesEncountered = 0;
- ULONG NlsTableSizes[3]; /* 3 NLS tables */
+ SIZE_T NlsTableSizes[3] = {0, 0, 0}; /* 3 NLS tables */
/* Check if this is boot-time phase 0 initialization */
if (!ExpInitializationPhase)
NULL,
&SectionSize,
PAGE_READWRITE,
- SEC_COMMIT,
+ SEC_COMMIT | 0x1,
NULL);
if (!NT_SUCCESS(Status))
{
}
/* Copy the codepage data in its new location. */
- ASSERT(SectionBase > MmSystemRangeStart);
+ ASSERT(SectionBase >= MmSystemRangeStart);
RtlCopyMemory(SectionBase, ExpNlsTableBase, ExpNlsTableSize);
/* Free the previously allocated buffer and set the new location */
(PVOID*)&ProcessParams,
0,
&Size,
- MEM_COMMIT,
+ MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
/* Failed, display error */
- p = InitBuffer->DebugBuffer;
- _snwprintf(p,
- 256 * sizeof(WCHAR),
+ _snwprintf(InitBuffer->DebugBuffer,
+ sizeof(InitBuffer->DebugBuffer)/sizeof(WCHAR),
L"INIT: Unable to allocate Process Parameters. 0x%lx",
Status);
- RtlInitUnicodeString(&DebugString, p);
+ RtlInitUnicodeString(&DebugString, InitBuffer->DebugBuffer);
ZwDisplayString(&DebugString);
/* Bugcheck the system */
}
/* Setup the basic header, and give the process the low 1MB to itself */
- ProcessParams->Length = Size;
- ProcessParams->MaximumLength = Size;
+ ProcessParams->Length = (ULONG)Size;
+ ProcessParams->MaximumLength = (ULONG)Size;
ProcessParams->Flags = RTL_USER_PROCESS_PARAMETERS_NORMALIZED |
RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB;
&EnvironmentPtr,
0,
&Size,
- MEM_COMMIT,
+ MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
/* Failed, display error */
- p = InitBuffer->DebugBuffer;
- _snwprintf(p,
- 256 * sizeof(WCHAR),
+ _snwprintf(InitBuffer->DebugBuffer,
+ sizeof(InitBuffer->DebugBuffer)/sizeof(WCHAR),
L"INIT: Unable to allocate Process Environment. 0x%lx",
Status);
- RtlInitUnicodeString(&DebugString, p);
+ RtlInitUnicodeString(&DebugString, InitBuffer->DebugBuffer);
ZwDisplayString(&DebugString);
/* Bugcheck the system */
if (!NT_SUCCESS(Status))
{
/* Failed, display error */
- p = InitBuffer->DebugBuffer;
- _snwprintf(p,
- 256 * sizeof(WCHAR),
+ _snwprintf(InitBuffer->DebugBuffer,
+ sizeof(InitBuffer->DebugBuffer)/sizeof(WCHAR),
L"INIT: Unable to create Session Manager. 0x%lx",
Status);
- RtlInitUnicodeString(&DebugString, p);
+ RtlInitUnicodeString(&DebugString, InitBuffer->DebugBuffer);
ZwDisplayString(&DebugString);
/* Bugcheck the system */
if (!NT_SUCCESS(Status))
{
/* Failed, display error */
- p = InitBuffer->DebugBuffer;
- _snwprintf(p,
- 256 * sizeof(WCHAR),
+ _snwprintf(InitBuffer->DebugBuffer,
+ sizeof(InitBuffer->DebugBuffer)/sizeof(WCHAR),
L"INIT: Unable to resume Session Manager. 0x%lx",
Status);
- RtlInitUnicodeString(&DebugString, p);
+ RtlInitUnicodeString(&DebugString, InitBuffer->DebugBuffer);
ZwDisplayString(&DebugString);
/* Bugcheck the system */
ExpInitializePushLocks();
/* Initialize events and event pairs */
- ExpInitializeEventImplementation();
- ExpInitializeEventPairImplementation();
-
- /* Initialize callbacks */
- ExpInitializeCallbacks();
-
+ if (ExpInitializeEventImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Event initialization failed\n");
+ return FALSE;
+ }
+ if (ExpInitializeEventPairImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Event Pair initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize mutants */
- ExpInitializeMutantImplementation();
-
+ if (ExpInitializeMutantImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Mutant initialization failed\n");
+ return FALSE;
+ }
+
+ /* Initialize callbacks */
+ if (ExpInitializeCallbacks() == FALSE)
+ {
+ DPRINT1("Executive: Callback initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize semaphores */
- ExpInitializeSemaphoreImplementation();
-
+ if (ExpInitializeSemaphoreImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Semaphore initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize timers */
- ExpInitializeTimerImplementation();
-
+ if (ExpInitializeTimerImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Timer initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize profiling */
- ExpInitializeProfileImplementation();
-
+ if (ExpInitializeProfileImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Profile initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize UUIDs */
ExpInitUuids();
-
+
+ /* Initialize keyed events */
+ if (ExpInitializeKeyedEventImplementation() == FALSE)
+ {
+ DPRINT1("Executive: Keyed event initialization failed\n");
+ return FALSE;
+ }
+
/* Initialize Win32K */
- ExpWin32kInit();
+ if (ExpWin32kInit() == FALSE)
+ {
+ DPRINT1("Executive: Win32 initialization failed\n");
+ return FALSE;
+ }
return TRUE;
}
ULONG Count, Length;
PWCHAR Name;
PLDR_DATA_TABLE_ENTRY LdrEntry;
- BOOLEAN OverFlow = FALSE;
CHAR NameBuffer[256];
STRING SymbolString;
+ NTSTATUS Status;
/* Loop the driver list */
NextEntry = LoaderBlock->LoadOrderListHead.Flink;
if (sizeof(NameBuffer) < Length + sizeof(ANSI_NULL))
{
/* It's too long */
- OverFlow = TRUE;
+ Status = STATUS_BUFFER_OVERFLOW;
}
else
{
/* Null-terminate */
NameBuffer[Count] = ANSI_NULL;
+ Status = STATUS_SUCCESS;
}
}
else
{
- /* This should be a driver, check if it fits */
- if (sizeof(NameBuffer) <
- (sizeof("\\System32\\Drivers\\") +
- NtSystemRoot.Length / sizeof(WCHAR) - sizeof(UNICODE_NULL) +
- LdrEntry->BaseDllName.Length / sizeof(WCHAR) +
- sizeof(ANSI_NULL)))
- {
- /* Buffer too small */
- OverFlow = TRUE;
- while (TRUE);
- }
- else
- {
- /* Otherwise build the name. HACKED for GCC :( */
- sprintf(NameBuffer,
- "%S\\System32\\Drivers\\%S",
- &SharedUserData->NtSystemRoot[2],
- LdrEntry->BaseDllName.Buffer);
- }
+ /* Safely print the string into our buffer */
+ Status = RtlStringCbPrintfA(NameBuffer,
+ sizeof(NameBuffer),
+ "%S\\System32\\Drivers\\%wZ",
+ &SharedUserData->NtSystemRoot[2],
+ &LdrEntry->BaseDllName);
}
/* Check if the buffer was ok */
- if (!OverFlow)
+ if (NT_SUCCESS(Status))
{
/* Initialize the STRING for the debugger */
RtlInitString(&SymbolString, NameBuffer);
NTAPI
INIT_FUNCTION
ExBurnMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
- IN ULONG PagesToDestroy,
+ IN ULONG_PTR PagesToDestroy,
IN TYPE_OF_MEMORY MemoryType)
{
PLIST_ENTRY ListEntry;
NlsData = LoaderBlock->NlsData;
ExpNlsTableBase = NlsData->AnsiCodePageData;
ExpAnsiCodePageDataOffset = 0;
- ExpOemCodePageDataOffset = ((ULONG_PTR)NlsData->OemCodePageData -
- (ULONG_PTR)NlsData->AnsiCodePageData);
- ExpUnicodeCaseTableDataOffset = ((ULONG_PTR)NlsData->UnicodeCodePageData -
- (ULONG_PTR)NlsData->AnsiCodePageData);
+ ExpOemCodePageDataOffset = (ULONG)((ULONG_PTR)NlsData->OemCodePageData -
+ (ULONG_PTR)NlsData->AnsiCodePageData);
+ ExpUnicodeCaseTableDataOffset = (ULONG)((ULONG_PTR)NlsData->UnicodeCodePageData -
+ (ULONG_PTR)NlsData->AnsiCodePageData);
/* Initialize the NLS Tables */
RtlInitNlsTables((PVOID)((ULONG_PTR)ExpNlsTableBase +
CmGetSystemControlValues(LoaderBlock->RegistryBase, CmControlVector);
/* Load static defaults for Service Pack 1 and add our SVN revision */
+ /* Format of CSD : SPMajor - SPMinor */
CmNtCSDVersion = 0x100 | (KERNEL_VERSION_BUILD_HEX << 16);
CmNtCSDReleaseType = 0;
/* Set Service Pack data for Service Pack 1 */
- CmNtSpBuildNumber = 1830;
+ CmNtSpBuildNumber = VER_PRODUCTBUILD_QFE;
if (!(CmNtCSDVersion & 0xFFFF0000))
{
/* Check the release type */
- if (CmNtCSDReleaseType == 1) CmNtSpBuildNumber |= 1830 << 16;
+ if (CmNtCSDReleaseType == 1) CmNtSpBuildNumber |= VER_PRODUCTBUILD_QFE << 16;
}
/* Add loaded CmNtGlobalFlag value */
}
/* Set system ranges */
+#ifdef _M_AMD64
+ SharedUserData->Reserved1 = MM_HIGHEST_USER_ADDRESS_WOW64;
+ SharedUserData->Reserved3 = MM_SYSTEM_RANGE_START_WOW64;
+#else
SharedUserData->Reserved1 = (ULONG_PTR)MmHighestUserAddress;
SharedUserData->Reserved3 = (ULONG_PTR)MmSystemRangeStart;
+#endif
/* Make a copy of the NLS Tables */
ExpInitNls(LoaderBlock);
/* Add the version format string */
Status = RtlStringCbPrintfA(RcEnd,
Remaining,
- "v. %u",
+ "r%u",
(CmNtCSDVersion & 0xFFFF0000) >> 16);
if (!NT_SUCCESS(Status))
{
SharedUserData->ImageNumberHigh = IMAGE_FILE_MACHINE_NATIVE;
}
+VOID
+NTAPI
+MmFreeLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock);
+
VOID
NTAPI
INIT_FUNCTION
size_t Remaining;
PRTL_USER_PROCESS_INFORMATION ProcessInfo;
KEY_VALUE_PARTIAL_INFORMATION KeyPartialInfo;
- UNICODE_STRING KeyName, DebugString;
+ UNICODE_STRING KeyName;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE KeyHandle, OptionHandle;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
/* Initialize Power Subsystem in Phase 1*/
if (!PoInitSystem(1)) KeBugCheck(INTERNAL_POWER_ERROR);
+ /* Update progress bar */
+ InbvUpdateProgressBar(90);
+
/* Initialize the Process Manager at Phase 1 */
if (!PsInitSystem(LoaderBlock)) KeBugCheck(PROCESS1_INITIALIZATION_FAILED);
- /* Update progress bar */
- InbvUpdateProgressBar(85);
-
/* Make sure nobody touches the loader block again */
if (LoaderBlock == KeLoaderBlock) KeLoaderBlock = NULL;
+ MmFreeLoaderBlock(LoaderBlock);
LoaderBlock = Context = NULL;
/* Update progress bar */
- InbvUpdateProgressBar(90);
+ InbvUpdateProgressBar(100);
+
+ /* Allow strings to be displayed */
+ InbvEnableDisplayString(TRUE);
/* Launch initial process */
DPRINT1("Free non-cache pages: %lx\n", MmAvailablePages + MiMemoryConsumers[MC_CACHE].PagesUsed);
ProcessInfo = &InitBuffer->ProcessInfo;
ExpLoadInitialProcess(InitBuffer, &ProcessParameters, &Environment);
- /* Update progress bar */
- InbvUpdateProgressBar(100);
-
- /* Allow strings to be displayed */
- InbvEnableDisplayString(TRUE);
-
- /* Wait 5 seconds for it to initialize */
+ /* Wait 5 seconds for initial process to initialize */
Timeout.QuadPart = Int32x32To64(5, -10000000);
Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout);
- if (InbvBootDriverInstalled) FinalizeBootLogo();
if (Status == STATUS_SUCCESS)
{
/* Failed, display error */
- RtlInitUnicodeString(&DebugString, L"INIT: Session Manager terminated.");
- ZwDisplayString(&DebugString);
+ DPRINT1("INIT: Session Manager terminated.\n");
/* Bugcheck the system if SMSS couldn't initialize */
KeBugCheck(SESSION5_INITIALIZATION_FAILED);
&Size,
MEM_RELEASE);
+ /* Clean the screen */
+ if (InbvBootDriverInstalled) FinalizeBootLogo();
+
/* Increase init phase */
ExpInitializationPhase++;