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