[NTVDM]
[reactos.git] / reactos / subsystems / mvdm / ntvdm / dos / dos32krnl / emsdrv.c
index af5bf1f..77fb7b1 100644 (file)
@@ -162,6 +162,8 @@ static USHORT EmsMap(USHORT Handle, UCHAR PhysicalPage, USHORT LogicalPage)
 
 static VOID WINAPI EmsIntHandler(LPWORD Stack)
 {
+    static PVOID MappingBackup[EMS_PHYSICAL_PAGES] = { NULL };
+
     switch (getAH())
     {
         /* Get Manager Status */
@@ -221,6 +223,20 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
             break;
         }
 
+        /* Save Page Map */
+        case 0x47:
+        {
+            RtlCopyMemory(MappingBackup, Mapping, sizeof(PVOID) * EMS_PHYSICAL_PAGES);
+            break;
+        }
+
+        /* Restore Page Map */
+        case 0x48:
+        {
+            RtlCopyMemory(Mapping, MappingBackup, sizeof(PVOID) * EMS_PHYSICAL_PAGES);
+            break;
+        }
+
         /* Get/Set Handle Name */
         case 0x53:
         {
@@ -345,6 +361,38 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
             break;
         }
 
+        /* Get Expanded Memory Hardware Information */
+        case 0x59:
+        {
+            if (getAL() == 0x00)
+            {
+                PEMS_HARDWARE_INFO HardwareInfo = (PEMS_HARDWARE_INFO)SEG_OFF_TO_PTR(getES(), getDI());
+
+                /* Return the hardware information */
+                HardwareInfo->RawPageSize         = EMS_PAGE_SIZE >> 4;
+                HardwareInfo->AlternateRegSets    = 0;
+                HardwareInfo->ContextAreaSize     = sizeof(Mapping);
+                HardwareInfo->DmaRegisterSets     = 0;
+                HardwareInfo->DmaChannelOperation = 0;
+
+                setAH(EMS_STATUS_OK);
+            }
+            else if (getAL() == 0x01)
+            {
+                /* Same as function AH = 42h */
+                setAH(EMS_STATUS_OK);
+                setBX(RtlNumberOfClearBits(&AllocBitmap));
+                setDX(EmsTotalPages);
+            }
+            else
+            {
+                DPRINT1("Invalid subfunction %02X for EMS function AH = 59h\n", getAL());
+                setAH(EMS_STATUS_UNKNOWN_FUNCTION);
+            }
+
+            break;
+        }
+
         default:
         {
             DPRINT1("EMS function AH = %02X NOT IMPLEMENTED\n", getAH());
@@ -354,7 +402,7 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
     }
 }
 
-static VOID NTAPI EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
+static VOID FASTCALL EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
 {
     ULONG i;
     ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0);
@@ -374,7 +422,7 @@ static VOID NTAPI EmsReadMemory(ULONG Address, PVOID Buffer, ULONG Size)
     }
 }
 
-static BOOLEAN NTAPI EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
+static BOOLEAN FASTCALL EmsWriteMemory(ULONG Address, PVOID Buffer, ULONG Size)
 {
     ULONG i;
     ULONG RelativeAddress = Address - TO_LINEAR(EMS_SEGMENT, 0);