:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / kernel32 / file / iocompl.c
1 /* $Id$
2  *
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)
8  * UPDATE HISTORY:
9  *                  Created 01/11/98
10  */
11
12 #include <ddk/ntddk.h>
13 #include <windows.h>
14 #include <wchar.h>
15
16
17 #include <kernel32/error.h>
18
19
20 typedef struct _FILE_COMPLETION_INFORMATION {
21     HANDLE CompletionPort;
22     ULONG CompletionKey;
23 } FILE_COMPLETION_INFORMATION;
24 typedef FILE_COMPLETION_INFORMATION *PFILE_COMPLETION_INFORMATION;
25
26
27 VOID
28 STDCALL
29 FileIOCompletionRoutine(
30         DWORD dwErrorCode,
31         DWORD dwNumberOfBytesTransfered,
32         LPOVERLAPPED lpOverlapped
33         );
34
35
36 HANDLE
37 STDCALL
38 CreateIoCompletionPort(
39     HANDLE FileHandle,
40     HANDLE ExistingCompletionPort,
41     DWORD CompletionKey,
42     DWORD NumberOfConcurrentThreads
43     )
44 {
45         HANDLE CompletionPort = NULL;
46         NTSTATUS errCode;
47         FILE_COMPLETION_INFORMATION CompletionInformation;
48         IO_STATUS_BLOCK IoStatusBlock;
49
50         if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE ) {
51                 SetLastErrorByStatus (STATUS_INVALID_PARAMETER);
52                 return FALSE;
53         }
54
55         if ( ExistingCompletionPort != NULL ) {
56                 CompletionPort = ExistingCompletionPort;
57         }
58         else {
59                 errCode = NtCreateIoCompletion(&CompletionPort,GENERIC_ALL,&IoStatusBlock,NumberOfConcurrentThreads);
60                 if (!NT_SUCCESS(errCode) ) {
61                         SetLastErrorByStatus (errCode);
62                         return FALSE;
63                 }
64
65         }
66         if ( FileHandle != INVALID_HANDLE_VALUE ) {
67
68                 CompletionInformation.CompletionPort = CompletionPort;
69                 CompletionInformation.CompletionKey  = CompletionKey;
70
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);
76                         return FALSE;
77                 }
78         }
79
80         return CompletionPort;
81 }
82
83
84 WINBOOL
85 STDCALL
86 GetQueuedCompletionStatus(
87                           HANDLE CompletionPort,
88                           LPDWORD lpNumberOfBytesTransferred,
89                           LPDWORD lpCompletionKey,
90                           LPOVERLAPPED *lpOverlapped,
91                           DWORD dwMilliseconds
92                           )
93 {
94         NTSTATUS errCode;
95         ULONG CompletionStatus;
96         LARGE_INTEGER TimeToWait;
97
98         errCode = NtRemoveIoCompletion(CompletionPort,(PULONG)lpCompletionKey,(PIO_STATUS_BLOCK)lpOverlapped,&CompletionStatus,&TimeToWait);
99         if (!NT_SUCCESS(errCode) ) {
100                 SetLastErrorByStatus (errCode);
101                 return FALSE;
102         }
103
104         return TRUE;
105 }
106
107
108 WINBOOL
109 STDCALL
110 PostQueuedCompletionStatus(
111   HANDLE CompletionPort,
112   DWORD dwNumberOfBytesTransferred,
113   DWORD dwCompletionKey,
114   LPOVERLAPPED lpOverlapped
115 )
116 {
117         NTSTATUS errCode;
118         errCode = NtSetIoCompletion(CompletionPort,  dwCompletionKey, (PIO_STATUS_BLOCK)lpOverlapped , 0, (PULONG)&dwNumberOfBytesTransferred );
119
120         if ( !NT_SUCCESS(errCode) ) {
121                 SetLastErrorByStatus (errCode);
122                 return FALSE;
123         }
124         return TRUE;
125 }
126
127
128 // this should be a place holder ??????????????????
129 VOID
130 STDCALL
131 FileIOCompletionRoutine(
132         DWORD dwErrorCode,
133         DWORD dwNumberOfBytesTransfered,
134         LPOVERLAPPED lpOverlapped
135         )
136 {
137         return;
138 }
139
140
141 /* EOF */