📄 aspidriver.cpp
字号:
return RunCommand(&exec); //send it..
}
/*\
*<------------ ReadBlockLimits ------------>
@m read block limits from device
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
*<-- OUT --> @r
* DWORD - ASPIERROR_xxx defined in AspiDriver.h
*/
DWORD CASPIDriver::ReadBlockLimits (BYTE adapter_id,BYTE device_id,BYTE lun)
{
DWORD code;
unsigned char *pBuffer;
SRB_MyExecSCSICmd exec;
pBuffer=new BYTE [64];
ZeroMemory (pBuffer,64);
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: reading block limits ... ");
// Now we construct the SCSI Inquiry SRB and send it to ASPI!
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Flags = SRB_DIR_IN;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_BufPointer = (unsigned char *)pBuffer;
exec.SRB_BufLen = 64;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.c6.cmd = SCSI_RD_BLK_LIM;
exec.ccb.c6.lun = lun;
code=RunCommand(&exec); //send it..
m_nBlockLimit_Max=((((DWORD) pBuffer[1])<<16) |
(((DWORD) pBuffer[2])<<8) |
(((DWORD) pBuffer[3])));
m_nBlockLimit_Min=((((DWORD) pBuffer[4])<<8) |
(((DWORD) pBuffer[5])));
delete [] pBuffer;
return code;
}
/*\
*<------------ GetBlockLimits ------------>
@m get block limits from interface
*--> I N <-- @p
* DWORD *nMin - pointer to min block size value
* DWORD *nMax - pointer to max block size value
*/
void CASPIDriver::GetBlockLimits (DWORD *nMin,DWORD *nMax)
{
*nMin=m_nBlockLimit_Min;
*nMax=m_nBlockLimit_Max;
}
/*\
*<------------ Read ------------>
@m read data
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* LPVOID buffer - buffer for data from media
* DWORD size - size of buffer
* DWORD blksize - size of a block
* BYTE bSili -
* BYTE bFixed -
*/
DWORD CASPIDriver::Read ( BYTE adapter_id,
BYTE device_id,
BYTE lun,
LPVOID buffer,
DWORD size,
DWORD blksize,
BYTE bSili,
BYTE bFixed)
{
ASSERT (buffer);
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: reading %d bytes... ",size*blksize);
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_Flags = SRB_DIR_IN;
exec.SRB_BufPointer = (unsigned char *)buffer;
exec.SRB_BufLen = size*blksize;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.rdwr.cmd = SCSI_READ6;
exec.ccb.rdwr.fixed = bFixed;
exec.ccb.rdwr.lun = lun;
exec.ccb.rdwr.sili = bSili;
exec.ccb.rdwr.len_0 = (size & 0xff);
exec.ccb.rdwr.len_1 = ((size>>8) & 0xff);
exec.ccb.rdwr.len_2 = ((size>>16) & 0xff);
m_nPosition+=size;
return RunCommand(&exec); //send it..
}
/*\
*<------------ WriteFileMark ------------>
@m write a file or setmark
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* DWORD size - number of marks to write
* BYTE bSetMark - TRUE=setmark,FALSE=filemark
* BYTE bImmediate - TRUE=return immediate (just dont use)
*<-- OUT --> @r
* DWORD - ASPIERROR_xxx defined in AspiDriver.h
*/
DWORD CASPIDriver::WriteFileMark (BYTE adapter_id,BYTE device_id,BYTE lun,DWORD size,BYTE bSetMark,BYTE bImmediate)
{
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: writing file mark %d bytes... ",size);
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_Flags = SRB_DIR_OUT;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.wrmk.cmd = SCSI_WRT_FILE;
exec.ccb.wrmk.immediate = bImmediate;
exec.ccb.wrmk.lun = lun;
exec.ccb.wrmk.wsmk = bSetMark;
exec.ccb.wrmk.len_0 = (size & 0xff);
exec.ccb.wrmk.len_1 = ((size>>8) & 0xff);
exec.ccb.wrmk.len_2 = ((size>>16) & 0xff);
m_nPosition+=size;
return RunCommand(&exec); //send it..
}
/*\
*<------------ Write ------------>
@m write data
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* LPVOID buffer - pointer to data
* DWORD size - number of bytes to write
* DWORD blksize - size of one block
* BYTE bFixed -
*/
DWORD CASPIDriver::Write ( BYTE adapter_id,
BYTE device_id,
BYTE lun,
LPVOID buffer,
DWORD size,
DWORD blksize,
BYTE bFixed)
{
ASSERT (buffer);
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: writing %d bytes... ",size*blksize);
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_Flags = SRB_DIR_OUT;
exec.SRB_BufPointer = (unsigned char *)buffer;
exec.SRB_BufLen = size*blksize;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.rdwr.cmd = SCSI_WRITE6;
exec.ccb.rdwr.fixed = bFixed;
exec.ccb.rdwr.lun = lun;
exec.ccb.rdwr.len_0 = (size & 0xff);
exec.ccb.rdwr.len_1 = ((size>>8) & 0xff);
exec.ccb.rdwr.len_2 = ((size>>16) & 0xff);
m_nPosition+=size;
return RunCommand(&exec); //send it..
}
/*\
*<------------ GetPosition ------------>
@m tell head position
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* DWORD *pos -
*<-- OUT --> @r
* DWORD - ASPIERROR_xxx defined in AspiDriver.h
*/
DWORD CASPIDriver::GetPosition (BYTE adapter_id,BYTE device_id,BYTE lun,DWORD *pos)
{
DWORD code;
BYTE *pBuffer;
pBuffer=new BYTE [64];
ZeroMemory (pBuffer,64);
ASSERT (pos);
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: getting position ... ");
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_Flags = SRB_DIR_IN;
exec.SRB_BufPointer = (unsigned char *)pBuffer;
exec.SRB_BufLen = 64;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 10;
exec.ccb.c10.cmd = SCSI_READ_POS;
exec.ccb.c10.lun = lun;
code=RunCommand(&exec); //send it..
*pos= (((DWORD)*(pBuffer+4))<<24) |
(((DWORD)*(pBuffer+5))<<16) |
(((DWORD)*(pBuffer+6))<<8) |
(DWORD)*(pBuffer+7);
delete [] pBuffer;
return code;
}
/*\
*<------------ Space ------------>
@m relative seek
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* BYTE code - 1=tapefiles,0=blocks
* DWORD position - seek offset
*<-- OUT --> @r
* DWORD - ASPIERROR_xxx defined in AspiDriver.h
*/
DWORD CASPIDriver::Space (BYTE adapter_id,BYTE device_id,BYTE lun,BYTE code,DWORD position)
{
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: space ... ");
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_Flags = SRB_DIR_OUT;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.spc.cmd = SCSI_SPACE;
exec.ccb.spc.lun = lun;
exec.ccb.spc.code = code; //tape file - 1 / block - 0
exec.ccb.spc.cnt0 = position&0xFF;
exec.ccb.spc.cnt1 = (position>>8)&0xFF;
exec.ccb.spc.cnt2 = (position>>16)&0xFF;
if (code == 0x01)
m_nPosition=0;
else
m_nPosition=position;
return RunCommand(&exec);
}
/*\
*<------------ ModeSense ------------>
@m mode sense
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* BYTE page - mode page index
* BYTE code - mode page code
* LPVOID buffer - pointer to page data
* DWORD size - size of buffer
*/
DWORD CASPIDriver::ModeSense ( BYTE adapter_id,
BYTE device_id,
BYTE lun,
BYTE page,
BYTE code,
LPVOID buffer,
DWORD size)
{
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: mode sense... ");
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Flags = SRB_DIR_IN;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_BufPointer = (unsigned char *)buffer;
exec.SRB_BufLen = size;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.mdsn.cmd = SCSI_MODE_SEN6;
exec.ccb.mdsn.lun = lun;
exec.ccb.mdsn.dbd = FALSE; //disable block descriptor
exec.ccb.mdsn.pagecode = page; //device configuration
exec.ccb.mdsn.pc = code; //changeable data
exec.ccb.mdsn.len = size;
return RunCommand(&exec); //send it..
}
/*\
*<------------ ModeSelect ------------>
@m mode select
*--> I N <-- @p
* BYTE adapter_id - host adapter id
* BYTE device_id - device id
* BYTE lun - lun id
* LPVOID buffer - pointer to page data
* DWORD size - size of page data
*/
DWORD CASPIDriver::ModeSelect ( BYTE adapter_id,
BYTE device_id,
BYTE lun,
LPVOID buffer,
DWORD size)
{
SRB_MyExecSCSICmd exec;
ZeroMemory (&exec,sizeof(SRB_MyExecSCSICmd));
TRACE ("ASPIsnoop: mode select... ");
exec.SRB_Cmd = SC_EXEC_SCSI_CMD;
exec.SRB_HaId = adapter_id;
exec.SRB_Flags = SRB_DIR_OUT;
exec.SRB_Target = device_id;
exec.SRB_Lun = lun;
exec.SRB_BufPointer = (unsigned char *)buffer;
exec.SRB_BufLen = size;
exec.SRB_SenseLen = SENSE_LEN;
exec.SRB_CDBLen = 6;
exec.ccb.mdsl.cmd = SCSI_MODE_SEL6;
exec.ccb.mdsl.sp = FALSE; //save it ?
exec.ccb.mdsl.pf = TRUE; //SCSI1 or standard ?
exec.ccb.mdsl.lun = lun;
exec.ccb.mdsl.len = size;
/*
unsigned _reserved1 : 3; //n/a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -