X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=subsys%2Fwin32k%2Feng%2Fdevice.c;h=b0568e960d71478e066b5ec0ce8f952703a9d035;hb=HEAD;hp=39a5358e120b6c55d73f4815b4b6572cfa9a1d80;hpb=1334f77b1ecef00ac31076ce6bf22bdfeb82d347;p=reactos.git diff --git a/subsys/win32k/eng/device.c b/subsys/win32k/eng/device.c index 39a5358..b0568e9 100644 --- a/subsys/win32k/eng/device.c +++ b/subsys/win32k/eng/device.c @@ -1,4 +1,23 @@ /* + * ReactOS W32 Subsystem + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id$ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: GDI Driver Device Functions @@ -9,10 +28,14 @@ */ #include +#include #define NDEBUG #include +/* + * @implemented + */ DWORD STDCALL EngDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, @@ -27,21 +50,34 @@ EngDeviceIoControl(HANDLE hDevice, KEVENT Event; IO_STATUS_BLOCK Iosb; PFILE_OBJECT FileObject; + PEPROCESS CurrentProcess; DPRINT("EngDeviceIoControl() called\n"); KeInitializeEvent(&Event, SynchronizationEvent, FALSE); + CurrentProcess = PsGetCurrentProcess(); + if (CurrentProcess != Win32kDeviceProcess) + { + /* Switch to process context in which hDevice is valid */ + KeAttachProcess(Win32kDeviceProcess); + } + Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID *)&FileObject, NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + if (CurrentProcess != Win32kDeviceProcess) + { + KeDetachProcess(); + } + + if (!NT_SUCCESS(Status)) + { + return(Status); + } Irp = IoBuildDeviceIoControlRequest(dwIoControlCode, FileObject->DeviceObject, @@ -57,5 +93,8 @@ EngDeviceIoControl(HANDLE hDevice, (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0); } + ObDereferenceObject(FileObject); + return (Status); } +/* EOF */