43#if (NTDDI_VERSION < NTDDI_VISTA) && (DLL_EXPORT_VERSION < _WIN32_WINNT_VISTA)
86#if (NTDDI_VERSION < NTDDI_VISTA) && (DLL_EXPORT_VERSION < _WIN32_WINNT_VISTA)
88#define LOAD_IMPORT(func) \
89 (RtlInitUnicodeString(&ImportName, L ## #func), \
90 (func) = MmGetSystemRoutineAddress(&ImportName))
110#define IsLowV86Mem(_Seg, _Off) ((((_Seg) << 4) + (_Off)) < (0xa0000))
115ProtectLowV86Mem(
VOID)
137UnprotectLowV86Mem(
VOID)
160IntInitializeVideoAddressSpace(
VOID)
169 CHAR IVTAndBda[1024 + 256];
198 DPRINT1(
"Couldn't open \\Device\\PhysicalMemory\n");
203 Offset.QuadPart = 0xa0000;
206 Status = ZwMapViewOfSection(PhysMemHandle,
228 DPRINT1(
"Couldn't map physical memory at the right address (was %x)\n",
246 DPRINT1(
"Failed to allocate virtual memory (Status %x)\n",
Status);
251 DPRINT1(
"Failed to allocate virtual memory at right address (was %x)\n",
277typedef struct _INT10_INTERFACE
287static const INT10_INTERFACE *Int10Vtbl;
288#define INT10(func) Int10Vtbl->Int10##func
290#define INT10(func) IntInt10##func##Emu
313IntInt10AllocateBufferV86(
332 MemoryAddress = (
PVOID)0x20000;
342 WARN_(VIDEOPRT,
"- ZwAllocateVirtualMemory failed\n");
347 if (MemoryAddress > (
PVOID)(0x100000 -
Size))
353 WARN_(VIDEOPRT,
"- Unacceptable memory allocated\n");
378 TRACE_(VIDEOPRT,
"IntInt10AllocateBuffer\n");
383 INFO_(VIDEOPRT,
"- Segment: 0x%x\n", *Seg);
384 INFO_(VIDEOPRT,
"- Offset : 0x%x\n", *Off);
409IntInt10FreeBufferV86(
444 TRACE_(VIDEOPRT,
"IntInt10FreeBuffer\n");
445 INFO_(VIDEOPRT,
"- Segment: 0x%x\n", Seg);
446 INFO_(VIDEOPRT,
"- Offset : 0x%x\n", Off);
472IntInt10ReadMemoryV86(
488 if (IsLowV86Mem(Seg, Off))
489 UnprotectLowV86Mem();
491 if (IsLowV86Mem(Seg, Off))
509 TRACE_(VIDEOPRT,
"IntInt10ReadMemory\n");
510 INFO_(VIDEOPRT,
"- Segment: 0x%x\n", Seg);
511 INFO_(VIDEOPRT,
"- Offset : 0x%x\n", Off);
539IntInt10WriteMemoryV86(
555 if (IsLowV86Mem(Seg, Off))
556 UnprotectLowV86Mem();
558 if (IsLowV86Mem(Seg, Off))
576 TRACE_(VIDEOPRT,
"IntInt10WriteMemory\n");
577 INFO_(VIDEOPRT,
"- Segment: 0x%x\n", Seg);
578 INFO_(VIDEOPRT,
"- Offset : 0x%x\n", Off);
672 UnprotectLowV86Mem();
717static const INT10_INTERFACE Int10IFace[2] =
724 { IntInt10AllocateBufferV86,
725 IntInt10FreeBufferV86,
726 IntInt10ReadMemoryV86,
727 IntInt10WriteMemoryV86,
728 IntInt10CallBiosV86 }
730static const INT10_INTERFACE *Int10Vtbl = &Int10IFace[0];
744 if (!VideoPortDisableX86Emulator)
750 DPRINT1(
"Could not initialize the x86 emulator; falling back to V86 mode\n");
751 VideoPortDisableX86Emulator =
TRUE;
755 Int10Vtbl = &Int10IFace[1];
756 return IntInitializeVideoAddressSpace();
779 RtlCopyMemory(&Int10BiosArguments, BiosArguments,
sizeof(*BiosArguments));
780 Int10BiosArguments.
SegDs = 0;
781 Int10BiosArguments.
SegEs = 0;
787 RtlCopyMemory(BiosArguments, &Int10BiosArguments,
sizeof(*BiosArguments));
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_SUPPORTED
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define EXCEPTION_EXECUTE_HANDLER
NTSTATUS IntInitializeInt10(VOID)
VP_STATUS NTAPI IntInt10CallBios(_In_ PVOID Context, _Inout_ PINT10_BIOS_ARGUMENTS BiosArguments)
VP_STATUS NTAPI IntInt10WriteMemory(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
VP_STATUS NTAPI VideoPortInt10(IN PVOID HwDeviceExtension, IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
static VP_STATUS NTAPI IntInt10AllocateBufferEmu(_In_ PVOID Context, _Out_ PUSHORT Seg, _Out_ PUSHORT Off, _Inout_ PULONG Length)
VP_STATUS NTAPI IntInt10AllocateBuffer(_In_ PVOID Context, _Out_ PUSHORT Seg, _Out_ PUSHORT Off, _Inout_ PULONG Length)
static VP_STATUS NTAPI IntInt10ReadMemoryEmu(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
static VP_STATUS NTAPI IntInt10FreeBufferEmu(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off)
static BOOLEAN IntInitializeX86Emu(VOID)
static VP_STATUS NTAPI IntInt10WriteMemoryEmu(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
KMUTEX VideoPortInt10Mutex
VP_STATUS NTAPI IntInt10ReadMemory(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
VP_STATUS NTAPI IntInt10FreeBuffer(_In_ PVOID Context, _In_ USHORT Seg, _In_ USHORT Off)
static VP_STATUS NTAPI IntInt10CallBiosEmu(_In_ PVOID Context, _Inout_ PINT10_BIOS_ARGUMENTS BiosArguments)
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwOpenSection(_Out_ PHANDLE SectionHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define _In_reads_bytes_(s)
#define _Out_writes_bytes_(s)
#define SECTION_ALL_ACCESS
#define NtCurrentProcess()
#define PAGE_EXECUTE_READWRITE
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
_Out_ PKAPC_STATE ApcState
NTSTATUS NTAPI NtVdmControl(IN ULONG ControlCode, IN PVOID ControlData)
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
VP_STATUS(NTAPI * PINT10_CALL_BIOS)(IN PVOID Context, IN OUT PINT10_BIOS_ARGUMENTS BiosArguments)
VP_STATUS(NTAPI * PINT10_ALLOCATE_BUFFER)(IN PVOID Context, OUT PUSHORT Seg, OUT PUSHORT Off, IN OUT PULONG Length)
VP_STATUS(NTAPI * PINT10_FREE_BUFFER)(IN PVOID Context, IN USHORT Seg, IN USHORT Off)
VP_STATUS(NTAPI * PINT10_WRITE_MEMORY)(IN PVOID Context, IN USHORT Seg, IN USHORT Off, IN PVOID Buffer, IN ULONG Length)
VP_STATUS(NTAPI * PINT10_READ_MEMORY)(IN PVOID Context, IN USHORT Seg, IN USHORT Off, OUT PVOID Buffer, IN ULONG Length)
#define RTL_CONSTANT_STRING(s)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_UNSUCCESSFUL
NTSTATUS NTAPI Ke386CallBios(IN ULONG Int, OUT PCONTEXT Context)
VOID FASTCALL IntDetachFromCSRSS(_In_ PKPROCESS CallingProcess, _In_ PKAPC_STATE ApcState)
Detach the current thread from the CSRSS process. This routine is to be invoked after a previous succ...
BOOLEAN FASTCALL IntAttachToCSRSS(_Outptr_ PKPROCESS *CallingProcess, _Out_ PKAPC_STATE ApcState)
Attach the current thread to the CSRSS process. The caller must detach from the process by invoking I...
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY ReadMemory
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY WriteMemory
NTSTATUS NTAPI x86BiosAllocateBuffer(_Inout_ ULONG *Size, _Out_ USHORT *Segment, _Out_ USHORT *Offset)
NTSTATUS NTAPI x86BiosFreeBuffer(_In_ USHORT Segment, _In_ USHORT Offset)
NTSTATUS NTAPI x86BiosReadMemory(_In_ USHORT Segment, _In_ USHORT Offset, _Out_writes_bytes_(Size) PVOID Buffer, _In_ ULONG Size)
BOOLEAN NTAPI x86BiosCall(_In_ ULONG InterruptNumber, _Inout_ PX86_BIOS_REGISTERS Registers)
NTSTATUS NTAPI x86BiosWriteMemory(_In_ USHORT Segment, _In_ USHORT Offset, _In_reads_bytes_(Size) PVOID Buffer, _In_ ULONG Size)
#define KeWaitForMutexObject
#define PsGetCurrentProcess