156 lines
2.4 KiB
C
156 lines
2.4 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
xmscmt86.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module conains the memory commit/decommit routines
|
||
|
for x86.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Dave Hastings (daveh) creation-date 25-Jan-1994
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
#include <xms.h>
|
||
|
#include <suballoc.h>
|
||
|
|
||
|
NTSTATUS
|
||
|
xmsCommitBlock(
|
||
|
ULONG BaseAddress,
|
||
|
ULONG Size
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine commits a block of memory using NtAllocateVirtualMemory.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BaseAddress -- Supplies the base address to commit memory at
|
||
|
Size -- Supplies the size of the block to commit
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Same as NtAllocateVirtualMemory.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
PVOID Address;
|
||
|
ULONG s;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
//
|
||
|
// Copy the parameters locally, so that MM doesn't
|
||
|
// change them for us
|
||
|
//
|
||
|
Address = (PVOID)BaseAddress;
|
||
|
s = Size;
|
||
|
|
||
|
//
|
||
|
// Perform the allocation
|
||
|
//
|
||
|
Status = NtAllocateVirtualMemory(
|
||
|
NtCurrentProcess(),
|
||
|
&Address,
|
||
|
0L,
|
||
|
&s,
|
||
|
MEM_COMMIT,
|
||
|
PAGE_READWRITE
|
||
|
);
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
xmsDecommitBlock(
|
||
|
ULONG BaseAddress,
|
||
|
ULONG Size
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine commits a block of memory using NtAllocateVirtualMemory.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
BaseAddress -- Supplies the base address to decommit memory at
|
||
|
Size -- Supplies the size of the block to decommit
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Same as NtFreeVirtualMemory.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
PVOID Address;
|
||
|
ULONG s;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
//
|
||
|
// Copy the parameters locally, so that MM doesn't
|
||
|
// change them for us
|
||
|
//
|
||
|
Address = (PVOID)BaseAddress;
|
||
|
s = Size;
|
||
|
|
||
|
//
|
||
|
// Perform the allocation
|
||
|
//
|
||
|
Status = NtFreeVirtualMemory( NtCurrentProcess(),
|
||
|
&Address,
|
||
|
&s,
|
||
|
MEM_DECOMMIT
|
||
|
);
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
xmsMoveMemory(
|
||
|
ULONG Destination,
|
||
|
ULONG Source,
|
||
|
ULONG Count
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine moves a block of memory, and notifies the emulator.
|
||
|
It correctly handles overlapping source and destination
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Destination -- Supplies a pointer to the destination Linear
|
||
|
Address
|
||
|
Source -- Supplies a pointer to the source Linear Address
|
||
|
Count -- Supplies the number of bytes to move
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Move the memory
|
||
|
//
|
||
|
RtlMoveMemory(
|
||
|
(PVOID)Destination,
|
||
|
(PVOID)Source,
|
||
|
Count
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|