- Timestamp:
- Jun 6, 2002, 1:31:13 PM (23 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 2 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r8454 r8580 1 /* $Id: hmdisk.cpp,v 1.4 5 2002-05-17 16:49:34sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.46 2002-06-06 11:31:12 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 #include <win\winioctl.h> 21 21 #include <win\ntddscsi.h> 22 #include <win\wnaspi32.h>23 22 #include <win\aspi.h> 24 23 #include "oslibdos.h" 25 24 #include "osliblvm.h" 25 #include "oslibcdio.h" 26 26 #include "asmutil.h" 27 27 … … 39 39 typedef struct 40 40 { 41 HINSTANCE hInstAspi; 42 DWORD (WIN32API *GetASPI32SupportInfo)(); 43 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB); 41 BOOL fCDIoSupported; 44 42 ULONG driveLetter; 45 43 ULONG driveType; … … 287 285 if(drvInfo->driveType == DRIVE_CDROM) 288 286 { 289 drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL"); 290 if(drvInfo->hInstAspi == NULL) { 291 if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle); 292 free(drvInfo); 293 return ERROR_INVALID_PARAMETER; 294 } 295 *(FARPROC *)&drvInfo->GetASPI32SupportInfo = GetProcAddress(drvInfo->hInstAspi, "GetASPI32SupportInfo"); 296 *(FARPROC *)&drvInfo->SendASPI32Command = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command"); 297 298 if(drvInfo->GetASPI32SupportInfo() == (SS_FAILED_INIT << 8)) { 299 FreeLibrary(drvInfo->hInstAspi); 300 drvInfo->hInstAspi = 0; 301 } 287 drvInfo->fCDIoSupported = OSLibCdIoIsSupported(pHMHandleData->hHMHandle); 302 288 303 289 //get cdrom signature … … 357 343 return 0; 358 344 } 345 if(drvInfo->driveType == DRIVE_CDROM) 346 { 347 drvInfo->fCDIoSupported = OSLibCdIoIsSupported(hFile); 348 349 //get cdrom signature 350 DWORD parsize = 4; 351 DWORD datasize = 4; 352 strcpy(drvInfo->signature, "CD01"); 353 OSLibDosDevIOCtl(hFile, 0x80, 0x61, &drvInfo->signature[0], 4, &parsize, 354 &drvInfo->signature[0], 4, &datasize); 355 } 359 356 OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &drvInfo->dwVolumelabel, NULL, 0); 360 357 return hFile; … … 373 370 if(pHMHandleData->dwUserData) { 374 371 DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData; 375 if(drvInfo->hInstAspi) FreeLibrary(drvInfo->hInstAspi);376 372 free(drvInfo); 377 373 } … … 1426 1422 // ------------------- 1427 1423 1428 case IOCTL_SCSI_PASS_THROUGH:1429 1424 case IOCTL_SCSI_MINIPORT: 1430 1425 case IOCTL_SCSI_GET_INQUIRY_DATA: 1426 break; 1427 1431 1428 case IOCTL_SCSI_GET_CAPABILITIES: 1432 1429 break; 1433 1430 1431 case IOCTL_SCSI_PASS_THROUGH: 1432 //no break; same as IOCTL_SCSI_PASS_THROUGH_DIRECT 1434 1433 case IOCTL_SCSI_PASS_THROUGH_DIRECT: 1435 1434 { 1436 1435 PSCSI_PASS_THROUGH_DIRECT pPacket = (PSCSI_PASS_THROUGH_DIRECT)lpOutBuffer; 1437 SRB_ExecSCSICmd *psrb; 1438 1439 if(drvInfo->hInstAspi == NULL) 1440 { 1441 SetLastError(ERROR_ACCESS_DENIED); 1442 return FALSE; 1443 } 1436 DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData; 1437 CDIO_CMD_BUFFER cdiocmd; 1444 1438 1445 1439 if(nOutBufferSize < sizeof(SCSI_PASS_THROUGH_DIRECT) || … … 1449 1443 return FALSE; 1450 1444 } 1445 1446 if(!drvInfo || drvInfo->fCDIoSupported == FALSE) { 1447 dprintf(("os2cdrom.dmd CD interface not supported!!")); 1448 SetLastError(ERROR_ACCESS_DENIED); 1449 return FALSE; 1450 } 1451 1451 if(lpBytesReturned) { 1452 1452 *lpBytesReturned = 0; 1453 1453 } 1454 1454 1455 psrb = (SRB_ExecSCSICmd *)alloca(sizeof(SRB_ExecSCSICmd)+pPacket->SenseInfoLength); 1456 if(psrb == NULL) { 1457 dprintf(("not enough memory!!")); 1458 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 1459 return FALSE; 1460 } 1461 memset(psrb, 0, sizeof(*psrb)); 1462 psrb->SRB_Cmd = SC_EXEC_SCSI_CMD; 1463 psrb->SRB_Status = pPacket->ScsiStatus; 1464 psrb->SRB_HaId = pPacket->PathId; 1465 psrb->SRB_Target = pPacket->TargetId; 1466 psrb->SRB_Lun = pPacket->Lun; 1467 psrb->SRB_BufLen = pPacket->DataTransferLength; 1468 psrb->SRB_SenseLen = pPacket->SenseInfoLength; 1469 psrb->SRB_CDBLen = pPacket->CdbLength; 1455 if(pPacket->CdbLength > sizeof(cdiocmd.arCDB)) { 1456 dprintf(("CDB buffer too big (%d)!!", pPacket->CdbLength)); 1457 SetLastError(ERROR_INVALID_PARAMETER); 1458 return FALSE; 1459 } 1460 1461 memset(&cdiocmd, 0, sizeof(cdiocmd)); 1462 1470 1463 switch(pPacket->DataIn) { 1471 1464 case SCSI_IOCTL_DATA_OUT: 1472 psrb->SRB_Flags = 0x2 << 3;1473 1465 cdiocmd.flDirection = CMDDIR_OUTPUT; 1466 break; 1474 1467 case SCSI_IOCTL_DATA_IN: 1475 psrb->SRB_Flags = 0x1 << 3;1476 1468 cdiocmd.flDirection = CMDDIR_INPUT; 1469 break; 1477 1470 case SCSI_IOCTL_DATA_UNSPECIFIED: 1478 psrb->SRB_Flags = 0x3 << 3;1479 1480 } 1481 if(pPacket->CdbLength > 16) { 1482 SetLastError(ERROR_INVALID_PARAMETER);1483 return FALSE;1484 } 1471 cdiocmd.flDirection = CMDDIR_OUTPUT|CMDDIR_INPUT;; 1472 break; 1473 } 1474 1475 cdiocmd.cbCDB = pPacket->CdbLength; 1476 memcpy(cdiocmd.arCDB, pPacket->Cdb, pPacket->CdbLength); 1477 1485 1478 dprintf(("IOCTL_SCSI_PASS_THROUGH_DIRECT %x len %x, %x%02x%02x%02x %x%02x", pPacket->Cdb[0], pPacket->DataTransferLength, pPacket->Cdb[2], pPacket->Cdb[3], pPacket->Cdb[4], pPacket->Cdb[5], pPacket->Cdb[7], pPacket->Cdb[8])); 1486 psrb->SRB_BufPointer = (BYTE *)pPacket->DataBuffer; 1487 memcpy(&psrb->CDBByte[0], &pPacket->Cdb[0], 16); 1488 if(psrb->SRB_SenseLen) { 1489 memcpy(&psrb->SenseArea[0], (char *)pPacket + pPacket->SenseInfoOffset, psrb->SRB_SenseLen); 1490 } 1491 //TODO: pPacket->TimeOutValue ignored 1492 int rc = drvInfo->SendASPI32Command((LPSRB)psrb); 1493 if(rc != SS_COMP) { 1494 dprintf(("SendASPI32Command failed with error %d", rc)); 1495 if(rc == SS_ERR) { 1496 SetLastError(ERROR_ADAP_HDW_ERR); //returned by NT4, SP6 1479 1480 if(OSLibCdIoSendCommand(pHMHandleData->hHMHandle, &cdiocmd, pPacket->DataBuffer, pPacket->DataTransferLength) == FALSE) { 1481 dprintf(("OSLibCdIoSendCommand failed!!")); 1482 pPacket->ScsiStatus = SS_ERR; 1483 SetLastError(ERROR_ADAP_HDW_ERR); //returned by NT4, SP6 1484 return FALSE; 1485 } 1486 1487 if(pPacket->SenseInfoLength) { 1488 if(OSLibCdIoRequestSense(pHMHandleData->hHMHandle, (char *)pPacket + pPacket->SenseInfoOffset, pPacket->SenseInfoLength) == FALSE) { 1489 dprintf(("OSLibCdIoRequestSense failed!!")); 1490 pPacket->ScsiStatus = SS_ERR; 1491 SetLastError(ERROR_ADAP_HDW_ERR); //returned by NT4, SP6 1492 return FALSE; 1497 1493 } 1498 else SetLastError(ERROR_GEN_FAILURE); 1499 return FALSE; 1500 } 1501 pPacket->ScsiStatus = rc; 1502 if(lpBytesReturned) { 1503 *lpBytesReturned = 0; 1504 } 1505 pPacket->DataTransferLength = psrb->SRB_BufLen; 1506 if(psrb->SRB_SenseLen) { 1507 memcpy((char *)pPacket + pPacket->SenseInfoOffset, &psrb->SenseArea[0], psrb->SRB_SenseLen); 1508 } 1494 } 1495 pPacket->ScsiStatus = SS_COMP; 1509 1496 SetLastError(ERROR_SUCCESS); 1510 1497 return TRUE; … … 1512 1499 case IOCTL_SCSI_GET_ADDRESS: 1513 1500 { 1514 DWORD numAdapters, rc; 1515 SRB srb; 1516 int i, j, k; 1501 DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData; 1502 1503 if(!drvInfo || drvInfo->fCDIoSupported == FALSE) { 1504 dprintf(("os2cdrom.dmd CD interface not supported!!")); 1505 SetLastError(ERROR_ACCESS_DENIED); 1506 return FALSE; 1507 } 1517 1508 1518 1509 if(!lpOutBuffer || nOutBufferSize < 8) { … … 1524 1515 addr->PortNumber = 0; 1525 1516 addr->PathId = 0; 1526 1527 if(drvInfo->hInstAspi == NULL) { 1528 SetLastError(ERROR_ACCESS_DENIED); 1529 return FALSE; 1530 } 1531 1532 numAdapters = drvInfo->GetASPI32SupportInfo(); 1533 1534 memset(&srb, 0, sizeof(srb)); 1535 srb.common.SRB_Cmd = SC_HA_INQUIRY; 1536 rc = drvInfo->SendASPI32Command(&srb); 1537 1538 char drivename[3]; 1539 drivename[0] = (char)drvInfo->driveLetter; 1540 drivename[1] = ':'; 1541 drivename[2] = 0; 1542 1543 for(i=0;i<LOBYTE(numAdapters);i++) { 1544 for(j=0;j<8;j++) { 1545 for(k=0;k<16;k++) { 1546 memset(&srb, 0, sizeof(srb)); 1547 srb.common.SRB_Cmd = SC_GET_DEV_TYPE; 1548 srb.devtype.SRB_HaId = i; 1549 srb.devtype.SRB_Target = j; 1550 srb.devtype.SRB_Lun = k; 1551 rc = drvInfo->SendASPI32Command(&srb); 1552 if(rc == SS_COMP) { 1553 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM && 1554 GetDriveTypeA(drivename) == DRIVE_CDROM) 1555 { 1556 goto done; 1557 } 1558 } 1559 } 1560 } 1561 } 1562 done: 1563 if(rc == SS_COMP) { 1564 addr->TargetId = j; 1565 addr->Lun = k; 1566 SetLastError(ERROR_SUCCESS); 1567 } 1568 else SetLastError(ERROR_FILE_NOT_FOUND); //todo 1517 //irrelevant, since os2cdrom.dmd doesn't need them 1518 addr->TargetId = 1; 1519 addr->Lun = 0; 1520 SetLastError(ERROR_SUCCESS); 1569 1521 return TRUE; 1570 failure:1571 SetLastError(ERROR_INVALID_PARAMETER); //todo1572 return FALSE;1573 1522 } 1574 1523 -
trunk/src/kernel32/kernel32.mak
r8401 r8580 1 # $Id: kernel32.mak,v 1.3 0 2002-05-10 14:55:12 sandervl Exp $1 # $Id: kernel32.mak,v 1.31 2002-06-06 11:31:12 sandervl Exp $ 2 2 3 3 # … … 139 139 $(OBJDIR)\hmnpipe.obj \ 140 140 $(OBJDIR)\hmdisk.obj \ 141 $(OBJDIR)\oslibcdio.obj \ 141 142 $(OBJDIR)\version.obj \ 142 143 !ifdef DEBUG
Note:
See TracChangeset
for help on using the changeset viewer.