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
This commit is contained in:
Aleksandar Andrejevic 2015-05-06 03:38:41 +00:00
parent 64dcdf9208
commit ea58ec7edb
2 changed files with 44 additions and 3 deletions

View file

@ -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;
}

View file

@ -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