- Timestamp:
- Jun 17, 2001, 3:58:32 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r6029 r6036 1 /* $Id: hmdisk.cpp,v 1. 8 2001-06-16 16:10:12 sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.9 2001-06-17 13:58:32 sandervl Exp $ */ 2 2 3 3 /* … … 24 24 #define DBG_LOCALLOG DBG_hmdisk 25 25 #include "dbglocal.h" 26 27 static HINSTANCE hInstAspi = 0; 28 static DWORD (WIN32API *GetASPI32SupportInfo)() = NULL; 29 static DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB) = NULL; 26 30 27 31 HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) … … 117 121 pHMHandleData->dwUserData = pHMHandleData->dwUserData - ((int)'a' - (int)'A'); 118 122 } 123 124 if(GetDriveTypeA(lpFileName) == DRIVE_CDROM && hInstAspi == NULL) { 125 hInstAspi = LoadLibraryA("WNASPI32.DLL"); 126 if(hInstAspi == NULL) { 127 return ERROR_INVALID_PARAMETER; 128 } 129 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo"); 130 *(FARPROC *)&SendASPI32Command = GetProcAddress(hInstAspi, "SendASPI32Command"); 131 } 119 132 return (NO_ERROR); 120 133 } … … 299 312 { 300 313 PDISK_GEOMETRY pGeom = (PDISK_GEOMETRY)lpOutBuffer; 301 if(nOutBufferSize < sizeof(DISK_GEOMETRY) ) {314 if(nOutBufferSize < sizeof(DISK_GEOMETRY) || !pGeom) { 302 315 SetLastError(ERROR_INSUFFICIENT_BUFFER); 303 316 return FALSE; … … 312 325 *lpBytesReturned = sizeof(DISK_GEOMETRY); 313 326 } 327 SetLastError(ERROR_SUCCESS); 314 328 return TRUE; 315 329 } … … 347 361 case IOCTL_SCSI_GET_INQUIRY_DATA: 348 362 case IOCTL_SCSI_GET_CAPABILITIES: 363 break; 364 349 365 case IOCTL_SCSI_PASS_THROUGH_DIRECT: 350 break; 351 366 { 367 PSCSI_PASS_THROUGH_DIRECT pPacket = (PSCSI_PASS_THROUGH_DIRECT)lpOutBuffer; 368 SRB_ExecSCSICmd *psrb; 369 370 if(nOutBufferSize < sizeof(SCSI_PASS_THROUGH_DIRECT) || 371 !pPacket || pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT)) 372 { 373 SetLastError(ERROR_INSUFFICIENT_BUFFER); 374 return FALSE; 375 } 376 if(lpBytesReturned) { 377 *lpBytesReturned = 0; 378 } 379 psrb = (SRB_ExecSCSICmd *)alloca(sizeof(SRB_ExecSCSICmd)+pPacket->SenseInfoLength); 380 if(psrb == NULL) { 381 dprintf(("not enough memory!!")); 382 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 383 return FALSE; 384 } 385 memset(psrb, 0, sizeof(*psrb)); 386 psrb->SRB_Cmd = SC_EXEC_SCSI_CMD; 387 psrb->SRB_Status = pPacket->ScsiStatus; 388 psrb->SRB_HaId = pPacket->PathId; 389 psrb->SRB_Target = pPacket->TargetId; 390 psrb->SRB_Lun = pPacket->Lun; 391 psrb->SRB_BufLen = pPacket->DataTransferLength; 392 psrb->SRB_SenseLen = pPacket->SenseInfoLength; 393 psrb->SRB_CDBLen = pPacket->CdbLength; 394 switch(pPacket->DataIn) { 395 case SCSI_IOCTL_DATA_OUT: 396 psrb->SRB_Flags = 0x2 << 3; 397 break; 398 case SCSI_IOCTL_DATA_IN: 399 psrb->SRB_Flags = 0x1 << 3; 400 break; 401 case SCSI_IOCTL_DATA_UNSPECIFIED: 402 psrb->SRB_Flags = 0x3 << 3; 403 break; 404 } 405 if(pPacket->CdbLength > 16) { 406 SetLastError(ERROR_INVALID_PARAMETER); 407 return FALSE; 408 } 409 psrb->SRB_BufPointer = (BYTE *)pPacket->DataBuffer; 410 memcpy(&psrb->CDBByte[0], &pPacket->Cdb[0], 16); 411 if(psrb->SRB_SenseLen) { 412 memcpy(&psrb->SenseArea[0], (char *)pPacket + pPacket->SenseInfoOffset, psrb->SRB_SenseLen); 413 } 414 //TODO: pPacket->TimeOutValue ignored 415 int rc = SendASPI32Command((LPSRB)psrb); 416 if(rc != SS_COMP) { 417 dprintf(("SendASPI32Command failed with error %d", rc)); 418 if(rc == SS_ERR) { 419 SetLastError(ERROR_ADAP_HDW_ERR); //returned by NT4, SP6 420 } 421 else SetLastError(ERROR_GEN_FAILURE); 422 return FALSE; 423 } 424 pPacket->ScsiStatus = rc; 425 if(lpBytesReturned) { 426 *lpBytesReturned = 0; 427 } 428 pPacket->DataTransferLength = psrb->SRB_BufLen; 429 if(psrb->SRB_SenseLen) { 430 memcpy((char *)pPacket + pPacket->SenseInfoOffset, &psrb->SenseArea[0], psrb->SRB_SenseLen); 431 } 432 SetLastError(ERROR_SUCCESS); 433 return TRUE; 434 } 352 435 case IOCTL_SCSI_GET_ADDRESS: 353 436 { 354 HINSTANCE hInstAspi;355 DWORD (WIN32API *GetASPI32SupportInfo)();356 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);357 437 DWORD numAdapters, rc; 358 438 SRB srb; … … 367 447 addr->PortNumber = 0; 368 448 addr->PathId = 0; 369 hInstAspi = LoadLibraryA("WNASPI32.DLL");370 if(hInstAspi == NULL) {371 SetLastError(ERROR_INVALID_PARAMETER); //todo372 return FALSE;373 }374 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");375 *(FARPROC *)&SendASPI32Command = GetProcAddress(hInstAspi, "SendASPI32Command");376 449 numAdapters = GetASPI32SupportInfo(); 377 450 if(LOBYTE(numAdapters) == 0) goto failure; … … 412 485 } 413 486 else SetLastError(ERROR_FILE_NOT_FOUND); //todo 414 FreeLibrary(hInstAspi);415 487 return TRUE; 416 488 failure: 417 FreeLibrary(hInstAspi);418 489 SetLastError(ERROR_INVALID_PARAMETER); //todo 419 490 return FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.