Author: ros-arm-bringup Date: Thu Oct 15 07:56:41 2009 New Revision: 43476
URL: http://svn.reactos.org/svn/reactos?rev=43476&view=rev Log: - Multiple PEB/TEB creation fixes: - Set up PEB and TEB under SEH to handle possible paging errors (which are legitimate). - Also touch the image under SEH to handle image paging errors (also legitimate). - Should avoid kernel panics in cases where the executable is damaged, invalid, or impossible to page in. - Initialize more PEB fields. - Add new INITIAL_PEB structure to support fork() in the future. Also fixes the fact we don't create a PEB for the system process anymore. - Create PEB while attached to the process. - Handle UP-only images, and set correct affinity mask in the PEB. - Set session ID instead of session structure (currently zero). - Set correct TIB version in the TEB. Due to a historical oddity, the NT TIB identifies itself as '0x1e00', which is 30 shifted 8 bits. 30 is the version identifier of OS/2 3.0, the original 32-bit target of the Windows NT effort. - Handle initial TEB correctly for fork(). - Move AWE APIs to procsup.c instea of section.c since they are unrelated. - Move the rewritten PEB/TEB functions to ARM3's procsup.c.
Modified: trunk/reactos/include/ndk/pstypes.h trunk/reactos/ntoskrnl/include/internal/mm.h trunk/reactos/ntoskrnl/mm/ARM3/miarm.h trunk/reactos/ntoskrnl/mm/ARM3/procsup.c trunk/reactos/ntoskrnl/mm/procsup.c trunk/reactos/ntoskrnl/mm/section.c trunk/reactos/ntoskrnl/ps/process.c trunk/reactos/ntoskrnl/ps/thread.c
Modified: trunk/reactos/include/ndk/pstypes.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/pstypes.h?rev=4... ============================================================================== --- trunk/reactos/include/ndk/pstypes.h [iso-8859-1] (original) +++ trunk/reactos/include/ndk/pstypes.h [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -587,23 +587,53 @@ } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;
// +// Initial PEB +// +typedef struct _INITIAL_PEB +{ + BOOLEAN InheritedAddressSpace; + BOOLEAN ReadImageFileExecOptions; + BOOLEAN BeingDebugged; + union + { + BOOLEAN BitField; +#if (NTDDI_VERSION >= NTDDI_WS03) + struct + { + BOOLEAN ImageUsesLargePages:1; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + BOOLEAN IsProtectedProcess:1; + BOOLEAN IsLegacyProcess:1; + BOOLEAN SpareBits:5; +#else + BOOLEAN SpareBits:7; +#endif + }; +#else + BOOLEAN SpareBool; +#endif + }; + HANDLE Mutant; +} INITIAL_PEB, *PINITIAL_PEB; + +// // Process Environment Block (PEB) // typedef struct _PEB { - UCHAR InheritedAddressSpace; - UCHAR ReadImageFileExecOptions; - UCHAR BeingDebugged; + BOOLEAN InheritedAddressSpace; + BOOLEAN ReadImageFileExecOptions; + BOOLEAN BeingDebugged; #if (NTDDI_VERSION >= NTDDI_WS03) struct { - UCHAR ImageUsesLargePages:1; + BOOLEAN ImageUsesLargePages:1; #if (NTDDI_VERSION >= NTDDI_LONGHORN) - UCHAR IsProtectedProcess:1; - UCHAR IsLegacyProcess:1; - UCHAR SpareBits:5; + BOOLEAN IsProtectedProcess:1; + BOOLEAN IsLegacyProcess:1; + BOOLEAN SpareBits:5; #else - UCHAR SpareBits:7; + BOOLEAN SpareBits:7; #endif }; #else
Modified: trunk/reactos/ntoskrnl/include/internal/mm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/m... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/mm.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/mm.h [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -776,14 +776,19 @@
NTSTATUS NTAPI -MmCreatePeb(struct _EPROCESS *Process); - -PTEB +MmCreatePeb( + IN PEPROCESS Process, + IN PINITIAL_PEB InitialPeb, + OUT PPEB *BasePeb +); + +NTSTATUS NTAPI MmCreateTeb( - struct _EPROCESS *Process, - PCLIENT_ID ClientId, - PINITIAL_TEB InitialTeb + IN PEPROCESS Process, + IN PCLIENT_ID ClientId, + IN PINITIAL_TEB InitialTeb, + OUT PTEB* BaseTeb );
VOID
Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?re... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -28,6 +28,10 @@
#define MI_PAGED_POOL_START (PVOID)0xE1000000 #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 + +#define MM_HIGHEST_VAD_ADDRESS \ + (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) +
// // FIXFIX: These should go in ex.h after the pool merge
Modified: trunk/reactos/ntoskrnl/mm/ARM3/procsup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/procsup.c?... ============================================================================== --- trunk/reactos/ntoskrnl/mm/ARM3/procsup.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/ARM3/procsup.c [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -16,6 +16,13 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h"
+extern MM_SYSTEMSIZE MmSystemSize; + +PVOID +NTAPI +MiCreatePebOrTeb(PEPROCESS Process, + PVOID BaseAddress); + /* PRIVATE FUNCTIONS **********************************************************/
VOID @@ -278,4 +285,454 @@ return MmGrowKernelStackEx(StackPointer, KERNEL_LARGE_STACK_COMMIT); }
+NTSTATUS +NTAPI +MmSetMemoryPriorityProcess(IN PEPROCESS Process, + IN UCHAR MemoryPriority) +{ + UCHAR OldPriority; + + // + // Check if we have less then 16MB of Physical Memory + // + if ((MmSystemSize == MmSmallSystem) && + (MmStats.NrTotalPages < ((15 * 1024 * 1024) / PAGE_SIZE))) + { + // + // Always use background priority + // + MemoryPriority = MEMORY_PRIORITY_BACKGROUND; + } + + // + // Save the old priority and update it + // + OldPriority = (UCHAR)Process->Vm.Flags.MemoryPriority; + Process->Vm.Flags.MemoryPriority = MemoryPriority; + + // + // Return the old priority + // + return OldPriority; +} + +LCID +NTAPI +MmGetSessionLocaleId(VOID) +{ + PEPROCESS Process; + PAGED_CODE(); + + // + // Get the current process + // + Process = PsGetCurrentProcess(); + + // + // Check if it's the Session Leader + // + if (Process->Vm.Flags.SessionLeader) + { + // + // Make sure it has a valid Session + // + if (Process->Session) + { + // + // Get the Locale ID + // +#if ROS_HAS_SESSIONS + return ((PMM_SESSION_SPACE)Process->Session)->LocaleId; +#endif + } + } + + // + // Not a session leader, return the default + // + return PsDefaultThreadLocaleId; +} + +NTSTATUS +NTAPI +MmCreatePeb(IN PEPROCESS Process, + IN PINITIAL_PEB InitialPeb, + OUT PPEB *BasePeb) +{ + PPEB Peb = NULL; + LARGE_INTEGER SectionOffset; + SIZE_T ViewSize = 0; + PVOID TableBase = NULL; + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigData; + NTSTATUS Status; + USHORT Characteristics; + KAFFINITY ProcessAffinityMask = 0; + SectionOffset.QuadPart = (ULONGLONG)0; + *BasePeb = NULL; + + // + // Attach to Process + // + KeAttachProcess(&Process->Pcb); + + // + // Allocate the PEB + // + Peb = MiCreatePebOrTeb(Process, + (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); + ASSERT(Peb == (PVOID)0x7FFDF000); + + // + // Map NLS Tables + // + Status = MmMapViewOfSection(ExpNlsSectionPointer, + (PEPROCESS)Process, + &TableBase, + 0, + 0, + &SectionOffset, + &ViewSize, + ViewShare, + MEM_TOP_DOWN, + PAGE_READONLY); + if (!NT_SUCCESS(Status)) return Status; + + // + // Use SEH in case we can't load the PEB + // + _SEH2_TRY + { + // + // Initialize the PEB + // + RtlZeroMemory(Peb, sizeof(PEB)); + + // + // Set up data + // + Peb->ImageBaseAddress = Process->SectionBaseAddress; + Peb->InheritedAddressSpace = InitialPeb->InheritedAddressSpace; + Peb->Mutant = InitialPeb->Mutant; + Peb->ImageUsesLargePages = InitialPeb->ImageUsesLargePages; + + // + // NLS + // + Peb->AnsiCodePageData = (PCHAR)TableBase + ExpAnsiCodePageDataOffset; + Peb->OemCodePageData = (PCHAR)TableBase + ExpOemCodePageDataOffset; + Peb->UnicodeCaseTableData = (PCHAR)TableBase + ExpUnicodeCaseTableDataOffset; + + // + // Default Version Data (could get changed below) + // + Peb->OSMajorVersion = NtMajorVersion; + Peb->OSMinorVersion = NtMinorVersion; + Peb->OSBuildNumber = (USHORT)(NtBuildNumber & 0x3FFF); + Peb->OSPlatformId = 2; /* VER_PLATFORM_WIN32_NT */ + Peb->OSCSDVersion = (USHORT)CmNtCSDVersion; + + // + // Heap and Debug Data + // + Peb->NumberOfProcessors = KeNumberProcessors; + Peb->BeingDebugged = (BOOLEAN)(Process->DebugPort != NULL ? TRUE : FALSE); + Peb->NtGlobalFlag = NtGlobalFlag; + /*Peb->HeapSegmentReserve = MmHeapSegmentReserve; + Peb->HeapSegmentCommit = MmHeapSegmentCommit; + Peb->HeapDeCommitTotalFreeThreshold = MmHeapDeCommitTotalFreeThreshold; + Peb->HeapDeCommitFreeBlockThreshold = MmHeapDeCommitFreeBlockThreshold; + Peb->CriticalSectionTimeout = MmCriticalSectionTimeout; + Peb->MinimumStackCommit = MmMinimumStackCommitInBytes; + */ + Peb->MaximumNumberOfHeaps = (PAGE_SIZE - sizeof(PEB)) / sizeof(PVOID); + Peb->ProcessHeaps = (PVOID*)(Peb + 1); + + // + // Session ID + // + if (Process->Session) Peb->SessionId = 0; // MmGetSessionId(Process); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // + // Fail + // + KeDetachProcess(); + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + // + // Use SEH in case we can't load the image + // + _SEH2_TRY + { + // + // Get NT Headers + // + NtHeaders = RtlImageNtHeader(Peb->ImageBaseAddress); + Characteristics = NtHeaders->FileHeader.Characteristics; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // + // Fail + // + KeDetachProcess(); + _SEH2_YIELD(return STATUS_INVALID_IMAGE_PROTECT); + } + _SEH2_END; + + // + // Parse the headers + // + if (NtHeaders) + { + // + // Use SEH in case we can't load the headers + // + _SEH2_TRY + { + // + // Get the Image Config Data too + // + ImageConfigData = RtlImageDirectoryEntryToData(Peb->ImageBaseAddress, + TRUE, + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, + &ViewSize); + if (ImageConfigData) + { + // + // Probe it + // + ProbeForRead(ImageConfigData, + sizeof(IMAGE_LOAD_CONFIG_DIRECTORY), + sizeof(ULONG)); + } + + // + // Write subsystem data + // + Peb->ImageSubSystem = NtHeaders->OptionalHeader.Subsystem; + Peb->ImageSubSystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion; + Peb->ImageSubSystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion; + + // + // Check for version data + // + if (NtHeaders->OptionalHeader.Win32VersionValue) + { + // + // Extract values and write them + // + Peb->OSMajorVersion = NtHeaders->OptionalHeader.Win32VersionValue & 0xFF; + Peb->OSMinorVersion = (NtHeaders->OptionalHeader.Win32VersionValue >> 8) & 0xFF; + Peb->OSBuildNumber = (NtHeaders->OptionalHeader.Win32VersionValue >> 16) & 0x3FFF; + Peb->OSPlatformId = (NtHeaders->OptionalHeader.Win32VersionValue >> 30) ^ 2; + } + + // + // Process the image config data overrides if specfied + // + if (ImageConfigData != NULL) + { + // + // Process CSD version override + // + if (ImageConfigData->CSDVersion) + { + // + // Set new data + // + Peb->OSCSDVersion = ImageConfigData->CSDVersion; + } + + // + // Process affinity mask ovverride + // + if (ImageConfigData->ProcessAffinityMask) + { + // + // Set new data + // + ProcessAffinityMask = ImageConfigData->ProcessAffinityMask; + } + } + + // + // Check if this is a UP image + if (Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY) + { + // + // Force it to use CPU 0 + // + Peb->ImageProcessAffinityMask = 0; + } + else + { + // + // Whatever was configured + // + Peb->ImageProcessAffinityMask = ProcessAffinityMask; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // + // Fail + // + KeDetachProcess(); + _SEH2_YIELD(return STATUS_INVALID_IMAGE_PROTECT); + } + _SEH2_END; + } + + // + // Detach from the Process + // + KeDetachProcess(); + *BasePeb = Peb; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmCreateTeb(IN PEPROCESS Process, + IN PCLIENT_ID ClientId, + IN PINITIAL_TEB InitialTeb, + OUT PTEB *BaseTeb) +{ + PTEB Teb; + NTSTATUS Status = STATUS_SUCCESS; + *BaseTeb = NULL; + + // + // Attach to Target + // + KeAttachProcess(&Process->Pcb); + + // + // Allocate the TEB + // + Teb = MiCreatePebOrTeb(Process, + (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); + if (!Teb) return STATUS_INSUFFICIENT_RESOURCES; + + // + // Use SEH in case we can't load the TEB + // + _SEH2_TRY + { + // + // Initialize the PEB + // + RtlZeroMemory(Teb, sizeof(TEB)); + + // + // Set TIB Data + // + Teb->Tib.ExceptionList = EXCEPTION_CHAIN_END; + Teb->Tib.Self = (PNT_TIB)Teb; + + // + // Identify this as an OS/2 V3.0 ("Cruiser") TIB + // + Teb->Tib.Version = 30 << 8; + + // + // Set TEB Data + // + Teb->ClientId = *ClientId; + Teb->RealClientId = *ClientId; + Teb->ProcessEnvironmentBlock = Process->Peb; + Teb->CurrentLocale = PsDefaultThreadLocaleId; + + // + // Check if we have a grandparent TEB + // + if ((InitialTeb->PreviousStackBase == NULL) && + (InitialTeb->PreviousStackLimit == NULL)) + { + // + // Use grandparent TEB values + // + Teb->Tib.StackBase = InitialTeb->PreviousStackBase; + Teb->Tib.StackLimit = InitialTeb->PreviousStackLimit; + } + else + { + // + // Use initial TEB values + // + Teb->Tib.StackBase = InitialTeb->StackBase; + Teb->Tib.StackLimit = InitialTeb->StackLimit; + Teb->DeallocationStack = InitialTeb->AllocatedStackBase; + } + + // + // Initialize the static unicode string + // + Teb->StaticUnicodeString.MaximumLength = sizeof(Teb->StaticUnicodeBuffer); + Teb->StaticUnicodeString.Buffer = Teb->StaticUnicodeBuffer; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // + // Get error code + // + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + // + // Return + // + KeDetachProcess(); + *BaseTeb = Teb; + return Status; +} + +/* SYSTEM CALLS ***************************************************************/ + +NTSTATUS +NTAPI +NtAllocateUserPhysicalPages(IN HANDLE ProcessHandle, + IN OUT PULONG_PTR NumberOfPages, + IN OUT PULONG_PTR UserPfnArray) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +NtMapUserPhysicalPages(IN PVOID VirtualAddresses, + IN ULONG_PTR NumberOfPages, + IN OUT PULONG_PTR UserPfnArray) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +NtMapUserPhysicalPagesScatter(IN PVOID *VirtualAddresses, + IN ULONG_PTR NumberOfPages, + IN OUT PULONG_PTR UserPfnArray) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +NtFreeUserPhysicalPages(IN HANDLE ProcessHandle, + IN OUT PULONG_PTR NumberOfPages, + IN OUT PULONG_PTR UserPfnArray) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */
Modified: trunk/reactos/ntoskrnl/mm/procsup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/procsup.c?rev=4... ============================================================================== --- trunk/reactos/ntoskrnl/mm/procsup.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/procsup.c [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -13,66 +13,7 @@ #define NDEBUG #include <debug.h>
-extern ULONG NtMajorVersion; -extern ULONG NtMinorVersion; -extern ULONG CmNtCSDVersion; -extern ULONG NtBuildNumber; -extern MM_SYSTEMSIZE MmSystemSize; - -#define MM_HIGHEST_VAD_ADDRESS \ - (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) - /* FUNCTIONS *****************************************************************/ - -NTSTATUS -NTAPI -MmSetMemoryPriorityProcess(IN PEPROCESS Process, - IN UCHAR MemoryPriority) -{ - UCHAR OldPriority; - - /* Check if we have less then 16MB of Physical Memory */ - if ((MmSystemSize == MmSmallSystem) && - (MmStats.NrTotalPages < ((15 * 1024 * 1024) / PAGE_SIZE))) - { - /* Always use background priority */ - MemoryPriority = 0; - } - - /* Save the old priority and update it */ - OldPriority = (UCHAR)Process->Vm.Flags.MemoryPriority; - Process->Vm.Flags.MemoryPriority = MemoryPriority; - - /* Return the old priority */ - return OldPriority; -} - -LCID -NTAPI -MmGetSessionLocaleId(VOID) -{ - PEPROCESS Process; - PAGED_CODE(); - - /* Get the current process */ - Process = PsGetCurrentProcess(); - - /* Check if it's the Session Leader */ - if (Process->Vm.Flags.SessionLeader) - { - /* Make sure it has a valid Session */ - if (Process->Session) - { - /* Get the Locale ID */ -#if ROS_HAS_SESSIONS - return ((PMM_SESSION_SPACE)Process->Session)->LocaleId; -#endif - } - } - - /* Not a session leader, return the default */ - return PsDefaultThreadLocaleId; -}
PVOID NTAPI @@ -146,211 +87,6 @@
/* Unlock the Address Space */ MmUnlockAddressSpace(ProcessAddressSpace); -} - -NTSTATUS -NTAPI -MmCreatePeb(PEPROCESS Process) -{ - PPEB Peb = NULL; - LARGE_INTEGER SectionOffset; - SIZE_T ViewSize = 0; - PVOID TableBase = NULL; - PIMAGE_NT_HEADERS NtHeaders; - PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigData; - NTSTATUS Status; - KAFFINITY ProcessAffinityMask = 0; - SectionOffset.QuadPart = (ULONGLONG)0; - DPRINT("MmCreatePeb\n"); - - /* Allocate the PEB */ - Peb = MiCreatePebOrTeb(Process, - (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); - ASSERT(Peb == (PVOID)0x7FFDF000); - - /* Map NLS Tables */ - DPRINT("Mapping NLS\n"); - Status = MmMapViewOfSection(ExpNlsSectionPointer, - (PEPROCESS)Process, - &TableBase, - 0, - 0, - &SectionOffset, - &ViewSize, - ViewShare, - MEM_TOP_DOWN, - PAGE_READONLY); - if (!NT_SUCCESS(Status)) - { - DPRINT1("MmMapViewOfSection() failed (Status %lx)\n", Status); - return(Status); - } - DPRINT("TableBase %p ViewSize %lx\n", TableBase, ViewSize); - - /* Attach to Process */ - KeAttachProcess(&Process->Pcb); - - /* Initialize the PEB */ - DPRINT("Allocated: %x\n", Peb); - RtlZeroMemory(Peb, sizeof(PEB)); - - /* Set up data */ - DPRINT("Setting up PEB\n"); - Peb->ImageBaseAddress = Process->SectionBaseAddress; - Peb->InheritedAddressSpace = 0; - Peb->Mutant = NULL; - - /* NLS */ - Peb->AnsiCodePageData = (PCHAR)TableBase + ExpAnsiCodePageDataOffset; - Peb->OemCodePageData = (PCHAR)TableBase + ExpOemCodePageDataOffset; - Peb->UnicodeCaseTableData = (PCHAR)TableBase + ExpUnicodeCaseTableDataOffset; - - /* Default Version Data (could get changed below) */ - Peb->OSMajorVersion = NtMajorVersion; - Peb->OSMinorVersion = NtMinorVersion; - Peb->OSBuildNumber = (USHORT)(NtBuildNumber & 0x3FFF); - Peb->OSPlatformId = 2; /* VER_PLATFORM_WIN32_NT */ - Peb->OSCSDVersion = (USHORT)CmNtCSDVersion; - - /* Heap and Debug Data */ - Peb->NumberOfProcessors = KeNumberProcessors; - Peb->BeingDebugged = (BOOLEAN)(Process->DebugPort != NULL ? TRUE : FALSE); - Peb->NtGlobalFlag = NtGlobalFlag; - /*Peb->HeapSegmentReserve = MmHeapSegmentReserve; - Peb->HeapSegmentCommit = MmHeapSegmentCommit; - Peb->HeapDeCommitTotalFreeThreshold = MmHeapDeCommitTotalFreeThreshold; - Peb->HeapDeCommitFreeBlockThreshold = MmHeapDeCommitFreeBlockThreshold;*/ - Peb->NumberOfHeaps = 0; - Peb->MaximumNumberOfHeaps = (PAGE_SIZE - sizeof(PEB)) / sizeof(PVOID); - Peb->ProcessHeaps = (PVOID*)(Peb + 1); - - /* Image Data */ - if ((NtHeaders = RtlImageNtHeader(Peb->ImageBaseAddress))) - { - /* Write subsystem data */ - Peb->ImageSubSystem = NtHeaders->OptionalHeader.Subsystem; - Peb->ImageSubSystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion; - Peb->ImageSubSystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion; - - /* Write Version Data */ - if (NtHeaders->OptionalHeader.Win32VersionValue) - { - Peb->OSMajorVersion = NtHeaders->OptionalHeader.Win32VersionValue & 0xFF; - Peb->OSMinorVersion = (NtHeaders->OptionalHeader.Win32VersionValue >> 8) & 0xFF; - Peb->OSBuildNumber = (NtHeaders->OptionalHeader.Win32VersionValue >> 16) & 0x3FFF; - - /* Set the Platform ID */ - Peb->OSPlatformId = (NtHeaders->OptionalHeader.Win32VersionValue >> 30) ^ 2; - } - - /* Check if the image is not safe for SMP */ - if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY) - { - /* FIXME: Choose one randomly */ - Peb->ImageProcessAffinityMask = 1; - } - else - { - /* Use affinity from Image Header */ - Peb->ImageProcessAffinityMask = ProcessAffinityMask; - } - - _SEH2_TRY - { - /* Get the Image Config Data too */ - ImageConfigData = RtlImageDirectoryEntryToData(Peb->ImageBaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, - &ViewSize); - - ProbeForRead(ImageConfigData, - sizeof(IMAGE_LOAD_CONFIG_DIRECTORY), - sizeof(ULONG)); - - /* Process the image config data overrides if specfied. */ - if (ImageConfigData != NULL) - { - if (ImageConfigData->CSDVersion) - { - Peb->OSCSDVersion = ImageConfigData->CSDVersion; - } - if (ImageConfigData->ProcessAffinityMask) - { - ProcessAffinityMask = ImageConfigData->ProcessAffinityMask; - } - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - - /* Misc data */ - Peb->SessionId = Process->Session; - Process->Peb = Peb; - - /* Detach from the Process */ - KeDetachProcess(); - - DPRINT("MmCreatePeb: Peb created at %p\n", Peb); - return Status; -} - -PTEB -NTAPI -MmCreateTeb(PEPROCESS Process, - PCLIENT_ID ClientId, - PINITIAL_TEB InitialTeb) -{ - PTEB Teb; - BOOLEAN Attached = FALSE; - - /* Attach to the process */ - DPRINT("MmCreateTeb\n"); - if (Process != PsGetCurrentProcess()) - { - /* Attach to Target */ - KeAttachProcess(&Process->Pcb); - Attached = TRUE; - } - - /* Allocate the TEB */ - Teb = MiCreatePebOrTeb(Process, - (PVOID)((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); - - /* Initialize the PEB */ - RtlZeroMemory(Teb, sizeof(TEB)); - - /* Set TIB Data */ - Teb->Tib.ExceptionList = (PVOID)0xFFFFFFFF; - Teb->Tib.Version = 1; - Teb->Tib.Self = (PNT_TIB)Teb; - - /* Set TEB Data */ - Teb->ClientId = *ClientId; - Teb->RealClientId = *ClientId; - Teb->ProcessEnvironmentBlock = Process->Peb; - Teb->CurrentLocale = PsDefaultThreadLocaleId; - - /* Store stack information from InitialTeb */ - if(InitialTeb != NULL) - { - Teb->Tib.StackBase = InitialTeb->StackBase; - Teb->Tib.StackLimit = InitialTeb->StackLimit; - Teb->DeallocationStack = InitialTeb->AllocatedStackBase; - } - - /* Initialize the static unicode string */ - Teb->StaticUnicodeString.Length = 0; - Teb->StaticUnicodeString.MaximumLength = sizeof(Teb->StaticUnicodeBuffer); - Teb->StaticUnicodeString.Buffer = Teb->StaticUnicodeBuffer; - - /* Return TEB Address */ - DPRINT("Allocated: %x\n", Teb); - if (Attached) KeDetachProcess(); - return Teb; }
NTSTATUS
Modified: trunk/reactos/ntoskrnl/mm/section.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/section.c?rev=4... ============================================================================== --- trunk/reactos/ntoskrnl/mm/section.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/section.c [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -5072,52 +5072,12 @@
NTSTATUS NTAPI -NtAllocateUserPhysicalPages(IN HANDLE ProcessHandle, - IN OUT PULONG_PTR NumberOfPages, - IN OUT PULONG_PTR UserPfnArray) +NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, + IN PVOID File2MappedAsFile) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; }
-NTSTATUS -NTAPI -NtMapUserPhysicalPages(IN PVOID VirtualAddresses, - IN ULONG_PTR NumberOfPages, - IN OUT PULONG_PTR UserPfnArray) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -NTAPI -NtMapUserPhysicalPagesScatter(IN PVOID *VirtualAddresses, - IN ULONG_PTR NumberOfPages, - IN OUT PULONG_PTR UserPfnArray) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -NTAPI -NtFreeUserPhysicalPages(IN HANDLE ProcessHandle, - IN OUT PULONG_PTR NumberOfPages, - IN OUT PULONG_PTR UserPfnArray) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -NTAPI -NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, - IN PVOID File2MappedAsFile) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} -
/* EOF */
Modified: trunk/reactos/ntoskrnl/ps/process.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/process.c?rev=4... ============================================================================== --- trunk/reactos/ntoskrnl/ps/process.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ps/process.c [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -379,6 +379,8 @@ BOOLEAN Result, SdAllocated; PSECURITY_DESCRIPTOR SecurityDescriptor; SECURITY_SUBJECT_CONTEXT SubjectContext; + BOOLEAN NeedsPeb = FALSE; + INITIAL_PEB InitialPeb; PAGED_CODE(); PSTRACE(PS_PROCESS_DEBUG, "ProcessHandle: %p Parent: %p\n", ProcessHandle, ParentProcess); @@ -635,17 +637,27 @@ SeAuditProcessCreationInfo. ImageFileName); if (!NT_SUCCESS(Status)) goto CleanupWithRef; + + // + // We need a PEB + // + NeedsPeb = TRUE; } else if (Parent) { /* Check if this is a child of the system process */ if (Parent != PsInitialSystemProcess) { + // + // We need a PEB + // + NeedsPeb = TRUE; + /* This is a clone! */ ASSERTMSG("No support for cloning yet\n", FALSE); } else - { + { /* This is the initial system process */ Flags &= ~PS_LARGE_PAGES; Status = MmInitializeProcessAddressSpace(Process, @@ -702,11 +714,34 @@ }
/* Create PEB only for User-Mode Processes */ - if (Parent) - { - /* Create it */ - Status = MmCreatePeb(Process); - if (!NT_SUCCESS(Status)) goto CleanupWithRef; + if ((Parent) && (NeedsPeb)) + { + // + // Set up the initial PEB + // + RtlZeroMemory(&InitialPeb, sizeof(INITIAL_PEB)); + InitialPeb.Mutant = (HANDLE)-1; + InitialPeb.ImageUsesLargePages = 0; // FIXME: Not yet supported + + // + // Create it only if we have an image section + // + if (SectionHandle) + { + // + // Create it + // + Status = MmCreatePeb(Process, &InitialPeb, &Process->Peb); + if (!NT_SUCCESS(Status)) goto CleanupWithRef; + } + else + { + // + // We have to clone it + // + ASSERTMSG("No support for cloning yet\n", FALSE); + } + }
/* The process can now be activated */
Modified: trunk/reactos/ntoskrnl/ps/thread.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/thread.c?rev=43... ============================================================================== --- trunk/reactos/ntoskrnl/ps/thread.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ps/thread.c [iso-8859-1] Thu Oct 15 07:56:41 2009 @@ -310,13 +310,13 @@ if (ThreadContext) { /* User-mode Thread, create Teb */ - TebBase = MmCreateTeb(Process, &Thread->Cid, InitialTeb); - if (!TebBase) + Status = MmCreateTeb(Process, &Thread->Cid, InitialTeb, &TebBase); + if (!NT_SUCCESS(Status)) { /* Failed to create the TEB. Release rundown and dereference */ ExReleaseRundownProtection(&Process->RundownProtect); ObDereferenceObject(Thread); - return STATUS_INSUFFICIENT_RESOURCES; + return Status; }
/* Set the Start Addresses */