Changeset 8980 for trunk/src


Ignore:
Timestamp:
Aug 9, 2002, 3:17:22 PM (23 years ago)
Author:
sandervl
Message:

Lock drive when sharing is disabled (CreateFile for drives); unlock when closed

File:
1 edited

Legend:

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

    r8971 r8980  
    1 /* $Id: hmdisk.cpp,v 1.51 2002-08-08 15:38:23 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.52 2002-08-09 13:17:22 sandervl Exp $ */
    22
    33/*
     
    5454    BOOL      fCDPlaying;
    5555    BOOL      fShareViolation;
     56    DWORD     fLocked;
    5657    LARGE_INTEGER StartingOffset;
    5758    LARGE_INTEGER PartitionSize;
     
    280281        drvInfo->dwFlags   = pHMHandleData->dwFlags;
    281282        drvInfo->hTemplate = hTemplate;
     283        drvInfo->fLocked   = FALSE;
    282284
    283285        //save volume start & length if volume must be accessed through the physical disk
     
    318320        {
    319321            SetFilePointer(pHMHandleData, 0, NULL, FILE_BEGIN);
     322        }
     323        //If the disk handle was valid, then we must lock it if the drive
     324        //was opened without share flags
     325        if(pHMHandleData->hHMHandle && drvInfo->dwShare == 0) {
     326            dprintf(("Locking drive"));
     327            if(OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_LOCKDRIVE,0,0,0,0,0,0))
     328            {
     329                dprintf(("Sharing violation while attempting to lock the drive"));
     330                OSLibDosClose(pHMHandleData->hHMHandle);
     331                free(drvInfo);
     332                return ERROR_SHARING_VIOLATION;
     333            }
     334            drvInfo->fLocked = TRUE;
    320335        }
    321336        return (NO_ERROR);
     
    368383        }
    369384        OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &drvInfo->dwVolumelabel, NULL, 0);
     385
     386        //If the disk handle was valid, then we must lock it if the drive
     387        //was opened without share flags
     388        if(hFile && drvInfo->dwShare == 0) {
     389            dprintf(("Locking drive"));
     390            if(OSLibDosDevIOCtl(hFile,IOCTL_DISK,DSK_LOCKDRIVE,0,0,0,0,0,0))
     391            {
     392                dprintf(("Sharing violation while attempting to lock the drive"));
     393                OSLibDosClose(hFile);
     394                return 0;
     395            }
     396            drvInfo->fLocked = TRUE;
     397        }
    370398        return hFile;
    371399    }
     
    379407
    380408    if(pHMHandleData->hHMHandle) {
     409        DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
     410        if(drvInfo && drvInfo->fLocked) {
     411            dprintf(("Unlocking drive"));
     412            OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_UNLOCKDRIVE,0,0,0,0,0,0);
     413        }
    381414        ret = OSLibDosClose(pHMHandleData->hHMHandle);
    382415    }
     
    727760        }
    728761
    729         OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_LOCKDRIVE,0,0,0,0,0,0);
    730 
    731762        ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);
    732763
     
    768799           }
    769800        }
    770         OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_UNLOCKDRIVE,0,0,0,0,0,0);
    771801        SetErrorMode(oldmode);
    772802        SetLastError(ERROR_SUCCESS);
     
    774804
    775805writecheckfail:
    776         OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_UNLOCKDRIVE,0,0,0,0,0,0);
    777806        SetErrorMode(oldmode);
    778807        return FALSE;
     
    843872            if(rc) {
    844873                dprintf(("IOCTL_DISK_GET_DRIVE_GEOMETRY: OSLibDosQueryVolumeSerialAndName failed with rc %d", GetLastError()));
    845                 if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle);
     874                if(pHMHandleData->hHMHandle) {
     875                    if(drvInfo->fLocked) {
     876                        dprintf(("Unlocking drive"));
     877                        OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_UNLOCKDRIVE,0,0,0,0,0,0);
     878                        drvInfo->fLocked = FALSE;
     879                    }
     880                    OSLibDosClose(pHMHandleData->hHMHandle);
     881                }
    846882                pHMHandleData->hHMHandle = 0;
    847883                SetLastError(ERROR_MEDIA_CHANGED);
     
    18911927    else  lpRealBuf = (LPVOID)lpBuffer;
    18921928
    1893     OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_LOCKDRIVE,0,0,0,0,0,0);
    1894 
    18951929    if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) {
    18961930        dprintf(("ERROR: Overlapped IO not yet implememented!!"));
     
    19031937//  }
    19041938
    1905     OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_UNLOCKDRIVE,0,0,0,0,0,0);
    19061939    dprintf2(("KERNEL32: HMDeviceDiskClass::WriteFile returned %08xh\n",
    19071940               bRC));
Note: See TracChangeset for help on using the changeset viewer.