VOID NTAPI MiRosTakeOverSharedUserPage(IN PEPROCESS Process) { NTSTATUS Status; PMEMORY_AREA MemoryArea; PVOID AllocatedBase = (PVOID)MM_SHARED_USER_DATA_VA; Status = MmCreateMemoryArea(&Process->Vm, MEMORY_AREA_OWNED_BY_ARM3, &AllocatedBase, PAGE_SIZE, PAGE_READWRITE, &MemoryArea, TRUE, 0, PAGE_SIZE); ASSERT(NT_SUCCESS(Status)); }
// // Helper function to create initial memory areas. // The created area is always read/write. // VOID INIT_FUNCTION NTAPI MiCreateArm3StaticMemoryArea(PVOID BaseAddress, ULONG Size, BOOLEAN Executable) { const ULONG Protection = Executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; PVOID pBaseAddress = BaseAddress; PMEMORY_AREA MArea; NTSTATUS Status; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &pBaseAddress, Size, Protection, &MArea, 0, PAGE_SIZE); ASSERT(Status == STATUS_SUCCESS); // TODO: Perhaps it would be prudent to bugcheck here, not only assert? }
VOID INIT_FUNCTION NTAPI MiInitSystemMemoryAreas() { PVOID BaseAddress; PHYSICAL_ADDRESS BoundaryAddressMultiple; PMEMORY_AREA MArea; NTSTATUS Status; BoundaryAddressMultiple.QuadPart = 0; // // Create the memory area to define the PTE base // BaseAddress = (PVOID)PTE_BASE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, 4 * 1024 * 1024, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // Create the memory area to define Hyperspace // BaseAddress = (PVOID)HYPER_SPACE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, 4 * 1024 * 1024, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // Protect the PFN database // BaseAddress = MmPfnDatabase; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, (MxPfnAllocation << PAGE_SHIFT), PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // Odyssey requires a memory area to keep the initial NP area off-bounds // BaseAddress = MmNonPagedPoolStart; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, MmSizeOfNonPagedPoolInBytes, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // And we need one more for the system NP // BaseAddress = MmNonPagedSystemStart; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, (ULONG_PTR)MmNonPagedPoolEnd - (ULONG_PTR)MmNonPagedSystemStart, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // We also need one for system view space // BaseAddress = MiSystemViewStart; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, MmSystemViewSize, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // And another for session space // BaseAddress = MmSessionBase; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, (ULONG_PTR)MiSessionSpaceEnd - (ULONG_PTR)MmSessionBase, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // One more for ARM paged pool // BaseAddress = MmPagedPoolStart; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, MmSizeOfPagedPoolInBytes, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // Next, the KPCR // BaseAddress = (PVOID)PCR; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, PAGE_SIZE * KeNumberProcessors, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // Now the KUSER_SHARED_DATA // BaseAddress = (PVOID)KI_USER_SHARED_DATA; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, PAGE_SIZE, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); // // And the debugger mapping // BaseAddress = MI_DEBUG_MAPPING; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, PAGE_SIZE, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); #if defined(_X86_) // // Finally, reserve the 2 pages we currently make use of for HAL mappings // BaseAddress = (PVOID)0xFFC00000; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, PAGE_SIZE * 2, PAGE_READWRITE, &MArea, TRUE, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); #endif }