- 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:
Hermès Bélusca-Maïto 2015-03-14 01:45:50 +00:00
parent c73bb5a49f
commit c80f97eea6
3 changed files with 15 additions and 18 deletions

View file

@ -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);

View file

@ -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);
}

View file

@ -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));