Index: drivers/video/videoprt/int10.c =================================================================== --- drivers/video/videoprt/int10.c (revision 38357) +++ drivers/video/videoprt/int10.c (working copy) @@ -202,45 +202,44 @@ 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"); + TRACE_(VIDEOPRT, "VideoPortInt10\n"); - if (!CsrssInitialized) - { - return ERROR_INVALID_PARAMETER; - } + if (!CsrssInitialized) + { + return ERROR_INVALID_PARAMETER; + } - IntAttachToCSRSS(&CallingProcess, &ApcState); + IntAttachToCSRSS(&CallingProcess, &ApcState); - 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; + /* Clear the context */ + RtlZeroMemory(&BiosContext, sizeof(CONTEXT)); - IntDetachFromCSRSS(&CallingProcess, &ApcState); + /* 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; - return Status; + /* Do the ROM BIOS call */ + Status = Ke386CallBios(0x10, &BiosContext); + + 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; + + IntDetachFromCSRSS(&CallingProcess, &ApcState); + + return Status; } Index: drivers/video/videoprt/videoprt.c =================================================================== --- drivers/video/videoprt/videoprt.c (revision 38357) +++ drivers/video/videoprt/videoprt.c (working copy) @@ -162,6 +162,40 @@ return STATUS_SUCCESS; } +ULONG NTAPI IntVideoPortAllocateDeviceNumber(VOID) +{ + NTSTATUS Status; + ULONG DeviceNumber; + WCHAR SymlinkBuffer[20]; + UNICODE_STRING SymlinkName; + OBJECT_ATTRIBUTES Obj; + HANDLE ObjHandle; + + for (DeviceNumber = 0;;) + { + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); + DPRINT1("Checking %S\n", SymlinkBuffer); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL); + Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj); + if (NT_SUCCESS(Status)) + { + ZwClose(ObjHandle); + DeviceNumber++; + continue; + } + else if (Status == STATUS_OBJECT_NAME_NOT_FOUND) + break; + else + { + DPRINT1("ZwOpenSymbolicLinkObject() returned unexpected status: 0x%08lx\n", Status); + return 0xFFFFFFFF; + } + } + DPRINT("Returning DeviceNumber %lu\n",DeviceNumber); + return DeviceNumber; +} + NTSTATUS NTAPI IntVideoPortCreateAdapterDeviceObject( IN PDRIVER_OBJECT DriverObject, @@ -187,7 +221,7 @@ * object names and symlinks. */ - DeviceNumber = VideoPortDeviceNumber; + DeviceNumber = IntVideoPortAllocateDeviceNumber(); if (DeviceNumber == 0xFFFFFFFF) { WARN_(VIDEOPRT, "Can't find free device number\n");