2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ke/iocomp.c
6 * PROGRAMMER: David Welch (welch@mcmail.com)
9 Changed NtQueryIoCompletion
12 /* INCLUDES *****************************************************************/
16 #include <internal/debug.h>
18 #define IOC_TAG TAG('I', 'O', 'C', 'T')
20 POBJECT_TYPE ExIoCompletionType
;
22 NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside
;
24 static GENERIC_MAPPING ExIoCompletionMapping
=
26 STANDARD_RIGHTS_READ
| IO_COMPLETION_QUERY_STATE
,
27 STANDARD_RIGHTS_WRITE
| IO_COMPLETION_MODIFY_STATE
,
28 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
| IO_COMPLETION_QUERY_STATE
,
29 IO_COMPLETION_ALL_ACCESS
32 /* FUNCTIONS *****************************************************************/
36 NtpCreateIoCompletion(
40 POBJECT_ATTRIBUTES ObjectAttributes
43 DPRINT("NtpCreateIoCompletion(ObjectBody %x, Parent %x, RemainingPath %S)\n",
44 ObjectBody
, Parent
, RemainingPath
);
46 if (RemainingPath
!= NULL
&& wcschr(RemainingPath
+1, '\\') != NULL
)
48 return STATUS_UNSUCCESSFUL
;
51 return STATUS_SUCCESS
;
55 NtpDeleteIoCompletion(PVOID ObjectBody
)
57 PKQUEUE Queue
= ObjectBody
;
59 DPRINT("NtpDeleteIoCompletion()\n");
61 KeRundownQueue(Queue
);
70 IoSetCompletionRoutineEx(
71 IN PDEVICE_OBJECT DeviceObject
,
73 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
75 IN BOOLEAN InvokeOnSuccess
,
76 IN BOOLEAN InvokeOnError
,
77 IN BOOLEAN InvokeOnCancel
81 return STATUS_NOT_IMPLEMENTED
;
90 IN PVOID IoCompletion
,
94 IN ULONG_PTR IoStatusInformation
,
99 return STATUS_NOT_IMPLEMENTED
;
103 NtInitializeIoCompletionImplementation(VOID
)
105 ExIoCompletionType
= ExAllocatePool(NonPagedPool
, sizeof(OBJECT_TYPE
));
107 RtlCreateUnicodeString(&ExIoCompletionType
->TypeName
, L
"IoCompletion");
109 ExIoCompletionType
->Tag
= IOC_TAG
;
110 ExIoCompletionType
->MaxObjects
= ULONG_MAX
;
111 ExIoCompletionType
->MaxHandles
= ULONG_MAX
;
112 ExIoCompletionType
->TotalObjects
= 0;
113 ExIoCompletionType
->TotalHandles
= 0;
114 ExIoCompletionType
->PagedPoolCharge
= 0;
115 ExIoCompletionType
->NonpagedPoolCharge
= sizeof(KQUEUE
);
116 ExIoCompletionType
->Mapping
= &ExIoCompletionMapping
;
117 ExIoCompletionType
->Dump
= NULL
;
118 ExIoCompletionType
->Open
= NULL
;
119 ExIoCompletionType
->Close
= NULL
;
120 ExIoCompletionType
->Delete
= NtpDeleteIoCompletion
;
121 ExIoCompletionType
->Parse
= NULL
;
122 ExIoCompletionType
->Security
= NULL
;
123 ExIoCompletionType
->QueryName
= NULL
;
124 ExIoCompletionType
->OkayToClose
= NULL
;
125 ExIoCompletionType
->Create
= NtpCreateIoCompletion
;
126 ExIoCompletionType
->DuplicationNotify
= NULL
;
128 ExInitializeNPagedLookasideList(&IoCompletionPacketLookaside
,
132 sizeof(IO_COMPLETION_PACKET
),
140 NtCreateIoCompletion(
141 OUT PHANDLE IoCompletionHandle
,
142 IN ACCESS_MASK DesiredAccess
,
143 IN POBJECT_ATTRIBUTES ObjectAttributes
,
144 IN ULONG NumberOfConcurrentThreads
150 Status
= ObCreateObject(ExGetPreviousMode(),
159 if (!NT_SUCCESS(Status
))
164 Status
= ObInsertObject ((PVOID
)Queue
,
170 if (!NT_SUCCESS(Status
))
172 ObDereferenceObject(Queue
);
176 KeInitializeQueue(Queue
, NumberOfConcurrentThreads
);
177 ObDereferenceObject(Queue
);
179 return STATUS_SUCCESS
;
182 CompletionPort = NULL OR ExistingCompletionPort
192 IO_COMPLETION_QUERY_STATE Query access
193 IO_COMPLETION_MODIFY_STATE Modify access
194 IO_COMPLETION_ALL_ACCESS All of the preceding + STANDARD_RIGHTS_ALL
197 OBJ_OPENLINK and OBJ_PERMANENT are not valid attributes
200 STATUS_SUCCESS or an error status, such as STATUS_ACCESS_DENIED or
201 STATUS_OBJECT_NAME_NOT_FOUND.
206 OUT PHANDLE IoCompletionHandle
,
207 IN ACCESS_MASK DesiredAccess
,
208 IN POBJECT_ATTRIBUTES ObjectAttributes
213 Status
= ObOpenObjectByName(ObjectAttributes
,
219 IoCompletionHandle
); //<- ???
228 IN HANDLE IoCompletionHandle
,
229 IN IO_COMPLETION_INFORMATION_CLASS IoCompletionInformationClass
,
230 OUT PVOID IoCompletionInformation
,
231 IN ULONG IoCompletionInformationLength
,
232 OUT PULONG ResultLength OPTIONAL
238 if (IoCompletionInformationClass
!= IoCompletionBasicInformation
)
240 return STATUS_INVALID_INFO_CLASS
;
242 if (IoCompletionInformationLength
< sizeof(IO_COMPLETION_BASIC_INFORMATION
))
244 return STATUS_INFO_LENGTH_MISMATCH
;
247 Status
= ObReferenceObjectByHandle( IoCompletionHandle
,
248 IO_COMPLETION_QUERY_STATE
,
253 if (NT_SUCCESS(Status
))
255 ((PIO_COMPLETION_BASIC_INFORMATION
)IoCompletionInformation
)->Depth
=
256 Queue
->Header
.SignalState
;
258 ObDereferenceObject(Queue
);
260 if (ResultLength
) *ResultLength
= sizeof(IO_COMPLETION_BASIC_INFORMATION
);
268 * Dequeues an I/O completion message from an I/O completion object
272 NtRemoveIoCompletion(
273 IN HANDLE IoCompletionHandle
,
274 OUT PULONG CompletionKey
,
275 OUT PULONG CompletionValue
,
276 OUT PIO_STATUS_BLOCK IoStatusBlock
,
277 IN PLARGE_INTEGER Timeout OPTIONAL
283 Status
= ObReferenceObjectByHandle( IoCompletionHandle
,
284 IO_COMPLETION_MODIFY_STATE
,
289 if (NT_SUCCESS(Status
))
291 PIO_COMPLETION_PACKET Packet
;
292 PLIST_ENTRY ListEntry
;
295 Try 2 remove packet from queue. Wait (optionaly) if
296 no packet in queue or max num of threads allready running.
298 ListEntry
= KeRemoveQueue(Queue
, UserMode
, Timeout
);
300 ObDereferenceObject(Queue
);
302 Packet
= CONTAINING_RECORD(ListEntry
, IO_COMPLETION_PACKET
, ListEntry
);
304 if (CompletionKey
) *CompletionKey
= Packet
->Key
;
305 if (CompletionValue
) *CompletionValue
= Packet
->Overlapped
;
306 if (IoStatusBlock
) *IoStatusBlock
= Packet
->IoStatus
;
308 ExFreeToNPagedLookasideList(&IoCompletionPacketLookaside
, Packet
);
316 ASSOSIERT MED FOB's IoCompletionContext
318 typedef struct _IO_COMPLETION_CONTEXT {
321 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
327 * Queues an I/O completion message to an I/O completion object
332 IN HANDLE IoCompletionPortHandle
,
333 IN ULONG CompletionKey
,
334 IN ULONG CompletionValue
,
335 IN NTSTATUS CompletionStatus
,
336 IN ULONG CompletionInformation
342 Status
= ObReferenceObjectByHandle( IoCompletionPortHandle
,
343 IO_COMPLETION_MODIFY_STATE
,
348 if (NT_SUCCESS(Status
))
350 PIO_COMPLETION_PACKET Packet
;
352 Packet
= ExAllocateFromNPagedLookasideList(&IoCompletionPacketLookaside
);
354 Packet
->Key
= CompletionKey
;
355 Packet
->Overlapped
= CompletionValue
;
356 Packet
->IoStatus
.Status
= CompletionStatus
;
357 Packet
->IoStatus
.Information
= CompletionInformation
;
359 KeInsertQueue(Queue
, &Packet
->ListEntry
);
360 ObDereferenceObject(Queue
);