From f7561326df1c80ac81727b534000da676c56c2c8 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Mon, 27 Apr 2015 18:23:39 +0000 Subject: [PATCH] [NTVDM] In DosAllocateMemory, when the "last fit" allocation strategy is selected, split the block so that the last part of it is used. svn path=/trunk/; revision=67462 --- .../mvdm/ntvdm/dos/dos32krnl/memory.c | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c index 18a28ce0e92..73a554d09c3 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/memory.c @@ -57,7 +57,7 @@ static VOID DosCombineFreeBlocks(WORD StartBlock) 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 @@ Done: if (CurrentMcb->Size > Size) { /* It is, split it into two blocks */ - NextMcb = SEGMENT_TO_MCB(Result + Size + 1); + 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; + /* 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; + /* 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 */ -- 2.17.1