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>
22 CreateIoCompletionPort(
24 HANDLE ExistingCompletionPort,
26 DWORD NumberOfConcurrentThreads
29 HANDLE CompletionPort = NULL;
31 FILE_COMPLETION_INFORMATION CompletionInformation;
32 IO_STATUS_BLOCK IoStatusBlock;
34 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE )
36 SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
40 if ( ExistingCompletionPort != NULL )
42 CompletionPort = ExistingCompletionPort;
47 errCode = NtCreateIoCompletion(&CompletionPort,
48 IO_COMPLETION_ALL_ACCESS,
49 NULL,//ObjectAttributes
50 NumberOfConcurrentThreads);
52 if (!NT_SUCCESS(errCode) )
54 SetLastErrorByStatus (errCode);
60 if ( FileHandle != INVALID_HANDLE_VALUE )
62 CompletionInformation.IoCompletionHandle = CompletionPort;
63 CompletionInformation.CompletionKey = CompletionKey;
65 errCode = NtSetInformationFile(FileHandle,
67 &CompletionInformation,
68 sizeof(FILE_COMPLETION_INFORMATION),
69 FileCompletionInformation);
71 if ( !NT_SUCCESS(errCode) )
73 if ( ExistingCompletionPort == NULL )
75 NtClose(CompletionPort);
78 SetLastErrorByStatus (errCode);
83 return CompletionPort;
92 GetQueuedCompletionStatus(
93 HANDLE CompletionHandle,
94 LPDWORD lpNumberOfBytesTransferred,
95 LPDWORD lpCompletionKey,
96 LPOVERLAPPED *lpOverlapped,
101 IO_STATUS_BLOCK IoStatus;
102 LARGE_INTEGER Interval;
104 if (!lpNumberOfBytesTransferred||!lpCompletionKey||!lpOverlapped)
106 return ERROR_INVALID_PARAMETER;
109 if (dwMilliseconds != INFINITE)
112 * System time units are 100 nanoseconds (a nanosecond is a billionth of
115 Interval.QuadPart = dwMilliseconds;
116 Interval.QuadPart = -(Interval.QuadPart * 10000);
120 /* Approximately 292000 years hence */
121 Interval.QuadPart = -0x7FFFFFFFFFFFFFFF;
124 errCode = NtRemoveIoCompletion(CompletionHandle,
126 lpNumberOfBytesTransferred,
130 if (!NT_SUCCESS(errCode) ) {
131 *lpOverlapped = NULL;
132 SetLastErrorByStatus(errCode);
136 *lpOverlapped = (LPOVERLAPPED)IoStatus.Information;
138 if (!NT_SUCCESS(IoStatus.Status)){
139 //failed io operation
140 SetLastErrorByStatus (IoStatus.Status);
154 PostQueuedCompletionStatus(
155 HANDLE CompletionHandle,
156 DWORD dwNumberOfBytesTransferred,
157 DWORD dwCompletionKey,
158 LPOVERLAPPED lpOverlapped
163 errCode = NtSetIoCompletion(CompletionHandle,
165 dwNumberOfBytesTransferred,//CompletionValue
166 0, //IoStatusBlock->Status
167 (ULONG)lpOverlapped ); //IoStatusBlock->Information
169 if ( !NT_SUCCESS(errCode) )
171 SetLastErrorByStatus (errCode);
182 CancelIo(HANDLE hFile)
184 IO_STATUS_BLOCK IoStatusBlock;
187 Status = NtCancelIoFile(hFile,
189 if (!NT_SUCCESS(Status))
191 SetLastErrorByStatus(Status);