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.
////================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.