diff --git a/base/system/smss/smsubsys.c b/base/system/smss/smsubsys.c index 40bcfa946f6..d9b81d8d198 100644 --- a/base/system/smss/smsubsys.c +++ b/base/system/smss/smsubsys.c @@ -572,8 +572,13 @@ SmpLoadSubSystemsForMuSession(IN PULONG MuSessionId, * Start Win32k.sys on this session. Use a hardcoded value * instead of the Kmode one... */ + #if 1 + RtlInitUnicodeString(&DestinationString, + L"\\SystemRoot\\System32\\default.xbe"); + #else RtlInitUnicodeString(&DestinationString, L"\\SystemRoot\\System32\\win32k.sys"); + #endif Status = NtSetSystemInformation(SystemExtendServiceTableInformation, &DestinationString, sizeof(DestinationString)); @@ -581,7 +586,7 @@ SmpLoadSubSystemsForMuSession(IN PULONG MuSessionId, SmpReleasePrivilege(State); if (!NT_SUCCESS(Status)) { - DPRINT1("SMSS: Load of WIN32K failed.\n"); + DPRINT1("SMSS: Load failed.\n"); return Status; } } diff --git a/ntoskrnl/ex/sysinfo.c b/ntoskrnl/ex/sysinfo.c index d6692bc83f6..2f61ba0c099 100644 --- a/ntoskrnl/ex/sysinfo.c +++ b/ntoskrnl/ex/sysinfo.c @@ -1915,9 +1915,7 @@ SSI_DEF(SystemExtendServiceTableInformation) KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); PLDR_DATA_TABLE_ENTRY ModuleObject; NTSTATUS Status; - PIMAGE_NT_HEADERS NtHeader; DRIVER_OBJECT Win32k; - PDRIVER_INITIALIZE DriverInit; PVOID ImageBase; ULONG_PTR EntryPoint; @@ -1927,8 +1925,13 @@ SSI_DEF(SystemExtendServiceTableInformation) /* Check who is calling */ if (PreviousMode != KernelMode) { + #if 1 + static const UNICODE_STRING Win32kName = + RTL_CONSTANT_STRING(L"\\SystemRoot\\System32\\default.xbe"); + #else static const UNICODE_STRING Win32kName = RTL_CONSTANT_STRING(L"\\SystemRoot\\System32\\win32k.sys"); + #endif /* Make sure we can load drivers */ if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, UserMode)) @@ -1974,27 +1977,36 @@ SSI_DEF(SystemExtendServiceTableInformation) if (!NT_SUCCESS(Status)) return Status; - /* Get the headers */ - NtHeader = RtlImageNtHeader(ImageBase); - if (!NtHeader) - { - /* Fail */ - MmUnloadSystemImage(ModuleObject); - return STATUS_INVALID_IMAGE_FORMAT; - } - - /* Get the entrypoint */ - EntryPoint = NtHeader->OptionalHeader.AddressOfEntryPoint; - EntryPoint += (ULONG_PTR)ImageBase; - DriverInit = (PDRIVER_INITIALIZE)EntryPoint; - /* Create a dummy device */ RtlZeroMemory(&Win32k, sizeof(Win32k)); ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); Win32k.DriverStart = ImageBase; + PIMAGE_XBE_HEADER XbeHeader = ImageBase; + if (XbeHeader->dwMagic == IMAGE_XBE_SIGNATURE){ + void (*Entry)(void) = (void (*)())XbeHeader->dwEntryAddr; + Entry(); + Status = STATUS_SUCCESS; + } + else{ + /* Get the headers */ + PIMAGE_NT_HEADERS NtHeader; + NtHeader = RtlImageNtHeader(ImageBase); + if (!NtHeader) + { + /* Fail */ + MmUnloadSystemImage(ModuleObject); + return STATUS_INVALID_IMAGE_FORMAT; + } + + /* Get the entrypoint */ + EntryPoint = NtHeader->OptionalHeader.AddressOfEntryPoint; + EntryPoint += (UINT_PTR)ImageBase; + PDRIVER_INITIALIZE DriverInit = (PDRIVER_INITIALIZE)EntryPoint; + Status = (DriverInit)(&Win32k, NULL); + } + /* Call it */ - Status = (DriverInit)(&Win32k, NULL); ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); /* Unload if we failed */