summaryrefslogtreecommitdiffstats
path: root/private/inc/vdm.h
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/inc/vdm.h
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/inc/vdm.h')
-rw-r--r--private/inc/vdm.h354
1 files changed, 354 insertions, 0 deletions
diff --git a/private/inc/vdm.h b/private/inc/vdm.h
new file mode 100644
index 000000000..713742bb0
--- /dev/null
+++ b/private/inc/vdm.h
@@ -0,0 +1,354 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ vdm.h
+
+Abstract:
+
+ This include file defines the usermode visible portions of the vdm support
+
+Author:
+
+Revision History:
+
+--*/
+
+/* XLATOFF */
+
+#ifndef _VDM_H_
+#define _VDM_H_
+
+
+
+typedef enum _VdmServiceClass {
+ VdmStartExecution, // is also defined in ntos\ke\i386\biosa.asm
+ VdmQueueInterrupt,
+ VdmDelayInterrupt,
+ VdmInitialize,
+ VdmFeatures,
+ VdmSetInt21Handler,
+ VdmQueryDir,
+ VdmPrinterDirectIoOpen,
+ VdmPrinterDirectIoClose,
+} VDMSERVICECLASS, *PVDMSERVICECLASS;
+
+
+#if defined (_NTDEF_)
+
+NTSTATUS
+NtVdmControl(
+ IN VDMSERVICECLASS Service,
+ IN OUT PVOID ServiceData
+ );
+
+typedef struct _VdmQueryDirInfo {
+ HANDLE FileHandle;
+ PVOID FileInformation;
+ ULONG Length;
+ PUNICODE_STRING FileName;
+ ULONG FileIndex;
+} VDMQUERYDIRINFO, *PVDMQUERYDIRINFO;
+
+#endif
+
+
+/*
+ * The Vdm Virtual Ica
+ * note: this structure definition is duplicated in
+ * mvdm\softpc\base\inc\ica.c. KEEP IN SYNC
+ *
+ */
+typedef struct _VdmVirtualIca{
+ LONG ica_count[8]; /* Count of Irq pending not in irr */
+ LONG ica_int_line; /* Current pending interrupt */
+ LONG ica_cpu_int; /* The state of the INT line to the CPU */
+ USHORT ica_base; /* Interrupt base address for cpu */
+ USHORT ica_hipri; /* Line no. of highest priority line */
+ USHORT ica_mode; /* Various single-bit modes */
+ UCHAR ica_master; /* 1 = Master; 0 = Slave */
+ UCHAR ica_irr; /* Interrupt Request Register */
+ UCHAR ica_isr; /* In Service Register */
+ UCHAR ica_imr; /* Interrupt Mask Register */
+ UCHAR ica_ssr; /* Slave Select Register */
+} VDMVIRTUALICA, *PVDMVIRTUALICA;
+
+
+//
+// copied from softpc\base\system\ica.c
+//
+#define ICA_AEOI 0x0020
+#define ICA_SMM 0x0200
+#define ICA_SFNM 0x0100
+
+
+#if defined(i386)
+#define VDM_PM_IRETBOPSEG 0x147
+#define VDM_PM_IRETBOPOFF 0x6
+#define VDM_PM_IRETBOPSIZE 8
+#else
+#define VDM_PM_IRETBOPSEG 0xd3
+#define VDM_PM_IRETBOPOFF 0x0
+#define VDM_PM_IRETBOPSIZE 4
+#endif
+
+#define VDM_RM_IRETBOPSIZE 4
+
+
+
+// VDM state which was earlier in vdmtib->flags has been moved to
+// dos arena at following fixed address.
+#ifdef _VDMNTOS_
+
+#define FIXED_NTVDMSTATE_LINEAR VdmFixedStateLinear
+#define FIXED_NTVDMSTATE_SIZE 4
+
+#else // _VDMNTOS_
+
+/* XLATON */
+#if defined(_PC98_)
+#define FIXED_NTVDMSTATE_SEGMENT 0x60
+#else // !_PC98_
+#define FIXED_NTVDMSTATE_SEGMENT 0x70
+#endif // _PC98_
+
+#define FIXED_NTVDMSTATE_OFFSET 0x14
+#define FIXED_NTVDMSTATE_LINEAR ((FIXED_NTVDMSTATE_SEGMENT << 4) + FIXED_NTVDMSTATE_OFFSET)
+#define FIXED_NTVDMSTATE_SIZE 4
+/* XLATOFF */
+
+#endif // _VDMNTOS_
+
+#if defined (i386)
+ // defined on x86 only since on mips we must reference thru sas
+#define pNtVDMState ((PULONG)FIXED_NTVDMSTATE_LINEAR)
+#endif
+
+/* XLATON */
+//
+// Vdm State Flags
+//
+#define VDM_INT_HARDWARE 0x00000001
+#define VDM_INT_TIMER 0x00000002
+
+ // A bitMask which includes all interrupts
+#define VDM_INTERRUPT_PENDING (VDM_INT_HARDWARE | VDM_INT_TIMER)
+
+#define VDM_BREAK_EXCEPTIONS 0x00000008
+#define VDM_BREAK_DEBUGGER 0x00000010
+#define VDM_PROFILE 0x00000020
+#define VDM_ANALYZE_PROFILE 0x00000040
+
+#define VDM_32BIT_APP 0x00000100
+#define VDM_VIRTUAL_INTERRUPTS 0x00000200
+#define VDM_ON_MIPS 0x00000400
+#define VDM_EXEC 0x00000800
+#define VDM_RM 0x00001000
+
+#define VDM_WOWBLOCKED 0x00100000
+#define VDM_IDLEACTIVITY 0x00200000
+#define VDM_TIMECHANGE 0x00400000
+#define VDM_WOWHUNGAPP 0x00800000
+
+#define VDM_PE_MASK 0x80000000
+
+/* XLATOFF */
+
+//
+// If the size of the structure is changed, ke\i386\instemul.asm must
+// be modified too. If not, it will fail to build
+//
+#pragma pack(1)
+typedef struct _Vdm_InterruptHandler {
+ USHORT CsSelector;
+ USHORT Flags;
+ ULONG Eip;
+} VDM_INTERRUPTHANDLER, *PVDM_INTERRUPTHANDLER;
+#pragma pack()
+
+typedef struct _Vdm_FaultHandler {
+ USHORT CsSelector;
+ USHORT SsSelector;
+ ULONG Eip;
+ ULONG Esp;
+ ULONG Flags;
+} VDM_FAULTHANDLER, *PVDM_FAULTHANDLER;
+
+#pragma pack(1)
+/* XLATON */
+typedef struct _VdmPmStackInfo { /* VDMTIB */
+ USHORT LockCount;
+ USHORT Flags;
+ USHORT SsSelector;
+ USHORT SaveSsSelector;
+ ULONG SaveEsp;
+ ULONG SaveEip;
+ ULONG DosxIntIret;
+ ULONG DosxIntIretD;
+ ULONG DosxFaultIret;
+ ULONG DosxFaultIretD;
+} VDM_PMSTACKINFO, *PVDM_PMSTACKINFO;
+/* XLATOFF */
+#pragma pack()
+
+
+#if defined(i386)
+
+typedef struct _VdmIcaUserData {
+ PVOID pIcaLock; // rtl critical section
+ PVDMVIRTUALICA pIcaMaster;
+ PVDMVIRTUALICA pIcaSlave;
+ PULONG pDelayIrq;
+ PULONG pUndelayIrq;
+ PULONG pDelayIret;
+ PULONG pIretHooked;
+ PULONG pAddrIretBopTable;
+ PHANDLE phWowIdleEvent;
+}VDMICAUSERDATA, *PVDMICAUSERDATA;
+
+typedef struct _VdmDelayIntsServiceData {
+ ULONG Delay; /* Delay Time in usecs */
+ ULONG DelayIrqLine; /* IRQ Number of ints delayed */
+ HANDLE hThread; /* Thread Handle of CurrentMonitorTeb */
+}VDMDELAYINTSDATA, *PVDMDELAYINTSDATA;
+
+typedef struct _VDMSET_INT21_HANDLER_DATA {
+ ULONG Selector;
+ ULONG Offset;
+ BOOLEAN Gate32;
+}VDMSET_INT21_HANDLER_DATA, *PVDMSET_INT21_HANDLER_DATA;
+
+#if defined (_NTDEF_)
+NTSTATUS
+NtVdmControl(
+ IN VDMSERVICECLASS Service,
+ IN OUT PVOID ServiceData
+ );
+
+//
+// Interrupt handler flags
+//
+
+#define VDM_INT_INT_GATE 0x00000001
+#define VDM_INT_TRAP_GATE 0x00000000
+#define VDM_INT_32 0x00000002
+#define VDM_INT_16 0x00000000
+
+
+typedef enum _VdmEventClass {
+ VdmIO,
+ VdmStringIO,
+ VdmMemAccess,
+ VdmIntAck,
+ VdmBop,
+ VdmError,
+ VdmIrq13,
+ VdmMaxEvent
+} VDMEVENTCLASS, *PVDMEVENTCLASS;
+
+// VdmPrinterInfo
+
+#define VDM_NUMBER_OF_LPT 3
+
+#define PRT_MODE_NO_SIMULATION 1
+#define PRT_MODE_SIMULATE_STATUS_PORT 2
+#define PRT_MODE_DIRECT_IO 3
+#define PRT_MODE_VDD_CONNECTED 4
+
+#define PRT_DATA_BUFFER_SIZE 16
+
+typedef struct _Vdm_Printer_Info {
+ PUCHAR prt_State;
+ PUCHAR prt_Control;
+ PUCHAR prt_Status;
+ PUCHAR prt_HostState;
+ USHORT prt_PortAddr[VDM_NUMBER_OF_LPT];
+ HANDLE prt_Handle[VDM_NUMBER_OF_LPT];
+ UCHAR prt_Mode[VDM_NUMBER_OF_LPT];
+ USHORT prt_BytesInBuffer[VDM_NUMBER_OF_LPT];
+ UCHAR prt_Buffer[VDM_NUMBER_OF_LPT][PRT_DATA_BUFFER_SIZE];
+ ULONG prt_Scratch;
+} VDM_PRINTER_INFO, *PVDM_PRINTER_INFO;
+
+
+typedef struct _VdmIoInfo {
+ USHORT PortNumber;
+ USHORT Size;
+ BOOLEAN Read;
+} VDMIOINFO, *PVDMIOINFO;
+
+typedef struct _VdmFaultInfo{
+ ULONG FaultAddr;
+ ULONG RWMode;
+} VDMFAULTINFO, *PVDMFAULTINFO;
+
+
+typedef struct _VdmStringIoInfo {
+ USHORT PortNumber;
+ USHORT Size;
+ BOOLEAN Rep;
+ BOOLEAN Read;
+ ULONG Count;
+ ULONG Address;
+} VDMSTRINGIOINFO, *PVDMSTRINGIOINFO;
+
+typedef ULONG VDMBOPINFO;
+typedef NTSTATUS VDMERRORINFO;
+
+
+typedef ULONG VDMINTACKINFO;
+#define VDMINTACK_RAEOIMASK 0x0000ffff
+#define VDMINTACK_SLAVE 0x00010000
+#define VDMINTACK_AEOI 0x00020000
+
+
+typedef struct _VdmEventInfo {
+ ULONG Size;
+ VDMEVENTCLASS Event;
+ ULONG InstructionSize;
+ union {
+ VDMIOINFO IoInfo;
+ VDMSTRINGIOINFO StringIoInfo;
+ VDMBOPINFO BopNumber;
+ VDMFAULTINFO FaultInfo;
+ VDMERRORINFO ErrorStatus;
+ VDMINTACKINFO IntAckInfo;
+ };
+} VDMEVENTINFO, *PVDMEVENTINFO;
+
+
+// Sudeepb 12-Mar-1993
+// Scratch areas are used from VDMTib to get user space while
+// in kernel. This allows us to make Nt APIs (faster) from kernel
+// rather than Zw apis (slower). These are currently being used
+// for DOS read/write.
+
+typedef struct _Vdm_Tib {
+ ULONG Size;
+ VDM_INTERRUPTHANDLER VdmInterruptHandlers[256];
+ VDM_FAULTHANDLER VdmFaultHandlers[32];
+ CONTEXT MonitorContext;
+ CONTEXT VdmContext;
+ VDMEVENTINFO EventInfo;
+ VDM_PRINTER_INFO PrinterInfo;
+ ULONG TempArea1[2]; // Scratch area
+ ULONG TempArea2[2]; // Scratch aArea
+ VDM_PMSTACKINFO PmStackInfo;
+} VDM_TIB, *PVDM_TIB;
+
+#define EFLAGS_TF_MASK 0x00000100
+#define EFLAGS_NT_MASK 0x00004000
+
+//
+// Feature flags returned by NtVdmControl(VdmFeatures...)
+//
+
+// System/processor supports fast emulation for IF instructions
+#define V86_VIRTUAL_INT_EXTENSIONS 0x00000001 // in v86 mode
+#define PM_VIRTUAL_INT_EXTENSIONS 0x00000002 // in protected mode (non-flat)
+
+#endif // if defined _NTDEF_
+#endif
+#endif