Author: ion
Date: Mon Jan 30 09:42:47 2012
New Revision: 55320
URL:
http://svn.reactos.org/svn/reactos?rev=55320&view=rev
Log:
[NTOSKRNL]: One of my favorite bugfixes to date: While working on SMSS2, I notice that
Win32->NT path conversion is failing and %SystemRoot% is not being translated. Yet,
this is supposed to be part of the core environment that the kernel sends to SMSS! I
analyze the old SMSS, and in there, it works. Puzzled, I DPRINT1 out the environment only
to see that it is empty. I do the same in the kernel -- empty! The old SMSS is currently
manually regenerating its critical environment, as if the kernel never sent it (which
perfectly hid the bug that our kernel...actually did never send it!). But why were we
sending no environment? It turns out our environment string was 0x10000 bytes, just one
byte longer than MAX_USHORT and overflowing back to zero -- hence our Appends were all
silently failing. But why was our environment string 0x10000, when we allocate 0x1000
bytes only? And here comes the Mm bug. When you allocate virtual memory in Windows you are
forced to use 64K alignment, and Windows internally will align the VAD on a 64K boundary.
In ReactOS however, we actually allocate, map, and reserve a full 64K memory area, as well
as actually modify the region size that the caller has sent, returning the caller a
64K-aligned size no matter what (whereas Windows would return the original 4KB size).
I've thus added a simple hack which still allocates a full 64K memory area (who knows
what would break if not), but only aligns the region size to a page size -- less swap
pages are reserved, and the caller only receives a page-aligned region, instead of 64K.
This now fixes ExpLoadInitialProcess and anyone else that was requesting a 4KB page and
getting 64KB in exchange...
Modified:
trunk/reactos/ntoskrnl/mm/anonmem.c
Modified: trunk/reactos/ntoskrnl/mm/anonmem.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/anonmem.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/anonmem.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/anonmem.c [iso-8859-1] Mon Jan 30 09:42:47 2012
@@ -874,9 +874,15 @@
return(Status);
}
+#if 0
MemoryAreaLength = (ULONG_PTR)MemoryArea->EndingAddress -
(ULONG_PTR)MemoryArea->StartingAddress;
-
+#else
+ ULONG_PTR EndingAddress;
+ EndingAddress = ((ULONG_PTR)MemoryArea->StartingAddress + RegionSize - 1) |
(PAGE_SIZE - 1);
+ MemoryAreaLength = (ULONG_PTR)EndingAddress -
(ULONG_PTR)MemoryArea->StartingAddress + 1;
+#endif
+
MmInitializeRegion(&MemoryArea->Data.VirtualMemoryData.RegionListHead,
MemoryAreaLength, Type, Protect);