20 #include "../../memory.h" 29 #define EMS_DEVICE_NAME "EMMXXXX0" 31 #define EMS_SEGMENT_SIZE ((EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE) >> 4) 32 #define EMS_SYSTEM_HANDLE 0 130 ULONG i, CurrentIndex = 0;
138 while (HandleEntry->
PageCount < NumPages)
149 else if ((HandleEntry->
PageCount + RunSize) > NumPages)
152 RunSize = NumPages - HandleEntry->
PageCount;
155 CurrentIndex = RunStart + RunSize;
159 for (
i = 0;
i < RunSize;
i++)
175 ULONG i, CurrentIndex = 0;
184 while (HandleEntry->
PageCount < NumPages)
200 else if ((HandleEntry->
PageCount + RunSize) > NumPages)
203 RunSize = NumPages - HandleEntry->
PageCount;
206 CurrentIndex = RunStart + RunSize;
210 for (
i = 0;
i < RunSize;
i++)
245 if (LogicalPage == 0xFFFF)
344 USHORT NumOpenHandles = 0;
354 setBX(NumOpenHandles);
378 USHORT NumOpenHandles = 0;
393 setBX(NumOpenHandles);
421 DPRINT1(
"EMS function AH = 0x4E, subfunction AL = %02X NOT IMPLEMENTED\n",
getAL());
446 sizeof(HandleEntry->
Name));
449 else if (
getAL() == 0x01)
454 sizeof(HandleEntry->
Name));
459 DPRINT1(
"Invalid subfunction %02X for EMS function AH = 53h\n",
getAL());
474 USHORT NumOpenHandles = 0;
484 sizeof(HandleDir->
Name));
493 else if (
getAL() == 0x01)
525 while ((
i <
sizeof(HandleFound->
Name)) && (HandleFound->
Name[
i] ==
'\0'))
528 if (
i >=
sizeof(HandleFound->
Name))
537 else if (
getAL() == 0x02)
551 DPRINT1(
"Invalid subfunction %02X for EMS function AH = 54h\n",
getAL());
561 PUCHAR SourcePtr, DestPtr;
567 if (
Data->SourceType)
586 +
Data->SourceOffset);
626 for (
i = 0;
i <
Data->RegionLength;
i++)
629 DestPtr[
i] = SourcePtr[
i];
661 else if (
getAL() == 0x01)
668 DPRINT1(
"Invalid subfunction %02X for EMS function AH = 58h\n",
getAL());
691 else if (
getAL() == 0x01)
700 DPRINT1(
"Invalid subfunction %02X for EMS function AH = 59h\n",
getAL());
709 DPRINT1(
"EMS function AH = %02X NOT IMPLEMENTED\n",
getAH());
724 for (
i = FirstPage;
i <= LastPage;
i++)
744 for (
i = FirstPage;
i <= LastPage;
i++)
779 ((TotalPages + 31) / 32) *
sizeof(
ULONG));
820 DPRINT1(
"Impossible to allocate pages for the system handle!\n");
struct _EMS_MAPPABLE_PHYS_PAGE * PEMS_MAPPABLE_PHYS_PAGE
#define EMS_SYSTEM_HANDLE
USHORT WINAPI getBX(VOID)
BOOLEAN UmaDescReserve(IN OUT PUSHORT Segment, IN OUT PUSHORT Size)
_In_ ULONG _In_ ULONG _In_ ULONG Length
USHORT WINAPI getSI(VOID)
static ULONG EmsTotalPages
static PVOID Mapping[EMS_PHYSICAL_PAGES]
static RTL_BITMAP AllocBitmap
#define EMS_STATUS_ZERO_PAGES
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
#define DOS_DEVATTR_IOCTL
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
BOOL MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
#define EMS_PHYSICAL_PAGES
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define InsertTailList(ListHead, Entry)
#define SEG_OFF_TO_PTR(seg, off)
#define EMS_STATUS_INSUFFICIENT_PAGES
static PEMS_PAGE EmsPageTable
static UCHAR InitSystemHandle(USHORT NumPages)
#define RtlMoveMemory(Destination, Source, Length)
static EMS_HANDLE EmsHandleTable[EMS_MAX_HANDLES]
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
struct _EMS_PAGE * PEMS_PAGE
#define EMS_INTERRUPT_NUM
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static VOID FASTCALL EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
static BOOLEAN FASTCALL EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
#define EMS_STATUS_SUCCESS
static BOOLEAN ValidateHandle(PEMS_HANDLE HandleEntry)
#define EMS_STATUS_INV_LOGICAL_PAGE
ULONG RegisterInt32(IN ULONG FarPtr, IN BYTE IntNumber, IN EMULATOR_INT32_PROC IntHandler, OUT PSIZE_T CodeSize OPTIONAL)
VOID DosDeleteDevice(PDOS_DEVICE_NODE DeviceNode)
IN PFCB IN VBO OUT PLBO OUT PULONG OUT PBOOLEAN Allocated
static PEMS_HANDLE CreateHandle(PUSHORT Handle)
#define Int16To32StubSize
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)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
static WORD NTAPI EmsDrvDispatchIoctlRead(PDOS_DEVICE_NODE Device, DWORD Buffer, PWORD Length)
struct _LIST_ENTRY * Flink
BOOLEAN EmsDrvInitialize(USHORT Segment, ULONG TotalPages)
static VOID FreeHandle(PEMS_HANDLE HandleEntry)
#define DEVICE_PRIVATE_AREA(Driver)
PDOS_DEVICE_NODE DosCreateDeviceEx(WORD Attributes, PCHAR DeviceName, WORD PrivateDataSize)
static PEMS_HANDLE GetEmsHandleRecord(USHORT Handle)
USHORT WINAPI getES(VOID)
BOOL MemInstallFastMemoryHook(PVOID Address, ULONG Size, PMEMORY_READ_HANDLER ReadHandler, PMEMORY_WRITE_HANDLER WriteHandler)
struct _EMS_HANDLE_DIR_ENTRY * PEMS_HANDLE_DIR_ENTRY
BOOLEAN UmaDescRelease(IN USHORT Segment)
static PULONG EmsBitmapBuffer
VOID WINAPI setDX(USHORT)
#define TO_LINEAR(seg, off)
#define EMS_STATUS_UNKNOWN_FUNCTION
static UCHAR EmsAlloc(USHORT NumPages, PUSHORT Handle)
#define EMS_STATUS_NO_MORE_HANDLES
USHORT WINAPI getDX(VOID)
#define EMS_STATUS_UNNAMED_HANDLE
#define EMS_STATUS_INVALID_HANDLE
_Must_inspect_result_ _In_ WDFDEVICE Device
struct _EMS_HANDLE_PAGE_INFO * PEMS_HANDLE_PAGE_INFO
VOID WINAPI setBX(USHORT)
#define EMS_STATUS_HANDLE_NOT_FOUND
struct _EMS_COPY_DATA * PEMS_COPY_DATA
#define EMS_STATUS_INVALID_SUBFUNCTION
_In_ ULONG _In_ ULONG Offset
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
#define DOS_DEVATTR_CHARACTER
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
USHORT WINAPI getDI(VOID)
#define InitializeListHead(ListHead)
NTSYSAPI void WINAPI RtlSetBits(PRTL_BITMAP, ULONG, ULONG)
VOID WINAPI setCX(USHORT)
NTSYSAPI ULONG WINAPI RtlFindNextForwardRunClear(PCRTL_BITMAP, ULONG, PULONG)
static PDOS_DEVICE_NODE Node
USHORT WINAPI getDS(VOID)
#define ARRAY_INDEX(ptr, array)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
struct _EMS_HARDWARE_INFO * PEMS_HARDWARE_INFO
static PVOID MappingBackup[EMS_PHYSICAL_PAGES]
NTSYSAPI ULONG WINAPI RtlNumberOfClearBits(PCRTL_BITMAP)
static UCHAR EmsMap(USHORT Handle, UCHAR PhysicalPage, USHORT LogicalPage)
base of all file and directory entries
static VOID WINAPI EmsIntHandler(LPWORD Stack)
#define RtlCompareMemory(s1, s2, l)
static PEMS_PAGE GetLogicalPage(PEMS_HANDLE HandleEntry, USHORT LogicalPage)
static UCHAR EmsFree(USHORT Handle)
#define EMS_STATUS_INV_PHYSICAL_PAGE
static VOID InitHandlesTable(VOID)
struct _EMS_PAGE EMS_PAGE