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/d... ============================================================================== --- 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 */