Changeset 5905 for trunk/src/kernel32/hmdevio.cpp
- Timestamp:
- Jun 4, 2001, 11:18:40 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdevio.cpp
r5771 r5905 1 /* $Id: hmdevio.cpp,v 1.1 1 2001-05-20 11:02:43sandervl Exp $ */1 /* $Id: hmdevio.cpp,v 1.12 2001-06-04 21:18:39 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 #include <os2wrap.h> //Odin32 OS/2 api wrappers 21 21 #include <string.h> 22 #include <stdio.h> 22 23 23 24 #include <win32type.h> 24 25 #include <win32api.h> 25 26 #include <misc.h> 27 #include <win\winioctl.h> 26 28 #include "hmdevio.h" 27 29 #include "cio.h" … … 48 50 { "FXMEMMAP.VXD", "PMAP$", FALSE, 0, FXMEMMAPIOCtl}, 49 51 #if 1 50 { "\\\\.\\VPCAppSv", "", 52 { "\\\\.\\VPCAppSv", "", TRUE, 667, VPCIOCtl}}; 51 53 #else 52 54 }; … … 54 56 55 57 static int nrKnownDrivers = sizeof(knownDriver)/sizeof(WIN32DRV); 58 BOOL fVirtualPC = FALSE; 56 59 57 60 //****************************************************************************** … … 74 77 knownDriver[i].szWin32Name, rc)); 75 78 } 79 80 //check registry for Odin driver plugin dlls 81 HKEY hkDrivers, hkDrvDll; 82 83 rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, 84 "System\\CurrentControlSet\\Services", 85 0, KEY_READ, &hkDrivers); 86 87 if(rc == 0) { 88 char szDllName[CCHMAXPATH]; 89 char szKeyName[CCHMAXPATH]; 90 char szDrvName[CCHMAXPATH]; 91 DWORD dwType, dwSize; 92 int iSubKey = 0; 93 94 while(rc == 0) { 95 rc = RegEnumKeyA(hkDrivers, iSubKey++, szKeyName, sizeof(szKeyName)); 96 if(rc) break; 97 98 rc = RegOpenKeyExA(hkDrivers, szKeyName, 99 0, KEY_READ, &hkDrvDll); 100 if(rc == 0) { 101 dwSize = sizeof(szDllName); 102 rc = RegQueryValueExA(hkDrvDll, 103 "DllName", 104 NULL, 105 &dwType, 106 (LPBYTE)szDllName, 107 &dwSize); 108 109 RegCloseKey(hkDrvDll); 110 if(rc == 0 && dwType == REG_SZ) 111 { 112 HINSTANCE hDrvDll = LoadLibraryA(szDllName); 113 if(hDrvDll) { 114 sprintf(szDrvName, "\\\\.\\%s", szKeyName); 115 driver = new HMCustomDriver(hDrvDll, szDrvName); 116 117 rc = HMDeviceRegister(szDrvName, driver); 118 if (rc != NO_ERROR) /* check for errors */ 119 dprintf(("KERNEL32:RegisterDevices: registering %s failed with %u.\n", szDrvName, rc)); 120 } 121 } 122 rc = 0; 123 } 124 } 125 RegCloseKey(hkDrivers); 126 } 127 76 128 return; 77 129 } … … 85 137 this->szOS2Name = lpOS2DevName; 86 138 this->devIOCtl = pDevIOCtl; 139 } 140 //****************************************************************************** 141 //****************************************************************************** 142 HMDeviceDriver::HMDeviceDriver(LPCSTR lpDeviceName) 143 : HMDeviceKernelObjectClass(lpDeviceName) 144 { 87 145 } 88 146 //****************************************************************************** … … 306 364 static BOOL VPCIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) 307 365 { 366 APIRET rc; 367 368 dprintf(("VPCIOCtl func %x: %x %d %x %d %x %x", dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped)); 308 369 switch(dwIoControlCode) { 309 370 case 0x9C402880: //0x00 310 dprintf(("VPCIOCtl func 0x9C402880: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));311 371 if(nOutBufferSize < 4) { 312 372 SetLastError(ERROR_BAD_LENGTH); … … 316 376 *lpBytesReturned = 4; 317 377 return TRUE; 378 318 379 case 0x9C402894: //0x14 (get IDT table) 319 380 { 320 381 DWORD *lpBuffer = (DWORD *)lpOutBuffer; 321 dprintf(("VPCIOCtl func 0x9C402894: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));322 382 if(nOutBufferSize < 0x800) { 323 383 SetLastError(ERROR_BAD_LENGTH); … … 335 395 } 336 396 case 0x9C40288C: //0x0C change IDT 337 dprintf(("VPCIOCtl func 0x9C40288C: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));338 397 if(nInBufferSize < 0x22) { 339 398 SetLastError(ERROR_BAD_LENGTH); 340 399 return FALSE; 341 400 } 401 fVirtualPC = TRUE; 342 402 return TRUE; 343 case 0x9C402884: //0x04 344 dprintf(("VPCIOCtl func 0x9C402884: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped)); 403 404 case 0x9C402884: //0x04 ExAllocatePoolWithTag 405 { 406 DWORD *lpBuffer = (DWORD *)lpInBuffer; 345 407 if(nInBufferSize < 0x08) { 346 408 SetLastError(ERROR_BAD_LENGTH); 347 409 return FALSE; 348 410 } 411 dprintf(("In: %x %x", lpBuffer[0], lpBuffer[1])); 349 412 return TRUE; 413 } 350 414 351 415 case 0x9C402898: //0x18 Remove IDT patch 352 dprintf(("VPCIOCtl func 0x9C402898: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));353 416 if(nInBufferSize < 0x01) { 354 417 SetLastError(ERROR_BAD_LENGTH); 355 418 return FALSE; 356 419 } 420 fVirtualPC = FALSE; 357 421 return TRUE; 358 359 422 default: 360 423 dprintf(("VPCIOCtl unknown func %X\n", dwIoControlCode)); 361 424 return FALSE; 362 425 } 426 } 427 //****************************************************************************** 428 //****************************************************************************** 429 HMCustomDriver::HMCustomDriver(HINSTANCE hInstance, LPCSTR lpDeviceName) 430 : HMDeviceDriver(lpDeviceName) 431 { 432 hDrvDll = hInstance ; 433 *(ULONG *)&driverOpen = (ULONG)GetProcAddress(hDrvDll, "DrvOpen"); 434 *(ULONG *)&driverClose = (ULONG)GetProcAddress(hDrvDll, "DrvClose"); 435 *(ULONG *)&driverIOCtl = (ULONG)GetProcAddress(hDrvDll, "DrvIOCtl"); 436 } 437 //****************************************************************************** 438 //****************************************************************************** 439 HMCustomDriver::~HMCustomDriver() 440 { 441 FreeLibrary(hDrvDll); 442 } 443 //****************************************************************************** 444 //****************************************************************************** 445 DWORD HMCustomDriver::CreateFile (LPCSTR lpFileName, 446 PHMHANDLEDATA pHMHandleData, 447 PVOID lpSecurityAttributes, 448 PHMHANDLEDATA pHMHandleDataTemplate) 449 { 450 pHMHandleData->hHMHandle = driverOpen(pHMHandleData->dwAccess, pHMHandleData->dwShare); 451 if(pHMHandleData->hHMHandle == 0) { 452 return 2; 453 } 454 return 0; 455 } 456 //****************************************************************************** 457 //****************************************************************************** 458 BOOL HMCustomDriver::CloseHandle(PHMHANDLEDATA pHMHandleData) 459 { 460 if(pHMHandleData->hHMHandle) { 461 driverClose(pHMHandleData->hHMHandle); 462 } 463 pHMHandleData->hHMHandle = 0; 464 return TRUE; 465 } 466 //****************************************************************************** 467 //****************************************************************************** 468 BOOL HMCustomDriver::DeviceIoControl(PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode, 469 LPVOID lpInBuffer, DWORD nInBufferSize, 470 LPVOID lpOutBuffer, DWORD nOutBufferSize, 471 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) 472 { 473 return driverIOCtl(pHMHandleData->hHMHandle, dwIoControlCode, lpInBuffer, nInBufferSize, 474 lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped); 363 475 } 364 476 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.