X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=win32ss%2Fdrivers%2Fvideoprt%2Fint10.c;h=82f3774067f87b8771196fd53a810edfa8743ad6;hp=b6a5eb93afe4b92a74029795e6f4e4bd09dc6c50;hb=e7b3c66a42188f645f3f31a96e4ed2e79144a916;hpb=ecfd6e6d6ddf7bcebb906b629c120d996b87ea8d diff --git a/win32ss/drivers/videoprt/int10.c b/win32ss/drivers/videoprt/int10.c index b6a5eb93afe..82f3774067f 100644 --- a/win32ss/drivers/videoprt/int10.c +++ b/win32ss/drivers/videoprt/int10.c @@ -40,7 +40,9 @@ IntInitializeVideoAddressSpace(VOID) PVOID BaseAddress; LARGE_INTEGER Offset; SIZE_T ViewSize; - CHAR IVTAndBda[1024+256]; +#ifdef _M_IX86 + CHAR IVTAndBda[1024 + 256]; +#endif // _M_IX86 /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us mapping the view into the reserved area, but it doesn't. */ BaseAddress = 0; @@ -58,7 +60,7 @@ IntInitializeVideoAddressSpace(VOID) /* Open the physical memory section */ InitializeObjectAttributes(&ObjectAttributes, &PhysMemName, - 0, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); Status = ZwOpenSection(&PhysMemHandle, @@ -124,6 +126,7 @@ IntInitializeVideoAddressSpace(VOID) return 0; } +#ifdef _M_IX86 /* Get the real mode IVT and BDA from the kernel */ Status = NtVdmControl(VdmInitialize, IVTAndBda); if (!NT_SUCCESS(Status)) @@ -131,131 +134,151 @@ IntInitializeVideoAddressSpace(VOID) DPRINT1("NtVdmControl failed (status %x)\n", Status); return Status; } +#endif // _M_IX86 /* Return success */ return STATUS_SUCCESS; } +#else +NTSTATUS +NTAPI +IntInitializeVideoAddressSpace(VOID) +{ + UNIMPLEMENTED; + NT_ASSERT(FALSE); + return STATUS_NOT_IMPLEMENTED; +} #endif #if defined(_M_IX86) -VP_STATUS NTAPI +VP_STATUS +NTAPI IntInt10AllocateBuffer( - IN PVOID Context, - OUT PUSHORT Seg, - OUT PUSHORT Off, - IN OUT PULONG Length) + IN PVOID Context, + OUT PUSHORT Seg, + OUT PUSHORT Off, + IN OUT PULONG Length) { - PVOID MemoryAddress; - NTSTATUS Status; - PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); - KAPC_STATE ApcState; - - TRACE_(VIDEOPRT, "IntInt10AllocateBuffer\n"); + PVOID MemoryAddress; + NTSTATUS Status; + PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); + KAPC_STATE ApcState; - IntAttachToCSRSS(&CallingProcess, &ApcState); + TRACE_(VIDEOPRT, "IntInt10AllocateBuffer\n"); - MemoryAddress = (PVOID)0x20000; - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &MemoryAddress, 0, - Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + IntAttachToCSRSS(&CallingProcess, &ApcState); - if (!NT_SUCCESS(Status)) - { - WARN_(VIDEOPRT, "- ZwAllocateVirtualMemory failed\n"); - IntDetachFromCSRSS(&CallingProcess, &ApcState); - return ERROR_NOT_ENOUGH_MEMORY; - } + MemoryAddress = (PVOID)0x20000; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &MemoryAddress, + 0, + Length, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + WARN_(VIDEOPRT, "- ZwAllocateVirtualMemory failed\n"); + IntDetachFromCSRSS(&CallingProcess, &ApcState); + return ERROR_NOT_ENOUGH_MEMORY; + } - if (MemoryAddress > (PVOID)(0x100000 - *Length)) - { - ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, Length, - MEM_RELEASE); - WARN_(VIDEOPRT, "- Unacceptable memory allocated\n"); - IntDetachFromCSRSS(&CallingProcess, &ApcState); - return ERROR_NOT_ENOUGH_MEMORY; - } + if (MemoryAddress > (PVOID)(0x100000 - *Length)) + { + ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, Length, + MEM_RELEASE); + WARN_(VIDEOPRT, "- Unacceptable memory allocated\n"); + IntDetachFromCSRSS(&CallingProcess, &ApcState); + return ERROR_NOT_ENOUGH_MEMORY; + } - *Seg = (USHORT)((ULONG)MemoryAddress >> 4); - *Off = (USHORT)((ULONG)MemoryAddress & 0xF); + *Seg = (USHORT)((ULONG)MemoryAddress >> 4); + *Off = (USHORT)((ULONG)MemoryAddress & 0xF); - INFO_(VIDEOPRT, "- Segment: %x\n", (ULONG)MemoryAddress >> 4); - INFO_(VIDEOPRT, "- Offset: %x\n", (ULONG)MemoryAddress & 0xF); - INFO_(VIDEOPRT, "- Length: %x\n", *Length); + INFO_(VIDEOPRT, "- Segment: %x\n", (ULONG)MemoryAddress >> 4); + INFO_(VIDEOPRT, "- Offset: %x\n", (ULONG)MemoryAddress & 0xF); + INFO_(VIDEOPRT, "- Length: %x\n", *Length); - IntDetachFromCSRSS(&CallingProcess, &ApcState); + IntDetachFromCSRSS(&CallingProcess, &ApcState); - return NO_ERROR; + return NO_ERROR; } -VP_STATUS NTAPI +VP_STATUS +NTAPI IntInt10FreeBuffer( - IN PVOID Context, - IN USHORT Seg, - IN USHORT Off) + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off) { - PVOID MemoryAddress = (PVOID)((Seg << 4) | Off); - NTSTATUS Status; - PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); - KAPC_STATE ApcState; - SIZE_T Size = 0; - - TRACE_(VIDEOPRT, "IntInt10FreeBuffer\n"); - INFO_(VIDEOPRT, "- Segment: %x\n", Seg); - INFO_(VIDEOPRT, "- Offset: %x\n", Off); - - IntAttachToCSRSS(&CallingProcess, &ApcState); - Status = ZwFreeVirtualMemory(NtCurrentProcess(), &MemoryAddress, &Size, - MEM_RELEASE); - IntDetachFromCSRSS(&CallingProcess, &ApcState); - - return Status; + PVOID MemoryAddress = (PVOID)((Seg << 4) | Off); + NTSTATUS Status; + PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); + KAPC_STATE ApcState; + SIZE_T Size = 0; + + TRACE_(VIDEOPRT, "IntInt10FreeBuffer\n"); + INFO_(VIDEOPRT, "- Segment: %x\n", Seg); + INFO_(VIDEOPRT, "- Offset: %x\n", Off); + + IntAttachToCSRSS(&CallingProcess, &ApcState); + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + &MemoryAddress, + &Size, + MEM_RELEASE); + + IntDetachFromCSRSS(&CallingProcess, &ApcState); + + return Status; } -VP_STATUS NTAPI +VP_STATUS +NTAPI IntInt10ReadMemory( - IN PVOID Context, - IN USHORT Seg, - IN USHORT Off, - OUT PVOID Buffer, - IN ULONG Length) + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off, + OUT PVOID Buffer, + IN ULONG Length) { - PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); - KAPC_STATE ApcState; + PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); + KAPC_STATE ApcState; - TRACE_(VIDEOPRT, "IntInt10ReadMemory\n"); - INFO_(VIDEOPRT, "- Segment: %x\n", Seg); - INFO_(VIDEOPRT, "- Offset: %x\n", Off); - INFO_(VIDEOPRT, "- Buffer: %x\n", Buffer); - INFO_(VIDEOPRT, "- Length: %x\n", Length); + TRACE_(VIDEOPRT, "IntInt10ReadMemory\n"); + INFO_(VIDEOPRT, "- Segment: %x\n", Seg); + INFO_(VIDEOPRT, "- Offset: %x\n", Off); + INFO_(VIDEOPRT, "- Buffer: %x\n", Buffer); + INFO_(VIDEOPRT, "- Length: %x\n", Length); - IntAttachToCSRSS(&CallingProcess, &ApcState); - RtlCopyMemory(Buffer, (PVOID)((Seg << 4) | Off), Length); - IntDetachFromCSRSS(&CallingProcess, &ApcState); + IntAttachToCSRSS(&CallingProcess, &ApcState); + RtlCopyMemory(Buffer, (PVOID)((Seg << 4) | Off), Length); + IntDetachFromCSRSS(&CallingProcess, &ApcState); - return NO_ERROR; + return NO_ERROR; } -VP_STATUS NTAPI +VP_STATUS +NTAPI IntInt10WriteMemory( - IN PVOID Context, - IN USHORT Seg, - IN USHORT Off, - IN PVOID Buffer, - IN ULONG Length) + IN PVOID Context, + IN USHORT Seg, + IN USHORT Off, + IN PVOID Buffer, + IN ULONG Length) { - PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); - KAPC_STATE ApcState; + PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess(); + KAPC_STATE ApcState; - TRACE_(VIDEOPRT, "IntInt10WriteMemory\n"); - INFO_(VIDEOPRT, "- Segment: %x\n", Seg); - INFO_(VIDEOPRT, "- Offset: %x\n", Off); - INFO_(VIDEOPRT, "- Buffer: %x\n", Buffer); - INFO_(VIDEOPRT, "- Length: %x\n", Length); + TRACE_(VIDEOPRT, "IntInt10WriteMemory\n"); + INFO_(VIDEOPRT, "- Segment: %x\n", Seg); + INFO_(VIDEOPRT, "- Offset: %x\n", Off); + INFO_(VIDEOPRT, "- Buffer: %x\n", Buffer); + INFO_(VIDEOPRT, "- Length: %x\n", Length); - IntAttachToCSRSS(&CallingProcess, &ApcState); - RtlCopyMemory((PVOID)((Seg << 4) | Off), Buffer, Length); - IntDetachFromCSRSS(&CallingProcess, &ApcState); + IntAttachToCSRSS(&CallingProcess, &ApcState); + RtlCopyMemory((PVOID)((Seg << 4) | Off), Buffer, Length); + IntDetachFromCSRSS(&CallingProcess, &ApcState); - return NO_ERROR; + return NO_ERROR; } VP_STATUS @@ -273,7 +296,7 @@ IntInt10CallBios( IntAttachToCSRSS(&CallingProcess, &ApcState); /* Clear the context */ - RtlZeroMemory(&BiosContext, sizeof(CONTEXT)); + RtlZeroMemory(&BiosContext, sizeof(BiosContext)); /* Fill out the bios arguments */ BiosContext.Eax = BiosArguments->Eax; @@ -287,8 +310,16 @@ IntInt10CallBios( BiosContext.SegEs = BiosArguments->SegEs; /* Do the ROM BIOS call */ + (void)KeWaitForMutexObject(&VideoPortInt10Mutex, + Executive, + KernelMode, + FALSE, + NULL); + Status = Ke386CallBios(0x10, &BiosContext); + KeReleaseMutex(&VideoPortInt10Mutex, FALSE); + /* Return the arguments */ BiosArguments->Eax = BiosContext.Eax; BiosArguments->Ebx = BiosContext.Ebx; @@ -302,7 +333,12 @@ IntInt10CallBios( /* Detach and return status */ IntDetachFromCSRSS(&CallingProcess, &ApcState); - if (NT_SUCCESS(Status)) return NO_ERROR; + + if (NT_SUCCESS(Status)) + { + return NO_ERROR; + } + return ERROR_INVALID_PARAMETER; } #endif @@ -313,7 +349,8 @@ IntInt10CallBios( * @implemented */ -VP_STATUS NTAPI +VP_STATUS +NTAPI VideoPortInt10( IN PVOID HwDeviceExtension, IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments) @@ -326,7 +363,7 @@ VideoPortInt10( if (!CsrssInitialized) { - return ERROR_INVALID_PARAMETER; + return ERROR_INVALID_PARAMETER; } /* Attach to CSRSS */ @@ -345,7 +382,13 @@ VideoPortInt10( BiosContext.Ebp = BiosArguments->Ebp; /* Do the ROM BIOS call */ + (void)KeWaitForMutexObject(&VideoPortInt10Mutex, + Executive, + KernelMode, + FALSE, + NULL); Status = Ke386CallBios(0x10, &BiosContext); + KeReleaseMutex(&VideoPortInt10Mutex, FALSE); /* Return the arguments */ BiosArguments->Eax = BiosContext.Eax; @@ -358,7 +401,12 @@ VideoPortInt10( /* Detach from CSRSS */ IntDetachFromCSRSS(&CallingProcess, &ApcState); - if (NT_SUCCESS(Status)) return NO_ERROR; + + if (NT_SUCCESS(Status)) + { + return NO_ERROR; + } + return ERROR_INVALID_PARAMETER; #else /* Not implemented for anything else than X86*/