mirror of
https://github.com/reactos/reactos.git
synced 2024-09-29 05:54:05 +00:00
- Fix VideoPortInt10 implementation. The previous implementation was passing a significantly smaller KV86M_REGISTERS struct vice CONTEXT struct to Ke386CallBios, resulting in memory corruption.
- Part 2 of ? fixes for bug 2286. svn path=/trunk/; revision=38365
This commit is contained in:
parent
a7e5b19f4c
commit
51dc30a02c
|
@ -199,48 +199,48 @@ IntInt10CallBios(
|
|||
|
||||
VP_STATUS NTAPI
|
||||
VideoPortInt10(
|
||||
IN PVOID HwDeviceExtension,
|
||||
IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
|
||||
IN PVOID HwDeviceExtension,
|
||||
IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments)
|
||||
{
|
||||
KV86M_REGISTERS Regs;
|
||||
NTSTATUS Status;
|
||||
PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
|
||||
KAPC_STATE ApcState;
|
||||
CONTEXT BiosContext;
|
||||
NTSTATUS Status;
|
||||
PKPROCESS CallingProcess = (PKPROCESS)PsGetCurrentProcess();
|
||||
KAPC_STATE ApcState;
|
||||
|
||||
TRACE_(VIDEOPRT, "VideoPortInt10\n");
|
||||
if (!CsrssInitialized)
|
||||
{
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (!CsrssInitialized)
|
||||
{
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
/* Attach to CSRSS */
|
||||
IntAttachToCSRSS(&CallingProcess, &ApcState);
|
||||
|
||||
IntAttachToCSRSS(&CallingProcess, &ApcState);
|
||||
/* Clear the context */
|
||||
RtlZeroMemory(&BiosContext, sizeof(CONTEXT));
|
||||
|
||||
memset(&Regs, 0, sizeof(Regs));
|
||||
INFO_(VIDEOPRT, "- Input register Eax: %x\n", BiosArguments->Eax);
|
||||
Regs.Eax = BiosArguments->Eax;
|
||||
INFO_(VIDEOPRT, "- Input register Ebx: %x\n", BiosArguments->Ebx);
|
||||
Regs.Ebx = BiosArguments->Ebx;
|
||||
INFO_(VIDEOPRT, "- Input register Ecx: %x\n", BiosArguments->Ecx);
|
||||
Regs.Ecx = BiosArguments->Ecx;
|
||||
INFO_(VIDEOPRT, "- Input register Edx: %x\n", BiosArguments->Edx);
|
||||
Regs.Edx = BiosArguments->Edx;
|
||||
INFO_(VIDEOPRT, "- Input register Esi: %x\n", BiosArguments->Esi);
|
||||
Regs.Esi = BiosArguments->Esi;
|
||||
INFO_(VIDEOPRT, "- Input register Edi: %x\n", BiosArguments->Edi);
|
||||
Regs.Edi = BiosArguments->Edi;
|
||||
INFO_(VIDEOPRT, "- Input register Ebp: %x\n", BiosArguments->Ebp);
|
||||
Regs.Ebp = BiosArguments->Ebp;
|
||||
Status = Ke386CallBios(0x10, (PCONTEXT)&Regs);
|
||||
BiosArguments->Eax = Regs.Eax;
|
||||
BiosArguments->Ebx = Regs.Ebx;
|
||||
BiosArguments->Ecx = Regs.Ecx;
|
||||
BiosArguments->Edx = Regs.Edx;
|
||||
BiosArguments->Esi = Regs.Esi;
|
||||
BiosArguments->Edi = Regs.Edi;
|
||||
BiosArguments->Ebp = Regs.Ebp;
|
||||
/* Fill out the bios arguments */
|
||||
BiosContext.Eax = BiosArguments->Eax;
|
||||
BiosContext.Ebx = BiosArguments->Ebx;
|
||||
BiosContext.Ecx = BiosArguments->Ecx;
|
||||
BiosContext.Edx = BiosArguments->Edx;
|
||||
BiosContext.Esi = BiosArguments->Esi;
|
||||
BiosContext.Edi = BiosArguments->Edi;
|
||||
BiosContext.Ebp = BiosArguments->Ebp;
|
||||
|
||||
IntDetachFromCSRSS(&CallingProcess, &ApcState);
|
||||
/* Do the ROM BIOS call */
|
||||
Status = Ke386CallBios(0x10, &BiosContext);
|
||||
|
||||
return Status;
|
||||
/* Return the arguments */
|
||||
BiosArguments->Eax = BiosContext.Eax;
|
||||
BiosArguments->Ebx = BiosContext.Ebx;
|
||||
BiosArguments->Ecx = BiosContext.Ecx;
|
||||
BiosArguments->Edx = BiosContext.Edx;
|
||||
BiosArguments->Esi = BiosContext.Esi;
|
||||
BiosArguments->Edi = BiosContext.Edi;
|
||||
BiosArguments->Ebp = BiosContext.Ebp;
|
||||
|
||||
/* Detach from CSRSS */
|
||||
IntDetachFromCSRSS(&CallingProcess, &ApcState);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue