mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 07:52:56 +00:00
[NTVDM]
- Move the VDD memory handler API prototypes to the corresponding DDK header. - Fix few function arguments types and add few more comments :) - Move all NTVDM-memory related functions to memory.c - Prefer checking for !IsListEmpty(&list) instead of doing list.Flink != &list (ehh! NTVDM is not win32k!!) svn path=/trunk/; revision=66669
This commit is contained in:
parent
6ea4a782ee
commit
682debaaf6
5 changed files with 153 additions and 136 deletions
|
@ -179,6 +179,13 @@ typedef enum
|
||||||
|
|
||||||
#define getMODE() ((getMSW() & MSW_PE) ? VDM_PM : VDM_V86)
|
#define getMODE() ((getMSW() & MSW_PE) ? VDM_PM : VDM_V86)
|
||||||
|
|
||||||
|
typedef VOID
|
||||||
|
(WINAPI *PVDD_MEMORY_HANDLER)
|
||||||
|
(
|
||||||
|
PVOID FaultAddress,
|
||||||
|
ULONG RWMode
|
||||||
|
);
|
||||||
|
|
||||||
PBYTE
|
PBYTE
|
||||||
WINAPI
|
WINAPI
|
||||||
Sim32pGetVDMPointer
|
Sim32pGetVDMPointer
|
||||||
|
@ -225,6 +232,25 @@ VdmUnmapFlat
|
||||||
IN VDM_MODE Mode
|
IN VDM_MODE Mode
|
||||||
);
|
);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
VDDInstallMemoryHook
|
||||||
|
(
|
||||||
|
IN HANDLE hVdd,
|
||||||
|
IN PVOID pStart,
|
||||||
|
IN DWORD dwCount,
|
||||||
|
IN PVDD_MEMORY_HANDLER MemoryHandler
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
VDDDeInstallMemoryHook
|
||||||
|
(
|
||||||
|
IN HANDLE hVdd,
|
||||||
|
IN PVOID pStart,
|
||||||
|
IN DWORD dwCount
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -139,7 +139,7 @@ VOID CpuSimulate(VOID)
|
||||||
EXCEPTION_EXECUTE_HANDLER)
|
EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
BOOLEAN Writing = (LocalExceptionRecord.ExceptionInformation[0] == 1);
|
BOOLEAN Writing = (LocalExceptionRecord.ExceptionInformation[0] == 1);
|
||||||
DWORD FaultingAddress = (DWORD)LocalExceptionRecord.ExceptionInformation[1];
|
ULONG FaultAddress = (ULONG)LocalExceptionRecord.ExceptionInformation[1];
|
||||||
|
|
||||||
/* Make sure this was an access violation */
|
/* Make sure this was an access violation */
|
||||||
ASSERT(LocalExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION);
|
ASSERT(LocalExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION);
|
||||||
|
@ -148,7 +148,7 @@ VOID CpuSimulate(VOID)
|
||||||
Fast486Rewind(&EmulatorContext);
|
Fast486Rewind(&EmulatorContext);
|
||||||
|
|
||||||
/* Call the handler */
|
/* Call the handler */
|
||||||
MemExceptionHandler(FaultingAddress, Writing);
|
MemExceptionHandler(FaultAddress, Writing);
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
}
|
}
|
||||||
|
|
|
@ -586,66 +586,4 @@ VDDTerminateVDM(VOID)
|
||||||
EmulatorTerminate();
|
EmulatorTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
PBYTE
|
|
||||||
WINAPI
|
|
||||||
Sim32pGetVDMPointer(IN ULONG Address,
|
|
||||||
IN BOOLEAN ProtectedMode)
|
|
||||||
{
|
|
||||||
// FIXME
|
|
||||||
UNREFERENCED_PARAMETER(ProtectedMode);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HIWORD(Address) == Segment (if ProtectedMode == FALSE)
|
|
||||||
* or Selector (if ProtectedMode == TRUE )
|
|
||||||
* LOWORD(Address) == Offset
|
|
||||||
*/
|
|
||||||
return (PBYTE)FAR_POINTER(Address);
|
|
||||||
}
|
|
||||||
|
|
||||||
PBYTE
|
|
||||||
WINAPI
|
|
||||||
MGetVdmPointer(IN ULONG Address,
|
|
||||||
IN ULONG Size,
|
|
||||||
IN BOOLEAN ProtectedMode)
|
|
||||||
{
|
|
||||||
UNREFERENCED_PARAMETER(Size);
|
|
||||||
return Sim32pGetVDMPointer(Address, ProtectedMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
PVOID
|
|
||||||
WINAPI
|
|
||||||
VdmMapFlat(IN USHORT Segment,
|
|
||||||
IN ULONG Offset,
|
|
||||||
IN VDM_MODE Mode)
|
|
||||||
{
|
|
||||||
// FIXME
|
|
||||||
UNREFERENCED_PARAMETER(Mode);
|
|
||||||
|
|
||||||
return SEG_OFF_TO_PTR(Segment, Offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
WINAPI
|
|
||||||
VdmFlushCache(IN USHORT Segment,
|
|
||||||
IN ULONG Offset,
|
|
||||||
IN ULONG Size,
|
|
||||||
IN VDM_MODE Mode)
|
|
||||||
{
|
|
||||||
// FIXME
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
WINAPI
|
|
||||||
VdmUnmapFlat(IN USHORT Segment,
|
|
||||||
IN ULONG Offset,
|
|
||||||
IN PVOID Buffer,
|
|
||||||
IN VDM_MODE Mode)
|
|
||||||
{
|
|
||||||
// FIXME
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -17,6 +17,24 @@
|
||||||
|
|
||||||
/* PRIVATE VARIABLES **********************************************************/
|
/* PRIVATE VARIABLES **********************************************************/
|
||||||
|
|
||||||
|
typedef struct _MEM_HOOK
|
||||||
|
{
|
||||||
|
LIST_ENTRY Entry;
|
||||||
|
HANDLE hVdd;
|
||||||
|
ULONG Count;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
PVDD_MEMORY_HANDLER VddHandler;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
PMEMORY_READ_HANDLER FastReadHandler;
|
||||||
|
PMEMORY_WRITE_HANDLER FastWriteHandler;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} MEM_HOOK, *PMEM_HOOK;
|
||||||
|
|
||||||
static LIST_ENTRY HookList;
|
static LIST_ENTRY HookList;
|
||||||
static PMEM_HOOK PageTable[TOTAL_PAGES];
|
static PMEM_HOOK PageTable[TOTAL_PAGES];
|
||||||
|
|
||||||
|
@ -171,16 +189,16 @@ MemWrite(ULONG Address, PVOID Buffer, ULONG Size)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MemExceptionHandler(DWORD Address, BOOLEAN Writing)
|
MemExceptionHandler(ULONG FaultAddress, BOOLEAN Writing)
|
||||||
{
|
{
|
||||||
PMEM_HOOK Hook = PageTable[Address >> 12];
|
PMEM_HOOK Hook = PageTable[FaultAddress >> 12];
|
||||||
DPRINT("The memory at 0x%08X could not be %s.\n", Address, Writing ? "written" : "read");
|
DPRINT("The memory at 0x%08X could not be %s.\n", FaultAddress, Writing ? "written" : "read");
|
||||||
|
|
||||||
/* Exceptions are only supposed to happen when using VDD-style memory hooks */
|
/* Exceptions are only supposed to happen when using VDD-style memory hooks */
|
||||||
ASSERT(Address < MAX_ADDRESS && Hook != NULL && Hook->hVdd != NULL);
|
ASSERT(FaultAddress < MAX_ADDRESS && Hook != NULL && Hook->hVdd != NULL);
|
||||||
|
|
||||||
/* Call the VDD handler */
|
/* Call the VDD handler */
|
||||||
Hook->VddHandler(Address, Writing);
|
Hook->VddHandler((PVOID)FaultAddress, (ULONG)Writing);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
@ -191,8 +209,8 @@ MemInstallFastMemoryHook(PVOID Address,
|
||||||
{
|
{
|
||||||
PMEM_HOOK Hook;
|
PMEM_HOOK Hook;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG FirstPage = (ULONG)Address >> 12;
|
ULONG FirstPage = (ULONG_PTR)Address >> 12;
|
||||||
ULONG LastPage = ((ULONG)Address + Size - 1) >> 12;
|
ULONG LastPage = ((ULONG_PTR)Address + Size - 1) >> 12;
|
||||||
|
|
||||||
/* Make sure none of these pages are already allocated */
|
/* Make sure none of these pages are already allocated */
|
||||||
for (i = FirstPage; i <= LastPage; i++)
|
for (i = FirstPage; i <= LastPage; i++)
|
||||||
|
@ -200,7 +218,8 @@ MemInstallFastMemoryHook(PVOID Address,
|
||||||
if (PageTable[i] != NULL) return FALSE;
|
if (PageTable[i] != NULL) return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hook = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(MEM_HOOK));
|
/* Create and initialize a new hook entry */
|
||||||
|
Hook = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(*Hook));
|
||||||
if (Hook == NULL) return FALSE;
|
if (Hook == NULL) return FALSE;
|
||||||
|
|
||||||
Hook->hVdd = NULL;
|
Hook->hVdd = NULL;
|
||||||
|
@ -208,8 +227,10 @@ MemInstallFastMemoryHook(PVOID Address,
|
||||||
Hook->FastReadHandler = ReadHandler;
|
Hook->FastReadHandler = ReadHandler;
|
||||||
Hook->FastWriteHandler = WriteHandler;
|
Hook->FastWriteHandler = WriteHandler;
|
||||||
|
|
||||||
|
/* Add the hook entry to the page table... */
|
||||||
for (i = FirstPage; i <= LastPage; i++) PageTable[i] = Hook;
|
for (i = FirstPage; i <= LastPage; i++) PageTable[i] = Hook;
|
||||||
|
|
||||||
|
/* ... and to the list of hooks */
|
||||||
InsertTailList(&HookList, &Hook->Entry);
|
InsertTailList(&HookList, &Hook->Entry);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -217,15 +238,16 @@ MemInstallFastMemoryHook(PVOID Address,
|
||||||
BOOL
|
BOOL
|
||||||
MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
|
MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
|
||||||
{
|
{
|
||||||
|
PMEM_HOOK Hook;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG FirstPage = (ULONG)Address >> 12;
|
ULONG FirstPage = (ULONG_PTR)Address >> 12;
|
||||||
ULONG LastPage = ((ULONG)Address + Size - 1) >> 12;
|
ULONG LastPage = ((ULONG_PTR)Address + Size - 1) >> 12;
|
||||||
|
|
||||||
if (Size == 0) return FALSE;
|
if (Size == 0) return FALSE;
|
||||||
|
|
||||||
for (i = FirstPage; i <= LastPage; i++)
|
for (i = FirstPage; i <= LastPage; i++)
|
||||||
{
|
{
|
||||||
PMEM_HOOK Hook = PageTable[i];
|
Hook = PageTable[i];
|
||||||
if (Hook == NULL || Hook->hVdd != NULL) continue;
|
if (Hook == NULL || Hook->hVdd != NULL) continue;
|
||||||
|
|
||||||
if (--Hook->Count == 0)
|
if (--Hook->Count == 0)
|
||||||
|
@ -241,18 +263,82 @@ MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PBYTE
|
||||||
|
WINAPI
|
||||||
|
Sim32pGetVDMPointer(IN ULONG Address,
|
||||||
|
IN BOOLEAN ProtectedMode)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
UNREFERENCED_PARAMETER(ProtectedMode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* HIWORD(Address) == Segment (if ProtectedMode == FALSE)
|
||||||
|
* or Selector (if ProtectedMode == TRUE )
|
||||||
|
* LOWORD(Address) == Offset
|
||||||
|
*/
|
||||||
|
return (PBYTE)FAR_POINTER(Address);
|
||||||
|
}
|
||||||
|
|
||||||
|
PBYTE
|
||||||
|
WINAPI
|
||||||
|
MGetVdmPointer(IN ULONG Address,
|
||||||
|
IN ULONG Size,
|
||||||
|
IN BOOLEAN ProtectedMode)
|
||||||
|
{
|
||||||
|
UNREFERENCED_PARAMETER(Size);
|
||||||
|
return Sim32pGetVDMPointer(Address, ProtectedMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
VdmMapFlat(IN USHORT Segment,
|
||||||
|
IN ULONG Offset,
|
||||||
|
IN VDM_MODE Mode)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
UNREFERENCED_PARAMETER(Mode);
|
||||||
|
|
||||||
|
return SEG_OFF_TO_PTR(Segment, Offset);
|
||||||
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
VDDInstallMemoryHook(HANDLE hVdd,
|
VdmFlushCache(IN USHORT Segment,
|
||||||
PVOID pStart,
|
IN ULONG Offset,
|
||||||
DWORD dwCount,
|
IN ULONG Size,
|
||||||
PVDD_MEMORY_HANDLER pHandler)
|
IN VDM_MODE Mode)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
VdmUnmapFlat(IN USHORT Segment,
|
||||||
|
IN ULONG Offset,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
IN VDM_MODE Mode)
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
VDDInstallMemoryHook(IN HANDLE hVdd,
|
||||||
|
IN PVOID pStart,
|
||||||
|
IN DWORD dwCount,
|
||||||
|
IN PVDD_MEMORY_HANDLER MemoryHandler)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PMEM_HOOK Hook;
|
PMEM_HOOK Hook;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG FirstPage = (ULONG)pStart >> 12;
|
ULONG FirstPage = (ULONG_PTR)pStart >> 12;
|
||||||
ULONG LastPage = ((ULONG)pStart + dwCount - 1) >> 12;
|
ULONG LastPage = ((ULONG_PTR)pStart + dwCount - 1) >> 12;
|
||||||
PVOID Address = (PVOID)(FirstPage * PAGE_SIZE);
|
PVOID Address = (PVOID)(FirstPage * PAGE_SIZE);
|
||||||
SIZE_T Size = (LastPage - FirstPage + 1) * PAGE_SIZE;
|
SIZE_T Size = (LastPage - FirstPage + 1) * PAGE_SIZE;
|
||||||
|
|
||||||
|
@ -266,12 +352,13 @@ VDDInstallMemoryHook(HANDLE hVdd,
|
||||||
if (PageTable[i] != NULL) return FALSE;
|
if (PageTable[i] != NULL) return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hook = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(MEM_HOOK));
|
/* Create and initialize a new hook entry */
|
||||||
|
Hook = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(*Hook));
|
||||||
if (Hook == NULL) return FALSE;
|
if (Hook == NULL) return FALSE;
|
||||||
|
|
||||||
Hook->hVdd = hVdd;
|
Hook->hVdd = hVdd;
|
||||||
Hook->Count = LastPage - FirstPage + 1;
|
Hook->Count = LastPage - FirstPage + 1;
|
||||||
Hook->VddHandler = pHandler;
|
Hook->VddHandler = MemoryHandler;
|
||||||
|
|
||||||
/* Decommit the pages */
|
/* Decommit the pages */
|
||||||
Status = NtFreeVirtualMemory(NtCurrentProcess(), &Address, &Size, MEM_DECOMMIT);
|
Status = NtFreeVirtualMemory(NtCurrentProcess(), &Address, &Size, MEM_DECOMMIT);
|
||||||
|
@ -281,22 +368,25 @@ VDDInstallMemoryHook(HANDLE hVdd,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add the hook entry to the page table... */
|
||||||
for (i = FirstPage; i <= LastPage; i++) PageTable[i] = Hook;
|
for (i = FirstPage; i <= LastPage; i++) PageTable[i] = Hook;
|
||||||
|
|
||||||
|
/* ... and to the list of hooks */
|
||||||
InsertTailList(&HookList, &Hook->Entry);
|
InsertTailList(&HookList, &Hook->Entry);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
VDDDeInstallMemoryHook(HANDLE hVdd,
|
VDDDeInstallMemoryHook(IN HANDLE hVdd,
|
||||||
PVOID pStart,
|
IN PVOID pStart,
|
||||||
DWORD dwCount)
|
IN DWORD dwCount)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
PMEM_HOOK Hook;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG FirstPage = (ULONG)pStart >> 12;
|
ULONG FirstPage = (ULONG_PTR)pStart >> 12;
|
||||||
ULONG LastPage = ((ULONG)pStart + dwCount - 1) >> 12;
|
ULONG LastPage = ((ULONG_PTR)pStart + dwCount - 1) >> 12;
|
||||||
PVOID Address = (PVOID)(FirstPage * PAGE_SIZE);
|
PVOID Address = (PVOID)(FirstPage * PAGE_SIZE);
|
||||||
SIZE_T Size = (LastPage - FirstPage + 1) * PAGE_SIZE;
|
SIZE_T Size = (LastPage - FirstPage + 1) * PAGE_SIZE;
|
||||||
|
|
||||||
|
@ -313,7 +403,7 @@ VDDDeInstallMemoryHook(HANDLE hVdd,
|
||||||
|
|
||||||
for (i = FirstPage; i <= LastPage; i++)
|
for (i = FirstPage; i <= LastPage; i++)
|
||||||
{
|
{
|
||||||
PMEM_HOOK Hook = PageTable[i];
|
Hook = PageTable[i];
|
||||||
if (Hook == NULL) continue;
|
if (Hook == NULL) continue;
|
||||||
|
|
||||||
if (Hook->hVdd != hVdd)
|
if (Hook->hVdd != hVdd)
|
||||||
|
@ -335,6 +425,8 @@ VDDDeInstallMemoryHook(HANDLE hVdd,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
MemInitialize(VOID)
|
MemInitialize(VOID)
|
||||||
{
|
{
|
||||||
|
@ -346,6 +438,8 @@ MemInitialize(VOID)
|
||||||
/*
|
/*
|
||||||
* The reserved region starts from the very first page.
|
* The reserved region starts from the very first page.
|
||||||
* We need to commit the reserved first 16 MB virtual address.
|
* We need to commit the reserved first 16 MB virtual address.
|
||||||
|
*
|
||||||
|
* NOTE: NULL has another signification for NtAllocateVirtualMemory.
|
||||||
*/
|
*/
|
||||||
BaseAddress = (PVOID)1;
|
BaseAddress = (PVOID)1;
|
||||||
|
|
||||||
|
@ -398,10 +492,11 @@ MemCleanup(VOID)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
SIZE_T MemorySize = MAX_ADDRESS;
|
SIZE_T MemorySize = MAX_ADDRESS;
|
||||||
|
PLIST_ENTRY Pointer;
|
||||||
|
|
||||||
while (HookList.Flink != &HookList)
|
while (!IsListEmpty(&HookList))
|
||||||
{
|
{
|
||||||
PLIST_ENTRY Pointer = RemoveHeadList(&HookList);
|
Pointer = RemoveHeadList(&HookList);
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, CONTAINING_RECORD(Pointer, MEM_HOOK, Entry));
|
RtlFreeHeap(RtlGetProcessHeap(), 0, CONTAINING_RECORD(Pointer, MEM_HOOK, Entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,3 +515,5 @@ MemCleanup(VOID)
|
||||||
DPRINT1("NTVDM: Failed to decommit VDM memory, Status 0x%08lx\n", Status);
|
DPRINT1("NTVDM: Failed to decommit VDM memory, Status 0x%08lx\n", Status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
|
@ -13,13 +13,6 @@
|
||||||
|
|
||||||
#define TOTAL_PAGES (MAX_ADDRESS / PAGE_SIZE)
|
#define TOTAL_PAGES (MAX_ADDRESS / PAGE_SIZE)
|
||||||
|
|
||||||
typedef VOID
|
|
||||||
(WINAPI *PVDD_MEMORY_HANDLER)
|
|
||||||
(
|
|
||||||
DWORD FaultingAddress,
|
|
||||||
BOOLEAN Writing
|
|
||||||
);
|
|
||||||
|
|
||||||
typedef VOID
|
typedef VOID
|
||||||
(WINAPI *PMEMORY_READ_HANDLER)
|
(WINAPI *PMEMORY_READ_HANDLER)
|
||||||
(
|
(
|
||||||
|
@ -36,29 +29,11 @@ typedef BOOLEAN
|
||||||
ULONG Size
|
ULONG Size
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef struct _MEM_HOOK
|
|
||||||
{
|
|
||||||
LIST_ENTRY Entry;
|
|
||||||
HANDLE hVdd;
|
|
||||||
ULONG Count;
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
|
||||||
PVDD_MEMORY_HANDLER VddHandler;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
PMEMORY_READ_HANDLER FastReadHandler;
|
|
||||||
PMEMORY_WRITE_HANDLER FastWriteHandler;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} MEM_HOOK, *PMEM_HOOK;
|
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
BOOLEAN MemInitialize(VOID);
|
BOOLEAN MemInitialize(VOID);
|
||||||
VOID MemCleanup(VOID);
|
VOID MemCleanup(VOID);
|
||||||
VOID MemExceptionHandler(DWORD Address, BOOLEAN Writing);
|
VOID MemExceptionHandler(ULONG FaultAddress, BOOLEAN Writing);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MemRead
|
MemRead
|
||||||
|
@ -92,25 +67,6 @@ MemRemoveFastMemoryHook
|
||||||
ULONG Size
|
ULONG Size
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOL
|
|
||||||
WINAPI
|
|
||||||
VDDInstallMemoryHook
|
|
||||||
(
|
|
||||||
HANDLE hVdd,
|
|
||||||
PVOID pStart,
|
|
||||||
DWORD dwCount,
|
|
||||||
PVDD_MEMORY_HANDLER pHandler
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
WINAPI
|
|
||||||
VDDDeInstallMemoryHook
|
|
||||||
(
|
|
||||||
HANDLE hVdd,
|
|
||||||
PVOID pStart,
|
|
||||||
DWORD dwCount
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif // _MEMORY_H_
|
#endif // _MEMORY_H_
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue