source: trunk/src/kernel32/hmnul.cpp@ 22018

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

overlapped io updates

File size: 7.1 KB
Line 
1/* $Id: hmnul.cpp,v 1.3 2001-12-05 18:06:01 sandervl Exp $ */
2
3/*
4 * Project Odin Software License can be found in LICENSE.TXT
5 *
6 * Win32 NUL device access class
7 *
8 * 2001 Patrick Haller <patrick.haller@innotek.de>
9 *
10 */
11
12
13
14#include <os2win.h>
15#include <string.h>
16#include <handlemanager.h>
17#include "handlenames.h"
18#include <heapstring.h>
19#include <winioctl.h>
20#include "hmdevice.h"
21#include "hmnul.h"
22#include "oslibdos.h"
23
24#define DBG_LOCALLOG DBG_hmnul
25#include "dbglocal.h"
26
27
28HMDeviceNulClass::HMDeviceNulClass(LPCSTR lpDeviceName) : HMDeviceHandler(lpDeviceName)
29{
30 dprintf(("HMDeviceNulClass::HMDevParPortClass(%s)\n",
31 lpDeviceName));
32
33 HMDeviceRegister("NUL", this);
34
35 // add symbolic links to the "real name" of the device
36 HandleNamesAddSymbolicLink("NUL:", "NUL");
37 HandleNamesAddSymbolicLink("\\\\.\\NUL", "NUL");
38}
39
40/*****************************************************************************
41 * Name : HMDeviceNulClass::FindDevice
42 * Purpose : Checks if lpDeviceName belongs to this device class
43 * Parameters: LPCSTR lpClassDevName
44 * LPCSTR lpDeviceName
45 * int namelength
46 * Variables :
47 * Result : checks if name is COMx or COMx: (x=1..8)
48 * Remark :
49 * Status :
50 *
51 * Author : SvL
52 *****************************************************************************/
53BOOL HMDeviceNulClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
54{
55 // == "NUL"
56 if(lstrcmpiA(lpDeviceName, lpClassDevName) != 0)
57 return FALSE;
58
59 return TRUE;
60}
61
62DWORD HMDeviceNulClass::CreateFile(LPCSTR lpFileName,
63 PHMHANDLEDATA pHMHandleData,
64 PVOID lpSecurityAttributes,
65 PHMHANDLEDATA pHMHandleDataTemplate)
66{
67 dprintf(("HMDeviceNulClass::CreateFile(%s,%08xh,%08xh,%08xh)\n",
68 lpFileName,
69 pHMHandleData,
70 lpSecurityAttributes,
71 pHMHandleDataTemplate));
72
73 // we don't actually open a handle to OS/2's NUL device,
74 // we just swallow any I/O
75 pHMHandleData->hHMHandle = 0xdeadface;
76 SetLastError(ERROR_SUCCESS);
77 return NO_ERROR;
78}
79
80
81 /* this is a handler method for calls to CloseHandle() */
82BOOL HMDeviceNulClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
83{
84 dprintf(("HMDeviceNulClass: close request(%08xh)\n",
85 pHMHandleData));
86
87 return TRUE;
88}
89
90
91/*****************************************************************************
92 * Name : BOOL HMDeviceNulClass::WriteFile
93 * Purpose : write data to handle / device
94 * Parameters: PHMHANDLEDATA pHMHandleData,
95 * LPCVOID lpBuffer,
96 * DWORD nNumberOfBytesToWrite,
97 * LPDWORD lpNumberOfBytesWritten,
98 * LPOVERLAPPED lpOverlapped
99 * Variables :
100 * Result : Boolean
101 * Remark :
102 * Status :
103 *
104 * Author : Patrick Haller [2001/11/29]
105 *****************************************************************************/
106
107BOOL HMDeviceNulClass::WriteFile(PHMHANDLEDATA pHMHandleData,
108 LPCVOID lpBuffer,
109 DWORD nNumberOfBytesToWrite,
110 LPDWORD lpNumberOfBytesWritten,
111 LPOVERLAPPED lpOverlapped,
112 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
113{
114 dprintf(("KERNEL32:HMDeviceNulClass::WriteFile %s(%08x,%08x,%08x,%08x,%08x)",
115 lpHMDeviceName,
116 pHMHandleData->hHMHandle,
117 lpBuffer,
118 nNumberOfBytesToWrite,
119 lpNumberOfBytesWritten,
120 lpOverlapped));
121
122 BOOL ret;
123 ULONG ulBytesWritten;
124
125 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) {
126 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!"));
127 SetLastError(ERROR_INVALID_PARAMETER);
128 return FALSE;
129 }
130 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) {
131 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation"));
132 }
133
134 if(lpCompletionRoutine) {
135 dprintf(("!WARNING!: lpCompletionRoutine not supported -> fall back to sync IO"));
136 }
137
138 // this is real NUL I/O
139 ret = NO_ERROR;
140 ulBytesWritten = nNumberOfBytesToWrite;
141
142 if(lpNumberOfBytesWritten) {
143 *lpNumberOfBytesWritten = (ret) ? ulBytesWritten : 0;
144 }
145 if(ret == FALSE) {
146 dprintf(("ERROR: WriteFile failed with rc %d", GetLastError()));
147 }
148
149 return ret;
150}
151
152
153/*****************************************************************************
154 * Name : BOOL HMDeviceNulClass::ReadFile
155 * Purpose : read data from handle / device
156 * Parameters: PHMHANDLEDATA pHMHandleData,
157 * LPCVOID lpBuffer,
158 * DWORD nNumberOfBytesToRead,
159 * LPDWORD lpNumberOfBytesRead,
160 * LPOVERLAPPED lpOverlapped
161 * Variables :
162 * Result : Boolean
163 * Remark :
164 * Status :
165 *
166 * Author : SvL
167 *****************************************************************************/
168
169BOOL HMDeviceNulClass::ReadFile(PHMHANDLEDATA pHMHandleData,
170 LPCVOID lpBuffer,
171 DWORD nNumberOfBytesToRead,
172 LPDWORD lpNumberOfBytesRead,
173 LPOVERLAPPED lpOverlapped,
174 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
175{
176 dprintf(("KERNEL32:HMDeviceNulClass::ReadFile %s(%08x,%08x,%08x,%08x,%08x)",
177 lpHMDeviceName,
178 pHMHandleData->hHMHandle,
179 lpBuffer,
180 nNumberOfBytesToRead,
181 lpNumberOfBytesRead,
182 lpOverlapped));
183
184 BOOL ret;
185 ULONG ulBytesRead;
186
187 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) {
188 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!"));
189 SetLastError(ERROR_INVALID_PARAMETER);
190 return FALSE;
191 }
192 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) {
193 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation"));
194 }
195
196 if(lpCompletionRoutine) {
197 dprintf(("!WARNING!: lpCompletionRoutine not supported -> fall back to sync IO"));
198 }
199
200 // this is real NUL I/O
201 ret = NO_ERROR;
202 ulBytesRead = nNumberOfBytesToRead;
203
204 if(lpNumberOfBytesRead) {
205 *lpNumberOfBytesRead = (ret) ? ulBytesRead : 0;
206 }
207 if(ret == FALSE) {
208 dprintf(("ERROR: ReadFile failed with rc %d", GetLastError()));
209 }
210 return ret;
211}
212
213
214BOOL HMDeviceNulClass::DeviceIoControl(PHMHANDLEDATA pHMHandleData,
215 DWORD dwIoControlCode,
216 LPVOID lpInBuffer,
217 DWORD nInBufferSize,
218 LPVOID lpOutBuffer,
219 DWORD nOutBufferSize,
220 LPDWORD lpBytesReturned,
221 LPOVERLAPPED lpOverlapped)
222{
223 dprintf(("HMDeviceNulClass::DeviceIoControl: unimplemented dwIoControlCode=%08lx\n", dwIoControlCode));
224 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
225 return FALSE;
226}
Note: See TracBrowser for help on using the repository browser.