[VIDEOPRT] Implement support for INT10 on x64 using the newly implemented HAL functions.
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 11 Feb 2018 18:22:30 +0000 (19:22 +0100)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 15 Aug 2019 12:13:54 +0000 (14:13 +0200)
win32ss/drivers/videoprt/dispatch.c
win32ss/drivers/videoprt/int10.c
win32ss/drivers/videoprt/services.c

index 34ae107..d168254 100644 (file)
@@ -103,6 +103,7 @@ IntVideoPortDispatchOpen(
 {
     PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
     PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
+    NTSTATUS Status;
 
     TRACE_(VIDEOPRT, "IntVideoPortDispatchOpen\n");
 
@@ -117,7 +118,12 @@ IntVideoPortDispatchOpen(
         Csrss = (PKPROCESS)PsGetCurrentProcess();
         INFO_(VIDEOPRT, "Csrss %p\n", Csrss);
 
-        IntInitializeVideoAddressSpace();
+        Status = IntInitializeVideoAddressSpace();
+        if (!NT_SUCCESS(Status))
+        {
+            ERR_(VIDEOPRT, "IntInitializeVideoAddressSpace() failed: 0x%lx\n", Status);
+            return Status;
+        }
 
         CsrssInitialized = TRUE;
     }
index 8b35709..3545250 100644 (file)
@@ -22,6 +22,7 @@
 #include "videoprt.h"
 
 #include <ndk/kefuncs.h>
+#include <ndk/halfuncs.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -158,8 +159,9 @@ IntInt10AllocateBuffer(
     OUT PUSHORT Off,
     IN OUT PULONG Length)
 {
-    PVOID MemoryAddress;
     NTSTATUS Status;
+#ifdef _M_IX86
+    PVOID MemoryAddress;
     PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
     KAPC_STATE ApcState;
     SIZE_T Size;
@@ -205,6 +207,10 @@ IntInt10AllocateBuffer(
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
 
     return NO_ERROR;
+#else
+    Status = x86BiosAllocateBuffer(Length, Seg, Off);
+    return NT_SUCCESS(Status) ? NO_ERROR : ERROR_NOT_ENOUGH_MEMORY;
+#endif
 }
 
 VP_STATUS
@@ -214,8 +220,9 @@ IntInt10FreeBuffer(
     IN USHORT Seg,
     IN USHORT Off)
 {
-    PVOID MemoryAddress = (PVOID)((ULONG_PTR)(Seg << 4) | Off);
     NTSTATUS Status;
+#ifdef _M_IX86
+    PVOID MemoryAddress = (PVOID)((ULONG_PTR)(Seg << 4) | Off);
     PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
     KAPC_STATE ApcState;
     SIZE_T Size = 0;
@@ -233,6 +240,10 @@ IntInt10FreeBuffer(
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
 
     return Status;
+#else
+    Status = x86BiosFreeBuffer(Seg, Off);
+    return NT_SUCCESS(Status) ? NO_ERROR : ERROR_INVALID_PARAMETER;
+#endif
 }
 
 VP_STATUS
@@ -244,6 +255,7 @@ IntInt10ReadMemory(
     OUT PVOID Buffer,
     IN ULONG Length)
 {
+#ifdef _M_IX86
     PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
     KAPC_STATE ApcState;
 
@@ -258,6 +270,12 @@ IntInt10ReadMemory(
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
 
     return NO_ERROR;
+#else
+    NTSTATUS Status;
+
+    Status = x86BiosReadMemory(Seg, Off, Buffer, Length);
+    return NT_SUCCESS(Status) ? NO_ERROR : ERROR_INVALID_PARAMETER;
+#endif
 }
 
 VP_STATUS
@@ -269,6 +287,7 @@ IntInt10WriteMemory(
     IN PVOID Buffer,
     IN ULONG Length)
 {
+#ifdef _M_IX86
     PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
     KAPC_STATE ApcState;
 
@@ -283,16 +302,25 @@ IntInt10WriteMemory(
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
 
     return NO_ERROR;
+#else
+    NTSTATUS Status;
+
+    Status = x86BiosWriteMemory(Seg, Off, Buffer, Length);
+    return NT_SUCCESS(Status) ? NO_ERROR : ERROR_INVALID_PARAMETER;
+#endif
 }
 
-#if defined(_M_IX86)
 VP_STATUS
 NTAPI
 IntInt10CallBios(
     IN PVOID Context,
     IN OUT PINT10_BIOS_ARGUMENTS BiosArguments)
 {
+#ifdef _M_AMD64
+    X86_BIOS_REGISTERS BiosContext;
+#else
     CONTEXT BiosContext;
+#endif
     NTSTATUS Status;
     PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
     KAPC_STATE ApcState;
@@ -321,7 +349,11 @@ IntInt10CallBios(
                                FALSE,
                                NULL);
 
+#ifdef _M_AMD64
+    Status = x86BiosCall(0x10, &BiosContext) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
+#else
     Status = Ke386CallBios(0x10, &BiosContext);
+#endif
 
     KeReleaseMutex(&VideoPortInt10Mutex, FALSE);
 
@@ -346,17 +378,6 @@ IntInt10CallBios(
 
     return ERROR_INVALID_PARAMETER;
 }
-#else
-VP_STATUS
-NTAPI
-IntInt10CallBios(
-    IN PVOID Context,
-    IN OUT PINT10_BIOS_ARGUMENTS BiosArguments)
-{
-    DPRINT1("Int10 not available on non-x86!\n");
-    return ERROR_INVALID_FUNCTION;
-}
-#endif
 
 /* PUBLIC FUNCTIONS ***********************************************************/
 
index 18290c0..93a7a8f 100644 (file)
@@ -46,7 +46,6 @@ VideoPortQueryServices(
 
    switch (ServicesType)
    {
-#if defined(_M_IX86)
       case VideoPortServicesInt10:
          if (Interface->Version >= VIDEO_PORT_INT10_INTERFACE_VERSION_1 ||
              Interface->Size >= sizeof(VIDEO_PORT_INT10_INTERFACE))
@@ -64,7 +63,7 @@ VideoPortQueryServices(
             return NO_ERROR;
          }
          break;
-#endif
+
       case VideoPortServicesAGP:
          if ((Interface->Version == VIDEO_PORT_AGP_INTERFACE_VERSION_2 &&
               Interface->Size >= sizeof(VIDEO_PORT_AGP_INTERFACE_2)) ||