Changeset 8787


Ignore:
Timestamp:
Jun 26, 2002, 5:26:42 PM (23 years ago)
Author:
sandervl
Message:

IOCTL_STORAGE_GET_MEDIA_TYPES/IOCTL_DISK_GET_MEDIA_TYPES should always succeed; don't fail CreateFile in case of a sharing violation; handle is usable in windoze (although very limited)

File:
1 edited

Legend:

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

    r8785 r8787  
    1 /* $Id: hmdisk.cpp,v 1.49 2002-06-26 13:35:13 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.50 2002-06-26 15:26:42 sandervl Exp $ */
    22
    33/*
     
    5353    BOOL      fPhysicalDisk;
    5454    BOOL      fCDPlaying;
     55    BOOL      fShareViolation;
    5556    LARGE_INTEGER StartingOffset;
    5657    LARGE_INTEGER PartitionSize;
     
    244245    SetErrorMode(oldmode);
    245246
    246     if (hFile != INVALID_HANDLE_ERROR || GetLastError() == ERROR_NOT_READY)
     247    DWORD lasterror = GetLastError();
     248    if(hFile != INVALID_HANDLE_ERROR || lasterror == ERROR_NOT_READY ||
     249       lasterror == ERROR_SHARING_VIOLATION)
    247250    {
    248251        if(hFile == INVALID_HANDLE_ERROR) {
     
    260263        }
    261264        pHMHandleData->dwUserData = (DWORD)drvInfo;
     265
     266        if(lasterror == ERROR_SHARING_VIOLATION) {
     267            drvInfo->fShareViolation = TRUE;
     268        }
    262269
    263270        memset(drvInfo, 0, sizeof(DRIVE_INFO));
     
    689696    {
    690697        APIRET rc;
    691             DWORD ret;
     698        DWORD ret;
    692699        ULONG  ulBytesRead    = 0;      /* Number of bytes read by DosRead */
    693700        ULONG  ulWrote        = 0;      /* Number of bytes written by DosWrite */
     
    700707            if(!pHMHandleData->hHMHandle) {
    701708                dprintf(("No disk inserted; aborting"));
    702                 SetLastError(ERROR_NOT_READY);
     709                SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    703710                return FALSE;
    704711            }
     
    766773        return FALSE;
    767774    }
    768     case IOCTL_DISK_GET_DRIVE_GEOMETRY:
     775    //Basically the same as IOCTL_DISK_GET_DRIVE_GEOMETRY, but these two ioctls
     776    //are supposed to work even without media in the drive
    769777    case IOCTL_STORAGE_GET_MEDIA_TYPES:
    770778    case IOCTL_DISK_GET_MEDIA_TYPES:
     
    778786            *lpBytesReturned = 0;
    779787        }
     788        if(!pHMHandleData->hHMHandle) {
     789            pHMHandleData->hHMHandle = OpenDisk(drvInfo);
     790            //we don't care if there's a disk present or not
     791        }
     792
     793        if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, drvInfo->driveLetter, pGeom) == FALSE) {
     794            dprintf(("!ERROR!: IOCTL_DISK_GET_MEDIA_TYPES: OSLibDosGetDiskGeometry failed!!"));
     795            return FALSE;
     796        }
     797        if(lpBytesReturned) {
     798            *lpBytesReturned = sizeof(DISK_GEOMETRY);
     799        }
     800        SetLastError(ERROR_SUCCESS);
     801        return TRUE;
     802    }
     803
     804    //This ioctl is different from IOCTL_DISK_GET_MEDIA_TYPES; some applications
     805    //use it to determine if a disk is present or whether a media change has
     806    //occurred
     807    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
     808    {
     809        PDISK_GEOMETRY pGeom = (PDISK_GEOMETRY)lpOutBuffer;
     810        if(nOutBufferSize < sizeof(DISK_GEOMETRY) || !pGeom) {
     811            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     812            return FALSE;
     813        }
     814        if(lpBytesReturned) {
     815            *lpBytesReturned = 0;
     816        }
    780817
    781818        ULONG  volumelabel;
     
    784821        if(!pHMHandleData->hHMHandle) {
    785822            pHMHandleData->hHMHandle = OpenDisk(drvInfo);
    786             //IOCTL_DISK_GET_DRIVE_GEOMETRY must fail if no disk inserted
    787             //the other two shouldn't
    788             if(!pHMHandleData->hHMHandle && dwIoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY) {
     823            if(!pHMHandleData->hHMHandle) {
    789824                dprintf(("No disk inserted; aborting"));
    790                 SetLastError(ERROR_NOT_READY);
     825                SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    791826                return FALSE;
    792827            }
     
    798833        //label has changed
    799834        //TODO: Find better way to determine if floppy was removed or switched
    800         if(drvInfo->driveType != DRIVE_FIXED && pHMHandleData->hHMHandle)
     835        if(drvInfo->driveType != DRIVE_FIXED)
    801836        {
    802837            rc = OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &volumelabel, NULL, 0);
     
    816851
    817852        if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, drvInfo->driveLetter, pGeom) == FALSE) {
    818             return FALSE;
    819         }
     853            dprintf(("!ERROR!: IOCTL_DISK_GET_DRIVE_GEOMETRY: OSLibDosGetDiskGeometry failed!!"));
     854            return FALSE;
     855        }
     856        dprintf(("Cylinders         %d", pGeom->Cylinders));
     857        dprintf(("TracksPerCylinder %d", pGeom->TracksPerCylinder));
     858        dprintf(("SectorsPerTrack   %d", pGeom->SectorsPerTrack));
     859        dprintf(("BytesPerSector    %d", pGeom->BytesPerSector));
     860        dprintf(("MediaType         %d", pGeom->MediaType));
    820861        if(lpBytesReturned) {
    821862            *lpBytesReturned = sizeof(DISK_GEOMETRY);
     
    13651406            if(!pHMHandleData->hHMHandle) {
    13661407                dprintf(("No disk inserted; aborting"));
    1367                 SetLastError(ERROR_NOT_READY);
     1408                SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    13681409                return FALSE;
    13691410            }
     
    15931634        if(!pHMHandleData->hHMHandle) {
    15941635            dprintf(("No disk inserted; aborting"));
    1595             SetLastError(ERROR_NOT_READY);
     1636            SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    15961637            return FALSE;
    15971638        }
     
    16751716        if(!pHMHandleData->hHMHandle) {
    16761717            dprintf(("No disk inserted; aborting"));
    1677             SetLastError(ERROR_NOT_READY);
     1718            SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    16781719            return -1;
    16791720        }
     
    18241865        if(!pHMHandleData->hHMHandle) {
    18251866            dprintf(("No disk inserted; aborting"));
    1826             SetLastError(ERROR_NOT_READY);
     1867            SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    18271868            return FALSE;
    18281869        }
     
    18961937        if(!pHMHandleData->hHMHandle) {
    18971938            dprintf(("No disk inserted; aborting"));
    1898             SetLastError(ERROR_NOT_READY);
     1939            SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY);
    18991940            return -1; //INVALID_SET_FILE_POINTER
    19001941        }
Note: See TracChangeset for help on using the changeset viewer.