[7550] | 1 | /* $Id: hmnul.cpp,v 1.3 2001-12-05 18:06:01 sandervl Exp $ */
|
---|
[7476] | 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 |
|
---|
| 28 | HMDeviceNulClass::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 | *****************************************************************************/
|
---|
| 53 | BOOL 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 |
|
---|
[7549] | 62 | DWORD HMDeviceNulClass::CreateFile(LPCSTR lpFileName,
|
---|
| 63 | PHMHANDLEDATA pHMHandleData,
|
---|
| 64 | PVOID lpSecurityAttributes,
|
---|
| 65 | PHMHANDLEDATA pHMHandleDataTemplate)
|
---|
[7476] | 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() */
|
---|
| 82 | BOOL 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 |
|
---|
| 107 | BOOL HMDeviceNulClass::WriteFile(PHMHANDLEDATA pHMHandleData,
|
---|
[7549] | 108 | LPCVOID lpBuffer,
|
---|
| 109 | DWORD nNumberOfBytesToWrite,
|
---|
| 110 | LPDWORD lpNumberOfBytesWritten,
|
---|
| 111 | LPOVERLAPPED lpOverlapped,
|
---|
| 112 | LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
|
---|
[7476] | 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 | }
|
---|
[7550] | 133 |
|
---|
| 134 | if(lpCompletionRoutine) {
|
---|
| 135 | dprintf(("!WARNING!: lpCompletionRoutine not supported -> fall back to sync IO"));
|
---|
| 136 | }
|
---|
[7476] | 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 |
|
---|
| 169 | BOOL HMDeviceNulClass::ReadFile(PHMHANDLEDATA pHMHandleData,
|
---|
[7549] | 170 | LPCVOID lpBuffer,
|
---|
| 171 | DWORD nNumberOfBytesToRead,
|
---|
| 172 | LPDWORD lpNumberOfBytesRead,
|
---|
| 173 | LPOVERLAPPED lpOverlapped,
|
---|
| 174 | LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
|
---|
[7476] | 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 | }
|
---|
[7550] | 195 |
|
---|
| 196 | if(lpCompletionRoutine) {
|
---|
| 197 | dprintf(("!WARNING!: lpCompletionRoutine not supported -> fall back to sync IO"));
|
---|
| 198 | }
|
---|
[7476] | 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 |
|
---|
| 214 | BOOL 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 | }
|
---|