https://git.reactos.org/?p=reactos.git;a=commitdiff;h=826704ba6b1ea46795097a1917e96f8fba4d7468
commit 826704ba6b1ea46795097a1917e96f8fba4d7468 Author: Timo Kreuzer <timo.kreu...@reactos.org> AuthorDate: Sun Feb 11 19:22:30 2018 +0100 Commit: Timo Kreuzer <timo.kreu...@reactos.org> CommitDate: Thu Aug 15 14:13:54 2019 +0200 [VIDEOPRT] Implement support for INT10 on x64 using the newly implemented HAL functions. --- win32ss/drivers/videoprt/dispatch.c | 8 +++++- win32ss/drivers/videoprt/int10.c | 49 ++++++++++++++++++++++++++----------- win32ss/drivers/videoprt/services.c | 3 +-- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/win32ss/drivers/videoprt/dispatch.c b/win32ss/drivers/videoprt/dispatch.c index 34ae1074626..d1682549185 100644 --- a/win32ss/drivers/videoprt/dispatch.c +++ b/win32ss/drivers/videoprt/dispatch.c @@ -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; } diff --git a/win32ss/drivers/videoprt/int10.c b/win32ss/drivers/videoprt/int10.c index 8b35709fbdb..35452501421 100644 --- a/win32ss/drivers/videoprt/int10.c +++ b/win32ss/drivers/videoprt/int10.c @@ -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 ***********************************************************/ diff --git a/win32ss/drivers/videoprt/services.c b/win32ss/drivers/videoprt/services.c index 18290c08d26..93a7a8fc6c8 100644 --- a/win32ss/drivers/videoprt/services.c +++ b/win32ss/drivers/videoprt/services.c @@ -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)) ||