source: trunk/src/kernel32/overlappedio.h@ 7564

Last change on this file since 7564 was 7564, checked in by sandervl, 24 years ago

overlappedio, com & lpt updates

File size: 4.0 KB
Line 
1/* $Id: overlappedio.h,v 1.5 2001-12-07 11:28:11 sandervl Exp $ */
2
3/*
4 * Win32 overlapped IO class
5 *
6 * Copyright 2001 Sander van Leeuwen <sandervl@xs4all.nl>
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12#ifndef __OVERLAPPEDIO_H__
13#define __OVERLAPPEDIO_H__
14
15#define NR_ASYNC_OPERATIONS 3
16#define ASYNC_INDEX_READ 0
17#define ASYNC_INDEX_WRITE 1
18#define ASYNC_INDEX_POLL 2
19
20#define ASYNCIO_READ 1
21#define ASYNCIO_WRITE 2
22#define ASYNCIO_READWRITE 4
23#define ASYNCIO_POLL 8
24
25//forward decl
26class OverlappedIOHandler;
27
28typedef struct {
29 DWORD dwOperation;
30 OverlappedIOHandler *lpOverlappedObj;
31} OVERLAPPED_THREAD_PARAM, *LPOVERLAPPED_THREAD_PARAM;
32
33typedef struct tagOVERLAPPED_ODIN{
34 DWORD dwAsyncType;
35 HANDLE hHandle;
36 LPCVOID lpBuffer;
37 DWORD nNumberOfBytes;
38 DWORD dwTimeOut;
39 LPOVERLAPPED lpOverlapped;
40 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
41 DWORD *lpdwResult;
42 DWORD dwLastError;
43 DWORD dwUserData;
44 tagOVERLAPPED_ODIN *next;
45} ASYNCIOREQUEST, *LPASYNCIOREQUEST;
46
47typedef BOOL (* LPOVERLAPPED_HANDLER)(LPASYNCIOREQUEST lpRequest, DWORD *lpdwResult, DWORD *lpdwTimeOut);
48
49enum OverlappedIOError {
50 InvalidParameter, OutOfMemory, EventCreationFailed, ThreadCreationFailed
51};
52
53class OverlappedIOHandler
54{
55public:
56 OverlappedIOHandler(LPOVERLAPPED_HANDLER lpReadHandler,
57 LPOVERLAPPED_HANDLER lpWriteHandler,
58 LPOVERLAPPED_HANDLER lpPollHandler = NULL);
59 ~OverlappedIOHandler();
60
61 BOOL WriteFile(HANDLE hHandle,
62 LPCVOID lpBuffer,
63 DWORD nNumberOfBytesToWrite,
64 LPDWORD lpNumberOfBytesWritten,
65 LPOVERLAPPED lpOverlapped,
66 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
67 DWORD dwUserData,
68 DWORD dwTimeOut = INFINITE);
69
70 BOOL ReadFile(HANDLE hHandle,
71 LPCVOID lpBuffer,
72 DWORD nNumberOfBytesToRead,
73 LPDWORD lpNumberOfBytesRead,
74 LPOVERLAPPED lpOverlapped,
75 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
76 DWORD dwUserData,
77 DWORD dwTimeOut = INFINITE);
78
79 BOOL WaitForEvent(HANDLE hHandle,
80 LPDWORD lpfdwEvtMask,
81 LPOVERLAPPED lpOverlapped,
82 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
83 DWORD dwUserData,
84 DWORD dwTimeOut = INFINITE);
85
86 BOOL CancelIo(HANDLE hHandle);
87
88 BOOL GetOverlappedResult(HANDLE hHandle,
89 LPOVERLAPPED lpoOverlapped,
90 LPDWORD lpcbTransfer,
91 BOOL fWait);
92
93protected:
94
95private:
96 LPASYNCIOREQUEST findAndRemoveRequest(int index, HANDLE hHandle);
97
98 DWORD threadHandler(DWORD fEvent);
99
100 HANDLE hThreadPoll;
101 HANDLE hThreadRead;
102 HANDLE hThreadWrite;
103 HANDLE hEventExit;
104 HANDLE hEventPoll;
105 HANDLE hEventRead;
106 HANDLE hEventWrite;
107
108 LPOVERLAPPED_HANDLER lpReadHandler;
109 LPOVERLAPPED_HANDLER lpWriteHandler;
110 LPOVERLAPPED_HANDLER lpPollHandler;
111
112 CRITICAL_SECTION critsect;
113
114 DWORD dwAsyncType;
115 //[ASYNC_INDEX_READ] list of pending read (+ write if half-duplex mode) operations
116 //[ASYNC_INDEX_WRITE] list of pending write (full-duplex mode) operations
117 //[ASYNC_INDEX_POLL] list of pending poll operations
118 LPASYNCIOREQUEST pending[NR_ASYNC_OPERATIONS];
119
120 friend DWORD CALLBACK OverlappedIOThread(LPVOID lpThreadParam);
121};
122
123
124#endif // __OVERLAPPEDIO_H__
Note: See TracBrowser for help on using the repository browser.