From ea58ec7edb08608b22a0adc0659a435a06644569 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Wed, 6 May 2015 03:38:41 +0000 Subject: [PATCH] [NTVDM] Implement EMS function AH = 53h (Get/Set Handle Name). Some programs expect to find the string "EMMXXXX0" at offset 0x0A in the segment where the EMS interrupt handler is, so move the interrupt handler BOP to the private device area of the EMS driver. svn path=/trunk/; revision=67573 --- .../mvdm/ntvdm/dos/dos32krnl/emsdrv.c | 46 +++++++++++++++++-- .../mvdm/ntvdm/dos/dos32krnl/emsdrv.h | 1 + 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c index 246e0424018..af5bf1f0542 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.c @@ -221,6 +221,41 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack) break; } + /* Get/Set Handle Name */ + case 0x53: + { + PEMS_HANDLE HandleEntry = GetHandleRecord(getDX()); + if (HandleEntry == NULL || !HandleEntry->Allocated) + { + setAL(EMS_STATUS_INVALID_HANDLE); + break; + } + + if (getAL() == 0x00) + { + /* Retrieve the name */ + RtlCopyMemory(SEG_OFF_TO_PTR(getES(), getDI()), + HandleEntry->Name, + sizeof(HandleEntry->Name)); + setAH(EMS_STATUS_OK); + } + else if (getAL() == 0x01) + { + /* Store the name */ + RtlCopyMemory(HandleEntry->Name, + SEG_OFF_TO_PTR(getDS(), getSI()), + sizeof(HandleEntry->Name)); + setAH(EMS_STATUS_OK); + } + else + { + DPRINT1("Invalid subfunction %02X for EMS function AH = 53h\n", getAL()); + setAH(EMS_STATUS_UNKNOWN_FUNCTION); + } + + break; + } + /* Move/Exchange Memory */ case 0x57: { @@ -418,13 +453,18 @@ BOOLEAN EmsDrvInitialize(ULONG TotalPages) EmsReadMemory, EmsWriteMemory); - RegisterDosInt32(EMS_INTERRUPT_NUM, EmsIntHandler); /* Create the device */ - Node = DosCreateDevice(DOS_DEVATTR_IOCTL | DOS_DEVATTR_CHARACTER, - EMS_DEVICE_NAME); + Node = DosCreateDeviceEx(DOS_DEVATTR_IOCTL | DOS_DEVATTR_CHARACTER, + EMS_DEVICE_NAME, + 32); Node->IoctlReadRoutine = EmsDrvDispatchIoctlRead; + RegisterInt32(MAKELONG(sizeof(DOS_DRIVER) + DEVICE_CODE_SIZE, HIWORD(Node->Driver)), + EMS_INTERRUPT_NUM, + EmsIntHandler, + NULL); + return TRUE; } diff --git a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.h b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.h index 6c7d55ebe5c..5d87bb8d1f7 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.h +++ b/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/emsdrv.h @@ -34,6 +34,7 @@ typedef struct _EMS_HANDLE BOOLEAN Allocated; USHORT PageCount; LIST_ENTRY PageList; + UCHAR Name[8]; } EMS_HANDLE, *PEMS_HANDLE; typedef struct _EMS_PAGE