source: trunk/src/kernel32/devio.cpp@ 73

Last change on this file since 73 was 51, checked in by sandervl, 26 years ago

* empty log message *

File size: 10.2 KB
Line 
1/*
2 * Win32 Device IOCTL API functions for OS/2
3 *
4 * Copyright 1998 Sander van Leeuwen
5 *
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10#define INCL_DOSPROFILE
11#define INCL_DOSDEVICES
12#define INCL_DOSDEVIOCTL
13#define INCL_GPI
14#define INCL_DOSFILEMGR /* File Manager values */
15#define INCL_DOSERRORS /* DOS Error values */
16#define INCL_DOSPROCESS /* DOS Process values */
17#define INCL_DOSMISC /* DOS Miscellanous values */
18#include <os2.h>
19#include <string.h>
20
21#include <win32type.h>
22#include <misc.h>
23#include "devio.h"
24#include "cio.h"
25#include "map.h"
26#include "except.h"
27
28static fX86Init = FALSE;
29//SvL: Used in iccio.asm (how can you put these in the .asm data segment without messing things up?)
30ULONG ioentry = 0;
31USHORT gdt = 0;
32char devname[] = "/dev/fastio$";
33
34static BOOL GpdDevIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
35static BOOL MAPMEMIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
36static BOOL FXMEMMAPIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
37
38static WIN32DRV knownDriver[] =
39 {{"GpdDev", "", TRUE, 666, GpdDevIOCtl},
40 {"MAPMEM", "PMAP$", FALSE, 0, MAPMEMIOCtl},
41 {"FXMEMMAP.VXD", "PMAP$", FALSE, 0, FXMEMMAPIOCtl}};
42
43static int nrKnownDrivers = sizeof(knownDriver)/sizeof(WIN32DRV);
44
45//******************************************************************************
46//******************************************************************************
47BOOL WIN32API DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
48 LPVOID lpInBuffer, DWORD nInBufferSize,
49 LPVOID lpOutBuffer, DWORD nOutBufferSize,
50 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
51{
52 int i;
53
54 for(i=0;i<nrKnownDrivers;i++) {
55 if(hDevice == knownDriver[i].hDevice) {
56 return knownDriver[i].devIOCtl(hDevice, dwIoControlCode,
57 lpInBuffer, nInBufferSize,
58 lpOutBuffer, nOutBufferSize,
59 lpBytesReturned, lpOverlapped);
60 }
61 }
62 dprintf(("DeviceIoControl: Device not found!\n"));
63 return(FALSE);
64}
65//******************************************************************************
66//******************************************************************************
67static BOOL GpdDevIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
68{
69 ULONG port, val = 0;
70
71 if(fX86Init == FALSE) {
72 if(io_init() == 0)
73 fX86Init = TRUE;
74 else return(FALSE);
75 }
76
77 *lpBytesReturned = 0;
78
79 port = ((GENPORT_WRITE_INPUT *)lpInBuffer)->PortNumber;
80
81 switch((dwIoControlCode >> 2) & 0xFFF) {
82 case IOCTL_GPD_READ_PORT_UCHAR:
83 if(nOutBufferSize < sizeof(char))
84 return(FALSE);
85
86 val = c_inb(port);
87 *(char *)lpOutBuffer = val;
88 *lpBytesReturned = sizeof(char);
89 break;
90 case IOCTL_GPD_READ_PORT_USHORT:
91 if(nOutBufferSize < sizeof(USHORT))
92 return(FALSE);
93
94 val = c_inw(port);
95 *(USHORT *)lpOutBuffer = val;
96 *lpBytesReturned = sizeof(USHORT);
97 break;
98 case IOCTL_GPD_READ_PORT_ULONG:
99 if(nOutBufferSize < sizeof(ULONG))
100 return(FALSE);
101
102 val = c_inl(port);
103 *(ULONG *)lpOutBuffer = val;
104 *lpBytesReturned = sizeof(ULONG);
105 break;
106 case IOCTL_GPD_WRITE_PORT_UCHAR:
107 val = ((GENPORT_WRITE_INPUT *)lpInBuffer)->CharData;
108 c_outb(port, val);
109 break;
110 case IOCTL_GPD_WRITE_PORT_USHORT:
111 val = ((GENPORT_WRITE_INPUT *)lpInBuffer)->ShortData;
112 c_outw(port, val);
113 break;
114 case IOCTL_GPD_WRITE_PORT_ULONG:
115 val = ((GENPORT_WRITE_INPUT *)lpInBuffer)->LongData;
116 c_outl(port, val);
117 break;
118 default:
119 dprintf(("GpdDevIOCtl unknown func %X\n", (dwIoControlCode >> 2) & 0xFFF));
120 return(FALSE);
121 }
122
123 return(TRUE);
124}
125//******************************************************************************
126//******************************************************************************
127static BOOL MAPMEMIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
128{
129 PHYSICAL_MEMORY_INFO *meminfo = (PHYSICAL_MEMORY_INFO *)lpInBuffer;
130 struct map_ioctl memmap;
131
132 *lpBytesReturned = 0;
133
134 switch((dwIoControlCode >> 2) & 0xFFF) {
135 case IOCTL_MAPMEM_MAP_USER_PHYSICAL_MEMORY:
136 if(nInBufferSize != sizeof(PHYSICAL_MEMORY_INFO))
137 return(FALSE);
138
139 memmap.a.phys = meminfo->BusAddress.u.LowPart;
140 memmap.size = meminfo->Length;
141 dprintf(("DeviceIoControl map phys address %X length %X\n", memmap.a.phys, memmap.size));
142 if(mpioctl((HFILE)hDevice, IOCTL_MAP, &memmap) == -1) {
143 dprintf(("mpioctl failed!\n"));
144 return(FALSE);
145 }
146
147 dprintf(("DeviceIoControl map virt address = %X\n", memmap.a.user));
148 *(ULONG *)lpOutBuffer = (ULONG)memmap.a.user;
149 break;
150 case IOCTL_MAPMEM_UNMAP_USER_PHYSICAL_MEMORY:
151 dprintf(("Unmap mapping %X\n", *(ULONG *)lpInBuffer));
152 memmap.a.phys = *(ULONG *)lpInBuffer;
153 memmap.size = 0;
154 if(mpioctl((HFILE)hDevice, IOCTL_MAP, &memmap) == -1)
155 return(FALSE);
156 break;
157 default:
158 dprintf(("MAPMEMIOCtl unknown func %X\n", (dwIoControlCode >> 2) & 0xFFF));
159 return(FALSE);
160 }
161
162 return(TRUE);
163}
164//******************************************************************************
165//******************************************************************************
166static BOOL FXMEMMAPIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
167{
168 struct map_ioctl memmap;
169 MAPDEVREQUEST *vxdmem = (MAPDEVREQUEST *)lpInBuffer;
170
171 switch(dwIoControlCode) {
172 case 1:
173 break;
174 case 2:
175// _interrupt(3);
176 memmap.a.phys = (DWORD)vxdmem->mdr_PhysicalAddress;
177 memmap.size = vxdmem->mdr_SizeInBytes;
178 dprintf(("DeviceIoControl map phys address %X length %X\n", memmap.a.phys, memmap.size));
179 if(mpioctl((HFILE)hDevice, IOCTL_MAP, &memmap) == -1) {
180 dprintf(("mpioctl failed!\n"));
181 return(FALSE);
182 }
183
184 dprintf(("DeviceIoControl map virt address = %X\n", memmap.a.user));
185 vxdmem->mdr_LinearAddress = (PVOID)memmap.a.user;
186 break;
187 default:
188 dprintf(("FXMEMMAPIOCtl unknown func %X\n", (dwIoControlCode >> 2) & 0xFFF));
189 return(FALSE);
190 }
191
192 return(TRUE);
193}
194//******************************************************************************
195//******************************************************************************
196void OS2CloseFile(HANDLE hDevice)
197{
198 DosClose((HFILE)hDevice);
199}
200//******************************************************************************
201//******************************************************************************
202HANDLE OS2CreateFile(char *szName, DWORD fdwAccess, DWORD fdwShareMode)
203{
204 APIRET rc;
205 int i;
206 char *drvname = NULL;
207 HFILE hfFileHandle = 0L; /* Handle for file being manipulated */
208 ULONG ulAction = 0; /* Action taken by DosOpen */
209 ULONG sharetype = 0;
210
211 for(i=0;i<nrKnownDrivers;i++) {
212 if(strcmp(szName, knownDriver[i].szWin32Name) == 0) {
213 drvname = knownDriver[i].szOS2Name;
214 break;
215 }
216 }
217 if(drvname == 0) {
218 return(0);
219 }
220
221 //TODO
222 if(knownDriver[i].fCreateFile == TRUE)
223 return(knownDriver[i].hDevice);
224
225 if(fdwAccess & (GENERIC_READ | GENERIC_WRITE))
226 sharetype |= OPEN_ACCESS_READWRITE;
227 else
228 if(fdwAccess & GENERIC_WRITE)
229 sharetype |= OPEN_ACCESS_WRITEONLY;
230
231 if(fdwShareMode == 0)
232 sharetype |= OPEN_SHARE_DENYREADWRITE;
233 else
234 if(fdwShareMode & (FILE_SHARE_READ | FILE_SHARE_WRITE))
235 sharetype |= OPEN_SHARE_DENYNONE;
236 else
237 if(fdwShareMode & FILE_SHARE_WRITE)
238 sharetype |= OPEN_SHARE_DENYREAD;
239 else
240 if(fdwShareMode & FILE_SHARE_READ)
241 sharetype |= OPEN_SHARE_DENYWRITE;
242
243 rc = DosOpen( drvname, /* File path name */
244 &hfFileHandle, /* File handle */
245 &ulAction, /* Action taken */
246 0,
247 FILE_NORMAL,
248 FILE_OPEN,
249 sharetype,
250 0L); /* No extended attribute */
251
252 dprintf(("DosOpen %s returned %d\n", drvname, rc));
253
254 if(rc == NO_ERROR) {
255 knownDriver[i].hDevice = (DWORD)hfFileHandle;
256 return((HANDLE)hfFileHandle);
257 }
258 else return(0);
259}
260//******************************************************************************
261//******************************************************************************
262BOOL WIN32API QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)
263{
264 QWORD time;
265 APIRET rc;
266
267 rc = DosTmrQueryTime(&time);
268 if(rc) {
269 dprintf(("DosTmrQueryTime returned %d\n", rc));
270 return(FALSE);
271 }
272 lpPerformanceCount->u.LowPart = time.ulLo;
273 lpPerformanceCount->u.HighPart = time.ulHi;
274 return(TRUE);
275}
276//******************************************************************************
277//******************************************************************************
278BOOL WIN32API QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
279{
280 APIRET rc;
281 ULONG freq;
282
283 rc = DosTmrQueryFreq(&freq);
284 if(rc) {
285 dprintf(("DosTmrQueryFreq returned %d\n", rc));
286 return(FALSE);
287 }
288 lpFrequency->u.LowPart = freq;
289 lpFrequency->u.HighPart = 0;
290 dprintf(("OS2QueryPerformanceFrequency returned 0x%X%X\n", lpFrequency->u.HighPart, lpFrequency->u.LowPart));
291 return(TRUE);
292}
293//******************************************************************************
294//******************************************************************************
295
Note: See TracBrowser for help on using the repository browser.