mirror of https://github.com/PCSX2/pcsx2.git
209 lines
5.1 KiB
C++
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 */
|
|
/***********************************************************/
|