Changeset 4588 for trunk/src


Ignore:
Timestamp:
Nov 14, 2000, 3:27:04 PM (25 years ago)
Author:
sandervl
Message:

Handlemanager fix (MN), changes for device name lookup, com bugfix (error check) + com class now called for COMx: names

Location:
trunk/src/kernel32
Files:
7 edited

Legend:

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

    r4487 r4588  
    1 /* $Id: HandleManager.cpp,v 1.53 2000-10-16 17:56:08 sandervl Exp $ */
     1/* $Id: HandleManager.cpp,v 1.54 2000-11-14 14:26:55 sandervl Exp $ */
    22
    33/*
     
    177177{
    178178  PHMDEVICE pHMDevice;                     /* iterator over the device table */
    179 
    180   if (pszDeviceName != NULL) {
     179  int namelength = strlen(pszDeviceName);
     180
     181  if (pszDeviceName != NULL)
     182  {
    181183    for (pHMDevice = TabWin32Devices;  /* loop over all devices in the table */
    182184         pHMDevice != NULL;
    183185         pHMDevice = pHMDevice->pNext)
    184186    {
    185       if (stricmp(pHMDevice->pszDeviceName,       /* case-insensitive search */
    186                   pszDeviceName) == 0)
    187         return (pHMDevice->pDeviceHandler);    /* OK, we've found our device */
     187        if(pHMDevice->pDeviceHandler->FindDevice(pHMDevice->pszDeviceName, pszDeviceName, namelength) == TRUE)
     188        {
     189            return pHMDevice->pDeviceHandler;
     190        }
    188191    }
    189192  }
    190   int namelength = strlen(pszDeviceName);
    191 
    192   //SvL: \\.\x:                 -> drive x (i.e. \\.\C:)
    193   //     \\.\PHYSICALDRIVEn     -> drive n (n>=0)
    194   if((strncmp(pszDeviceName, "\\\\.\\", 4) == 0) &&
    195      namelength == 6 && pszDeviceName[5] == ':')
    196   {
    197         return HMGlobals.pHMDisk;
    198   }
    199   if((strncmp(pszDeviceName, "\\\\.\\PHYSICALDRIVE", 17) == 0) && namelength == 18) {
    200         return HMGlobals.pHMDisk;
    201   }
    202 
    203193  return (HMGlobals.pHMOpen32);    /* haven't found anything, return default */
    204194}
     
    219209{
    220210  PHMDEVICE pHMDevice;                     /* iterator over the device table */
     211  int namelength = strlen(pszDeviceName);
    221212
    222213  if (pszDeviceName != NULL)
     214  {
    223215    for (pHMDevice = TabWin32Devices;  /* loop over all devices in the table */
    224216         pHMDevice != NULL;
    225217         pHMDevice = pHMDevice->pNext)
    226218    {
    227       if (stricmp(pHMDevice->pszDeviceName,       /* case-insensitive search */
    228                   pszDeviceName) == 0)
    229         return (pHMDevice->pDevData);    /* OK, we've found our device */
     219        if(pHMDevice->pDeviceHandler->FindDevice(pHMDevice->pszDeviceName, pszDeviceName, namelength) == TRUE)
     220        {
     221            return (pHMDevice->pDevData);    /* OK, we've found our device */
     222        }
    230223    }
    231 
     224  }
    232225  return (NULL);    /* haven't found anything, return NULL */
    233226}
     
    259252                                                       /* free handle found ? */
    260253    if (INVALID_HANDLE_VALUE == TabWin32Handles[ulLoop].hmHandleData.hHMHandle) {
    261   TabWin32Handles[ulLoop].hmHandleData.dwUserData     = 0;
    262   TabWin32Handles[ulLoop].hmHandleData.dwInternalType = HMTYPE_UNKNOWN;
    263   TabWin32Handles[ulLoop].hmHandleData.lpDeviceData   = NULL;
    264       handleMutex.leave();
     254        TabWin32Handles[ulLoop].hmHandleData.dwUserData     = 0;
     255        TabWin32Handles[ulLoop].hmHandleData.dwInternalType = HMTYPE_UNKNOWN;
     256        TabWin32Handles[ulLoop].hmHandleData.lpDeviceData   = NULL;
     257        handleMutex.leave();
    265258        return (ulLoop);                    /* OK, then return it to the caller */
    266259    }
     
    389382  if (HMGlobals.fIsInitialized != TRUE)
    390383  {
    391     HMGlobals.fIsInitialized = TRUE;                             /* OK, done */
    392 
    393384    handleMutex.enter();
    394385    // fill handle table
     
    403394           0,
    404395           sizeof(HMGlobals));
     396
     397    HMGlobals.fIsInitialized = TRUE;                             /* OK, done */
    405398
    406399    /* copy standard handles from OS/2's Open32 Subsystem */
     
    442435  /* @@@PH we could deallocate the device list here */
    443436
    444   if(HMGlobals.pHMOpen32) 
    445         delete HMGlobals.pHMOpen32;
    446   if(HMGlobals.pHMEvent) 
    447         delete HMGlobals.pHMEvent;
    448   if(HMGlobals.pHMFile) 
    449         delete HMGlobals.pHMFile;
    450   if(HMGlobals.pHMMutex) 
    451         delete HMGlobals.pHMMutex;
    452   if(HMGlobals.pHMSemaphore) 
    453         delete HMGlobals.pHMSemaphore;
    454   if(HMGlobals.pHMFileMapping) 
    455         delete HMGlobals.pHMFileMapping;
    456   if(HMGlobals.pHMComm) 
    457         delete HMGlobals.pHMComm;
    458   if(HMGlobals.pHMToken) 
    459         delete HMGlobals.pHMToken;
    460   if(HMGlobals.pHMThread) 
    461         delete HMGlobals.pHMThread;
    462   if(HMGlobals.pHMNamedPipe) 
    463         delete HMGlobals.pHMNamedPipe;
    464   if(HMGlobals.pHMDisk) 
    465         delete HMGlobals.pHMDisk;
     437  if(HMGlobals.pHMOpen32)
     438    delete HMGlobals.pHMOpen32;
     439  if(HMGlobals.pHMEvent)
     440    delete HMGlobals.pHMEvent;
     441  if(HMGlobals.pHMFile)
     442    delete HMGlobals.pHMFile;
     443  if(HMGlobals.pHMMutex)
     444    delete HMGlobals.pHMMutex;
     445  if(HMGlobals.pHMSemaphore)
     446    delete HMGlobals.pHMSemaphore;
     447  if(HMGlobals.pHMFileMapping)
     448    delete HMGlobals.pHMFileMapping;
     449  if(HMGlobals.pHMComm)
     450    delete HMGlobals.pHMComm;
     451  if(HMGlobals.pHMToken)
     452    delete HMGlobals.pHMToken;
     453  if(HMGlobals.pHMThread)
     454    delete HMGlobals.pHMThread;
     455  if(HMGlobals.pHMNamedPipe)
     456    delete HMGlobals.pHMNamedPipe;
     457  if(HMGlobals.pHMDisk)
     458    delete HMGlobals.pHMDisk;
    466459
    467460  return (NO_ERROR);
     
    13801373  if((hFile == GetStdHandle(STD_INPUT_HANDLE)) ||
    13811374     (hFile == GetStdHandle(STD_OUTPUT_HANDLE)) ||
    1382      (hFile == GetStdHandle(STD_ERROR_HANDLE))) 
     1375     (hFile == GetStdHandle(STD_ERROR_HANDLE)))
    13831376  {
    13841377      return FILE_TYPE_CHAR;
  • trunk/src/kernel32/hmcomm.cpp

    r4285 r4588  
    1 /* $Id: hmcomm.cpp,v 1.5 2000-09-20 21:32:51 hugh Exp $ */
     1/* $Id: hmcomm.cpp,v 1.6 2000-11-14 14:26:59 sandervl Exp $ */
    22
    33/*
     
    1414#include <os2win.h>
    1515#include <string.h>
    16 #include "handlemanager.h"
     16#include <handlemanager.h>
     17#include <heapstring.h>
    1718#include "hmdevice.h"
    1819#include "hmcomm.h"
     
    9798} HMDEVCOMDATA, *PHMDEVCOMDATA;
    9899
    99 VOID * CreateDevData()
     100VOID *CreateDevData()
    100101{
    101102  PHMDEVCOMDATA pData;
     
    126127  if(pData!= NULL)
    127128    HMDeviceRegisterEx("COM1", this, pData);
    128   pData = CreateDevData();
    129   if(pData!= NULL)
    130     HMDeviceRegisterEx("COM2", this, pData);
    131   pData = CreateDevData();
    132   if(pData!= NULL)
    133     HMDeviceRegisterEx("COM3", this, pData);
    134   pData = CreateDevData();
    135   if(pData!= NULL)
    136     HMDeviceRegisterEx("COM4", this, pData);
    137   pData = CreateDevData();
    138   if(pData!= NULL)
    139     HMDeviceRegisterEx("COM5", this, pData);
    140   pData = CreateDevData();
    141   if(pData!= NULL)
    142     HMDeviceRegisterEx("COM6", this, pData);
    143   pData = CreateDevData();
    144   if(pData!= NULL)
    145     HMDeviceRegisterEx("COM7", this, pData);
    146   pData = CreateDevData();
    147   if(pData!= NULL)
    148     HMDeviceRegisterEx("COM8", this, pData);
     129}
     130
     131/*****************************************************************************
     132 * Name      : HMDeviceCommClass::FindDevice
     133 * Purpose   : Checks if lpDeviceName belongs to this device class
     134 * Parameters: LPCSTR lpClassDevName
     135 *             LPCSTR lpDeviceName
     136 *             int namelength
     137 * Variables :
     138 * Result    : checks if name is COMx or COMx: (x=1..8)
     139 * Remark    :
     140 * Status    :
     141 *
     142 * Author    : SvL
     143 *****************************************************************************/
     144BOOL HMDeviceCommClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
     145{
     146    if(namelength > 5)
     147        return FALSE;  //can't be com name
     148
     149    //first 3 letters 'COM'?
     150    if(lstrncmpiA(lpDeviceName, lpClassDevName, 3) != 0) {
     151        return FALSE;
     152    }
     153
     154    if(namelength == 5 && lpDeviceName[4] != ':') {
     155        return FALSE;
     156    }
     157    switch(lpDeviceName[3]) {
     158    case '1':
     159    case '2':
     160    case '3':
     161    case '4':
     162    case '5':
     163    case '6':
     164    case '7':
     165    case '8':
     166        return TRUE;    //we support up to COM8
     167    }
     168    return FALSE;
    149169}
    150170
     
    154174                                    PHMHANDLEDATA pHMHandleDataTemplate)
    155175{
     176 char comname[6];
     177
    156178  dprintf(("HMComm: Serial communication port %s open request\n", lpFileName));
    157179
     180  if(strlen(lpFileName) > 5) {
     181    return -1;  //safety check (unnecessary..)
     182  }
    158183  pHMHandleData->hHMHandle = 0;
     184
     185  strcpy(comname, lpFileName);
     186  comname[4] = 0;   //get rid of : (if present) (eg COM1:)
    159187
    160188  //AH: TODO parse Win32 security handles
    161189  OSLibDosDisableHardError(TRUE);
    162   pHMHandleData->hHMHandle = OSLibDosOpen((char*)lpFileName,
     190  pHMHandleData->hHMHandle = OSLibDosOpen(comname,
    163191                                          OSLIB_ACCESS_READWRITE |
    164192                                          OSLIB_ACCESS_SHAREDENYREAD |
     
    184212                      &((PHMDEVCOMDATA)pHMHandleData->lpHandlerData)->dcbOS2,ulLen,&ulLen);
    185213
    186     if(!rc)
     214    if(rc)
    187215    {
    188216      return -1;
  • trunk/src/kernel32/hmcomm.h

    r4285 r4588  
    1 /* $Id: hmcomm.h,v 1.5 2000-09-20 21:32:54 hugh Exp $ */
     1/* $Id: hmcomm.h,v 1.6 2000-11-14 14:26:59 sandervl Exp $ */
    22
    33/*
     
    2323
    2424  HMDeviceCommClass(LPCSTR lpDeviceName);
     25
     26  //checks if device name belongs to this class
     27  virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength);
    2528
    2629  /* this is the handler method for calls to CreateFile() */
  • trunk/src/kernel32/hmdevice.cpp

    r4285 r4588  
    1 /* $Id: hmdevice.cpp,v 1.23 2000-09-20 21:32:52 hugh Exp $ */
     1/* $Id: hmdevice.cpp,v 1.24 2000-11-14 14:27:00 sandervl Exp $ */
    22
    33/*
     
    2020#include <odin.h>
    2121#include <os2win.h>
     22#include <string.h>
    2223#include <misc.h>
    2324#include "HandleManager.h"
     
    7071}
    7172
     73
     74/*****************************************************************************
     75 * Name      : HMDeviceHandler::FindDevice
     76 * Purpose   : Checks if lpDeviceName belongs to this device class
     77 * Parameters: LPCSTR lpClassDevName
     78 *             LPCSTR lpDeviceName
     79 *             int namelength
     80 * Variables :
     81 * Result    :
     82 * Remark    :
     83 * Status    :
     84 *
     85 * Author    : SvL
     86 *****************************************************************************/
     87BOOL HMDeviceHandler::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
     88{
     89    if(stricmp(lpClassDevName, lpDeviceName) == 0) {
     90        return TRUE;
     91    }
     92    return FALSE;
     93}
    7294
    7395/*****************************************************************************
  • trunk/src/kernel32/hmdevice.h

    r4285 r4588  
    1 /* $Id: hmdevice.h,v 1.23 2000-09-20 21:32:54 hugh Exp $ */
     1/* $Id: hmdevice.h,v 1.24 2000-11-14 14:27:01 sandervl Exp $ */
    22
    33/*
     
    6969
    7070  HMDeviceHandler(LPCSTR lpDeviceName);      /* constructor with device name */
     71
     72  //checks if device name belongs to this class
     73  virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength);
    7174
    7275  /***********************************
  • trunk/src/kernel32/hmdisk.cpp

    r4259 r4588  
    1 /* $Id: hmdisk.cpp,v 1.3 2000-09-14 19:08:36 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.4 2000-11-14 14:27:02 sandervl Exp $ */
    22
    33/*
     
    2121#include <win\aspi.h>
    2222
    23 #define DBG_LOCALLOG    DBG_hmdisk
     23#define DBG_LOCALLOG    DBG_hmdisk
    2424#include "dbglocal.h"
    2525
     26HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName)
     27{
     28    HMDeviceRegisterEx("\\\\.\\PHYSICALDRIVE", this, NULL);
     29}
     30
     31/*****************************************************************************
     32 * Name      : HMDeviceDiskClass::FindDevice
     33 * Purpose   : Checks if lpDeviceName belongs to this device class
     34 * Parameters: LPCSTR lpClassDevName
     35 *             LPCSTR lpDeviceName
     36 *             int namelength
     37 * Variables :
     38 * Result    : checks if name is for a drive of physical disk
     39 * Remark    :
     40 * Status    :
     41 *
     42 * Author    : SvL
     43 *****************************************************************************/
     44BOOL HMDeviceDiskClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
     45{
     46    //\\.\\x:               -> length 6
     47    //\\.\PHYSICALDRIVEn    -> length 18
     48    if(namelength != 6 && namelength != 18) {
     49        return FALSE;
     50    }
     51
     52    //SvL: \\.\x:             -> drive x (i.e. \\.\C:)
     53    //     \\.\PHYSICALDRIVEn -> drive n (n>=0)
     54    if((strncmp(lpDeviceName, "\\\\.\\", 4) == 0) &&
     55        namelength == 6 && lpDeviceName[5] == ':')
     56    {
     57        return TRUE;
     58    }
     59    if((strncmp(lpDeviceName, "\\\\.\\PHYSICALDRIVE", 17) == 0) && namelength == 18) {
     60        return TRUE;
     61    }
     62    return FALSE;
     63}
    2664//******************************************************************************
    2765//TODO: PHYSICALDRIVEn!!
     
    4684             4) == 0)
    4785  {
    48         lpFileName+=4;
     86        lpFileName+=4;
    4987  }
    5088
     
    5997  if (hFile != INVALID_HANDLE_ERROR)
    6098  {
    61         pHMHandleData->hHMHandle  = hFile;
    62         pHMHandleData->dwUserData = GetDriveTypeA(lpFileName);
    63         return (NO_ERROR);
     99        pHMHandleData->hHMHandle  = hFile;
     100    pHMHandleData->dwUserData = GetDriveTypeA(lpFileName);
     101        return (NO_ERROR);
    64102  }
    65103  else {
    66         dprintf(("CreateFile failed; error %d", GetLastError()));
    67         return(GetLastError());
     104    dprintf(("CreateFile failed; error %d", GetLastError()));
     105        return(GetLastError());
    68106  }
    69107}
     
    81119                             LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
    82120{
    83    switch(dwIoControlCode) 
     121   switch(dwIoControlCode)
    84122   {
    85         case FSCTL_DELETE_REPARSE_POINT:
    86         case FSCTL_DISMOUNT_VOLUME:
    87         case FSCTL_GET_COMPRESSION:
    88         case FSCTL_GET_REPARSE_POINT:
    89         case FSCTL_LOCK_VOLUME:
    90         case FSCTL_QUERY_ALLOCATED_RANGES:
    91         case FSCTL_SET_COMPRESSION:
    92         case FSCTL_SET_REPARSE_POINT:
    93         case FSCTL_SET_SPARSE:
    94         case FSCTL_SET_ZERO_DATA:
    95         case FSCTL_UNLOCK_VOLUME:
    96         case IOCTL_DISK_CHECK_VERIFY:
    97         case IOCTL_DISK_EJECT_MEDIA:
    98         case IOCTL_DISK_FORMAT_TRACKS:
    99         case IOCTL_DISK_GET_DRIVE_GEOMETRY:
    100         case IOCTL_DISK_GET_DRIVE_LAYOUT:
    101         case IOCTL_DISK_GET_MEDIA_TYPES:
    102         case IOCTL_DISK_GET_PARTITION_INFO:
    103         case IOCTL_DISK_LOAD_MEDIA:
    104         case IOCTL_DISK_MEDIA_REMOVAL:
    105         case IOCTL_DISK_PERFORMANCE:
    106         case IOCTL_DISK_REASSIGN_BLOCKS:
    107         case IOCTL_DISK_SET_DRIVE_LAYOUT:
    108         case IOCTL_DISK_SET_PARTITION_INFO:
    109         case IOCTL_DISK_VERIFY:
    110         case IOCTL_SERIAL_LSRMST_INSERT:
    111         case IOCTL_STORAGE_CHECK_VERIFY:
    112         case IOCTL_STORAGE_EJECT_MEDIA:
    113         case IOCTL_STORAGE_GET_MEDIA_TYPES:
    114         case IOCTL_STORAGE_LOAD_MEDIA:
    115         case IOCTL_STORAGE_MEDIA_REMOVAL:
    116                 break;
    117         case IOCTL_SCSI_PASS_THROUGH:
    118         case IOCTL_SCSI_MINIPORT:
    119         case IOCTL_SCSI_GET_INQUIRY_DATA:
    120         case IOCTL_SCSI_GET_CAPABILITIES:
    121         case IOCTL_SCSI_PASS_THROUGH_DIRECT:
    122                 break;
    123 
    124         case IOCTL_SCSI_GET_ADDRESS:
     123    case FSCTL_DELETE_REPARSE_POINT:
     124    case FSCTL_DISMOUNT_VOLUME:
     125    case FSCTL_GET_COMPRESSION:
     126    case FSCTL_GET_REPARSE_POINT:
     127    case FSCTL_LOCK_VOLUME:
     128    case FSCTL_QUERY_ALLOCATED_RANGES:
     129    case FSCTL_SET_COMPRESSION:
     130    case FSCTL_SET_REPARSE_POINT:
     131    case FSCTL_SET_SPARSE:
     132    case FSCTL_SET_ZERO_DATA:
     133    case FSCTL_UNLOCK_VOLUME:
     134    case IOCTL_DISK_CHECK_VERIFY:
     135    case IOCTL_DISK_EJECT_MEDIA:
     136    case IOCTL_DISK_FORMAT_TRACKS:
     137    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
     138    case IOCTL_DISK_GET_DRIVE_LAYOUT:
     139    case IOCTL_DISK_GET_MEDIA_TYPES:
     140    case IOCTL_DISK_GET_PARTITION_INFO:
     141    case IOCTL_DISK_LOAD_MEDIA:
     142    case IOCTL_DISK_MEDIA_REMOVAL:
     143    case IOCTL_DISK_PERFORMANCE:
     144    case IOCTL_DISK_REASSIGN_BLOCKS:
     145    case IOCTL_DISK_SET_DRIVE_LAYOUT:
     146    case IOCTL_DISK_SET_PARTITION_INFO:
     147    case IOCTL_DISK_VERIFY:
     148    case IOCTL_SERIAL_LSRMST_INSERT:
     149    case IOCTL_STORAGE_CHECK_VERIFY:
     150    case IOCTL_STORAGE_EJECT_MEDIA:
     151    case IOCTL_STORAGE_GET_MEDIA_TYPES:
     152    case IOCTL_STORAGE_LOAD_MEDIA:
     153    case IOCTL_STORAGE_MEDIA_REMOVAL:
     154        break;
     155    case IOCTL_SCSI_PASS_THROUGH:
     156    case IOCTL_SCSI_MINIPORT:
     157    case IOCTL_SCSI_GET_INQUIRY_DATA:
     158    case IOCTL_SCSI_GET_CAPABILITIES:
     159    case IOCTL_SCSI_PASS_THROUGH_DIRECT:
     160        break;
     161
     162    case IOCTL_SCSI_GET_ADDRESS:
    125163        {
    126164         HINSTANCE hInstAspi;
    127         DWORD (WIN32API *GetASPI32SupportInfo)();
     165    DWORD (WIN32API *GetASPI32SupportInfo)();
    128166         DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
    129167         DWORD numAdapters, rc;
     
    131169         int   i, j, k;
    132170
    133                 if(!lpOutBuffer || nOutBufferSize < 8) {
    134                         SetLastError(ERROR_INSUFFICIENT_BUFFER);  //todo: right error?
    135                         return(FALSE);
    136                 }
    137                 SCSI_ADDRESS *addr = (SCSI_ADDRESS *)lpOutBuffer;
    138                 addr->Length = sizeof(SCSI_ADDRESS);
    139                 addr->PortNumber = 0;
    140                 addr->PathId     = 0;
    141                 hInstAspi = LoadLibraryA("WNASPI32.DLL");
    142                 if(hInstAspi == NULL) {
    143                         SetLastError(ERROR_INVALID_PARAMETER); //todo
    144                         return FALSE;
    145                 }
    146                 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
    147                 *(FARPROC *)&SendASPI32Command    = GetProcAddress(hInstAspi, "SendASPI32Command");
    148                 numAdapters = GetASPI32SupportInfo();
    149                 if(LOBYTE(numAdapters) == 0) goto failure;
    150 
    151                 memset(&srb, 0, sizeof(srb));
    152                 srb.common.SRB_Cmd = SC_HA_INQUIRY;
    153                 rc = SendASPI32Command(&srb);
    154 
    155                 for(i=0;i<LOBYTE(numAdapters);i++) {
    156                         for(j=0;j<8;j++) {
    157                                 for(k=0;k<16;k++) {
    158                                         memset(&srb, 0, sizeof(srb));
    159                                         srb.common.SRB_Cmd     = SC_GET_DEV_TYPE;
    160                                         srb.devtype.SRB_HaId   = i;
    161                                         srb.devtype.SRB_Target = j;
    162                                         srb.devtype.SRB_Lun    = k;
    163                                         rc = SendASPI32Command(&srb);
    164                                         if(rc == SS_COMP) {
    165                                                 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
     171            if(!lpOutBuffer || nOutBufferSize < 8) {
     172            SetLastError(ERROR_INSUFFICIENT_BUFFER);  //todo: right error?
     173                    return(FALSE);
     174        }
     175        SCSI_ADDRESS *addr = (SCSI_ADDRESS *)lpOutBuffer;
     176        addr->Length = sizeof(SCSI_ADDRESS);
     177        addr->PortNumber = 0;
     178        addr->PathId     = 0;
     179        hInstAspi = LoadLibraryA("WNASPI32.DLL");
     180        if(hInstAspi == NULL) {
     181            SetLastError(ERROR_INVALID_PARAMETER); //todo
     182            return FALSE;
     183        }
     184        *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
     185        *(FARPROC *)&SendASPI32Command    = GetProcAddress(hInstAspi, "SendASPI32Command");
     186        numAdapters = GetASPI32SupportInfo();
     187        if(LOBYTE(numAdapters) == 0) goto failure;
     188
     189        memset(&srb, 0, sizeof(srb));
     190        srb.common.SRB_Cmd = SC_HA_INQUIRY;
     191        rc = SendASPI32Command(&srb);
     192
     193        for(i=0;i<LOBYTE(numAdapters);i++) {
     194            for(j=0;j<8;j++) {
     195                for(k=0;k<16;k++) {
     196                    memset(&srb, 0, sizeof(srb));
     197                    srb.common.SRB_Cmd     = SC_GET_DEV_TYPE;
     198                    srb.devtype.SRB_HaId   = i;
     199                    srb.devtype.SRB_Target = j;
     200                    srb.devtype.SRB_Lun    = k;
     201                    rc = SendASPI32Command(&srb);
     202                    if(rc == SS_COMP) {
     203                        if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
    166204                                                   pHMHandleData->dwUserData == DRIVE_CDROM)
    167                                                 {
    168                                                         goto done;
    169                                                 }
    170                                         }
    171                                 }
    172                         }
    173                 }
     205                        {
     206                            goto done;
     207                        }
     208                    }
     209                }
     210            }
     211        }
    174212done:
    175                 if(rc == SS_COMP) {
    176                         addr->TargetId   = j;
    177                         addr->Lun        = k;
    178                         SetLastError(ERROR_SUCCESS);
    179                 }
    180                 else    SetLastError(ERROR_FILE_NOT_FOUND); //todo
    181                 FreeLibrary(hInstAspi);
    182                 return TRUE;
     213        if(rc == SS_COMP) {
     214            addr->TargetId   = j;
     215            addr->Lun        = k;
     216            SetLastError(ERROR_SUCCESS);
     217        }
     218        else    SetLastError(ERROR_FILE_NOT_FOUND); //todo
     219        FreeLibrary(hInstAspi);
     220        return TRUE;
    183221failure:
    184                 FreeLibrary(hInstAspi);
    185                 SetLastError(ERROR_INVALID_PARAMETER); //todo
    186                 return FALSE;
    187         }
    188 
    189         case IOCTL_SCSI_RESCAN_BUS:
    190         case IOCTL_SCSI_GET_DUMP_POINTERS:
    191         case IOCTL_SCSI_FREE_DUMP_POINTERS:
    192         case IOCTL_IDE_PASS_THROUGH:
    193                 break;
     222        FreeLibrary(hInstAspi);
     223        SetLastError(ERROR_INVALID_PARAMETER); //todo
     224        return FALSE;
     225        }
     226
     227    case IOCTL_SCSI_RESCAN_BUS:
     228    case IOCTL_SCSI_GET_DUMP_POINTERS:
     229    case IOCTL_SCSI_FREE_DUMP_POINTERS:
     230    case IOCTL_IDE_PASS_THROUGH:
     231        break;
    194232
    195233   }
  • trunk/src/kernel32/hmdisk.h

    r4256 r4588  
    1 /* $Id: hmdisk.h,v 1.1 2000-09-13 21:10:58 sandervl Exp $ */
     1/* $Id: hmdisk.h,v 1.2 2000-11-14 14:27:04 sandervl Exp $ */
    22
    33#ifndef __HMDISK_H__
     
    1919{
    2020public:
    21   HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) {};
     21  HMDeviceDiskClass(LPCSTR lpDeviceName);
     22
     23  //checks if device name belongs to this class
     24  virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength);
    2225
    2326  /* this is a handler method for calls to CreateFile() */
Note: See TracChangeset for help on using the changeset viewer.