Changeset 7272 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- Oct 30, 2001, 1:46:17 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r7270 r7272 1 /* $Id: hmdisk.cpp,v 1.2 6 2001-10-29 20:08:40sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.27 2001-10-30 00:46:17 sandervl Exp $ */ 2 2 3 3 /* … … 38 38 ULONG driveType; 39 39 CHAR signature[8]; 40 DWORD dwAccess; 41 DWORD dwShare; 42 DWORD dwCreation; 43 DWORD dwFlags; 44 LPSECURITY_ATTRIBUTES lpSecurityAttributes; 45 HFILE hTemplate; 40 46 } DRIVE_INFO; 41 47 … … 137 143 138 144 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 139 152 drvInfo->driveLetter = *lpFileName; //save drive letter 140 153 if(drvInfo->driveLetter >= 'a') { … … 173 186 return(GetLastError()); 174 187 } 188 } 189 //****************************************************************************** 190 //****************************************************************************** 191 DWORD 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; 175 222 } 176 223 //****************************************************************************** … … 523 570 APIRET rc; 524 571 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 525 581 //Applications can use this IOCTL to check if the floppy has been changed 526 582 //OSLibDosGetDiskGeometry won't fail when that happens so we read one … … 651 707 pTOC->TrackData[i].Reserved1 = 0; 652 708 //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 658 715 //Add a track at the end (presumably so the app can determine the size of the 1st track) 659 716 //That is what NT4, SP6 does anyway … … 665 722 //big endian format 666 723 //Address of pseudo track is the address of the lead-out track 667 pTOC->TrackData[numtracks].Address[0] = HI WORD(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] = LO WORD(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)); 671 728 672 729 if(lpBytesReturned) … … 876 933 *lpBytesReturned = 0; 877 934 } 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 878 945 #pragma pack(1) 879 946 typedef struct … … 954 1021 SRB_ExecSCSICmd *psrb; 955 1022 956 if(drvInfo->hInstAspi == NULL) { 1023 if(drvInfo->hInstAspi == NULL) 1024 { 957 1025 SetLastError(ERROR_ACCESS_DENIED); 958 1026 return FALSE; … … 968 1036 *lpBytesReturned = 0; 969 1037 } 1038 970 1039 psrb = (SRB_ExecSCSICmd *)alloca(sizeof(SRB_ExecSCSICmd)+pPacket->SenseInfoLength); 971 1040 if(psrb == NULL) { … … 1145 1214 return FALSE; 1146 1215 } 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 1147 1227 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) { 1148 1228 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation")); … … 1212 1292 dwMoveMethod)); 1213 1293 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 1214 1304 ret = OSLibDosSetFilePointer(pHMHandleData->hHMHandle, 1215 1305 lDistanceToMove,
Note:
See TracChangeset
for help on using the changeset viewer.