1 /* $Id: ioctrl.c,v 1.13 2001/11/02 22:22:33 hbirr Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/ioctrl.c
6 * PURPOSE: Device IO control
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * Eric Kohl (ekohl@abo.rhein-zeitung.de)
11 * Filled in ZwDeviceIoControlFile 22/02/99
12 * Fixed IO method handling 08/03/99
13 * Added APC support 05/11/99
16 /* INCLUDES *****************************************************************/
18 #include <ddk/ntddk.h>
19 #include <internal/io.h>
21 #include <internal/debug.h>
23 /* FUNCTIONS *****************************************************************/
25 NTSTATUS STDCALL
NtDeviceIoControlFile (IN HANDLE DeviceHandle
,
27 IN PIO_APC_ROUTINE UserApcRoutine
,
28 IN PVOID UserApcContext
,
29 OUT PIO_STATUS_BLOCK IoStatusBlock
,
30 IN ULONG IoControlCode
,
32 IN ULONG InputBufferSize
,
33 OUT PVOID OutputBuffer
,
34 IN ULONG OutputBufferSize
)
37 PFILE_OBJECT FileObject
;
38 PDEVICE_OBJECT DeviceObject
;
40 PIO_STACK_LOCATION StackPtr
;
45 DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
46 "UserApcContext %x IoStatusBlock %x IoControlCode %x "
47 "InputBuffer %x InputBufferSize %x OutputBuffer %x "
48 "OutputBufferSize %x)\n",
49 DeviceHandle
,Event
,UserApcRoutine
,UserApcContext
,IoStatusBlock
,
50 IoControlCode
,InputBuffer
,InputBufferSize
,OutputBuffer
,
53 Status
= ObReferenceObjectByHandle(DeviceHandle
,
54 FILE_READ_DATA
| FILE_WRITE_DATA
,
57 (PVOID
*) &FileObject
,
60 if (!NT_SUCCESS(Status
))
66 Status
= ObReferenceObjectByHandle (Event
,
72 if (!NT_SUCCESS(Status
))
74 ObDereferenceObject(FileObject
);
78 else if (FileObject
->Flags
& FO_SYNCHRONOUS_IO
)
84 KeInitializeEvent (&KEvent
,
90 DeviceObject
= FileObject
->DeviceObject
;
92 KeInitializeEvent(&KEvent
,NotificationEvent
,TRUE
);
94 Irp
= IoBuildDeviceIoControlRequest(IoControlCode
,
102 Event
? IoStatusBlock
: &IoSB
);
104 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= UserApcRoutine
;
105 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= UserApcContext
;
107 StackPtr
= IoGetNextIrpStackLocation(Irp
);
108 StackPtr
->FileObject
= FileObject
;
109 StackPtr
->DeviceObject
= DeviceObject
;
110 StackPtr
->Parameters
.DeviceIoControl
.InputBufferLength
= InputBufferSize
;
111 StackPtr
->Parameters
.DeviceIoControl
.OutputBufferLength
= OutputBufferSize
;
113 Status
= IoCallDriver(DeviceObject
,Irp
);
114 if (Event
== NULL
&& Status
== STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
116 KeWaitForSingleObject(&KEvent
,Executive
,KernelMode
,FALSE
,NULL
);
117 Status
= IoSB
.Status
;
121 *IoStatusBlock
= IoSB
;