pcsx2/plugins/cdvd/CDVDdraft/Src/ioctl.cpp

209 lines
5.1 KiB
C++

// Ioctl.cpp: implementation of the ioctl methods
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "cdvd.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/***********************************************************/
/* IOCTL Init/Shutdown related methods */
/***********************************************************/
int CCdvd::Ioctl_Init()
{
int retval = CDVD_ERROR_FAIL;
if(m_bIoctlInitialized)
return CDVD_ERROR_SUCCESS;
return retval;
}
// shuts down ioctl
int CCdvd::Ioctl_Shutdown()
{
int retval = CDVD_ERROR_SUCCESS;
GetNumSectors = Dummy_T1;
GetToc = Dummy_T1;
Stop = Dummy_T1;
Play = Dummy_T3;
TestReady = Dummy_T1;
SetSpeed = Dummy_T2;
SetSectorSize = Dummy_T2;
ReadSector = Dummy_T4;
UpdateInterfaceObject();
ShutdownBuffers();
return retval;
}
// open a drive for reading
int CCdvd::Ioctl_OpenDrive(int drv_num)
{
int retval = CDVD_ERROR_SUCCESS;
CloseDrive();
m_nCurrentDrive = drv_num;
return retval;
}
// dummy for now
int CCdvd::Ioctl_CloseDrive()
{
int retval = CDVD_ERROR_SUCCESS;
m_nCurrentDrive = -1;
return retval;
}
// get srb status
int CCdvd::Ioctl_GetSrbStatus(int srb_num)
{
int retval = CDVD_SRB_ERROR;
switch(m_nCurrentReadMode)
{
case CDVD_READ_MMC:
case CDVD_READ_SCSI10:
case CDVD_READ_D8:
case CDVD_READ_D410:
case CDVD_READ_D412:
default: break;
}
if(retval == SS_COMP) retval = CDVD_SRB_COMPLETED;
else if(retval == SS_PENDING) retval = CDVD_SRB_PENDING;
else retval = CDVD_SRB_ERROR;
return retval;
}
// set read mode
int CCdvd::Ioctl_SetReadMode(CDVD_READ_MODE read_mode)
{
int retval = CDVD_ERROR_SUCCESS;
switch(read_mode)
{
case CDVD_READ_MMC:
case CDVD_READ_SCSI10:
case CDVD_READ_D8:
case CDVD_READ_D410:
case CDVD_READ_D412:
default: retval = CDVD_ERROR_FAIL; break;
}
UpdateInterfaceObject();
return retval;
}
// search for scsi adapters with c/dvd drives.
int CCdvd::Ioctl_ScsiBusScan()
{
int retval = CDVD_ERROR_SUCCESS;
HANDLE handle;
char adapter_name[16];
UI08 buffer[2048];
int adapter_num = 0;
memset(m_drvDetails, 0, CDVD_MAX_SUPPORTED_DRIVES * sizeof(ADAPTERINFO));
m_nDrives = 0;
for(;;)
{
wsprintf(adapter_name,"\\\\.\\SCSI%d:", adapter_num);
++adapter_num;
if((handle = CreateFile(adapter_name,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL)) == INVALID_HANDLE_VALUE)
{
break; // no more scsi adapters
}
UI32 nreturned;
if(DeviceIoControl(handle,
IOCTL_SCSI_GET_INQUIRY_DATA,
NULL,
0,
buffer,
sizeof(buffer),
&nreturned,
FALSE) == 0)
{
continue; // failed
}
Ioctl_AddAdapter(adapter_num, buffer);
}
return retval;
}
// add an adapter to the adapter list
int CCdvd::Ioctl_AddAdapter(int adptr_num, UI08 *buffer)
{
int retval = CDVD_ERROR_SUCCESS;
SCSI_ADAPTER_BUS_INFO *adapter_info = (SCSI_ADAPTER_BUS_INFO *) buffer;
char string[40];
memset(string, 0, sizeof(string));
for (int i = 0; i < adapter_info->NumberOfBuses; i++)
{
SCSI_INQUIRY_DATA *inquiry_data =
(PSCSI_INQUIRY_DATA) (buffer + adapter_info->BusData[i].InquiryDataOffset);
//while
if(adapter_info->BusData[i].InquiryDataOffset)
{
if(inquiry_data->InquiryData[0] == 0x05) // c/dvd drive
{
m_drvDetails[m_nDrives].ha = adptr_num;
m_drvDetails[m_nDrives].id = inquiry_data->TargetId;
m_drvDetails[m_nDrives].lun = inquiry_data->Lun;
m_drvDetails[m_nDrives].hostname[0] = '\0';
memcpy(m_drvDetails[m_nDrives].name,
&inquiry_data->InquiryData[8] + 9, 27);
m_drvDetails[m_nDrives].name[27] = '\0';
++m_nDrives;
}
if(inquiry_data->NextInquiryDataOffset == 0)
{
break;
}
inquiry_data = (SCSI_INQUIRY_DATA *) (buffer + inquiry_data->NextInquiryDataOffset);
}
}
return retval;
}
/***********************************************************/
/* IOCTL Execute SRB */
/***********************************************************/
/***********************************************************/
/* ASPI C/DVD Methods */
/***********************************************************/