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)
12 #include <ddk/ntddk.h>
17 #include <kernel32/error.h>
20 typedef struct _FILE_COMPLETION_INFORMATION {
21 HANDLE CompletionPort;
23 } FILE_COMPLETION_INFORMATION;
24 typedef FILE_COMPLETION_INFORMATION *PFILE_COMPLETION_INFORMATION;
29 FileIOCompletionRoutine(
31 DWORD dwNumberOfBytesTransfered,
32 LPOVERLAPPED lpOverlapped
38 CreateIoCompletionPort(
40 HANDLE ExistingCompletionPort,
42 DWORD NumberOfConcurrentThreads
45 HANDLE CompletionPort = NULL;
47 FILE_COMPLETION_INFORMATION CompletionInformation;
48 IO_STATUS_BLOCK IoStatusBlock;
50 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE ) {
51 SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
55 if ( ExistingCompletionPort != NULL ) {
56 CompletionPort = ExistingCompletionPort;
59 errCode = NtCreateIoCompletion(&CompletionPort,GENERIC_ALL,&IoStatusBlock,NumberOfConcurrentThreads);
60 if (!NT_SUCCESS(errCode) ) {
61 SetLastErrorByStatus (errCode);
66 if ( FileHandle != INVALID_HANDLE_VALUE ) {
68 CompletionInformation.CompletionPort = CompletionPort;
69 CompletionInformation.CompletionKey = CompletionKey;
71 errCode = NtSetInformationFile(FileHandle, &IoStatusBlock,&CompletionInformation,sizeof(FILE_COMPLETION_INFORMATION),FileCompletionInformation);
72 if ( !NT_SUCCESS(errCode) ) {
73 if ( ExistingCompletionPort == NULL )
74 NtClose(CompletionPort);
75 SetLastErrorByStatus (errCode);
80 return CompletionPort;
86 GetQueuedCompletionStatus(
87 HANDLE CompletionPort,
88 LPDWORD lpNumberOfBytesTransferred,
89 LPDWORD lpCompletionKey,
90 LPOVERLAPPED *lpOverlapped,
95 ULONG CompletionStatus;
96 LARGE_INTEGER TimeToWait;
98 errCode = NtRemoveIoCompletion(CompletionPort,(PULONG)lpCompletionKey,(PIO_STATUS_BLOCK)lpOverlapped,&CompletionStatus,&TimeToWait);
99 if (!NT_SUCCESS(errCode) ) {
100 SetLastErrorByStatus (errCode);
110 PostQueuedCompletionStatus(
111 HANDLE CompletionPort,
112 DWORD dwNumberOfBytesTransferred,
113 DWORD dwCompletionKey,
114 LPOVERLAPPED lpOverlapped
118 errCode = NtSetIoCompletion(CompletionPort, dwCompletionKey, (PIO_STATUS_BLOCK)lpOverlapped , 0, (PULONG)&dwNumberOfBytesTransferred );
120 if ( !NT_SUCCESS(errCode) ) {
121 SetLastErrorByStatus (errCode);
128 // this should be a place holder ??????????????????
131 FileIOCompletionRoutine(
133 DWORD dwNumberOfBytesTransfered,
134 LPOVERLAPPED lpOverlapped