Changeset 4588 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- Nov 14, 2000, 3:27:04 PM (25 years ago)
- File:
-
- 1 edited
-
trunk/src/kernel32/hmdisk.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r4259 r4588 1 /* $Id: hmdisk.cpp,v 1. 3 2000-09-14 19:08:36sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.4 2000-11-14 14:27:02 sandervl Exp $ */ 2 2 3 3 /* … … 21 21 #include <win\aspi.h> 22 22 23 #define DBG_LOCALLOG DBG_hmdisk23 #define DBG_LOCALLOG DBG_hmdisk 24 24 #include "dbglocal.h" 25 25 26 HMDeviceDiskClass::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 *****************************************************************************/ 44 BOOL 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 } 26 64 //****************************************************************************** 27 65 //TODO: PHYSICALDRIVEn!! … … 46 84 4) == 0) 47 85 { 48 lpFileName+=4;86 lpFileName+=4; 49 87 } 50 88 … … 59 97 if (hFile != INVALID_HANDLE_ERROR) 60 98 { 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); 64 102 } 65 103 else { 66 dprintf(("CreateFile failed; error %d", GetLastError()));67 return(GetLastError());104 dprintf(("CreateFile failed; error %d", GetLastError())); 105 return(GetLastError()); 68 106 } 69 107 } … … 81 119 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) 82 120 { 83 switch(dwIoControlCode) 121 switch(dwIoControlCode) 84 122 { 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: 125 163 { 126 164 HINSTANCE hInstAspi; 127 DWORD (WIN32API *GetASPI32SupportInfo)();165 DWORD (WIN32API *GetASPI32SupportInfo)(); 128 166 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB); 129 167 DWORD numAdapters, rc; … … 131 169 int i, j, k; 132 170 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); //todo144 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 && 166 204 pHMHandleData->dwUserData == DRIVE_CDROM) 167 {168 goto done;169 }170 }171 }172 }173 }205 { 206 goto done; 207 } 208 } 209 } 210 } 211 } 174 212 done: 175 if(rc == SS_COMP) {176 addr->TargetId = j;177 addr->Lun = k;178 SetLastError(ERROR_SUCCESS);179 }180 elseSetLastError(ERROR_FILE_NOT_FOUND); //todo181 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; 183 221 failure: 184 FreeLibrary(hInstAspi);185 SetLastError(ERROR_INVALID_PARAMETER); //todo186 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; 194 232 195 233 }
Note:
See TracChangeset
for help on using the changeset viewer.
