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)
13 #include <wine/debug.h>
15 #define NANOS_TO_100NS(nanos) (((LONGLONG)(nanos)) / 100)
16 #define MICROS_TO_100NS(micros) (((LONGLONG)(micros)) * NANOS_TO_100NS(1000))
17 #define MILLIS_TO_100NS(milli) (((LONGLONG)(milli)) * MICROS_TO_100NS(1000))
19 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file
);
26 CreateIoCompletionPort(
28 HANDLE ExistingCompletionPort
,
29 ULONG_PTR CompletionKey
,
30 DWORD NumberOfConcurrentThreads
33 HANDLE CompletionPort
= NULL
;
35 FILE_COMPLETION_INFORMATION CompletionInformation
;
36 IO_STATUS_BLOCK IoStatusBlock
;
38 if ( FileHandle
== INVALID_HANDLE_VALUE
&& ExistingCompletionPort
!= NULL
)
40 SetLastError(ERROR_INVALID_PARAMETER
);
44 if ( ExistingCompletionPort
!= NULL
)
46 CompletionPort
= ExistingCompletionPort
;
51 errCode
= NtCreateIoCompletion(&CompletionPort
,
52 IO_COMPLETION_ALL_ACCESS
,
53 NULL
,//ObjectAttributes
54 NumberOfConcurrentThreads
);
56 if (!NT_SUCCESS(errCode
) )
58 SetLastErrorByStatus (errCode
);
64 if ( FileHandle
!= INVALID_HANDLE_VALUE
)
66 CompletionInformation
.Port
= CompletionPort
;
67 CompletionInformation
.Key
= (PVOID
)CompletionKey
;
69 errCode
= NtSetInformationFile(FileHandle
,
71 &CompletionInformation
,
72 sizeof(FILE_COMPLETION_INFORMATION
),
73 FileCompletionInformation
);
75 if ( !NT_SUCCESS(errCode
) )
77 if ( ExistingCompletionPort
== NULL
)
79 NtClose(CompletionPort
);
82 SetLastErrorByStatus (errCode
);
87 return CompletionPort
;
96 GetQueuedCompletionStatus(
97 HANDLE CompletionHandle
,
98 LPDWORD lpNumberOfBytesTransferred
,
99 PULONG_PTR lpCompletionKey
,
100 LPOVERLAPPED
*lpOverlapped
,
105 IO_STATUS_BLOCK IoStatus
;
106 ULONG_PTR CompletionKey
;
107 LARGE_INTEGER Interval
;
109 if (!lpNumberOfBytesTransferred
|| !lpCompletionKey
|| !lpOverlapped
)
111 SetLastError(ERROR_INVALID_PARAMETER
);
115 if (dwMilliseconds
!= INFINITE
)
117 Interval
.QuadPart
= (-(MILLIS_TO_100NS(dwMilliseconds
)));
120 errCode
= NtRemoveIoCompletion(CompletionHandle
,
121 (PVOID
*)&CompletionKey
,
122 (PVOID
*)lpOverlapped
,
124 dwMilliseconds
== INFINITE
? NULL
: &Interval
);
126 if (!NT_SUCCESS(errCode
) || errCode
== STATUS_TIMEOUT
) {
127 *lpOverlapped
= NULL
;
128 SetLastErrorByStatus(errCode
);
132 *lpCompletionKey
= CompletionKey
;
133 *lpNumberOfBytesTransferred
= IoStatus
.Information
;
135 if (!NT_SUCCESS(IoStatus
.Status
)){
136 //failed io operation
137 SetLastErrorByStatus(IoStatus
.Status
);
150 PostQueuedCompletionStatus(
151 HANDLE CompletionHandle
,
152 DWORD dwNumberOfBytesTransferred
,
153 ULONG_PTR dwCompletionKey
,
154 LPOVERLAPPED lpOverlapped
159 errCode
= NtSetIoCompletion(CompletionHandle
,
160 (PVOID
)dwCompletionKey
, // KeyContext
161 (PVOID
)lpOverlapped
, // ApcContext
162 STATUS_SUCCESS
, // IoStatusBlock->Status
163 dwNumberOfBytesTransferred
); // IoStatusBlock->Information
165 if ( !NT_SUCCESS(errCode
) )
167 SetLastErrorByStatus (errCode
);
178 CancelIo(HANDLE hFile
)
180 IO_STATUS_BLOCK IoStatusBlock
;
183 Status
= NtCancelIoFile(hFile
,
185 if (!NT_SUCCESS(Status
))
187 SetLastErrorByStatus(Status
);
200 CancelIoEx(IN HANDLE hFile
,
201 IN LPOVERLAPPED lpOverlapped
)
213 CancelSynchronousIo(IN HANDLE hThread
)