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;
- KAPC_STATE ApcState;
+#if defined(_M_IX86)
+ 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));
+
+ /* 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;
- 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;
+ /* Do the ROM BIOS call */
+ Status = Ke386CallBios(0x10, &BiosContext);
- IntDetachFromCSRSS(&CallingProcess, &ApcState);
+ /* 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;
- return Status;
+ /* Detach from CSRSS */
+ IntDetachFromCSRSS(&CallingProcess, &ApcState);
+
+ return Status;
+#else
+ /* Not implemented for anything else than X86*/
+ DPRINT1("Int10 not available on non-x86!\n");
+ return ERROR_INVALID_FUNCTION;
+#endif
}