請問如何辨別(唯讀)光碟機與燒錄機 |
尚未結案
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
我使用 IOCTL_STORAGE_GET_MEDIA_TYPES_EX 來取得光碟機的型態,
但情況不如預期,雖然 DeviceType 能區分出 DVD 和 CD,不過 MediaType 都是 CD-ROM,
DEVICE_MEDIA_INFO 的參數 MediaCharacteristics 也都顯示唯獨讀。 想請問以下程式碼是否有問題?
或者有其他簡易的方式可以辨別燒錄機?
// 請放一個 Memo 和 Button 元件,include winioctl.h // IOCTL_STORAGE_GET_MEDIA_TYPES_EX 可能返回不止一條 DEVICE_MEDIA_INFO,故定義足夠的空間 #define MEDIA_INFO_SIZE sizeof(GET_MEDIA_TYPES) 15*sizeof(DEVICE_MEDIA_INFO) //--------------------------------------------------------------------------- void __fastcall TForm1::Button21Click(TObject *Sender) { Memo1->Lines->Clear(); AnsiString disk = "\\\\.\\F:"; // 光碟機磁碟代號 HANDLE hDevice = CreateFile(disk.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == INVALID_HANDLE_VALUE) return; GET_MEDIA_TYPES *pmt = (GET_MEDIA_TYPES *)new BYTE[MEDIA_INFO_SIZE]; DWORD cbBytesReturned = 0; if(DeviceIoControl(hDevice, IOCTL_STORAGE_GET_MEDIA_TYPES_EX, NULL, 0, pmt, MEDIA_INFO_SIZE, &cbBytesReturned, NULL)) { Memo1->Lines->Add("DeviceType: " PrintDeviceType(pmt->DeviceType)); Memo1->Lines->Add("MediaType: " PrintMediaType(pmt->MediaInfo[0].DeviceSpecific.RemovableDiskInfo.MediaType)); Memo1->Lines->Add("MediaCharacteristics: " PrintMediaChrar(pmt->MediaInfo[0].DeviceSpecific.RemovableDiskInfo.MediaCharacteristics)); }else Memo1->Lines->Add("GetLastError: " AnsiString(GetLastError())); delete pmt; CloseHandle(hDevice); } //--------------------------------------------------------------------------- AnsiString __fastcall TForm1::PrintMediaType(STORAGE_MEDIA_TYPE MediaType) { AnsiString TypeString = ""; switch(MediaType) { case DDS_4mm: TypeString = "DDS_4mm"; break; case MiniQic: TypeString = "MiniQic"; break; case Travan: TypeString = "Travan"; break; case QIC: TypeString = "QIC"; break; case MP_8mm: TypeString = "MP_8mm"; break; case AME_8mm: TypeString = "AME_8mm"; break; case AIT1_8mm: TypeString = "AIT1_8mm"; break; case DLT: TypeString = "DLT"; break; case NCTP: TypeString = "NCTP"; break; case IBM_3480: TypeString = "IBM_3480"; break; case IBM_3490E: TypeString = "IBM_3490E"; break; case IBM_Magstar_3590: TypeString = "IBM_Magstar_3590"; break; case IBM_Magstar_MP: TypeString = "IBM_Magstar_MP"; break; case STK_DATA_D3: TypeString = "STK_DATA_D3"; break; case SONY_DTF: TypeString = "SONY_DTF"; break; case DV_6mm: TypeString = "DV_6mm"; break; case DMI: TypeString = "DMI"; break; case SONY_D2: TypeString = "SONY_D2"; break; case CLEANER_CARTRIDGE: TypeString = "CLEANER_CARTRIDGE"; break; case CD_ROM: TypeString = "CD_ROM"; break; case CD_R: TypeString = "CD_R"; break; case CD_RW: TypeString = "CD_RW"; break; case DVD_ROM: TypeString = "DVD_ROM"; break; case DVD_R: TypeString = "DVD_R"; break; case DVD_RW: TypeString = "DVD_RW"; break; case MO_3_RW: TypeString = "MO_3_RW"; break; case MO_5_WO: TypeString = "MO_5_WO"; break; case MO_5_RW: TypeString = "MO_5_RW"; break; case MO_5_LIMDOW: TypeString = "MO_5_LIMDOW"; break; case PC_5_WO: TypeString = "PC_5_WO"; break; case PC_5_RW: TypeString = "PC_5_RW"; break; case PD_5_RW: TypeString = "PD_5_RW"; break; case ABL_5_WO: TypeString = "ABL_5_WO"; break; case PINNACLE_APEX_5_RW: TypeString = "PINNACLE_APEX_5_RW"; break; case SONY_12_WO: TypeString = "SONY_12_WO"; break; case PHILIPS_12_WO: TypeString = "PHILIPS_12_WO"; break; case HITACHI_12_WO: TypeString = "HITACHI_12_WO"; break; case CYGNET_12_WO: TypeString = "CYGNET_12_WO"; break; case KODAK_14_WO: TypeString = "KODAK_14_WO"; break; case MO_NFR_525: TypeString = "MO_NFR_525"; break; case NIKON_12_RW: TypeString = "NIKON_12_RW"; break; case IOMEGA_ZIP: TypeString = "IOMEGA_ZIP"; break; case IOMEGA_JAZ: TypeString = "IOMEGA_JAZ"; break; case SYQUEST_EZ135: TypeString = "SYQUEST_EZ135"; break; case SYQUEST_EZFLYER: TypeString = "SYQUEST_EZFLYER"; break; case SYQUEST_SYJET: TypeString = "SYQUEST_SYJET"; break; case AVATAR_F2: TypeString = "AVATAR_F2"; break; case MP2_8mm: TypeString = "MP2_8mm"; break; case DST_S: TypeString = "DST_S"; break; case DST_M: TypeString = "DST_M"; break; case DST_L: TypeString = "DST_L"; break; case VXATape_1: TypeString = "VXATape_1"; break; case VXATape_2: TypeString = "VXATape_2"; break; case STK_9840: TypeString = "STK_9840"; break; case LTO_Ultrium: TypeString = "LTO_Ultrium"; break; case LTO_Accelis: TypeString = "LTO_Accelis"; break; case DVD_RAM: TypeString = "DVD_RAM"; break; case AIT_8mm: TypeString = "AIT_8mm"; break; case ADR_1: TypeString = "ADR_1"; break; case ADR_2: TypeString = "ADR_2"; break; // case STK_9940: TypeString = "STK_9940"; break; } return TypeString; } //--------------------------------------------------------------------------- AnsiString __fastcall TForm1::PrintDeviceType(ULONG DeviceType) { AnsiString TypeString = ""; switch(DeviceType) { case FILE_DEVICE_BEEP: TypeString = "FILE_DEVICE_BEEP"; break; case FILE_DEVICE_CD_ROM: TypeString = "FILE_DEVICE_CD_ROM"; break; case FILE_DEVICE_CD_ROM_FILE_SYSTEM: TypeString = "FILE_DEVICE_CD_ROM_FILE_SYSTEM"; break; case FILE_DEVICE_CONTROLLER: TypeString = "FILE_DEVICE_CONTROLLER"; break; case FILE_DEVICE_DATALINK: TypeString = "FILE_DEVICE_DATALINK"; break; case FILE_DEVICE_DFS: TypeString = "FILE_DEVICE_DFS"; break; case FILE_DEVICE_DISK: TypeString = "FILE_DEVICE_DISK"; break; case FILE_DEVICE_DISK_FILE_SYSTEM: TypeString = "FILE_DEVICE_DISK_FILE_SYSTEM"; break; case FILE_DEVICE_FILE_SYSTEM: TypeString = "FILE_DEVICE_FILE_SYSTEM"; break; case FILE_DEVICE_INPORT_PORT: TypeString = "FILE_DEVICE_INPORT_PORT"; break; case FILE_DEVICE_KEYBOARD: TypeString = "FILE_DEVICE_KEYBOARD"; break; case FILE_DEVICE_MAILSLOT: TypeString = "FILE_DEVICE_MAILSLOT"; break; case FILE_DEVICE_MIDI_IN: TypeString = "FILE_DEVICE_MIDI_IN"; break; case FILE_DEVICE_MIDI_OUT: TypeString = "FILE_DEVICE_MIDI_OUT"; break; case FILE_DEVICE_MOUSE: TypeString = "FILE_DEVICE_MOUSE"; break; case FILE_DEVICE_MULTI_UNC_PROVIDER: TypeString = "FILE_DEVICE_MULTI_UNC_PROVIDER"; break; case FILE_DEVICE_NAMED_PIPE: TypeString = "FILE_DEVICE_NAMED_PIPE"; break; case FILE_DEVICE_NETWORK: TypeString = "FILE_DEVICE_NETWORK"; break; case FILE_DEVICE_NETWORK_BROWSER: TypeString = "FILE_DEVICE_NETWORK_BROWSER"; break; case FILE_DEVICE_NETWORK_FILE_SYSTEM: TypeString = "FILE_DEVICE_NETWORK_FILE_SYSTEM"; break; case FILE_DEVICE_NULL: TypeString = "FILE_DEVICE_NULL"; break; case FILE_DEVICE_PARALLEL_PORT: TypeString = "FILE_DEVICE_PARALLEL_PORT"; break; case FILE_DEVICE_PHYSICAL_NETCARD: TypeString = "FILE_DEVICE_PHYSICAL_NETCARD"; break; case FILE_DEVICE_PRINTER: TypeString = "FILE_DEVICE_PRINTER"; break; case FILE_DEVICE_SCANNER: TypeString = "FILE_DEVICE_SCANNER"; break; case FILE_DEVICE_SERIAL_MOUSE_PORT: TypeString = "FILE_DEVICE_SERIAL_MOUSE_PORT"; break; case FILE_DEVICE_SERIAL_PORT: TypeString = "FILE_DEVICE_SERIAL_PORT"; break; case FILE_DEVICE_SCREEN: TypeString = "FILE_DEVICE_SCREEN"; break; case FILE_DEVICE_SOUND: TypeString = "FILE_DEVICE_SOUND"; break; case FILE_DEVICE_STREAMS: TypeString = "FILE_DEVICE_STREAMS"; break; case FILE_DEVICE_TAPE: TypeString = "FILE_DEVICE_TAPE"; break; case FILE_DEVICE_TAPE_FILE_SYSTEM: TypeString = "FILE_DEVICE_TAPE_FILE_SYSTEM"; break; case FILE_DEVICE_TRANSPORT: TypeString = "FILE_DEVICE_TRANSPORT"; break; case FILE_DEVICE_UNKNOWN: TypeString = "FILE_DEVICE_UNKNOWN"; break; case FILE_DEVICE_VIDEO: TypeString = "FILE_DEVICE_VIDEO"; break; case FILE_DEVICE_VIRTUAL_DISK: TypeString = "FILE_DEVICE_VIRTUAL_DISK"; break; case FILE_DEVICE_WAVE_IN: TypeString = "FILE_DEVICE_WAVE_IN"; break; case FILE_DEVICE_WAVE_OUT: TypeString = "FILE_DEVICE_WAVE_OUT"; break; case FILE_DEVICE_8042_PORT: TypeString = "FILE_DEVICE_8042_PORT"; break; case FILE_DEVICE_NETWORK_REDIRECTOR: TypeString = "FILE_DEVICE_NETWORK_REDIRECTOR"; break; case FILE_DEVICE_BATTERY: TypeString = "FILE_DEVICE_BATTERY"; break; case FILE_DEVICE_BUS_EXTENDER: TypeString = "FILE_DEVICE_BUS_EXTENDER"; break; case FILE_DEVICE_MODEM: TypeString = "FILE_DEVICE_MODEM"; break; case FILE_DEVICE_VDM: TypeString = "FILE_DEVICE_VDM"; break; case FILE_DEVICE_MASS_STORAGE: TypeString = "FILE_DEVICE_MASS_STORAGE"; break; case FILE_DEVICE_SMB: TypeString = "FILE_DEVICE_SMB"; break; case FILE_DEVICE_KS: TypeString = "FILE_DEVICE_KS"; break; case FILE_DEVICE_CHANGER: TypeString = "FILE_DEVICE_CHANGER"; break; case FILE_DEVICE_SMARTCARD: TypeString = "FILE_DEVICE_SMARTCARD"; break; case FILE_DEVICE_ACPI: TypeString = "FILE_DEVICE_ACPI"; break; case FILE_DEVICE_DVD: TypeString = "FILE_DEVICE_DVD"; break; case FILE_DEVICE_FULLSCREEN_VIDEO: TypeString = "FILE_DEVICE_FULLSCREEN_VIDEO"; break; case FILE_DEVICE_DFS_FILE_SYSTEM: TypeString = "FILE_DEVICE_DFS_FILE_SYSTEM"; break; case FILE_DEVICE_DFS_VOLUME: TypeString = "FILE_DEVICE_DFS_VOLUME"; break; case FILE_DEVICE_SERENUM: TypeString = "FILE_DEVICE_SERENUM"; break; case FILE_DEVICE_TERMSRV: TypeString = "FILE_DEVICE_TERMSRV"; break; case FILE_DEVICE_KSEC: TypeString = "FILE_DEVICE_KSEC"; break; case FILE_DEVICE_FIPS: TypeString = "FILE_DEVICE_FIPS"; break; } return TypeString; } //--------------------------------------------------------------------------- AnsiString __fastcall TForm1::PrintMediaChrar(ULONG Characteristics) { AnsiString TypeString = ""; switch(Characteristics) { case MEDIA_ERASEABLE: TypeString = "MEDIA_ERASEABLE"; break; case MEDIA_WRITE_ONCE: TypeString = "MEDIA_WRITE_ONCE"; break; case MEDIA_READ_ONLY: TypeString = "MEDIA_READ_ONLY"; break; case MEDIA_READ_WRITE: TypeString = "MEDIA_READ_WRITE"; break; case MEDIA_WRITE_PROTECTED: TypeString = "MEDIA_WRITE_PROTECTED"; break; case MEDIA_CURRENTLY_MOUNTED: TypeString = "MEDIA_CURRENTLY_MOUNTED"; break; } return TypeString; }發表人 - ura 於 2005/02/05 17:50:02 |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
kcin
一般會員 發表:0 回覆:18 積分:3 註冊:2005-01-21 發送簡訊給我 |
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
引言: http://support.microsoft.com/default.aspx?scid=kb;en-us;305184 下載 EnumCD.exe 解開後有個EnumCD.exe 可以辨認CD-RW 參考EnumCD.c這個範例真是讓我受益良多~ 而 IOCTL_SCSI_PASS_THROUGH 正是我需要的~ 感謝 kcin ~ 也謝謝 blk5743 提供資訊~ 有機會的話再研究如何下 ATAPI Command 了~ 以下是擷取出來的程式碼~ void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Lines->Clear(); AnsiString disk = "\\\\.\\G:"; HANDLE hDevice = CreateFile(disk.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == INVALID_HANDLE_VALUE) return; ULONG length=0, returned=0; SCSI_PASS_THROUGH_WITH_BUFFERS sptwb; ZeroMemory(&sptwb,sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS)); sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH); sptwb.Spt.PathId = 0; sptwb.Spt.TargetId = 1; sptwb.Spt.Lun = 0; sptwb.Spt.CdbLength = CDB6GENERIC_LENGTH; sptwb.Spt.SenseInfoLength = 24; sptwb.Spt.DataIn = SCSI_IOCTL_DATA_IN; sptwb.Spt.DataTransferLength = 192; sptwb.Spt.TimeOutValue = 2; sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf); sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,SenseBuf); sptwb.Spt.Cdb[0] = SCSIOP_MODE_SENSE; sptwb.Spt.Cdb[1] = 0x08; // target shall not return any block descriptors sptwb.Spt.Cdb[2] = MODE_PAGE_CAPABILITIES; sptwb.Spt.Cdb[4] = 192; length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf) sptwb.Spt.DataTransferLength; if(DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH, &sptwb, sizeof(SCSI_PASS_THROUGH), &sptwb, length, &returned, FALSE) && !sptwb.Spt.ScsiStatus) { if((sptwb.DataBuf[6] & 0x01)||(sptwb.DataBuf[6] & 0x02)) Memo1->Lines->Add("CD Reader : Yes"); else Memo1->Lines->Add("CD Reader : No"); if((sptwb.DataBuf[7] & 0x01)||(sptwb.DataBuf[7] & 0x02)) Memo1->Lines->Add("CD writer : Yes"); else Memo1->Lines->Add("CD writer : No"); if((sptwb.DataBuf[6] & 0x08)||(sptwb.DataBuf[6] & 0x10)||(sptwb.DataBuf[6] & 0x20)) Memo1->Lines->Add("DVD Reader : Yes"); else Memo1->Lines->Add("DVD Reader : No"); if((sptwb.DataBuf[7] & 0x10)||(sptwb.DataBuf[7] & 0x20)) Memo1->Lines->Add("DVD writer : Yes"); else Memo1->Lines->Add("DVD writer : No"); } } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |