⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aspidriver.cpp

📁 一个SCSI的Tape设备读写等操作的软件.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -