Changeset 5905 for trunk/src


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

plugin driver dll updates

Location:
trunk/src/kernel32
Files:
4 edited

Legend:

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

    r5557 r5905  
    1 /* $Id: exceptions.cpp,v 1.52 2001-04-21 09:10:13 sandervl Exp $ */
     1/* $Id: exceptions.cpp,v 1.53 2001-06-04 21:18:39 sandervl Exp $ */
    22
    33/*
     
    11081108  case XCPT_PROCESS_TERMINATE:
    11091109  case XCPT_ASYNC_PROCESS_TERMINATE:
    1110         dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1110////        dprintfException(pERepRec, pERegRec, pCtxRec, p);
    11111111        SetExceptionChain((ULONG)-1);
    11121112        goto continuesearch;
     
    11211121                goto continueFail;
    11221122        }
     1123
    11231124//------------->>> WARNING: potentially dangerous workaround!!
    11241125        /* Some apps set ES = FS and Odin doesn't like that!       */
  • 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//******************************************************************************
  • trunk/src/kernel32/hmdevio.h

    r5587 r5905  
    1 /* $Id: hmdevio.h,v 1.2 2001-04-26 13:22:44 sandervl Exp $ */
     1/* $Id: hmdevio.h,v 1.3 2001-06-04 21:18:40 sandervl Exp $ */
    22
    33#ifndef __DEVIO_H__
     
    103103              LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
    104104
     105typedef HANDLE (* WIN32API DrvOpen)(DWORD dwAccess, DWORD dwShare);
     106typedef void   (* WIN32API DrvClose)(HANDLE hDevice);
     107typedef BOOL   (* WIN32API DrvIOCtl)(HANDLE hDevice, DWORD dwIoControlCode,
     108                       LPVOID lpInBuffer, DWORD nInBufferSize,
     109                       LPVOID lpOutBuffer, DWORD nOutBufferSize,
     110                       LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
     111
    105112typedef struct {
    106113    char     szWin32Name[32];
     
    119126public:
    120127  HMDeviceDriver(LPCSTR lpDeviceName, LPSTR lpOS2DevName, BOOL fCreate, WINIOCTL pDevIOCtl);
     128  HMDeviceDriver(LPCSTR lpDeviceName);
    121129
    122130                       /* this is a handler method for calls to CreateFile() */
     
    139147};
    140148
     149class HMCustomDriver : public HMDeviceDriver
     150
     151{
     152public:
     153  HMCustomDriver(HINSTANCE hInstance, LPCSTR lpDeviceName);
     154  virtual ~HMCustomDriver();
     155
     156                       /* this is a handler method for calls to CreateFile() */
     157  virtual DWORD  CreateFile (LPCSTR        lpFileName,
     158                             PHMHANDLEDATA pHMHandleData,
     159                             PVOID         lpSecurityAttributes,
     160                             PHMHANDLEDATA pHMHandleDataTemplate);
     161
     162  virtual BOOL   CloseHandle(PHMHANDLEDATA pHMHandleData);
     163
     164                    /* this is a handler method for calls to DeviceIoControl() */
     165  virtual BOOL   DeviceIoControl    (PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode,
     166                                     LPVOID lpInBuffer, DWORD nInBufferSize,
     167                                     LPVOID lpOutBuffer, DWORD nOutBufferSize,
     168                                     LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
     169private:
     170  DrvOpen  driverOpen;
     171  DrvClose driverClose;
     172  DrvIOCtl driverIOCtl;
     173  HINSTANCE hDrvDll;
     174};
     175
    141176void  RegisterDevices();
    142177
  • trunk/src/kernel32/oslibexcept.cpp

    r5750 r5905  
    1 /* $Id: oslibexcept.cpp,v 1.6 2001-05-19 11:14:38 sandervl Exp $ */
     1/* $Id: oslibexcept.cpp,v 1.7 2001-06-04 21:18:40 sandervl Exp $ */
    22/*
    33 * Exception handler util. procedures
     
    171171  case XCPT_ILLEGAL_INSTRUCTION:
    172172  case XCPT_PRIVILEGED_INSTRUCTION:
     173#ifndef DEBUG
     174  case XCPT_BREAKPOINT:
     175#endif
    173176        rc = RtlDispatchException(&winreportrec, &wincontextrec);
    174177        break;
    175178
     179#ifdef DEBUG
     180  case XCPT_BREAKPOINT:
     181#endif
    176182  case XCPT_INTEGER_DIVIDE_BY_ZERO:
    177183  case XCPT_INTEGER_OVERFLOW:
    178   case XCPT_BREAKPOINT:
    179184  case XCPT_SINGLE_STEP:
    180185  case XCPT_ARRAY_BOUNDS_EXCEEDED:
Note: See TracChangeset for help on using the changeset viewer.