Changeset 8787
- Timestamp:
- Jun 26, 2002, 5:26:42 PM (23 years ago)
- 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:13sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.50 2002-06-26 15:26:42 sandervl Exp $ */ 2 2 3 3 /* … … 53 53 BOOL fPhysicalDisk; 54 54 BOOL fCDPlaying; 55 BOOL fShareViolation; 55 56 LARGE_INTEGER StartingOffset; 56 57 LARGE_INTEGER PartitionSize; … … 244 245 SetErrorMode(oldmode); 245 246 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) 247 250 { 248 251 if(hFile == INVALID_HANDLE_ERROR) { … … 260 263 } 261 264 pHMHandleData->dwUserData = (DWORD)drvInfo; 265 266 if(lasterror == ERROR_SHARING_VIOLATION) { 267 drvInfo->fShareViolation = TRUE; 268 } 262 269 263 270 memset(drvInfo, 0, sizeof(DRIVE_INFO)); … … 689 696 { 690 697 APIRET rc; 691 DWORDret;698 DWORD ret; 692 699 ULONG ulBytesRead = 0; /* Number of bytes read by DosRead */ 693 700 ULONG ulWrote = 0; /* Number of bytes written by DosWrite */ … … 700 707 if(!pHMHandleData->hHMHandle) { 701 708 dprintf(("No disk inserted; aborting")); 702 SetLastError( ERROR_NOT_READY);709 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 703 710 return FALSE; 704 711 } … … 766 773 return FALSE; 767 774 } 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 769 777 case IOCTL_STORAGE_GET_MEDIA_TYPES: 770 778 case IOCTL_DISK_GET_MEDIA_TYPES: … … 778 786 *lpBytesReturned = 0; 779 787 } 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 } 780 817 781 818 ULONG volumelabel; … … 784 821 if(!pHMHandleData->hHMHandle) { 785 822 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) { 789 824 dprintf(("No disk inserted; aborting")); 790 SetLastError( ERROR_NOT_READY);825 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 791 826 return FALSE; 792 827 } … … 798 833 //label has changed 799 834 //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) 801 836 { 802 837 rc = OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &volumelabel, NULL, 0); … … 816 851 817 852 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)); 820 861 if(lpBytesReturned) { 821 862 *lpBytesReturned = sizeof(DISK_GEOMETRY); … … 1365 1406 if(!pHMHandleData->hHMHandle) { 1366 1407 dprintf(("No disk inserted; aborting")); 1367 SetLastError( ERROR_NOT_READY);1408 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 1368 1409 return FALSE; 1369 1410 } … … 1593 1634 if(!pHMHandleData->hHMHandle) { 1594 1635 dprintf(("No disk inserted; aborting")); 1595 SetLastError( ERROR_NOT_READY);1636 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 1596 1637 return FALSE; 1597 1638 } … … 1675 1716 if(!pHMHandleData->hHMHandle) { 1676 1717 dprintf(("No disk inserted; aborting")); 1677 SetLastError( ERROR_NOT_READY);1718 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 1678 1719 return -1; 1679 1720 } … … 1824 1865 if(!pHMHandleData->hHMHandle) { 1825 1866 dprintf(("No disk inserted; aborting")); 1826 SetLastError( ERROR_NOT_READY);1867 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 1827 1868 return FALSE; 1828 1869 } … … 1896 1937 if(!pHMHandleData->hHMHandle) { 1897 1938 dprintf(("No disk inserted; aborting")); 1898 SetLastError( ERROR_NOT_READY);1939 SetLastError((drvInfo->fShareViolation) ? ERROR_SHARING_VIOLATION : ERROR_NOT_READY); 1899 1940 return -1; //INVALID_SET_FILE_POINTER 1900 1941 }
Note:
See TracChangeset
for help on using the changeset viewer.