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>
18 typedef struct _FILE_COMPLETION_INFORMATION {
19 HANDLE CompletionPort;
21 } FILE_COMPLETION_INFORMATION;
22 typedef FILE_COMPLETION_INFORMATION *PFILE_COMPLETION_INFORMATION;
27 FileIOCompletionRoutine(
29 DWORD dwNumberOfBytesTransfered,
30 LPOVERLAPPED lpOverlapped
36 CreateIoCompletionPort(
38 HANDLE ExistingCompletionPort,
40 DWORD NumberOfConcurrentThreads
43 HANDLE CompletionPort = NULL;
45 FILE_COMPLETION_INFORMATION CompletionInformation;
46 IO_STATUS_BLOCK IoStatusBlock;
48 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE ) {
49 SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
53 if ( ExistingCompletionPort != NULL ) {
54 CompletionPort = ExistingCompletionPort;
57 errCode = NtCreateIoCompletion(&CompletionPort,GENERIC_ALL,&IoStatusBlock,NumberOfConcurrentThreads);
58 if (!NT_SUCCESS(errCode) ) {
59 SetLastErrorByStatus (errCode);
64 if ( FileHandle != INVALID_HANDLE_VALUE ) {
66 CompletionInformation.CompletionPort = CompletionPort;
67 CompletionInformation.CompletionKey = CompletionKey;
69 errCode = NtSetInformationFile(FileHandle, &IoStatusBlock,&CompletionInformation,sizeof(FILE_COMPLETION_INFORMATION),FileCompletionInformation);
70 if ( !NT_SUCCESS(errCode) ) {
71 if ( ExistingCompletionPort == NULL )
72 NtClose(CompletionPort);
73 SetLastErrorByStatus (errCode);
78 return CompletionPort;
84 GetQueuedCompletionStatus(
85 HANDLE CompletionPort,
86 LPDWORD lpNumberOfBytesTransferred,
87 LPDWORD lpCompletionKey,
88 LPOVERLAPPED *lpOverlapped,
93 ULONG CompletionStatus;
94 LARGE_INTEGER TimeToWait;
96 errCode = NtRemoveIoCompletion(CompletionPort,(PULONG)lpCompletionKey,(PIO_STATUS_BLOCK)lpOverlapped,&CompletionStatus,&TimeToWait);
97 if (!NT_SUCCESS(errCode) ) {
98 SetLastErrorByStatus (errCode);
108 PostQueuedCompletionStatus(
109 HANDLE CompletionPort,
110 DWORD dwNumberOfBytesTransferred,
111 DWORD dwCompletionKey,
112 LPOVERLAPPED lpOverlapped
116 errCode = NtSetIoCompletion(CompletionPort, dwCompletionKey, (PIO_STATUS_BLOCK)lpOverlapped , 0, (PULONG)&dwNumberOfBytesTransferred );
118 if ( !NT_SUCCESS(errCode) ) {
119 SetLastErrorByStatus (errCode);
126 // this should be a place holder ??????????????????
129 FileIOCompletionRoutine(
131 DWORD dwNumberOfBytesTransfered,
132 LPOVERLAPPED lpOverlapped
140 CancelIo(HANDLE hFile)
142 IO_STATUS_BLOCK IoStatusBlock;
145 Status = NtCancelIoFile(hFile,
147 if (!NT_SUCCESS(Status))
149 SetLastErrorByStatus(Status);