Author: aandrejevic
Date: Mon Apr 27 18:23:39 2015
New Revision: 67462
URL:
http://svn.reactos.org/svn/reactos?rev=67462&view=rev
Log:
[NTVDM]
In DosAllocateMemory, when the "last fit" allocation strategy is selected,
split
the block so that the last part of it is used.
Modified:
trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c [iso-8859-1] Mon Apr 27
18:23:39 2015
@@ -57,7 +57,7 @@
WORD DosAllocateMemory(WORD Size, WORD *MaxAvailable)
{
WORD Result = 0, Segment = FIRST_MCB_SEGMENT, MaxSize = 0;
- PDOS_MCB CurrentMcb, NextMcb;
+ PDOS_MCB CurrentMcb;
BOOLEAN SearchUmb = FALSE;
DPRINT("DosAllocateMemory: Size 0x%04X\n", Size);
@@ -159,16 +159,37 @@
if (CurrentMcb->Size > Size)
{
/* It is, split it into two blocks */
- NextMcb = SEGMENT_TO_MCB(Result + Size + 1);
-
- /* Initialize the new MCB structure */
- NextMcb->BlockType = CurrentMcb->BlockType;
- NextMcb->Size = CurrentMcb->Size - Size - 1;
- NextMcb->OwnerPsp = 0;
-
- /* Update the current block */
- CurrentMcb->BlockType = 'M';
- CurrentMcb->Size = Size;
+ if ((DosAllocStrategy & 0x3F) != DOS_ALLOC_LAST_FIT)
+ {
+ PDOS_MCB NextMcb = SEGMENT_TO_MCB(Result + Size + 1);
+
+ /* Initialize the new MCB structure */
+ NextMcb->BlockType = CurrentMcb->BlockType;
+ NextMcb->Size = CurrentMcb->Size - Size - 1;
+ NextMcb->OwnerPsp = 0;
+
+ /* Update the current block */
+ CurrentMcb->BlockType = 'M';
+ CurrentMcb->Size = Size;
+ }
+ else
+ {
+ /* Save the location of the current MCB */
+ PDOS_MCB PreviousMcb = CurrentMcb;
+
+ /* Move the current MCB higher */
+ Result += CurrentMcb->Size - Size;
+ CurrentMcb = SEGMENT_TO_MCB(Result);
+
+ /* Initialize the new MCB structure */
+ CurrentMcb->BlockType = PreviousMcb->BlockType;
+ CurrentMcb->Size = Size;
+ CurrentMcb->OwnerPsp = 0;
+
+ /* Update the previous block */
+ PreviousMcb->BlockType = 'M';
+ PreviousMcb->Size -= Size + 1;
+ }
}
/* Take ownership of the block */