From cf74899c6f787b89e9f6406738f00165e8360046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Mon, 17 Oct 2005 21:40:37 +0000 Subject: [PATCH] Should have committed this along with r18529 svn path=/trunk/; revision=18531 --- reactos/subsys/win32k/objects/dc.c | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 95ae8bd7e61..8f0983b7e9f 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -661,6 +661,61 @@ IntPrepareDriverIfNeeded() return (PrimarySurface.PreparedDriver ? TRUE : IntPrepareDriver()); } +static BOOL FASTCALL +PrepareVideoPrt() +{ + PIRP Irp; + NTSTATUS Status; + IO_STATUS_BLOCK Iosb; + BOOL Prepare = TRUE; + ULONG Length = sizeof(BOOL); + PIO_STACK_LOCATION StackPtr; + LARGE_INTEGER StartOffset; + PFILE_OBJECT FileObject = PrimarySurface.VideoFileObject; + PDEVICE_OBJECT DeviceObject = FileObject->DeviceObject; + + DPRINT("PrepareVideoPrt() called\n"); + + KeClearEvent(&PrimarySurface.VideoFileObject->Event); + + ObReferenceObjectByPointer(FileObject, 0, IoFileObjectType, KernelMode); + + StartOffset.QuadPart = 0; + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE, + DeviceObject, + (PVOID) &Prepare, + Length, + &StartOffset, + NULL, + &Iosb); + if (NULL == Irp) + { + return FALSE; + } + + /* Set up IRP Data */ + Irp->Tail.Overlay.OriginalFileObject = FileObject; + Irp->RequestorMode = KernelMode; + Irp->Overlay.AsynchronousParameters.UserApcRoutine = NULL; + Irp->Overlay.AsynchronousParameters.UserApcContext = NULL; + Irp->Flags |= IRP_WRITE_OPERATION; + + /* Setup Stack Data */ + StackPtr = IoGetNextIrpStackLocation(Irp); + StackPtr->FileObject = PrimarySurface.VideoFileObject; + StackPtr->Parameters.Write.Key = 0; + + Status = IoCallDriver(DeviceObject, Irp); + + if (STATUS_PENDING == Status) + { + KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, TRUE, 0); + Status = Iosb.Status; + } + + return NT_SUCCESS(Status); +} + BOOL FASTCALL IntCreatePrimarySurface() { @@ -674,6 +729,11 @@ IntCreatePrimarySurface() return FALSE; } + if (! PrepareVideoPrt()) + { + return FALSE; + } + DPRINT("calling EnableSurface\n"); /* Enable the drawing surface */ PrimarySurface.Handle =