Ignore:
Timestamp:
Oct 29, 2001, 2:36:32 PM (24 years ago)
Author:
sandervl
Message:

Always IOCTL_DISK/DSK_GETLOCKSTATUS for IOCTL_STORAGE_CHECK_VERIFY

File:
1 edited

Legend:

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

    r7234 r7262  
    1 /* $Id: hmdisk.cpp,v 1.23 2001-10-27 08:26:06 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.24 2001-10-29 13:36:32 sandervl Exp $ */
    22
    33/*
     
    870870    case IOCTL_DISK_CHECK_VERIFY:
    871871    case IOCTL_STORAGE_CHECK_VERIFY:
     872    {
    872873        dprintf(("IOCTL_CDROM(DISK/STORAGE)CHECK_VERIFY %s", drvInfo->signature));
    873874        if(lpBytesReturned) {
    874875            *lpBytesReturned = 0;
    875876        }
    876         //TODO: check if disk has been inserted or removed
    877         if(pHMHandleData->hHMHandle == 0) {
    878             SetLastError(ERROR_NOT_READY);  //NT4, SP6 returns this
    879             return FALSE;
    880         }
    881 
    882         if(drvInfo->driveType == DRIVE_CDROM)
    883         {
    884             DWORD parsize = 4;
    885             DWORD datasize = 4;
    886             DWORD status = 0;
    887             DWORD rc;
    888 
    889             //IOCTL_CDROM (0x80), CDROMDISK_DEVICESTATUS (0x60)
    890             rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x80, 0x60, &drvInfo->signature[0], 4, &parsize,
    891                                   &status, sizeof(status), &datasize);
    892             if(rc != NO_ERROR) {
    893                 dprintf(("OSLibDosDevIOCtl failed with rc %d", rc));
    894                 return FALSE;
    895             }
    896             dprintf(("CDROM status 0x%x", status));
    897             //if door open or no disk present, return FALSE
    898             if(status & (BIT_0|BIT_11)) {
    899                 SetLastError(ERROR_NOT_READY);  //NT4, SP6 returns this
    900                 return FALSE;
    901             }
    902             SetLastError(NO_ERROR);
    903             return TRUE;
    904         }
    905         else {
    906877#pragma pack(1)
    907878      typedef struct
     
    912883#pragma pack()
    913884
    914             DWORD parsize = sizeof(ParameterBlock);
    915             DWORD datasize = 2;
    916             WORD status = 0;
    917             DWORD rc;
    918             ParameterBlock parm;
    919 
    920             parm.ucCommandInfo = 0;
    921             parm.usDriveUnit = drvInfo->driveLetter - 'A';
    922             //IOCTL_DISK (0x08), DSK_GETLOCKSTATUS (0x66)
    923             rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x08, 0x66, &parm, sizeof(parm), &parsize,
    924                                   &status, sizeof(status), &datasize);
    925             if(rc != NO_ERROR) {
    926                 dprintf(("OSLibDosDevIOCtl failed with rc %d", rc));
    927                 return FALSE;
    928             }
    929             dprintf(("Disk status 0x%x", status));
    930             dprintf(("WARNING: IOCTL_DISK_CHECK_VERIFY not properly implemented!!"));
    931             //TODO: this doesn't seem to work
    932             //if no disk present, return FALSE
    933 //            if(!(status & (BIT_2))) {
    934 //                SetLastError(ERROR_NOT_READY);  //NT4, SP6 returns this
    935 //                return FALSE;
    936 //            }
    937             SetLastError(NO_ERROR);
    938             return TRUE;
     885        DWORD parsize = sizeof(ParameterBlock);
     886        DWORD datasize = 2;
     887        WORD status = 0;
     888        DWORD rc;
     889        ParameterBlock parm;
     890
     891        parm.ucCommandInfo = 0;
     892        parm.usDriveUnit = drvInfo->driveLetter - 'A';
     893        //IOCTL_DISK (0x08), DSK_GETLOCKSTATUS (0x66)
     894//            rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x08, 0x66, &parm, sizeof(parm), &parsize,
     895        //TODO: this doesn't work for floppies for some reason...
     896        rc = OSLibDosDevIOCtl(-1, 0x08, 0x66, &parm, sizeof(parm), &parsize,
     897                              &status, sizeof(status), &datasize);
     898        if(rc != NO_ERROR || datasize == 0) {
     899            dprintf(("OSLibDosDevIOCtl failed with rc %d datasize %d", rc, datasize));
     900            return FALSE;
     901        }
     902        dprintf(("Disk status 0x%x", status));
     903        //if no disk present, return FALSE
     904        if(!(status & (BIT_2))) {
     905            SetLastError(ERROR_NOT_READY);  //NT4, SP6 returns this
     906            return FALSE;
    939907        }
    940908        SetLastError(NO_ERROR);
    941909        return TRUE;
     910    }
    942911
    943912    case IOCTL_DISK_EJECT_MEDIA:
Note: See TracChangeset for help on using the changeset viewer.