//--------------------------------------------------------------------------------------------------------------
bool cddaSCSIPassTru::GetMediaStatus(wchar_t *NiceDrive, int &RetMediaEvent, bool &RetMediaPresent, bool &RetDoorOpen)
{
STSCSI_PT_CDDrive *pCDDrive = FindDrive (NiceDrive);
if (!pCDDrive)
return(false);
if (!OpenCDDrive (pCDDrive))
return(false);
XMem Buffer(8, true);
if (Buffer())
{
SRB_ExecSCSICmd cmd;
ZeroMemory(&cmd, sizeof(SRB_ExecSCSICmd));
cmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
cmd.SRB_Flags = SRB_DIR_IN;
cmd.SRB_BufLen = Buffer.Size();
cmd.SRB_BufPointer = (BYTE *)Buffer();
cmd.SRB_SenseLen = SENSE_LEN;
cmd.SRB_CDBLen = 10;
cmd.CDBByte[0] = 0x4a;
cmd.CDBByte[1] = 1; // immediate return
cmd.CDBByte[4] = 16; // request media class
cmd.CDBByte[8] = (BYTE)Buffer.Size(); // buffer size LSB
if (ExecuteSCSICommand( pCDDrive, &cmd ))
{
char *pBuffer = (char *)Buffer();
if ((pBuffer[2] & 7) == 4) // is valid?
{
pBuffer+=4; // over the header
RetMediaEvent = pBuffer[0] & 15;
RetDoorOpen = (pBuffer[1] & 1) ? true : false;
RetMediaPresent = (pBuffer[1] & 2) ? true : false;
return(true);
}
}
}
return(false);
}