Changeset 8258 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- Apr 13, 2002, 8:21:39 AM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r8195 r8258 1 /* $Id: hmdisk.cpp,v 1.4 1 2002-04-06 14:58:35 sandervlExp $ */1 /* $Id: hmdisk.cpp,v 1.42 2002-04-13 06:21:39 bird Exp $ */ 2 2 3 3 /* … … 30 30 #define BIT_11 (1<<11) 31 31 32 typedef struct 32 typedef struct 33 33 { 34 34 HINSTANCE hInstAspi; … … 79 79 return TRUE; 80 80 } 81 81 82 82 //\\.\x: -> length 6 83 83 //\\.\PHYSICALDRIVEn -> length 18 … … 123 123 } 124 124 125 dwDriveType = GetDriveTypeA(lpFileName); 125 char szDrive[4]; 126 szDrive[0] = *lpFileName; 127 szDrive[1] = ':'; 128 szDrive[2] = '\0'; 129 dwDriveType = GetDriveTypeA(szDrive); 126 130 127 131 //Disable error popus. NT allows an app to open a cdrom/dvd drive without a disk inside … … 136 140 hTemplate); 137 141 138 //It is not allowed to open a readonly device with GENERIC_WRITE in OS/2; 142 //It is not allowed to open a readonly device with GENERIC_WRITE in OS/2; 139 143 //try with readonly again if that happened 140 144 //NOTE: Some applications open it with GENERIC_WRITE as Windows 2000 requires 141 145 // this for some aspi functions 142 if(hFile == INVALID_HANDLE_ERROR && dwDriveType == DRIVE_CDROM && 143 (pHMHandleData->dwAccess & GENERIC_WRITE)) 146 if(hFile == INVALID_HANDLE_ERROR && dwDriveType == DRIVE_CDROM && 147 (pHMHandleData->dwAccess & GENERIC_WRITE)) 144 148 { 145 149 pHMHandleData->dwAccess &= ~GENERIC_WRITE; … … 185 189 186 190 drvInfo->driveType = dwDriveType; 187 if(drvInfo->driveType == DRIVE_CDROM) 191 if(drvInfo->driveType == DRIVE_CDROM) 188 192 { 189 193 drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL"); … … 200 204 drvInfo->hInstAspi = 0; 201 205 } 202 206 203 207 //get cdrom signature 204 208 DWORD parsize = 4; … … 248 252 if(hFile == INVALID_HANDLE_ERROR) { 249 253 dprintf(("Drive not ready")); 250 return 0; 254 return 0; 251 255 } 252 256 OSLibDosQueryVolumeSerialAndName(1 + drvInfo->driveLetter - 'A', &drvInfo->dwVolumelabel, NULL, 0); … … 319 323 } ParameterBlock; 320 324 #pragma pack() 321 325 322 326 DWORD dwParameterSize = sizeof( ParameterBlock ); 323 327 DWORD dwDataSize = 0; 324 328 DWORD ret; 325 329 326 330 ParameterBlock.ucCommand = dwCommand; 327 331 ParameterBlock.ucHandle = dwDiskHandle; 328 332 329 333 if(lpBytesReturned) 330 334 *lpBytesReturned = 0; … … 588 592 UCHAR uchFileData[1] = {'0'}; /* Data to write to file */ 589 593 590 if(!pHMHandleData->hHMHandle) 594 if(!pHMHandleData->hHMHandle) 591 595 { 592 596 pHMHandleData->hHMHandle = OpenDisk(drvInfo); … … 604 608 605 609 OSLibDosDevIOCtl(pHMHandleData->hHMHandle,IOCTL_DISK,DSK_LOCKDRIVE,0,0,0,0,0,0); 606 610 607 611 ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS); 608 612 … … 629 633 goto writecheckfail; 630 634 } 631 635 632 636 rc = OSLibDosWrite(pHMHandleData->hHMHandle, /* File handle */ 633 637 (PVOID) uchFileData, /* String to be written */ … … 678 682 } 679 683 } 680 684 681 685 //Applications can use this IOCTL to check if the floppy has been changed 682 686 //OSLibDosGetDiskGeometry won't fail when that happens so we read the … … 718 722 case IOCTL_SERIAL_LSRMST_INSERT: 719 723 break; 720 721 724 725 722 726 // ----------- 723 727 // CDROM class … … 737 741 BYTE ucTrackControl; 738 742 } AudioTrackInfo; 739 typedef struct 743 typedef struct 740 744 { 741 745 BYTE signature[4]; … … 778 782 779 783 //numtracks+1, because we have to add a track at the end 780 int length = 4 + (numtracks+1)*sizeof(TRACK_DATA); 784 int length = 4 + (numtracks+1)*sizeof(TRACK_DATA); 781 785 //big endian format 782 786 pTOC->Length[0] = HIBYTE((length-2)); //minus length itself; … … 787 791 return FALSE; 788 792 } 789 790 for(int i=0;i<numtracks;i++) 793 794 for(int i=0;i<numtracks;i++) 791 795 { 792 796 parsize = sizeof(parm); … … 839 843 case IOCTL_CDROM_GET_CONTROL: 840 844 break; 841 845 842 846 case IOCTL_CDROM_PLAY_AUDIO_MSF: 843 847 { 844 848 dprintf(("Play CDROM audio playback")); 845 849 846 850 #pragma pack(1) 847 851 struct … … 853 857 } ParameterBlock; 854 858 #pragma pack() 855 859 856 860 PCDROM_PLAY_AUDIO_MSF pPlay = (PCDROM_PLAY_AUDIO_MSF)lpInBuffer; 857 861 858 862 // setup the parameter block 859 863 860 864 memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4); 861 865 ParameterBlock.ucAddressingMode = 1; // MSF format 862 866 863 867 // @@@PH unknown if this kind of MSF conversion is correct! 864 868 ParameterBlock.ulStartingMSF = pPlay->StartingM << 16 | … … 868 872 pPlay->EndingS << 8 | 869 873 pPlay->EndingF; 870 874 871 875 DWORD dwParameterSize = sizeof( ParameterBlock ); 872 876 DWORD dwDataSize = 0; 873 877 DWORD ret; 874 878 875 879 if(lpBytesReturned) 876 880 *lpBytesReturned = 0; 877 881 878 882 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 879 883 0x81, // IOCTL_CDROMAUDIO … … 887 891 return (ret == ERROR_SUCCESS); 888 892 } 889 893 890 894 case IOCTL_CDROM_SEEK_AUDIO_MSF: 891 895 break; … … 894 898 // NO BREAK CASE 895 899 // Note: for OS/2, pause and stop seems to be the same! 896 900 897 901 case IOCTL_CDROM_STOP_AUDIO: 898 902 { 899 903 dprintf(("Stop / pause CDROM audio playback")); 900 return ioctlCDROMSimple(pHMHandleData, 904 return ioctlCDROMSimple(pHMHandleData, 901 905 0x81, // IOCTL_CDROMAUDIO 902 906 0x51, // CDROMAUDIO_STOPAUDIO 903 907 lpBytesReturned, drvInfo); 904 908 } 905 909 906 910 case IOCTL_CDROM_RESUME_AUDIO: 907 911 { 908 912 dprintf(("Resume CDROM audio playback")); 909 return ioctlCDROMSimple(pHMHandleData, 913 return ioctlCDROMSimple(pHMHandleData, 910 914 0x81, // IOCTL_CDROMAUDIO 911 915 0x52, // CDROMAUDIO_RESUMEAUDIO … … 985 989 case IOCTL_CDROM_MEDIA_REMOVAL: 986 990 break; 987 991 988 992 case IOCTL_CDROM_EJECT_MEDIA: 989 993 { 990 994 dprintf(("Eject CDROM media")); 991 return ioctlCDROMSimple(pHMHandleData, 995 return ioctlCDROMSimple(pHMHandleData, 992 996 0x80, // IOCTL_CDROM 993 997 0x44, // CDROMDISK_EJECTDISK 994 998 lpBytesReturned, drvInfo); 995 999 } 996 1000 997 1001 case IOCTL_CDROM_LOAD_MEDIA: 998 1002 { 999 1003 dprintf(("Loading CDROM media")); 1000 return ioctlCDROMSimple(pHMHandleData, 1004 return ioctlCDROMSimple(pHMHandleData, 1001 1005 0x80, // IOCTL_CDROM 1002 1006 0x45, // CDROMDISK_CLOSETRAY 1003 1007 lpBytesReturned, drvInfo); 1004 1008 } 1005 1009 1006 1010 case IOCTL_CDROM_RESERVE: 1007 1011 case IOCTL_CDROM_RELEASE: 1008 1012 case IOCTL_CDROM_FIND_NEW_DEVICES: 1009 1013 break; 1010 1011 1014 1015 1012 1016 // ------------- 1013 1017 // STORAGE class 1014 1018 // ------------- 1015 1019 1016 1020 case IOCTL_CDROM_CHECK_VERIFY: 1017 1021 if(drvInfo->driveType != DRIVE_CDROM) { … … 1080 1084 lpBytesReturned); 1081 1085 } 1082 1086 1083 1087 case IOCTL_STORAGE_LOAD_MEDIA: 1084 1088 // case IOCTL_STORAGE_LOAD_MEDIA2: … … 1090 1094 lpBytesReturned); 1091 1095 } 1092 1096 1093 1097 // case IOCTL_STORAGE_EJECTION_CONTROL: 1094 1098 case IOCTL_STORAGE_MEDIA_REMOVAL: 1095 1099 break; 1096 1097 1100 1101 1098 1102 // ------------------- 1099 1103 // SCSI passthru class 1100 1104 // ------------------- 1101 1105 1102 1106 case IOCTL_SCSI_PASS_THROUGH: 1103 1107 case IOCTL_SCSI_MINIPORT: … … 1111 1115 SRB_ExecSCSICmd *psrb; 1112 1116 1113 if(drvInfo->hInstAspi == NULL) 1117 if(drvInfo->hInstAspi == NULL) 1114 1118 { 1115 1119 SetLastError(ERROR_ACCESS_DENIED);
Note:
See TracChangeset
for help on using the changeset viewer.