Changeset 8580 for trunk/src


Ignore:
Timestamp:
Jun 6, 2002, 1:31:13 PM (23 years ago)
Author:
sandervl
Message:

Use aspi interface in os2cdrom.dmd for SCSI ioctls

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.45 2002-05-17 16:49:34 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.46 2002-06-06 11:31:12 sandervl Exp $ */
    22
    33/*
     
    2020#include <win\winioctl.h>
    2121#include <win\ntddscsi.h>
    22 #include <win\wnaspi32.h>
    2322#include <win\aspi.h>
    2423#include "oslibdos.h"
    2524#include "osliblvm.h"
     25#include "oslibcdio.h"
    2626#include "asmutil.h"
    2727
     
    3939typedef struct
    4040{
    41     HINSTANCE hInstAspi;
    42     DWORD     (WIN32API *GetASPI32SupportInfo)();
    43     DWORD     (CDECL *SendASPI32Command)(LPSRB lpSRB);
     41    BOOL      fCDIoSupported;   
    4442    ULONG     driveLetter;
    4543    ULONG     driveType;
     
    287285        if(drvInfo->driveType == DRIVE_CDROM)
    288286        {
    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);
    302288
    303289            //get cdrom signature
     
    357343             return 0;
    358344        }
     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        }
    359356        OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &drvInfo->dwVolumelabel, NULL, 0);
    360357        return hFile;
     
    373370    if(pHMHandleData->dwUserData) {
    374371       DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
    375        if(drvInfo->hInstAspi)    FreeLibrary(drvInfo->hInstAspi);
    376372       free(drvInfo);
    377373    }
     
    14261422    // -------------------
    14271423
    1428     case IOCTL_SCSI_PASS_THROUGH:
    14291424    case IOCTL_SCSI_MINIPORT:
    14301425    case IOCTL_SCSI_GET_INQUIRY_DATA:
     1426        break;
     1427
    14311428    case IOCTL_SCSI_GET_CAPABILITIES:
    14321429        break;
    14331430
     1431    case IOCTL_SCSI_PASS_THROUGH:
     1432        //no break; same as IOCTL_SCSI_PASS_THROUGH_DIRECT
    14341433    case IOCTL_SCSI_PASS_THROUGH_DIRECT:
    14351434    {
    14361435        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;
    14441438
    14451439        if(nOutBufferSize < sizeof(SCSI_PASS_THROUGH_DIRECT) ||
     
    14491443            return FALSE;
    14501444        }
     1445       
     1446        if(!drvInfo || drvInfo->fCDIoSupported == FALSE) {
     1447            dprintf(("os2cdrom.dmd CD interface not supported!!"));
     1448            SetLastError(ERROR_ACCESS_DENIED);
     1449            return FALSE;
     1450        }
    14511451        if(lpBytesReturned) {
    14521452            *lpBytesReturned = 0;
    14531453        }
    14541454
    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
    14701463        switch(pPacket->DataIn) {
    14711464        case SCSI_IOCTL_DATA_OUT:
    1472              psrb->SRB_Flags = 0x2 << 3;
    1473              break;
     1465            cdiocmd.flDirection = CMDDIR_OUTPUT;
     1466            break;
    14741467        case SCSI_IOCTL_DATA_IN:
    1475              psrb->SRB_Flags = 0x1 << 3;
    1476              break;
     1468            cdiocmd.flDirection = CMDDIR_INPUT;
     1469            break;
    14771470        case SCSI_IOCTL_DATA_UNSPECIFIED:
    1478              psrb->SRB_Flags = 0x3 << 3;
    1479              break;
    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
    14851478        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;
    14971493            }
    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;
    15091496        SetLastError(ERROR_SUCCESS);
    15101497        return TRUE;
     
    15121499    case IOCTL_SCSI_GET_ADDRESS:
    15131500    {
    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        }
    15171508
    15181509        if(!lpOutBuffer || nOutBufferSize < 8) {
     
    15241515        addr->PortNumber = 0;
    15251516        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);
    15691521        return TRUE;
    1570 failure:
    1571         SetLastError(ERROR_INVALID_PARAMETER); //todo
    1572         return FALSE;
    15731522    }
    15741523
  • trunk/src/kernel32/kernel32.mak

    r8401 r8580  
    1 # $Id: kernel32.mak,v 1.30 2002-05-10 14:55:12 sandervl Exp $
     1# $Id: kernel32.mak,v 1.31 2002-06-06 11:31:12 sandervl Exp $
    22
    33#
     
    139139$(OBJDIR)\hmnpipe.obj \
    140140$(OBJDIR)\hmdisk.obj \
     141$(OBJDIR)\oslibcdio.obj \
    141142$(OBJDIR)\version.obj \
    142143!ifdef DEBUG
Note: See TracChangeset for help on using the changeset viewer.