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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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   }
Note: See TracChangeset for help on using the changeset viewer.