Click to See Complete Forum and Search --> : How to differ DVD-ROM from DVD-Rom Writter(I use SCSI command)


howwen5469
March 10th, 2008, 02:28 AM
I use enumCD on MSDN. These are some codes.

////================enumcd.c===========================

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_INQUIRY;
sptwb.Spt.Cdb[4] = 192;
length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf) +
sptwb.Spt.DataTransferLength;

status = DeviceIoControl(hDevice,
IOCTL_SCSI_PASS_THROUGH,
&sptwb,
sizeof(SCSI_PASS_THROUGH),
&sptwb,
length,
&returned,
FALSE);

sptwb.Spt.Cdb[0] = 0x1A;//SCSIOP_MODE_SENSE;
sptwb.Spt.Cdb[1] = 0x08; // target shall not return any block descriptors
sptwb.Spt.Cdb[2] = MODE_PAGE_CAPABILITIES;

status = DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT,//IOCTL_SCSI_PASS_THROUGH,
&sptwb,
sizeof(SCSI_PASS_THROUGH_DIRECT),//sizeof(SCSI_PASS_THROUGH),
&sptwb,
length,
&returned,
FALSE);

if (status == 0) // I/O fail , try 0x5A
{
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 = CDB10GENERIC_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_INQUIRY;
sptwb.Spt.Cdb[4] = 192;
length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,DataBuf) +
sptwb.Spt.DataTransferLength;

status = DeviceIoControl(hDevice,
IOCTL_SCSI_PASS_THROUGH,
&sptwb,
sizeof(SCSI_PASS_THROUGH),
&sptwb,
length,
&returned,
FALSE);
//CDB10GENERIC_LENGTH
UCHAR CDReader, CDwriter, DVDReader, DVDwriter;

sptwb.Spt.Cdb[0] = 0x5A;
sptwb.Spt.Cdb[1] = 0x08; // target shall not return any block descriptors
sptwb.Spt.Cdb[2] = MODE_PAGE_CAPABILITIES;

status = DeviceIoControl(hDevice,
IOCTL_SCSI_PASS_THROUGH_DIRECT,//IOCTL_SCSI_PASS_THROUGH,
&sptwb,
sizeof(SCSI_PASS_THROUGH_DIRECT),//sizeof(SCSI_PASS_THROUGH),
&sptwb,
length,
&returned,
FALSE);

if(CDReader=((sptwb.DataBuf[?] & 0x01)||(sptwb.DataBuf[?] & 0x02))){
DebugPrint( 1, "CD Reader : Yes\n");
DebugPrint( 1, " CD-R disc : %s\n", ((sptwb.DataBuf[?] & 0x01))?"Yes":"No");
DebugPrint( 1, " CD-RW disc: %s\n", ((sptwb.DataBuf[?] & 0x02))?"Yes":"No");
} else {
DebugPrint( 1, "CD Reader : No\n");
}

if(CDwriter=((sptwb.DataBuf[?] & 0x01)||(sptwb.DataBuf[?] & 0x02))){
DebugPrint( 1, "\nCD writer : Yes\n");
DebugPrint( 1, " CD-R disc : %s\n", ((sptwb.DataBuf[?] & 0x01))?"Yes":"No");
DebugPrint( 1, " CD-RW disc: %s\n", ((sptwb.DataBuf[?] & 0x02))?"Yes":"No");
} else {
DebugPrint( 1, "\nCD writer : No\n");
}

}


////==================================================

But some DVD-ROM Writer Device occur I/O error by input 0x1A. So I sue the value 0x5A instead of 0x1A. But I don't know which value I should use at symbol "?".

Maybe someone can tell me more easier method to differ it.

Any suggestion will be very appreciated.

howwen5469
March 14th, 2008, 03:51 AM
Afterward, I solved this problem. MODE_SENSE10 : 0x5A with SPTI function will work well. So this thread could be closed.

mbow
April 15th, 2008, 02:58 AM
Can you post the code please?