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 *****************************************************************/
15 #define NTOS_MODE_KERNEL
17 //#include <ntos/synch.h>
20 #include <internal/debug.h>
22 #define IOC_TAG TAG('I', 'O', 'C', 'T')
24 POBJECT_TYPE ExIoCompletionType
;
26 NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside
;
28 static GENERIC_MAPPING ExIoCompletionMapping
=
30 STANDARD_RIGHTS_READ
| IO_COMPLETION_QUERY_STATE
,
31 STANDARD_RIGHTS_WRITE
| IO_COMPLETION_MODIFY_STATE
,
32 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
| IO_COMPLETION_QUERY_STATE
,
33 IO_COMPLETION_ALL_ACCESS
36 /* FUNCTIONS *****************************************************************/
40 NtpCreateIoCompletion(
44 POBJECT_ATTRIBUTES ObjectAttributes
47 DPRINT("NtpCreateIoCompletion(ObjectBody %x, Parent %x, RemainingPath %S)\n",
48 ObjectBody
, Parent
, RemainingPath
);
50 if (RemainingPath
!= NULL
&& wcschr(RemainingPath
+1, '\\') != NULL
)
52 return STATUS_UNSUCCESSFUL
;
55 return STATUS_SUCCESS
;
59 NtpDeleteIoCompletion(PVOID ObjectBody
)
61 PKQUEUE Queue
= ObjectBody
;
63 DPRINT("NtpDeleteIoCompletion()\n");
65 KeRundownQueue(Queue
);
70 NtInitializeIoCompletionImplementation(VOID
)
72 ExIoCompletionType
= ExAllocatePool(NonPagedPool
, sizeof(OBJECT_TYPE
));
74 RtlCreateUnicodeString(&ExIoCompletionType
->TypeName
, L
"IoCompletion");
76 ExIoCompletionType
->Tag
= IOC_TAG
;
77 ExIoCompletionType
->MaxObjects
= ULONG_MAX
;
78 ExIoCompletionType
->MaxHandles
= ULONG_MAX
;
79 ExIoCompletionType
->TotalObjects
= 0;
80 ExIoCompletionType
->TotalHandles
= 0;
81 ExIoCompletionType
->PagedPoolCharge
= 0;
82 ExIoCompletionType
->NonpagedPoolCharge
= sizeof(KQUEUE
);
83 ExIoCompletionType
->Mapping
= &ExIoCompletionMapping
;
84 ExIoCompletionType
->Dump
= NULL
;
85 ExIoCompletionType
->Open
= NULL
;
86 ExIoCompletionType
->Close
= NULL
;
87 ExIoCompletionType
->Delete
= NtpDeleteIoCompletion
;
88 ExIoCompletionType
->Parse
= NULL
;
89 ExIoCompletionType
->Security
= NULL
;
90 ExIoCompletionType
->QueryName
= NULL
;
91 ExIoCompletionType
->OkayToClose
= NULL
;
92 ExIoCompletionType
->Create
= NtpCreateIoCompletion
;
93 ExIoCompletionType
->DuplicationNotify
= NULL
;
95 ExInitializeNPagedLookasideList(&IoCompletionPacketLookaside
,
99 sizeof(IO_COMPLETION_PACKET
),
107 NtCreateIoCompletion(
108 OUT PHANDLE IoCompletionHandle
,
109 IN ACCESS_MASK DesiredAccess
,
110 IN POBJECT_ATTRIBUTES ObjectAttributes
,
111 IN ULONG NumberOfConcurrentThreads
117 Status
= ObRosCreateObject(IoCompletionHandle
,
123 if (NT_SUCCESS(Status
))
125 (void) KeInitializeQueue(Queue
, NumberOfConcurrentThreads
);
126 ObDereferenceObject(Queue
);
132 CompletionPort = NULL OR ExistingCompletionPort
142 IO_COMPLETION_QUERY_STATE Query access
143 IO_COMPLETION_MODIFY_STATE Modify access
144 IO_COMPLETION_ALL_ACCESS All of the preceding + STANDARD_RIGHTS_ALL
147 OBJ_OPENLINK and OBJ_PERMANENT are not valid attributes
150 STATUS_SUCCESS or an error status, such as STATUS_ACCESS_DENIED or
151 STATUS_OBJECT_NAME_NOT_FOUND.
156 OUT PHANDLE IoCompletionHandle
,
157 IN ACCESS_MASK DesiredAccess
,
158 IN POBJECT_ATTRIBUTES ObjectAttributes
163 Status
= ObOpenObjectByName(ObjectAttributes
,
169 IoCompletionHandle
); //<- ???
178 IN HANDLE IoCompletionHandle
,
179 IN IO_COMPLETION_INFORMATION_CLASS IoCompletionInformationClass
,
180 OUT PVOID IoCompletionInformation
,
181 IN ULONG IoCompletionInformationLength
,
182 OUT PULONG ResultLength OPTIONAL
188 if (IoCompletionInformationClass
!= IoCompletionBasicInformation
)
190 return STATUS_INVALID_INFO_CLASS
;
192 if (IoCompletionInformationLength
< sizeof(IO_COMPLETION_BASIC_INFORMATION
))
194 return STATUS_INFO_LENGTH_MISMATCH
;
197 Status
= ObReferenceObjectByHandle( IoCompletionHandle
,
198 IO_COMPLETION_QUERY_STATE
,
203 if (NT_SUCCESS(Status
))
205 ((PIO_COMPLETION_BASIC_INFORMATION
)IoCompletionInformation
)->SignalState
=
206 Queue
->Header
.SignalState
;
208 ObDereferenceObject(Queue
);
210 if (ResultLength
) *ResultLength
= sizeof(IO_COMPLETION_BASIC_INFORMATION
);
218 * Dequeues an I/O completion message from an I/O completion object
222 NtRemoveIoCompletion(
223 IN HANDLE IoCompletionHandle
,
224 OUT PULONG CompletionKey
,
225 OUT PULONG CompletionValue
,
226 OUT PIO_STATUS_BLOCK IoStatusBlock
,
227 IN PLARGE_INTEGER Timeout OPTIONAL
233 Status
= ObReferenceObjectByHandle( IoCompletionHandle
,
234 IO_COMPLETION_MODIFY_STATE
,
239 if (NT_SUCCESS(Status
))
241 PIO_COMPLETION_PACKET Packet
;
242 PLIST_ENTRY ListEntry
;
245 Try 2 remove packet from queue. Wait (optionaly) if
246 no packet in queue or max num of threads allready running.
248 ListEntry
= KeRemoveQueue(Queue
, UserMode
, Timeout
);
250 ObDereferenceObject(Queue
);
252 Packet
= CONTAINING_RECORD(ListEntry
, IO_COMPLETION_PACKET
, ListEntry
);
254 if (CompletionKey
) *CompletionKey
= Packet
->Key
;
255 if (CompletionValue
) *CompletionValue
= Packet
->Overlapped
;
256 if (IoStatusBlock
) *IoStatusBlock
= Packet
->IoStatus
;
258 ExFreeToNPagedLookasideList(&IoCompletionPacketLookaside
, Packet
);
266 ASSOSIERT MED FOB's IoCompletionContext
268 typedef struct _IO_COMPLETION_CONTEXT {
271 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
277 * Queues an I/O completion message to an I/O completion object
282 IN HANDLE IoCompletionPortHandle
,
283 IN ULONG CompletionKey
,
284 IN ULONG CompletionValue
,
285 IN NTSTATUS CompletionStatus
,
286 IN ULONG CompletionInformation
292 Status
= ObReferenceObjectByHandle( IoCompletionPortHandle
,
293 IO_COMPLETION_MODIFY_STATE
,
298 if (NT_SUCCESS(Status
))
300 PIO_COMPLETION_PACKET Packet
;
302 Packet
= ExAllocateFromNPagedLookasideList(&IoCompletionPacketLookaside
);
304 Packet
->Key
= CompletionKey
;
305 Packet
->Overlapped
= CompletionValue
;
306 Packet
->IoStatus
.Status
= CompletionStatus
;
307 Packet
->IoStatus
.Information
= CompletionInformation
;
309 KeInsertQueue(Queue
, &Packet
->ListEntry
);
310 ObDereferenceObject(Queue
);