Ignore:
Timestamp:
Oct 26, 2001, 3:03:04 PM (24 years ago)
Author:
sandervl
Message:

implemented several cdrom ioctls

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/hmdisk.cpp

    r7202 r7219  
    1 /* $Id: hmdisk.cpp,v 1.18 2001-10-25 13:19:05 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.19 2001-10-26 13:03:04 sandervl Exp $ */
    22
    33/*
     
    2525#include "dbglocal.h"
    2626
     27#define BIT_0     (1)
     28#define BIT_11    (1<<11)
     29
    2730typedef struct
    2831{
     
    3134    DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
    3235    ULONG     driveLetter;
     36    ULONG     driveType;
    3337    CHAR      signature[8];
    3438} DRIVE_INFO;
     
    135139        }
    136140
    137         if(GetDriveTypeA(lpFileName) == DRIVE_CDROM) {
     141        drvInfo->driveType = GetDriveTypeA(lpFileName);
     142        if(drvInfo->driveType == DRIVE_CDROM)
     143        {
    138144            drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL");
    139145            if(drvInfo->hInstAspi == NULL) {
     
    145151            *(FARPROC *)&drvInfo->SendASPI32Command    = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command");
    146152   
    147             //get cdrom signature (TODO: why doesn't this work???)
     153            //get cdrom signature
    148154            DWORD parsize = 4;
    149155            DWORD datasize = 4;
    150156            strcpy(drvInfo->signature, "CD01");
    151             OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, &drvInfo->signature[0], 4, &parsize,
     157            OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x80, 0x61, &drvInfo->signature[0], 4, &parsize,
    152158                             &drvInfo->signature[0], 4, &datasize);
    153159        }
     160
    154161        return (NO_ERROR);
    155162    }
     
    186193                             DWORD dwCategory,
    187194                             DWORD dwFunction,
    188                              LPDWORD lpBytesReturned)
     195                             LPDWORD lpBytesReturned, DRIVE_INFO *pdrvInfo)
    189196{
    190197  DWORD dwParameterSize = 4;
     
    198205                         dwCategory,
    199206                         dwFunction,
    200                          "CD01",
     207                         pdrvInfo->signature,
    201208                         4,
    202209                         &dwParameterSize,
     
    550557    // CDROM class
    551558    // -----------
     559    case IOCTL_CDROM_READ_TOC:
     560    {
     561#pragma pack(1)
     562        typedef struct
     563        {
     564            BYTE  ucFirstTrack;
     565            BYTE  ucLastTrack;
     566            DWORD ulLeadOutAddr;
     567        } AudioDiskInfo;
     568        typedef struct
     569        {
     570            DWORD ulTrackAddr;
     571            BYTE  ucTrackControl;
     572        } AudioTrackInfo;
     573        typedef struct
     574        {
     575            BYTE  signature[4];
     576            BYTE  ucTrack;
     577        } ParameterBlock;
     578#pragma pack()
     579
     580        PCDROM_TOC pTOC = (PCDROM_TOC)lpOutBuffer;
     581        DWORD rc, numtracks;
     582        DWORD parsize = 4;
     583        DWORD datasize;
     584        AudioDiskInfo diskinfo;
     585        AudioTrackInfo trackinfo;
     586        ParameterBlock parm;
     587
     588        if(lpBytesReturned)
     589            *lpBytesReturned = 0;
     590
     591        if(nOutBufferSize < 4 || !pTOC) {
     592            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     593            return FALSE;
     594        }
     595
     596        //IOCTL_CDROMAUDIO (0x81), CDROMAUDIO_GETAUDIODISK (0x61)
     597        datasize = sizeof(diskinfo);
     598        rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x61, &drvInfo->signature[0], 4, &parsize,
     599                              &diskinfo, sizeof(diskinfo), &datasize);
     600        if(rc != NO_ERROR) {
     601            dprintf(("OSLibDosDevIOCtl failed with rc %d", rc));
     602            return FALSE;
     603        }
     604        pTOC->FirstTrack = diskinfo.ucFirstTrack;
     605        pTOC->LastTrack  = diskinfo.ucLastTrack;
     606        numtracks = pTOC->LastTrack - pTOC->FirstTrack + 1;
     607        *(WORD *)&pTOC->Length = 4 + numtracks*sizeof(TRACK_DATA);
     608        dprintf(("first %d, last %d, num %d", pTOC->FirstTrack, pTOC->LastTrack, numtracks));
     609
     610        if(nOutBufferSize < 4+numtracks*sizeof(TRACK_DATA)) {
     611            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     612            return FALSE;
     613        }
     614
     615        for(int i=0;i<numtracks;i++)
     616        {
     617            parsize = sizeof(parm);
     618            memcpy(parm.signature, drvInfo->signature, 4);
     619            parm.ucTrack = i;
     620
     621            datasize = sizeof(trackinfo);
     622
     623            //IOCTL_CDROMAUDIO (0x81), CDROMAUDIO_GETAUDIOTRACK (0x62)
     624            rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x62, &parm, sizeof(parm), &parsize,
     625                                  &trackinfo, sizeof(trackinfo), &datasize);
     626            if(rc != NO_ERROR) {
     627                dprintf(("OSLibDosDevIOCtl failed with rc %d", rc));
     628                return FALSE;
     629            }
     630            pTOC->TrackData[i].TrackNumber = pTOC->FirstTrack + i;
     631            pTOC->TrackData[i].Reserved    = 0;
     632            pTOC->TrackData[i].Control     = trackinfo.ucTrackControl >> 4;
     633            pTOC->TrackData[i].Adr         = trackinfo.ucTrackControl & 0xF;
     634            pTOC->TrackData[i].Reserved1   = 0;
     635            *(DWORD *)&pTOC->TrackData[i].Address = trackinfo.ulTrackAddr;
     636        }       
     637        if(lpBytesReturned)
     638            *lpBytesReturned = 4 + numtracks*sizeof(TRACK_DATA);
     639
     640        SetLastError(ERROR_SUCCESS);
     641        return TRUE;
     642    }
    552643
    553644    case IOCTL_CDROM_UNLOAD_DRIVER:
    554     case IOCTL_CDROM_READ_TOC:
    555645    case IOCTL_CDROM_GET_CONTROL:
    556646        break;
     
    574664      // setup the parameter block
    575665     
    576       ParameterBlock.ucSignature = 0x31304443; // 'CD01'
     666      memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4);
    577667      ParameterBlock.ucAddressingMode = 1;     // MSF format
    578668     
     
    623713                              0x81,   // IOCTL_CDROMAUDIO
    624714                              0x51,   // CDROMAUDIO_STOPAUDIO
    625                               lpBytesReturned);
     715                              lpBytesReturned, drvInfo);
    626716    }
    627717     
     
    632722                              0x81,   // IOCTL_CDROMAUDIO
    633723                              0x52,   // CDROMAUDIO_RESUMEAUDIO
    634                               lpBytesReturned);
     724                              lpBytesReturned, drvInfo);
    635725    }
    636726
     
    650740        parsize = 4;
    651741        datasize = 8;
    652         ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, "CD01", 4, &parsize,
     742        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, drvInfo->signature, 4, &parsize,
    653743                               volbuf, 8, &datasize);
    654744
     
    692782        volbuf[7] = pVol->PortVolume[3];
    693783        dprintf(("Set CD volume (%d,%d)(%d,%d)", pVol->PortVolume[0], pVol->PortVolume[1], pVol->PortVolume[2], pVol->PortVolume[3]));
    694         ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, "CD01", 4, &parsize,
     784        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, drvInfo->signature, 4, &parsize,
    695785                               volbuf, 8, &datasize);
    696786
     
    707797    case IOCTL_CDROM_DISK_TYPE:
    708798    case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
    709     case IOCTL_CDROM_CHECK_VERIFY:
    710799    case IOCTL_CDROM_MEDIA_REMOVAL:
    711800        break;
     
    717806                              0x80,   // IOCTL_CDROM
    718807                              0x44,   // CDROMDISK_EJECTDISK
    719                               lpBytesReturned);
     808                              lpBytesReturned, drvInfo);
    720809    }
    721810     
     
    726815                              0x80,   // IOCTL_CDROM
    727816                              0x45,   // CDROMDISK_CLOSETRAY
    728                               lpBytesReturned);
     817                              lpBytesReturned, drvInfo);
    729818    }
    730819     
     
    739828    // -------------
    740829     
     830    case IOCTL_CDROM_CHECK_VERIFY:
     831        if(drvInfo->driveType != DRIVE_CDROM) {
     832            SetLastError(ERROR_GEN_FAILURE); //TODO: right error?
     833            return FALSE;
     834        }
     835        //no break;
    741836    case IOCTL_DISK_CHECK_VERIFY:
    742837    case IOCTL_STORAGE_CHECK_VERIFY:
    743       dprintf(("IOCTL_STORAGE_CHECK_VERIFY incompletely implemented"));
     838        dprintf(("IOCTL_CDROM(DISK/STORAGE)CHECK_VERIFY %s", drvInfo->signature));
    744839        if(lpBytesReturned) {
    745840            *lpBytesReturned = 0;
     
    747842        //TODO: check if disk has been inserted or removed
    748843        if(pHMHandleData->hHMHandle == 0) {
    749             SetLastError(ERROR_NOT_READY);
    750             return FALSE;
     844            SetLastError(NO_ERROR); //TODO: correct???
     845//            SetLastError(ERROR_NOT_READY);         
     846            return FALSE;
     847        }
     848
     849        if(drvInfo->driveType == DRIVE_CDROM)
     850        {
     851            DWORD parsize = 4;
     852            DWORD datasize = 4;
     853            DWORD status = 0;
     854            DWORD rc;
     855
     856            //IOCTL_CDROM (0x80), CDROMDISK_DEVICESTATUS (0x60)
     857            rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x80, 0x60, &drvInfo->signature[0], 4, &parsize,
     858                                  &status, sizeof(status), &datasize);
     859            if(rc != NO_ERROR) {
     860                dprintf(("OSLibDosDevIOCtl failed with rc %d", rc));
     861                return FALSE;
     862            }
     863            dprintf(("CDROM status 0x%x", status));
     864            //if door open or no disk present, return FALSE
     865            if(status & (BIT_0|BIT_11)) {
     866                 rc = FALSE;
     867            }
     868            else rc = TRUE;
     869            SetLastError(NO_ERROR);
     870            return rc;
     871        }
     872        else {
     873            dprintf(("IOCTL_STORAGE_CHECK_VERIFY incompletely implemented"));
    751874        }
    752875        SetLastError(NO_ERROR);
     
    840963             return FALSE;
    841964        }
     965        dprintf(("IOCTL_SCSI_PASS_THROUGH_DIRECT %x", pPacket->Cdb[0]));
    842966        psrb->SRB_BufPointer = (BYTE *)pPacket->DataBuffer;
    843967        memcpy(&psrb->CDBByte[0], &pPacket->Cdb[0], 16);
     
    8811005        addr->PathId     = 0;
    8821006        numAdapters = drvInfo->GetASPI32SupportInfo();
    883         if(LOBYTE(numAdapters) == 0) goto failure;
     1007
     1008        if(LOBYTE(numAdapters) == 0) {
     1009            //testestest
     1010            i=j=k=0;
     1011            goto done; //failure;
     1012        }
    8841013
    8851014        memset(&srb, 0, sizeof(srb));
Note: See TracChangeset for help on using the changeset viewer.