Ignore:
Timestamp:
Oct 26, 2001, 9:22:15 PM (24 years ago)
Author:
sandervl
Message:

IOCTL_CDROM_READ_TOC fix: add lead-out track

File:
1 edited

Legend:

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

    r7222 r7224  
    1 /* $Id: hmdisk.cpp,v 1.21 2001-10-26 17:47:21 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.22 2001-10-26 19:22:15 sandervl Exp $ */
    22
    33/*
     
    150150            *(FARPROC *)&drvInfo->GetASPI32SupportInfo = GetProcAddress(drvInfo->hInstAspi, "GetASPI32SupportInfo");
    151151            *(FARPROC *)&drvInfo->SendASPI32Command    = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command");
     152
     153            if(drvInfo->GetASPI32SupportInfo() == 0) {
     154                FreeLibrary(drvInfo->hInstAspi);
     155                drvInfo->hInstAspi = 0;
     156            }
    152157   
    153158            //get cdrom signature
     
    597602            return FALSE;
    598603        }
    599 
     604        memset(pTOC, 0, nOutBufferSize);
    600605        //IOCTL_CDROMAUDIO (0x81), CDROMAUDIO_GETAUDIODISK (0x61)
    601606        datasize = sizeof(diskinfo);
     
    611616        dprintf(("first %d, last %d, num %d", pTOC->FirstTrack, pTOC->LastTrack, numtracks));
    612617
    613         int len = 4 + numtracks*sizeof(TRACK_DATA) - 2; //minus length itself;
     618        //numtracks+1, because we have to add a track at the end
     619        int length = 4 + (numtracks+1)*sizeof(TRACK_DATA);
    614620        //big endian format
    615         pTOC->Length[0] = HIBYTE(len);
    616         pTOC->Length[1] = LOBYTE(len);
    617 
    618         if(nOutBufferSize < 4+numtracks*sizeof(TRACK_DATA)) {
     621        pTOC->Length[0] = HIBYTE((length-2));  //minus length itself;
     622        pTOC->Length[1] = LOBYTE((length-2));  //minus length itself;
     623
     624        if(nOutBufferSize < length) {
    619625            SetLastError(ERROR_INSUFFICIENT_BUFFER);
    620626            return FALSE;
    621627        }
    622 
     628       
    623629        for(int i=0;i<numtracks;i++)
    624630        {
     
    646652            pTOC->TrackData[i].Address[2]  = LOWORD(HIBYTE(trackinfo.ulTrackAddr));
    647653            pTOC->TrackData[i].Address[3]  = LOWORD(LOBYTE(trackinfo.ulTrackAddr));
    648         }       
     654        }
     655        //Add a track at the end (presumably so the app can determine the size of the 1st track)
     656        //That is what NT4, SP6 does anyway
     657        pTOC->TrackData[numtracks].TrackNumber = 0xAA;
     658        pTOC->TrackData[numtracks].Reserved    = 0;
     659        pTOC->TrackData[numtracks].Control     = pTOC->TrackData[numtracks-1].Control;
     660        pTOC->TrackData[numtracks].Adr         = pTOC->TrackData[numtracks-1].Adr;
     661        pTOC->TrackData[numtracks].Reserved1   = 0;
     662        //big endian format
     663        //Address of pseudo track is the address of the lead-out track
     664        pTOC->TrackData[numtracks].Address[0]  = HIWORD(HIBYTE(diskinfo.ulLeadOutAddr));
     665        pTOC->TrackData[numtracks].Address[1]  = HIWORD(LOBYTE(diskinfo.ulLeadOutAddr));
     666        pTOC->TrackData[numtracks].Address[2]  = LOWORD(HIBYTE(diskinfo.ulLeadOutAddr));
     667        pTOC->TrackData[numtracks].Address[3]  = LOWORD(LOBYTE(diskinfo.ulLeadOutAddr));
     668
    649669        if(lpBytesReturned)
    650             *lpBytesReturned = 4 + numtracks*sizeof(TRACK_DATA);
     670            *lpBytesReturned = length;
    651671
    652672        SetLastError(ERROR_SUCCESS);
     
    10151035        addr->PortNumber = 0;
    10161036        addr->PathId     = 0;
     1037
     1038        if(drvInfo->hInstAspi == NULL) {
     1039            //Don't fail if wnaspi32 not loaded
     1040            addr->TargetId   = 0;
     1041            addr->Lun        = 0;
     1042            SetLastError(ERROR_SUCCESS);
     1043            return TRUE;
     1044        }
     1045
    10171046        numAdapters = drvInfo->GetASPI32SupportInfo();
    1018 
    1019         if(LOBYTE(numAdapters) == 0) {
    1020             //testestest
    1021             i=j=k=0;
    1022             goto done; //failure;
    1023         }
    10241047
    10251048        memset(&srb, 0, sizeof(srb));
Note: See TracChangeset for help on using the changeset viewer.