mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 00:32:57 +00:00
[NTVDM]
- Remove unneeded commented code; - Fix few things related to committing the reserved low-memory VDM page by kernel32; - Decommit this memory when we terminate NTVDM. svn path=/trunk/; revision=65426
This commit is contained in:
parent
bc27bfaa6b
commit
0bbe7eda19
2 changed files with 45 additions and 15 deletions
|
@ -560,7 +560,7 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
{
|
{
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
|
|
||||||
/* Allocate memory for the 16-bit address space */
|
/* Allocate 16 MB memory for the 16-bit address space */
|
||||||
BaseAddress = HeapAlloc(GetProcessHeap(), /*HEAP_ZERO_MEMORY*/ 0, MAX_ADDRESS);
|
BaseAddress = HeapAlloc(GetProcessHeap(), /*HEAP_ZERO_MEMORY*/ 0, MAX_ADDRESS);
|
||||||
if (BaseAddress == NULL)
|
if (BaseAddress == NULL)
|
||||||
{
|
{
|
||||||
|
@ -571,10 +571,19 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
#else
|
#else
|
||||||
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
SIZE_T MemorySize = MAX_ADDRESS;
|
SIZE_T MemorySize = MAX_ADDRESS; // See: kernel32/client/vdm.c!BaseGetVdmConfigInfo
|
||||||
|
|
||||||
/* The reserved region starts from the very first page */
|
/*
|
||||||
BaseAddress = NULL;
|
* The reserved region starts from the very first page.
|
||||||
|
* We need to commit the reserved first 16 MB virtual address.
|
||||||
|
*/
|
||||||
|
BaseAddress = (PVOID)1; // NULL has another signification for NtAllocateVirtualMemory
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since to get NULL, we allocated from 0x1, account for this.
|
||||||
|
* See also: kernel32/client/proc.c!CreateProcessInternalW
|
||||||
|
*/
|
||||||
|
MemorySize -= 1;
|
||||||
|
|
||||||
/* Commit the reserved memory */
|
/* Commit the reserved memory */
|
||||||
Status = NtAllocateVirtualMemory(NtCurrentProcess(),
|
Status = NtAllocateVirtualMemory(NtCurrentProcess(),
|
||||||
|
@ -585,10 +594,12 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
PAGE_EXECUTE_READWRITE);
|
PAGE_EXECUTE_READWRITE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
wprintf(L"FATAL: Failed to commit VDM memory.\n");
|
wprintf(L"FATAL: Failed to commit VDM memory, Status 0x%08lx\n", Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(BaseAddress == NULL);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -607,20 +618,12 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
if (!ClockInitialize())
|
if (!ClockInitialize())
|
||||||
{
|
{
|
||||||
wprintf(L"FATAL: Failed to initialize the clock\n");
|
wprintf(L"FATAL: Failed to initialize the clock\n");
|
||||||
|
EmulatorCleanup();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the CPU */
|
/* Initialize the CPU */
|
||||||
CpuInitialize();
|
CpuInitialize();
|
||||||
// Fast486Initialize(&EmulatorContext,
|
|
||||||
// EmulatorReadMemory,
|
|
||||||
// EmulatorWriteMemory,
|
|
||||||
// EmulatorReadIo,
|
|
||||||
// EmulatorWriteIo,
|
|
||||||
// NULL,
|
|
||||||
// EmulatorBiosOperation,
|
|
||||||
// EmulatorIntAcknowledge,
|
|
||||||
// NULL /* TODO: Use a TLB */);
|
|
||||||
|
|
||||||
/* Initialize DMA */
|
/* Initialize DMA */
|
||||||
|
|
||||||
|
@ -659,6 +662,7 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
if (InputThread == NULL)
|
if (InputThread == NULL)
|
||||||
{
|
{
|
||||||
DisplayMessage(L"Failed to create the console input thread.");
|
DisplayMessage(L"Failed to create the console input thread.");
|
||||||
|
EmulatorCleanup();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
|
@ -667,6 +671,7 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
if (!VgaInitialize(ConsoleOutput))
|
if (!VgaInitialize(ConsoleOutput))
|
||||||
{
|
{
|
||||||
DisplayMessage(L"Failed to initialize VGA support.");
|
DisplayMessage(L"Failed to initialize VGA support.");
|
||||||
|
EmulatorCleanup();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -683,6 +688,11 @@ BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput)
|
||||||
|
|
||||||
VOID EmulatorCleanup(VOID)
|
VOID EmulatorCleanup(VOID)
|
||||||
{
|
{
|
||||||
|
#ifndef STANDALONE
|
||||||
|
NTSTATUS Status;
|
||||||
|
SIZE_T MemorySize = MAX_ADDRESS;
|
||||||
|
#endif
|
||||||
|
|
||||||
VgaCleanup();
|
VgaCleanup();
|
||||||
|
|
||||||
/* Close the input thread handle */
|
/* Close the input thread handle */
|
||||||
|
@ -698,8 +708,28 @@ VOID EmulatorCleanup(VOID)
|
||||||
|
|
||||||
CpuCleanup();
|
CpuCleanup();
|
||||||
|
|
||||||
|
#ifdef STANDALONE
|
||||||
|
|
||||||
/* Free the memory allocated for the 16-bit address space */
|
/* Free the memory allocated for the 16-bit address space */
|
||||||
if (BaseAddress != NULL) HeapFree(GetProcessHeap(), 0, BaseAddress);
|
if (BaseAddress != NULL) HeapFree(GetProcessHeap(), 0, BaseAddress);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* The reserved region starts from the very first page */
|
||||||
|
// BaseAddress = (PVOID)1;
|
||||||
|
|
||||||
|
/* Since to get NULL, we allocated from 0x1, account for this */
|
||||||
|
MemorySize -= 1;
|
||||||
|
|
||||||
|
Status = NtFreeVirtualMemory(NtCurrentProcess(),
|
||||||
|
&BaseAddress,
|
||||||
|
&MemorySize,
|
||||||
|
MEM_DECOMMIT);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("NTVDM: Failed to decommit VDM memory, Status 0x%08lx\n", Status);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#define TO_LINEAR(seg, off) (((seg) << 4) + (off))
|
#define TO_LINEAR(seg, off) (((seg) << 4) + (off))
|
||||||
#define MAX_SEGMENT 0xFFFF
|
#define MAX_SEGMENT 0xFFFF
|
||||||
#define MAX_OFFSET 0xFFFF
|
#define MAX_OFFSET 0xFFFF
|
||||||
#define MAX_ADDRESS 0x1000000 // 16 MB of RAM
|
#define MAX_ADDRESS 0x1000000 // 16 MB of RAM; see also: kernel32/client/vdm.c!BaseGetVdmConfigInfo
|
||||||
|
|
||||||
#define FAR_POINTER(x) \
|
#define FAR_POINTER(x) \
|
||||||
(PVOID)((ULONG_PTR)BaseAddress + TO_LINEAR(HIWORD(x), LOWORD(x)))
|
(PVOID)((ULONG_PTR)BaseAddress + TO_LINEAR(HIWORD(x), LOWORD(x)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue