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");
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define RtlInitializeBitMap
#define RtlFindNextForwardRunClear
#define RtlNumberOfClearBits
static WORD NTAPI EmsDrvDispatchIoctlRead(PDOS_DEVICE_NODE Device, DWORD Buffer, PWORD Length)
static UCHAR EmsMap(USHORT Handle, UCHAR PhysicalPage, USHORT LogicalPage)
BOOLEAN EmsDrvInitialize(USHORT Segment, ULONG TotalPages)
static VOID FreeHandle(PEMS_HANDLE HandleEntry)
static PEMS_HANDLE CreateHandle(PUSHORT Handle)
static BOOLEAN ValidateHandle(PEMS_HANDLE HandleEntry)
static VOID WINAPI EmsIntHandler(LPWORD Stack)
static PEMS_PAGE EmsPageTable
static PEMS_HANDLE GetEmsHandleRecord(USHORT Handle)
static PULONG EmsBitmapBuffer
static ULONG EmsTotalPages
static BOOLEAN FASTCALL EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
static VOID InitHandlesTable(VOID)
static UCHAR EmsAlloc(USHORT NumPages, PUSHORT Handle)
static UCHAR InitSystemHandle(USHORT NumPages)
static PVOID MappingBackup[EMS_PHYSICAL_PAGES]
static PDOS_DEVICE_NODE Node
static EMS_HANDLE EmsHandleTable[EMS_MAX_HANDLES]
static VOID FASTCALL EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
#define EMS_SYSTEM_HANDLE
static PVOID Mapping[EMS_PHYSICAL_PAGES]
static RTL_BITMAP AllocBitmap
static UCHAR EmsFree(USHORT Handle)
static PEMS_PAGE GetLogicalPage(PEMS_HANDLE HandleEntry, USHORT LogicalPage)
struct _EMS_COPY_DATA * PEMS_COPY_DATA
#define EMS_STATUS_HANDLE_NOT_FOUND
#define EMS_STATUS_INV_PHYSICAL_PAGE
#define EMS_STATUS_NO_MORE_HANDLES
#define EMS_STATUS_INVALID_HANDLE
#define EMS_STATUS_INV_LOGICAL_PAGE
struct _EMS_HANDLE_PAGE_INFO * PEMS_HANDLE_PAGE_INFO
#define EMS_STATUS_ZERO_PAGES
#define EMS_STATUS_SUCCESS
struct _EMS_PAGE * PEMS_PAGE
#define EMS_PHYSICAL_PAGES
#define EMS_INTERRUPT_NUM
#define EMS_STATUS_UNKNOWN_FUNCTION
struct _EMS_HANDLE_DIR_ENTRY * PEMS_HANDLE_DIR_ENTRY
#define EMS_STATUS_UNNAMED_HANDLE
struct _EMS_PAGE EMS_PAGE
struct _EMS_MAPPABLE_PHYS_PAGE * PEMS_MAPPABLE_PHYS_PAGE
struct _EMS_HARDWARE_INFO * PEMS_HARDWARE_INFO
#define EMS_STATUS_INVALID_SUBFUNCTION
#define EMS_STATUS_INSUFFICIENT_PAGES
#define TO_LINEAR(seg, off)
#define SEG_OFF_TO_PTR(seg, off)
#define ARRAY_INDEX(ptr, array)
#define InsertTailList(ListHead, Entry)
#define RtlCompareMemory(s1, s2, l)
#define InitializeListHead(ListHead)
IN PFCB IN VBO OUT PLBO OUT PULONG OUT PBOOLEAN Allocated
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
ULONG RegisterInt32(IN ULONG FarPtr, IN BYTE IntNumber, IN EMULATOR_INT32_PROC IntHandler, OUT PSIZE_T CodeSize OPTIONAL)
#define Int16To32StubSize
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
base of all file and directory entries
struct _LIST_ENTRY * Flink
VOID DosDeleteDevice(PDOS_DEVICE_NODE DeviceNode)
PDOS_DEVICE_NODE DosCreateDeviceEx(WORD Attributes, PCHAR DeviceName, WORD PrivateDataSize)
#define DEVICE_PRIVATE_AREA(Driver)
#define DOS_DEVATTR_IOCTL
#define DOS_DEVATTR_CHARACTER
BOOL MemRemoveFastMemoryHook(PVOID Address, ULONG Size)
BOOL MemInstallFastMemoryHook(PVOID Address, ULONG Size, PMEMORY_READ_HANDLER ReadHandler, PMEMORY_WRITE_HANDLER WriteHandler)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
BOOLEAN UmaDescRelease(IN USHORT Segment)
BOOLEAN UmaDescReserve(IN OUT PUSHORT Segment, IN OUT PUSHORT Size)
VOID WINAPI setBX(USHORT)
VOID WINAPI setCX(USHORT)
VOID WINAPI setDX(USHORT)
USHORT WINAPI getBX(VOID)
USHORT WINAPI getDS(VOID)
USHORT WINAPI getSI(VOID)
USHORT WINAPI getDX(VOID)
USHORT WINAPI getES(VOID)
USHORT WINAPI getDI(VOID)
_Must_inspect_result_ _In_ WDFDEVICE Device
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack