Changeset 7219 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- Oct 26, 2001, 3:03:04 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r7202 r7219 1 /* $Id: hmdisk.cpp,v 1.1 8 2001-10-25 13:19:05sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.19 2001-10-26 13:03:04 sandervl Exp $ */ 2 2 3 3 /* … … 25 25 #include "dbglocal.h" 26 26 27 #define BIT_0 (1) 28 #define BIT_11 (1<<11) 29 27 30 typedef struct 28 31 { … … 31 34 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB); 32 35 ULONG driveLetter; 36 ULONG driveType; 33 37 CHAR signature[8]; 34 38 } DRIVE_INFO; … … 135 139 } 136 140 137 if(GetDriveTypeA(lpFileName) == DRIVE_CDROM) { 141 drvInfo->driveType = GetDriveTypeA(lpFileName); 142 if(drvInfo->driveType == DRIVE_CDROM) 143 { 138 144 drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL"); 139 145 if(drvInfo->hInstAspi == NULL) { … … 145 151 *(FARPROC *)&drvInfo->SendASPI32Command = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command"); 146 152 147 //get cdrom signature (TODO: why doesn't this work???)153 //get cdrom signature 148 154 DWORD parsize = 4; 149 155 DWORD datasize = 4; 150 156 strcpy(drvInfo->signature, "CD01"); 151 OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x8 1, 0x60, &drvInfo->signature[0], 4, &parsize,157 OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x80, 0x61, &drvInfo->signature[0], 4, &parsize, 152 158 &drvInfo->signature[0], 4, &datasize); 153 159 } 160 154 161 return (NO_ERROR); 155 162 } … … 186 193 DWORD dwCategory, 187 194 DWORD dwFunction, 188 LPDWORD lpBytesReturned )195 LPDWORD lpBytesReturned, DRIVE_INFO *pdrvInfo) 189 196 { 190 197 DWORD dwParameterSize = 4; … … 198 205 dwCategory, 199 206 dwFunction, 200 "CD01",207 pdrvInfo->signature, 201 208 4, 202 209 &dwParameterSize, … … 550 557 // CDROM class 551 558 // ----------- 559 case IOCTL_CDROM_READ_TOC: 560 { 561 #pragma pack(1) 562 typedef struct 563 { 564 BYTE ucFirstTrack; 565 BYTE ucLastTrack; 566 DWORD ulLeadOutAddr; 567 } AudioDiskInfo; 568 typedef struct 569 { 570 DWORD ulTrackAddr; 571 BYTE ucTrackControl; 572 } AudioTrackInfo; 573 typedef struct 574 { 575 BYTE signature[4]; 576 BYTE ucTrack; 577 } ParameterBlock; 578 #pragma pack() 579 580 PCDROM_TOC pTOC = (PCDROM_TOC)lpOutBuffer; 581 DWORD rc, numtracks; 582 DWORD parsize = 4; 583 DWORD datasize; 584 AudioDiskInfo diskinfo; 585 AudioTrackInfo trackinfo; 586 ParameterBlock parm; 587 588 if(lpBytesReturned) 589 *lpBytesReturned = 0; 590 591 if(nOutBufferSize < 4 || !pTOC) { 592 SetLastError(ERROR_INSUFFICIENT_BUFFER); 593 return FALSE; 594 } 595 596 //IOCTL_CDROMAUDIO (0x81), CDROMAUDIO_GETAUDIODISK (0x61) 597 datasize = sizeof(diskinfo); 598 rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x61, &drvInfo->signature[0], 4, &parsize, 599 &diskinfo, sizeof(diskinfo), &datasize); 600 if(rc != NO_ERROR) { 601 dprintf(("OSLibDosDevIOCtl failed with rc %d", rc)); 602 return FALSE; 603 } 604 pTOC->FirstTrack = diskinfo.ucFirstTrack; 605 pTOC->LastTrack = diskinfo.ucLastTrack; 606 numtracks = pTOC->LastTrack - pTOC->FirstTrack + 1; 607 *(WORD *)&pTOC->Length = 4 + numtracks*sizeof(TRACK_DATA); 608 dprintf(("first %d, last %d, num %d", pTOC->FirstTrack, pTOC->LastTrack, numtracks)); 609 610 if(nOutBufferSize < 4+numtracks*sizeof(TRACK_DATA)) { 611 SetLastError(ERROR_INSUFFICIENT_BUFFER); 612 return FALSE; 613 } 614 615 for(int i=0;i<numtracks;i++) 616 { 617 parsize = sizeof(parm); 618 memcpy(parm.signature, drvInfo->signature, 4); 619 parm.ucTrack = i; 620 621 datasize = sizeof(trackinfo); 622 623 //IOCTL_CDROMAUDIO (0x81), CDROMAUDIO_GETAUDIOTRACK (0x62) 624 rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x62, &parm, sizeof(parm), &parsize, 625 &trackinfo, sizeof(trackinfo), &datasize); 626 if(rc != NO_ERROR) { 627 dprintf(("OSLibDosDevIOCtl failed with rc %d", rc)); 628 return FALSE; 629 } 630 pTOC->TrackData[i].TrackNumber = pTOC->FirstTrack + i; 631 pTOC->TrackData[i].Reserved = 0; 632 pTOC->TrackData[i].Control = trackinfo.ucTrackControl >> 4; 633 pTOC->TrackData[i].Adr = trackinfo.ucTrackControl & 0xF; 634 pTOC->TrackData[i].Reserved1 = 0; 635 *(DWORD *)&pTOC->TrackData[i].Address = trackinfo.ulTrackAddr; 636 } 637 if(lpBytesReturned) 638 *lpBytesReturned = 4 + numtracks*sizeof(TRACK_DATA); 639 640 SetLastError(ERROR_SUCCESS); 641 return TRUE; 642 } 552 643 553 644 case IOCTL_CDROM_UNLOAD_DRIVER: 554 case IOCTL_CDROM_READ_TOC:555 645 case IOCTL_CDROM_GET_CONTROL: 556 646 break; … … 574 664 // setup the parameter block 575 665 576 ParameterBlock.ucSignature = 0x31304443; // 'CD01'666 memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4); 577 667 ParameterBlock.ucAddressingMode = 1; // MSF format 578 668 … … 623 713 0x81, // IOCTL_CDROMAUDIO 624 714 0x51, // CDROMAUDIO_STOPAUDIO 625 lpBytesReturned );715 lpBytesReturned, drvInfo); 626 716 } 627 717 … … 632 722 0x81, // IOCTL_CDROMAUDIO 633 723 0x52, // CDROMAUDIO_RESUMEAUDIO 634 lpBytesReturned );724 lpBytesReturned, drvInfo); 635 725 } 636 726 … … 650 740 parsize = 4; 651 741 datasize = 8; 652 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, "CD01", 4, &parsize,742 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, drvInfo->signature, 4, &parsize, 653 743 volbuf, 8, &datasize); 654 744 … … 692 782 volbuf[7] = pVol->PortVolume[3]; 693 783 dprintf(("Set CD volume (%d,%d)(%d,%d)", pVol->PortVolume[0], pVol->PortVolume[1], pVol->PortVolume[2], pVol->PortVolume[3])); 694 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, "CD01", 4, &parsize,784 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, drvInfo->signature, 4, &parsize, 695 785 volbuf, 8, &datasize); 696 786 … … 707 797 case IOCTL_CDROM_DISK_TYPE: 708 798 case IOCTL_CDROM_GET_DRIVE_GEOMETRY: 709 case IOCTL_CDROM_CHECK_VERIFY:710 799 case IOCTL_CDROM_MEDIA_REMOVAL: 711 800 break; … … 717 806 0x80, // IOCTL_CDROM 718 807 0x44, // CDROMDISK_EJECTDISK 719 lpBytesReturned );808 lpBytesReturned, drvInfo); 720 809 } 721 810 … … 726 815 0x80, // IOCTL_CDROM 727 816 0x45, // CDROMDISK_CLOSETRAY 728 lpBytesReturned );817 lpBytesReturned, drvInfo); 729 818 } 730 819 … … 739 828 // ------------- 740 829 830 case IOCTL_CDROM_CHECK_VERIFY: 831 if(drvInfo->driveType != DRIVE_CDROM) { 832 SetLastError(ERROR_GEN_FAILURE); //TODO: right error? 833 return FALSE; 834 } 835 //no break; 741 836 case IOCTL_DISK_CHECK_VERIFY: 742 837 case IOCTL_STORAGE_CHECK_VERIFY: 743 dprintf(("IOCTL_STORAGE_CHECK_VERIFY incompletely implemented"));838 dprintf(("IOCTL_CDROM(DISK/STORAGE)CHECK_VERIFY %s", drvInfo->signature)); 744 839 if(lpBytesReturned) { 745 840 *lpBytesReturned = 0; … … 747 842 //TODO: check if disk has been inserted or removed 748 843 if(pHMHandleData->hHMHandle == 0) { 749 SetLastError(ERROR_NOT_READY); 750 return FALSE; 844 SetLastError(NO_ERROR); //TODO: correct??? 845 // SetLastError(ERROR_NOT_READY); 846 return FALSE; 847 } 848 849 if(drvInfo->driveType == DRIVE_CDROM) 850 { 851 DWORD parsize = 4; 852 DWORD datasize = 4; 853 DWORD status = 0; 854 DWORD rc; 855 856 //IOCTL_CDROM (0x80), CDROMDISK_DEVICESTATUS (0x60) 857 rc = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x80, 0x60, &drvInfo->signature[0], 4, &parsize, 858 &status, sizeof(status), &datasize); 859 if(rc != NO_ERROR) { 860 dprintf(("OSLibDosDevIOCtl failed with rc %d", rc)); 861 return FALSE; 862 } 863 dprintf(("CDROM status 0x%x", status)); 864 //if door open or no disk present, return FALSE 865 if(status & (BIT_0|BIT_11)) { 866 rc = FALSE; 867 } 868 else rc = TRUE; 869 SetLastError(NO_ERROR); 870 return rc; 871 } 872 else { 873 dprintf(("IOCTL_STORAGE_CHECK_VERIFY incompletely implemented")); 751 874 } 752 875 SetLastError(NO_ERROR); … … 840 963 return FALSE; 841 964 } 965 dprintf(("IOCTL_SCSI_PASS_THROUGH_DIRECT %x", pPacket->Cdb[0])); 842 966 psrb->SRB_BufPointer = (BYTE *)pPacket->DataBuffer; 843 967 memcpy(&psrb->CDBByte[0], &pPacket->Cdb[0], 16); … … 881 1005 addr->PathId = 0; 882 1006 numAdapters = drvInfo->GetASPI32SupportInfo(); 883 if(LOBYTE(numAdapters) == 0) goto failure; 1007 1008 if(LOBYTE(numAdapters) == 0) { 1009 //testestest 1010 i=j=k=0; 1011 goto done; //failure; 1012 } 884 1013 885 1014 memset(&srb, 0, sizeof(srb));
Note:
See TracChangeset
for help on using the changeset viewer.