3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/iocompl.c
6 * PURPOSE: Io Completion functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
15 #include "../include/debug.h"
23 CreateIoCompletionPort(
25 HANDLE ExistingCompletionPort
,
26 ULONG_PTR CompletionKey
,
27 DWORD NumberOfConcurrentThreads
30 HANDLE CompletionPort
= NULL
;
32 FILE_COMPLETION_INFORMATION CompletionInformation
;
33 IO_STATUS_BLOCK IoStatusBlock
;
35 if ( ExistingCompletionPort
== NULL
&& FileHandle
== INVALID_HANDLE_VALUE
)
37 SetLastError(ERROR_INVALID_PARAMETER
);
41 if ( ExistingCompletionPort
!= NULL
)
43 CompletionPort
= ExistingCompletionPort
;
48 errCode
= NtCreateIoCompletion(&CompletionPort
,
49 IO_COMPLETION_ALL_ACCESS
,
50 NULL
,//ObjectAttributes
51 NumberOfConcurrentThreads
);
53 if (!NT_SUCCESS(errCode
) )
55 SetLastErrorByStatus (errCode
);
61 if ( FileHandle
!= INVALID_HANDLE_VALUE
)
63 CompletionInformation
.Port
= CompletionPort
;
64 CompletionInformation
.Key
= (PVOID
)CompletionKey
;
66 errCode
= NtSetInformationFile(FileHandle
,
68 &CompletionInformation
,
69 sizeof(FILE_COMPLETION_INFORMATION
),
70 FileCompletionInformation
);
72 if ( !NT_SUCCESS(errCode
) )
74 if ( ExistingCompletionPort
== NULL
)
76 NtClose(CompletionPort
);
79 SetLastErrorByStatus (errCode
);
84 return CompletionPort
;
93 GetQueuedCompletionStatus(
94 HANDLE CompletionHandle
,
95 LPDWORD lpNumberOfBytesTransferred
,
96 PULONG_PTR lpCompletionKey
,
97 LPOVERLAPPED
*lpOverlapped
,
102 IO_STATUS_BLOCK IoStatus
;
103 LARGE_INTEGER Interval
;
105 if (!lpNumberOfBytesTransferred
||!lpCompletionKey
||!lpOverlapped
)
107 SetLastError(ERROR_INVALID_PARAMETER
);
111 if (dwMilliseconds
!= INFINITE
)
113 Interval
.QuadPart
= RELATIVE_TIME(MILLIS_TO_100NS(dwMilliseconds
));
116 errCode
= NtRemoveIoCompletion(CompletionHandle
,
117 (PVOID
*)lpCompletionKey
,
118 (PVOID
*)lpNumberOfBytesTransferred
,
120 dwMilliseconds
== INFINITE
? NULL
: &Interval
);
122 if (!NT_SUCCESS(errCode
)) {
123 *lpOverlapped
= NULL
;
124 SetLastErrorByStatus(errCode
);
128 *lpOverlapped
= (LPOVERLAPPED
)IoStatus
.Information
;
130 if (!NT_SUCCESS(IoStatus
.Status
)){
131 //failed io operation
132 SetLastErrorByStatus(IoStatus
.Status
);
146 PostQueuedCompletionStatus(
147 HANDLE CompletionHandle
,
148 DWORD dwNumberOfBytesTransferred
,
149 DWORD dwCompletionKey
,
150 LPOVERLAPPED lpOverlapped
155 errCode
= NtSetIoCompletion(CompletionHandle
,
156 (PVOID
)dwCompletionKey
,
157 (PVOID
)lpOverlapped
,//CompletionValue
158 STATUS_SUCCESS
, //IoStatusBlock->Status
159 dwNumberOfBytesTransferred
); //IoStatusBlock->Information
161 if ( !NT_SUCCESS(errCode
) )
163 SetLastErrorByStatus (errCode
);
174 CancelIo(HANDLE hFile
)
176 IO_STATUS_BLOCK IoStatusBlock
;
179 Status
= NtCancelIoFile(hFile
,
181 if (!NT_SUCCESS(Status
))
183 SetLastErrorByStatus(Status
);