85 #else // defined(_MSC_VER) 142 ULONG FirstPage, LastPage;
166 if (FirstPage == LastPage)
172 for (
i = FirstPage;
i <= LastPage;
i++)
186 ULONG FirstPage, LastPage;
199 if (FirstPage == LastPage)
205 for (
i = FirstPage;
i <= LastPage;
i++)
226 static BYTE StaticBuffer[8192];
228 static ULONG HeapBufferSize = 0;
231 if (
Size <=
sizeof(StaticBuffer))
234 LocalBuffer = StaticBuffer;
236 else if (
Size <= HeapBufferSize)
239 ASSERT(HeapBufferSize > 0 && HeapBuffer !=
NULL);
240 LocalBuffer = HeapBuffer;
246 if (HeapBuffer ==
NULL)
257 HeapBuffer = LocalBuffer;
258 HeapBufferSize =
Size;
286 DPRINT(
"The memory at 0x%08X could not be %s.\n", FaultAddress, Writing ?
"written" :
"read");
289 ASSERT(FaultAddress < MAX_ADDRESS && Hook != NULL && Hook->
hVdd !=
NULL);
308 for (
i = FirstPage;
i <= LastPage;
i++)
341 Hook->
Count += LastPage - FirstPage + 1;
359 for (
i = FirstPage;
i <= LastPage;
i++)
364 if (--Hook->
Count == 0)
433 #ifndef VdmFlushCache 488 if (dwCount == 0)
return FALSE;
491 for (
i = FirstPage;
i <= LastPage;
i++)
537 Hook->
Count += LastPage - FirstPage + 1;
566 if (dwCount == 0)
return FALSE;
577 for (
i = FirstPage;
i <= LastPage;
i++)
580 if (Hook ==
NULL)
continue;
584 DPRINT1(
"VDDDeInstallMemoryHook: Page %u owned by someone else.\n",
i);
588 if (--Hook->
Count == 0)
627 for (
i = FirstPage;
i <= LastPage;
i++)
634 DPRINT1(
"VDDAllocMem: Page %u owned by someone else.\n",
i);
675 for (
i = FirstPage;
i <= LastPage;
i++)
682 DPRINT1(
"VDDFreeMem: Page %u owned by someone else.\n",
i);
762 wprintf(
L"FATAL: Failed to commit VDM memory, Status 0x%08lx\n",
Status);
804 DPRINT1(
"NTVDM: Failed to decommit VDM memory, Status 0x%08lx\n",
Status);
BOOL WINAPI VDDDeInstallMemoryHook(IN HANDLE hVdd, IN PVOID pStart, IN DWORD dwCount)
#define ERROR_INVALID_PARAMETER
BOOLEAN MemQueryMemoryZone(ULONG StartAddress, PULONG Length, PBOOLEAN Hooked)
BOOLEAN EmulatorGetA20(VOID)
_In_ ULONG _In_ ULONG _In_ ULONG Length
static PMEM_HOOK PageTable[TOTAL_PAGES]
#define UNREFERENCED_PARAMETER(P)
VOID(FASTCALL * PMEMORY_READ_HANDLER)(ULONG Address, PVOID Buffer, ULONG Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
BOOL MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
#define INVALID_HANDLE_VALUE
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define PHYS_TO_REAL(ptr)
VOID FASTCALL EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
BOOL WINAPI VDDExcludeMem(IN HANDLE hVdd, IN PVOID Address, IN ULONG Size)
PVOID WINAPI VdmMapFlat(IN USHORT Segment, IN ULONG Offset, IN VDM_MODE Mode)
BOOLEAN(FASTCALL * PMEMORY_WRITE_HANDLER)(ULONG Address, PVOID Buffer, ULONG Size)
#define InsertTailList(ListHead, Entry)
#define SEG_OFF_TO_PTR(seg, off)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define RtlMoveMemory(Destination, Source, Length)
BOOL WINAPI VDDInstallMemoryHook(IN HANDLE hVdd, IN PVOID pStart, IN DWORD dwCount, IN PVDD_MEMORY_HANDLER MemoryHandler)
struct _MEM_HOOK * PMEM_HOOK
BOOL WINAPI VDDFreeMem(IN HANDLE hVdd, IN PVOID Address, IN ULONG Size)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOL WINAPI VDDAllocMem(IN HANDLE hVdd, IN PVOID Address, IN ULONG Size)
VOID FASTCALL EmulatorCopyMemory(PFAST486_STATE State, ULONG DestAddress, ULONG SrcAddress, ULONG Size)
#define REAL_TO_PHYS(ptr)
BOOL WINAPI VDDIncludeMem(IN HANDLE hVdd, IN PVOID Address, IN ULONG Size)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
static LIST_ENTRY HookList
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define NtCurrentProcess()
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
PPC_QUAL void __movsb(unsigned char *Destination, const unsigned char *Source, unsigned long Count)
BOOL WINAPI VdmUnmapFlat(IN USHORT Segment, IN ULONG Offset, IN PVOID Buffer, IN VDM_MODE Mode)
static VOID ReadPage(PMEM_HOOK Hook, ULONG Address, PVOID Buffer, ULONG Size)
struct _LIST_ENTRY * Flink
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
#define NT_SUCCESS(StatCode)
#define RtlFillMemory(Dest, Length, Fill)
BOOL MemInstallFastMemoryHook(PVOID Address, ULONG Size, PMEMORY_READ_HANDLER ReadHandler, PMEMORY_WRITE_HANDLER WriteHandler)
VOID EmulatorSetA20(BOOLEAN Enabled)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
PBYTE WINAPI MGetVdmPointer(IN ULONG Address, IN ULONG Size, IN BOOLEAN ProtectedMode)
VOID(WINAPI * PVDD_MEMORY_HANDLER)(PVOID FaultAddress, ULONG RWMode)
static VOID WritePage(PMEM_HOOK Hook, ULONG Address, PVOID Buffer, ULONG Size)
static CONST DWORD MemorySize[]
PBYTE WINAPI Sim32pGetVDMPointer(IN ULONG Address, IN BOOLEAN ProtectedMode)
VOID MemExceptionHandler(ULONG FaultAddress, BOOLEAN Writing)
_Must_inspect_result_ _In_ USHORT NewSize
BOOLEAN MemInitialize(VOID)
struct _MEM_HOOK MEM_HOOK
_In_ ULONG _In_ ULONG Offset
PPC_QUAL void __movsw(unsigned short *Destination, const unsigned short *Source, unsigned long Count)
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define InitializeListHead(ListHead)
PMEMORY_READ_HANDLER FastReadHandler
PPC_QUAL void __movsd(unsigned long *Destination, const unsigned long *Source, unsigned long Count)
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
#define PAGE_EXECUTE_READWRITE
PMEMORY_WRITE_HANDLER FastWriteHandler
VOID WINAPI MemoryHandler(IN PVOID FaultAddress, IN ULONG RWMode)
static VOID MemFastMoveMemory(OUT VOID UNALIGNED *Destination, IN const VOID UNALIGNED *Source, IN SIZE_T Length)
BOOL WINAPI VdmFlushCache(IN USHORT Segment, IN ULONG Offset, IN ULONG Size, IN VDM_MODE Mode)
base of all file and directory entries
PVDD_MEMORY_HANDLER VddHandler
VOID FASTCALL EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)