Ignore:
Timestamp:
Oct 30, 2001, 1:46:17 AM (24 years ago)
Author:
sandervl
Message:

IOCTL_CDROM_READ_TOC bugfix

File:
1 edited

Legend:

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

    r7270 r7272  
    1 /* $Id: hmdisk.cpp,v 1.26 2001-10-29 20:08:40 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.27 2001-10-30 00:46:17 sandervl Exp $ */
    22
    33/*
     
    3838    ULONG     driveType;
    3939    CHAR      signature[8];
     40    DWORD     dwAccess;
     41    DWORD     dwShare;
     42    DWORD     dwCreation;
     43    DWORD     dwFlags;
     44    LPSECURITY_ATTRIBUTES lpSecurityAttributes;
     45    HFILE     hTemplate;
    4046} DRIVE_INFO;
    4147
     
    137143
    138144        memset(drvInfo, 0, sizeof(DRIVE_INFO));
     145        drvInfo->dwAccess  = pHMHandleData->dwAccess;
     146        drvInfo->dwAccess  = pHMHandleData->dwShare;
     147        drvInfo->lpSecurityAttributes  = (LPSECURITY_ATTRIBUTES)lpSecurityAttributes;
     148        drvInfo->dwAccess  = pHMHandleData->dwCreation;
     149        drvInfo->dwAccess  = pHMHandleData->dwFlags;
     150        drvInfo->hTemplate = hTemplate;
     151
    139152        drvInfo->driveLetter = *lpFileName; //save drive letter
    140153        if(drvInfo->driveLetter >= 'a') {
     
    173186        return(GetLastError());
    174187    }
     188}
     189//******************************************************************************
     190//******************************************************************************
     191DWORD HMDeviceDiskClass::OpenDisk(PVOID pDrvInfo)
     192{
     193    char filename[3];
     194    DRIVE_INFO *drvInfo = (DRIVE_INFO*)pDrvInfo;
     195    HFILE hFile;
     196
     197    filename[0] = 'A' + drvInfo->driveLetter;
     198    filename[1] = ':';
     199    filename[2] = 0;
     200
     201    //Disable error popus. NT allows an app to open a cdrom/dvd drive without a disk inside
     202    //OS/2 fails in that case with error ERROR_NOT_READY
     203    ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);
     204    hFile = OSLibDosCreateFile(filename,
     205                               drvInfo->dwAccess,
     206                               drvInfo->dwShare,
     207                               drvInfo->lpSecurityAttributes,
     208                               drvInfo->dwCreation,
     209                               drvInfo->dwFlags,
     210                               drvInfo->hTemplate);
     211    SetErrorMode(oldmode);
     212
     213    if (hFile != INVALID_HANDLE_ERROR || GetLastError() == ERROR_NOT_READY)
     214    {
     215        if(hFile == INVALID_HANDLE_ERROR) {
     216             dprintf(("Drive not ready"));
     217             return 0;
     218        }
     219        else return hFile;
     220    }
     221    return 0;
    175222}
    176223//******************************************************************************
     
    523570        APIRET rc;
    524571
     572        if(!pHMHandleData->hHMHandle) {
     573            pHMHandleData->hHMHandle = OpenDisk(drvInfo);
     574            if(!pHMHandleData->hHMHandle) {
     575                dprintf(("No disk inserted; aborting"));
     576                SetLastError(ERROR_NOT_READY);
     577                return FALSE;
     578            }
     579        }
     580
    525581        //Applications can use this IOCTL to check if the floppy has been changed
    526582        //OSLibDosGetDiskGeometry won't fail when that happens so we read one
     
    651707            pTOC->TrackData[i].Reserved1   = 0;
    652708            //big endian format
    653             pTOC->TrackData[i].Address[0]  = HIWORD(HIBYTE(trackinfo.ulTrackAddr));
    654             pTOC->TrackData[i].Address[1]  = HIWORD(LOBYTE(trackinfo.ulTrackAddr));
    655             pTOC->TrackData[i].Address[2]  = LOWORD(HIBYTE(trackinfo.ulTrackAddr));
    656             pTOC->TrackData[i].Address[3]  = LOWORD(LOBYTE(trackinfo.ulTrackAddr));
    657         }
     709            pTOC->TrackData[i].Address[0]  = HIBYTE(HIWORD(trackinfo.ulTrackAddr));
     710            pTOC->TrackData[i].Address[1]  = LOBYTE(HIWORD(trackinfo.ulTrackAddr));
     711            pTOC->TrackData[i].Address[2]  = HIBYTE(LOWORD(trackinfo.ulTrackAddr));
     712            pTOC->TrackData[i].Address[3]  = LOBYTE(LOWORD(trackinfo.ulTrackAddr));
     713        }
     714
    658715        //Add a track at the end (presumably so the app can determine the size of the 1st track)
    659716        //That is what NT4, SP6 does anyway
     
    665722        //big endian format
    666723        //Address of pseudo track is the address of the lead-out track
    667         pTOC->TrackData[numtracks].Address[0]  = HIWORD(HIBYTE(diskinfo.ulLeadOutAddr));
    668         pTOC->TrackData[numtracks].Address[1]  = HIWORD(LOBYTE(diskinfo.ulLeadOutAddr));
    669         pTOC->TrackData[numtracks].Address[2]  = LOWORD(HIBYTE(diskinfo.ulLeadOutAddr));
    670         pTOC->TrackData[numtracks].Address[3]  = LOWORD(LOBYTE(diskinfo.ulLeadOutAddr));
     724        pTOC->TrackData[numtracks].Address[0]  = HIBYTE(HIWORD(diskinfo.ulLeadOutAddr));
     725        pTOC->TrackData[numtracks].Address[1]  = LOBYTE(HIWORD(diskinfo.ulLeadOutAddr));
     726        pTOC->TrackData[numtracks].Address[2]  = HIBYTE(LOWORD(diskinfo.ulLeadOutAddr));
     727        pTOC->TrackData[numtracks].Address[3]  = LOBYTE(LOWORD(diskinfo.ulLeadOutAddr));
    671728
    672729        if(lpBytesReturned)
     
    876933            *lpBytesReturned = 0;
    877934        }
     935
     936        if(!pHMHandleData->hHMHandle) {
     937            pHMHandleData->hHMHandle = OpenDisk(drvInfo);
     938            if(!pHMHandleData->hHMHandle) {
     939                dprintf(("No disk inserted; aborting"));
     940                SetLastError(ERROR_NOT_READY);
     941                return FALSE;
     942            }
     943        }
     944
    878945#pragma pack(1)
    879946      typedef struct
     
    9541021        SRB_ExecSCSICmd *psrb;
    9551022
    956         if(drvInfo->hInstAspi == NULL) {
     1023        if(drvInfo->hInstAspi == NULL)
     1024        {
    9571025            SetLastError(ERROR_ACCESS_DENIED);
    9581026            return FALSE;
     
    9681036            *lpBytesReturned = 0;
    9691037        }
     1038
    9701039        psrb = (SRB_ExecSCSICmd *)alloca(sizeof(SRB_ExecSCSICmd)+pPacket->SenseInfoLength);
    9711040        if(psrb == NULL) {
     
    11451214    return FALSE;
    11461215  }
     1216
     1217  if(!pHMHandleData->hHMHandle) {
     1218      DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
     1219      pHMHandleData->hHMHandle = OpenDisk(drvInfo);
     1220      if(!pHMHandleData->hHMHandle) {
     1221          dprintf(("No disk inserted; aborting"));
     1222          SetLastError(ERROR_NOT_READY);
     1223          return -1;
     1224      }
     1225  }
     1226
    11471227  if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) {
    11481228    dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation"));
     
    12121292           dwMoveMethod));
    12131293
     1294  if(!pHMHandleData->hHMHandle) {
     1295      DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
     1296      pHMHandleData->hHMHandle = OpenDisk(drvInfo);
     1297      if(!pHMHandleData->hHMHandle) {
     1298          dprintf(("No disk inserted; aborting"));
     1299          SetLastError(ERROR_NOT_READY);
     1300          return -1;
     1301      }
     1302  }
     1303
    12141304  ret = OSLibDosSetFilePointer(pHMHandleData->hHMHandle,
    12151305                               lDistanceToMove,
Note: See TracChangeset for help on using the changeset viewer.