Ignore:
Timestamp:
Jun 4, 2001, 11:18:40 PM (24 years ago)
Author:
sandervl
Message:

plugin driver dll updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/hmdevio.cpp

    r5771 r5905  
    1 /* $Id: hmdevio.cpp,v 1.11 2001-05-20 11:02:43 sandervl Exp $ */
     1/* $Id: hmdevio.cpp,v 1.12 2001-06-04 21:18:39 sandervl Exp $ */
    22
    33/*
     
    2020#include <os2wrap.h>    //Odin32 OS/2 api wrappers
    2121#include <string.h>
     22#include <stdio.h>
    2223
    2324#include <win32type.h>
    2425#include <win32api.h>
    2526#include <misc.h>
     27#include <win\winioctl.h>
    2628#include "hmdevio.h"
    2729#include "cio.h"
     
    4850    { "FXMEMMAP.VXD",  "PMAP$", FALSE, 0,     FXMEMMAPIOCtl},
    4951#if 1
    50     { "\\\\.\\VPCAppSv", "",    TRUE,  667,   VPCIOCtl}};
     52    { "\\\\.\\VPCAppSv", "", TRUE,  667,   VPCIOCtl}};
    5153#else
    5254    };
     
    5456
    5557static int nrKnownDrivers = sizeof(knownDriver)/sizeof(WIN32DRV);
     58BOOL fVirtualPC = FALSE;
    5659
    5760//******************************************************************************
     
    7477                          knownDriver[i].szWin32Name, rc));
    7578    }
     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
    76128    return;
    77129}
     
    85137    this->szOS2Name   = lpOS2DevName;
    86138    this->devIOCtl    = pDevIOCtl;
     139}
     140//******************************************************************************
     141//******************************************************************************
     142HMDeviceDriver::HMDeviceDriver(LPCSTR lpDeviceName)
     143                : HMDeviceKernelObjectClass(lpDeviceName)
     144{
    87145}
    88146//******************************************************************************
     
    306364static BOOL VPCIOCtl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
    307365{
     366  APIRET rc;
     367
     368  dprintf(("VPCIOCtl func %x: %x %d %x %d %x %x", dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    308369  switch(dwIoControlCode) {
    309370  case 0x9C402880: //0x00
    310         dprintf(("VPCIOCtl func 0x9C402880: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    311371        if(nOutBufferSize < 4) {
    312372            SetLastError(ERROR_BAD_LENGTH);
     
    316376        *lpBytesReturned = 4;
    317377        return TRUE;
     378
    318379  case 0x9C402894: //0x14 (get IDT table)
    319380  {
    320381        DWORD *lpBuffer = (DWORD *)lpOutBuffer;
    321         dprintf(("VPCIOCtl func 0x9C402894: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    322382        if(nOutBufferSize < 0x800) {
    323383            SetLastError(ERROR_BAD_LENGTH);
     
    335395  }
    336396  case 0x9C40288C: //0x0C change IDT
    337         dprintf(("VPCIOCtl func 0x9C40288C: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    338397        if(nInBufferSize < 0x22) {
    339398            SetLastError(ERROR_BAD_LENGTH);
    340399            return FALSE;
    341400        }
     401        fVirtualPC = TRUE;
    342402        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;
    345407        if(nInBufferSize < 0x08) {
    346408            SetLastError(ERROR_BAD_LENGTH);
    347409            return FALSE;
    348410        }
     411        dprintf(("In: %x %x", lpBuffer[0], lpBuffer[1]));
    349412        return TRUE;
     413  }
    350414
    351415  case 0x9C402898: //0x18 Remove IDT patch
    352         dprintf(("VPCIOCtl func 0x9C402898: %d %x %d %x %x", nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    353416        if(nInBufferSize < 0x01) {
    354417            SetLastError(ERROR_BAD_LENGTH);
    355418            return FALSE;
    356419        }
     420        fVirtualPC = FALSE;
    357421        return TRUE;
    358 
    359422  default:
    360423        dprintf(("VPCIOCtl unknown func %X\n", dwIoControlCode));
    361424        return FALSE;
    362425  }
     426}
     427//******************************************************************************
     428//******************************************************************************
     429HMCustomDriver::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//******************************************************************************
     439HMCustomDriver::~HMCustomDriver()
     440{
     441   FreeLibrary(hDrvDll);
     442}
     443//******************************************************************************
     444//******************************************************************************
     445DWORD 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//******************************************************************************
     458BOOL HMCustomDriver::CloseHandle(PHMHANDLEDATA pHMHandleData)
     459{
     460   if(pHMHandleData->hHMHandle) {
     461        driverClose(pHMHandleData->hHMHandle);
     462   }
     463   pHMHandleData->hHMHandle = 0;
     464   return TRUE;
     465}
     466//******************************************************************************
     467//******************************************************************************
     468BOOL 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);
    363475}
    364476//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.