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 <kernel32/error.h>
19 CreateIoCompletionPort(
21 HANDLE ExistingCompletionPort,
23 DWORD NumberOfConcurrentThreads
26 HANDLE CompletionPort = NULL;
28 FILE_COMPLETION_INFORMATION CompletionInformation;
29 IO_STATUS_BLOCK IoStatusBlock;
31 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE )
33 SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
37 if ( ExistingCompletionPort != NULL )
39 CompletionPort = ExistingCompletionPort;
44 errCode = NtCreateIoCompletion(&CompletionPort,
45 IO_COMPLETION_ALL_ACCESS,
46 NULL,//ObjectAttributes
47 NumberOfConcurrentThreads);
49 if (!NT_SUCCESS(errCode) )
51 SetLastErrorByStatus (errCode);
57 if ( FileHandle != INVALID_HANDLE_VALUE )
59 CompletionInformation.IoCompletionHandle = CompletionPort;
60 CompletionInformation.CompletionKey = CompletionKey;
62 errCode = NtSetInformationFile(FileHandle,
64 &CompletionInformation,
65 sizeof(FILE_COMPLETION_INFORMATION),
66 FileCompletionInformation);
68 if ( !NT_SUCCESS(errCode) )
70 if ( ExistingCompletionPort == NULL )
72 NtClose(CompletionPort);
75 SetLastErrorByStatus (errCode);
80 return CompletionPort;
86 GetQueuedCompletionStatus(
87 HANDLE CompletionHandle,
88 LPDWORD lpNumberOfBytesTransferred,
89 LPDWORD lpCompletionKey,
90 LPOVERLAPPED *lpOverlapped,
95 IO_STATUS_BLOCK IoStatus;
96 LARGE_INTEGER Interval;
98 if (!lpNumberOfBytesTransferred||!lpCompletionKey||!lpOverlapped)
100 return ERROR_INVALID_PARAMETER;
103 if (dwMilliseconds != INFINITE)
106 * System time units are 100 nanoseconds (a nanosecond is a billionth of
109 Interval.QuadPart = dwMilliseconds;
110 Interval.QuadPart = -(Interval.QuadPart * 10000);
114 /* Approximately 292000 years hence */
115 Interval.QuadPart = -0x7FFFFFFFFFFFFFFF;
118 errCode = NtRemoveIoCompletion(CompletionHandle,
120 lpNumberOfBytesTransferred,
124 if (!NT_SUCCESS(errCode) ) {
125 *lpOverlapped = NULL;
126 SetLastErrorByStatus(errCode);
130 *lpOverlapped = (LPOVERLAPPED)IoStatus.Information;
132 if (!NT_SUCCESS(IoStatus.Status)){
133 //failed io operation
134 SetLastErrorByStatus (IoStatus.Status);
145 PostQueuedCompletionStatus(
146 HANDLE CompletionHandle,
147 DWORD dwNumberOfBytesTransferred,
148 DWORD dwCompletionKey,
149 LPOVERLAPPED lpOverlapped
154 errCode = NtSetIoCompletion(CompletionHandle,
156 dwNumberOfBytesTransferred,//CompletionValue
157 0, //IoStatusBlock->Status
158 (ULONG)lpOverlapped ); //IoStatusBlock->Information
160 if ( !NT_SUCCESS(errCode) )
162 SetLastErrorByStatus (errCode);
170 CancelIo(HANDLE hFile)
172 IO_STATUS_BLOCK IoStatusBlock;
175 Status = NtCancelIoFile(hFile,
177 if (!NT_SUCCESS(Status))
179 SetLastErrorByStatus(Status);