全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4883
推到 Plurk!
推到 Facebook!

請問如何辨別(唯讀)光碟機與燒錄機

尚未結案
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-05 13:24:08 IP:61.221.xxx.xxx 未訂閱
我使用 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-05 16:44:34 IP:61.66.xxx.xxx 未訂閱
ATAPI Command中有一個Command[Mode Sense]可以知道碟機特性 他會回覆碟機可讀寫的碟片種類 根據回覆的表,你就知道這台光碟是哪一種類型了 不過,你要先能下ATAPI Command
kcin
一般會員


發表:0
回覆:18
積分:3
註冊:2005-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-06 00:15:41 IP:220.130.xxx.xxx 未訂閱
http://support.microsoft.com/default.aspx?scid=kb;en-us;305184 下載 EnumCD.exe 解開後有個EnumCD.exe 可以辨認CD-RW 參考EnumCD.c
ura
一般會員


發表:2
回覆:9
積分:2
註冊:2002-08-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-06 13:04:29 IP:218.164.xxx.xxx 未訂閱
引言: 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");
        }
}    
系統時間:2024-04-27 18:48:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!