mirror of
https://github.com/reactos/reactos.git
synced 2025-05-08 03:07:05 +00:00
[NTVDM]
- cpu.c: Convert the faulting address to "real" (VM) address before calling the exception handler. - ems.c: Simplify code by using ARRAY_INDEX; some poiters should point to physical memory. - ems.c: Memory hook addresses should be "real". - memory.c: Remove an extra MemFastMoveMemory call; really use IsListEmpty (was commented by error in my previous commit). svn path=/trunk/; revision=66671
This commit is contained in:
parent
c73bb5a49f
commit
c80f97eea6
3 changed files with 15 additions and 18 deletions
|
@ -139,7 +139,7 @@ VOID CpuSimulate(VOID)
|
|||
EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
BOOLEAN Writing = (LocalExceptionRecord.ExceptionInformation[0] == 1);
|
||||
ULONG FaultAddress = (ULONG)LocalExceptionRecord.ExceptionInformation[1];
|
||||
ULONG FaultAddress = (ULONG)PHYS_TO_REAL(LocalExceptionRecord.ExceptionInformation[1]);
|
||||
|
||||
/* Make sure this was an access violation */
|
||||
ASSERT(LocalExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION);
|
||||
|
|
|
@ -23,7 +23,7 @@ static RTL_BITMAP AllocBitmap;
|
|||
static ULONG BitmapBuffer[(EMS_TOTAL_PAGES + sizeof(ULONG) - 1) / sizeof(ULONG)];
|
||||
static EMS_PAGE PageTable[EMS_TOTAL_PAGES];
|
||||
static EMS_HANDLE HandleTable[EMS_MAX_HANDLES];
|
||||
static PVOID Mapping[EMS_PHYSICAL_PAGES] = { NULL };
|
||||
static PVOID Mapping[EMS_PHYSICAL_PAGES] = {{NULL}};
|
||||
|
||||
/* PRIVATE FUNCTIONS **********************************************************/
|
||||
|
||||
|
@ -42,7 +42,7 @@ static USHORT EmsFree(USHORT Handle)
|
|||
Entry = Entry->Flink)
|
||||
{
|
||||
PEMS_PAGE PageEntry = (PEMS_PAGE)CONTAINING_RECORD(Entry, EMS_PAGE, Entry);
|
||||
ULONG PageNumber = (ULONG)(((ULONG_PTR)PageEntry - (ULONG_PTR)PageTable) / sizeof(EMS_PAGE));
|
||||
ULONG PageNumber = ARRAY_INDEX(PageEntry, PageTable);
|
||||
|
||||
/* Free the page */
|
||||
RtlClearBits(&AllocBitmap, PageNumber, 1);
|
||||
|
@ -223,10 +223,10 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
|
|||
break;
|
||||
}
|
||||
|
||||
SourcePtr = (PUCHAR)(EMS_ADDRESS
|
||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||
* EMS_PAGE_SIZE
|
||||
+ Data->SourceOffset);
|
||||
SourcePtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
|
||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||
* EMS_PAGE_SIZE
|
||||
+ Data->SourceOffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -253,10 +253,10 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
|
|||
break;
|
||||
}
|
||||
|
||||
DestPtr = (PUCHAR)(EMS_ADDRESS
|
||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||
* EMS_PAGE_SIZE
|
||||
+ Data->DestOffset);
|
||||
DestPtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
|
||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||
* EMS_PAGE_SIZE
|
||||
+ Data->DestOffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -324,7 +324,7 @@ VOID EmsInitialize(VOID)
|
|||
InitializeListHead(&HandleTable[i].PageList);
|
||||
}
|
||||
|
||||
MemInstallFastMemoryHook(SEG_OFF_TO_PTR(EMS_SEGMENT, 0),
|
||||
MemInstallFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
|
||||
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE,
|
||||
EmsReadMemory,
|
||||
EmsWriteMemory);
|
||||
|
@ -334,6 +334,6 @@ VOID EmsInitialize(VOID)
|
|||
|
||||
VOID EmsCleanup(VOID)
|
||||
{
|
||||
MemRemoveFastMemoryHook(SEG_OFF_TO_PTR(EMS_SEGMENT, 0),
|
||||
MemRemoveFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
|
||||
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ typedef struct _MEM_HOOK
|
|||
} MEM_HOOK, *PMEM_HOOK;
|
||||
|
||||
static LIST_ENTRY HookList;
|
||||
static PMEM_HOOK PageTable[TOTAL_PAGES];
|
||||
static PMEM_HOOK PageTable[TOTAL_PAGES] = {{NULL}};
|
||||
|
||||
/* PRIVATE FUNCTIONS **********************************************************/
|
||||
|
||||
|
@ -145,8 +145,6 @@ MemRead(ULONG Address, PVOID Buffer, ULONG Size)
|
|||
ULONG FirstPage = Address >> 12;
|
||||
ULONG LastPage = (Address + Size - 1) >> 12;
|
||||
|
||||
MemFastMoveMemory(Buffer, REAL_TO_PHYS(Address), Size);
|
||||
|
||||
if (FirstPage == LastPage)
|
||||
{
|
||||
ReadPage(PageTable[FirstPage], Address, Buffer, Size);
|
||||
|
@ -538,8 +536,7 @@ MemCleanup(VOID)
|
|||
SIZE_T MemorySize = MAX_ADDRESS;
|
||||
PLIST_ENTRY Pointer;
|
||||
|
||||
// while (!IsListEmpty(&HookList))
|
||||
while (HookList.Flink != &HookList)
|
||||
while (!IsListEmpty(&HookList))
|
||||
{
|
||||
Pointer = RemoveHeadList(&HookList);
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, CONTAINING_RECORD(Pointer, MEM_HOOK, Entry));
|
||||
|
|
Loading…
Reference in a new issue