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

📄 aspisnoopdlg.cpp

📁 一个SCSI的Tape设备读写等操作的软件.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ASPIsnoopDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ASPIsnoop.h"
#include "ASPIsnoopDlg.h"
#include "DlgConfig.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

char    gszAppName[] = "TapeSnoop" ;

/////////////////////////////////////////////////////////////////////////////
// CASPIsnoopDlg dialog

CASPIsnoopDlg::CASPIsnoopDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CASPIsnoopDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CASPIsnoopDlg)
	m_bFileSeek = FALSE;
	m_nOffset = 0;
	m_bSetMark = FALSE;
	m_bCompression = FALSE;
	m_dwBlkSize = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pASPI=NULL;
	m_hIOBuffer=NULL;
	m_nCount=0;
	m_cTapeHost=0;
	m_cTapeID=4;
	m_cTapeLun=0;
}

void CASPIsnoopDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CASPIsnoopDlg)
	DDX_Control(pDX, IDC_COPY, m_btnCopy);
	DDX_Control(pDX, IDC_MODE, m_cbMode);
	DDX_Control(pDX, IDC_PAGE, m_cbPage);
	DDX_Control(pDX, IDC_COMPRESSION, m_btnCompression);
	DDX_Control(pDX, IDC_SEEKEOD, m_btnSeekEOD);
	DDX_Control(pDX, IDC_WRITEMARK, m_btnWriteMark);
	DDX_Control(pDX, IDC_WRITE, m_btnWrite);
	DDX_Control(pDX, IDC_SPACE, m_btnSpace);
	DDX_Control(pDX, IDC_SNOOP, m_btnSnoop);
	DDX_Control(pDX, IDC_REZERO, m_btnRezero);
	DDX_Control(pDX, IDC_RESET, m_btnReset);
	DDX_Control(pDX, IDC_READLIMITS, m_btnReadLimits);
	DDX_Control(pDX, IDC_READ, m_btnRead);
	DDX_Control(pDX, IDC_GETPOS, m_btnGetPos);
	DDX_Control(pDX, IDC_GETPARAS, m_btnGetParas);
	DDX_Control(pDX, IDC_EJECT, m_btnEject);
	DDX_Control(pDX, IDC_LIST1, m_ListBox);
	DDX_Check(pDX, IDC_TOFILE, m_bFileSeek);
	DDX_Text(pDX, IDC_OFFSET, m_nOffset);
	DDX_Check(pDX, IDC_SETMARK, m_bSetMark);
	DDX_Check(pDX, IDC_COMPRESSION, m_bCompression);
	DDX_Text(pDX, IDC_BLKSIZE, m_dwBlkSize);
	//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CASPIsnoopDlg, CDialog)
	//{{AFX_MSG_MAP(CASPIsnoopDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_SNOOP, OnSnoop)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_RESET, OnReset)
	ON_BN_CLICKED(IDC_EJECT, OnEject)
	ON_BN_CLICKED(IDC_REZERO, OnRezero)
	ON_BN_CLICKED(IDC_READLIMITS, OnReadlimits)
	ON_BN_CLICKED(IDC_READ, OnRead)
	ON_BN_CLICKED(IDC_WRITEMARK, OnWritemark)
	ON_BN_CLICKED(IDC_WRITE, OnWrite)
	ON_BN_CLICKED(IDC_GETPOS, OnGetpos)
	ON_BN_CLICKED(IDC_SPACE, OnSpace)
	ON_BN_CLICKED(IDC_GETPARAS, OnGetParameters)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_BN_CLICKED(IDC_COMPRESSION, OnCompression)
	ON_BN_CLICKED(IDC_SEEKEOD, OnSeekeod)
	ON_BN_CLICKED(IDC_CONFIGURE, OnConfigure)
	ON_EN_UPDATE(IDC_BLKSIZE, OnUpdateBlksize)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_COPY, OnCopy)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CASPIsnoopDlg message handlers

BOOL CASPIsnoopDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	//
	CString		strSection = "Configuration";
	CWinApp*	pApp = AfxGetApp();
	m_cTapeHost=(BYTE)GetPrivateProfileInt (strSection,"Host",0,"tapesnoop.ini");
	m_cTapeID=(BYTE)GetPrivateProfileInt (strSection,"ID",4,"tapesnoop.ini");
	m_cTapeLun=(BYTE)GetPrivateProfileInt (strSection,"Lun",0,"tapesnoop.ini");

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	m_cbPage.SetCurSel (0);
	m_cbMode.SetCurSel (0);

	CString src,dst;
	GetWindowText (src);
	dst.Format(src,1,02);
	SetWindowText (dst);


	/*
	//create fonts
	CFont *pCurFont = m_ListBox.GetFont();
	if (pCurFont)
	{
		LOGFONT lf;
		if (pCurFont->GetLogFont(&lf))
		{
			//make normal font
			m_fontNormal.CreateFontIndirect(&lf);
			//make bold font
			lf.lfWeight = FW_BOLD;
			m_fontBold.CreateFontIndirect(&lf);
		}
	}
	*/
	// TODO: Add extra initialization here
	m_pASPI=new CASPIDriver;
	if (!m_pASPI->Init(GetSafeHwnd()))
	{
		MessageBox ("could not find any ASPI devices","TapeSnoop",MB_OK|MB_ICONSTOP);
		EndDialog (IDOK);
	}

	if (!InitTapeParameters ())
		OnConfigure();

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CASPIsnoopDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CASPIsnoopDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CASPIsnoopDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if (m_hIOBuffer != NULL)
		GlobalFree (m_hIOBuffer);
	if (m_pASPI != NULL)
	{
		m_pASPI->Destroy ();
		delete m_pASPI;
	}
}

void CASPIsnoopDlg::OnSnoop() 
{
	CString str;
	HGLOBAL hMem;
	SRB_HAInquiry *inq;
	BYTE d,t,l;

	enableButtons (FALSE);
	hMem=GlobalAlloc (GHND,sizeof(SRB_HAInquiry));
	inq=(SRB_HAInquiry *)GlobalLock(hMem);
	m_pASPI->HaInquiry (0,inq);
	str.Format ("HOST#%d ID#%d : \"%s\" - \"%s\"",0,inq->HA_SCSI_ID,inq->HA_Identifier,inq->HA_ManagerId);
	TRACE ("%s\n",str);
	m_ListBox.AddString (str);
	GlobalFree (hMem);

	char type;
	CString name;
	char *buffer;
	DWORD code;

	buffer=new char[32];
	m_pASPI->m_DeviceList.RemoveAll();
	for (t=0x00;t < m_pASPI->InstalledAdapters();t++)
	{
		for (d=0x00;d <= 0x0F;d++)
		{
			if ((code=m_pASPI->Scan  (t,d,buffer,32)) == ASPIERR_OK)
			{
				for (l=0x00;l <= 0x7F;l++)
				{					
					if ((type=m_pASPI->DeviceType (t,d,l,name)) != -1)
						m_pASPI->m_DeviceList.AddDevice (t,d,l,type,name,&buffer[8]);
				}
			}
		}
	}
	SnoopDone ();
	enableButtons (TRUE);
}
void CASPIsnoopDlg::SnoopDone (void)
{
	CString		str;
	POSITION	pos;
	CASPIDevice *pDev;

	for (pos=m_pASPI->m_DeviceList.GetHeadPosition();pos != NULL;)
	{
		pDev=(CASPIDevice *)m_pASPI->m_DeviceList.GetAt (pos);
		str.Format ("HOST#%d ID#%d LUN#%d %s: \"%s\"",	pDev->m_cAdapter,
														pDev->m_cID,
														pDev->m_cLUN,
														pDev->m_strType,
														pDev->m_strName);
		m_ListBox.AddString (str);
		m_pASPI->m_DeviceList.GetNext(pos);
	}
	m_ListBox.AddString ("Snoop finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
}

void CASPIsnoopDlg::OnReset() 
{
	DWORD code;
	enableButtons (FALSE);
	if ((code=m_pASPI->Reset (1,0)) != ASPIERR_OK)
		Error (code);
	enableButtons (TRUE);
	ResetDone ();
}
void CASPIsnoopDlg::ResetDone (void)
{
	m_ListBox.AddString ("Reset finished.");
	UpdateData (FALSE);
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	TRACE ("ASPIsnoop: Reset Done !\n");
}

void CASPIsnoopDlg::OnEject() 
{
	DWORD code;
	enableButtons (FALSE);
	m_ListBox.AddString ("Eject....");
	UpdateData (TRUE);
	if ((code=m_pASPI->LoadUnload  (m_cTapeHost,m_cTapeID,m_cTapeLun,ASPICMD_UNLOAD)) != ASPIERR_OK)
		Error (code);
	enableButtons (TRUE);
	EjectDone();
}

void CASPIsnoopDlg::Error (DWORD code)
{
	CString str,out;
	if (code != ASPIERR_OK)
	{
		m_pASPI->GetSenseString(str);
		m_ListBox.AddString (str);
		str.LoadString (IDS_ASPIERROR1+code-1);
		out="ERROR: "+str;
		m_ListBox.AddString (LPCTSTR(out));
	}
}


void CASPIsnoopDlg::EjectDone (void)
{
	CString str;
	m_ListBox.AddString ("Eject finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Eject done !\n");
}

void CASPIsnoopDlg::OnRezero() 
{
	enableButtons (FALSE);
	m_ListBox.AddString ("Rezero....");
	UpdateData (TRUE);
	DWORD code;
	if ((code=m_pASPI->Rezero  (m_cTapeHost,m_cTapeID,m_cTapeLun,0)) != ASPIERR_OK)
		Error (code);
	enableButtons (TRUE);
	RezeroDone();
}
void CASPIsnoopDlg::RezeroDone (void)
{
	CString str;
	m_ListBox.AddString ("Rezero finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Rezero done !\n");
}

void CASPIsnoopDlg::OnReadlimits() 
{
	enableButtons (FALSE);
	m_ListBox.AddString ("Read Block Limits....");
	UpdateData (TRUE);
	DWORD code;
	if ((code=m_pASPI->ReadBlockLimits  (m_cTapeHost,m_cTapeID,m_cTapeLun)) != ASPIERR_OK)
		Error (code);
	enableButtons (TRUE);
	ReadLimitsDone();
}
void CASPIsnoopDlg::ReadLimitsDone (void)
{
	unsigned long a,b;
	CString str;
	m_pASPI->GetBlockLimits (&a,&b);
	str.Format ("Block Limits: min=%u max=%u",a,b);
	m_ListBox.AddString (str);
	m_ListBox.AddString ("Read Block Limits finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Read Block Limits done !\n");
}

void CASPIsnoopDlg::OnRead() 
{
	DWORD code;
	DWORD i,pos;
	CString str,part;
	BYTE *buff;
	
	UpdateData (TRUE);
	enableButtons (FALSE);
	m_ListBox.AddString ("Read....");
	if (m_pASPI->GetPosition (m_cTapeHost,m_cTapeID,m_cTapeLun,&pos) != ASPIERR_OK)
		pos=0;
	else
		pos*=m_dwBlkSize;
	buff=new BYTE[m_dwBlkSize];
	ZeroMemory (buff,m_dwBlkSize);
	UpdateData (TRUE);
	if ((code=m_pASPI->Read  (	m_cTapeHost,
								m_cTapeID,
								m_cTapeLun,
								buff,
								1,
								m_dwBlkSize,
								FALSE,
								TRUE)) != ASPIERR_OK)
		Error (code);
	//else
	//{
		for (i=0;i < m_dwBlkSize;i+=16)
		{
			str.Format ("%08X: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
				pos+i,
				buff[i],buff[i+1],buff[i+2],buff[i+3],
				buff[i+4],buff[i+5],buff[i+6],buff[i+7],
				buff[i+8],buff[i+9],buff[i+10],buff[i+11],
				buff[i+12],buff[i+13],buff[i+14],buff[i+15]);
			part.Format (": %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",	buff[i] ? buff[i] : '_',
																	buff[i+1] ? buff[i+1] : '_',
																	buff[i+2] ? buff[i+2] : '_',
																	buff[i+3] ? buff[i+3] : '_',
																	buff[i+4] ? buff[i+4] : '_',
																	buff[i+5] ? buff[i+5] : '_',
																	buff[i+6] ? buff[i+6] : '_',
																	buff[i+7] ? buff[i+7] : '_',
																	buff[i+8] ? buff[i+8] : '_',
																	buff[i+9] ? buff[i+9] : '_',
																	buff[i+10] ? buff[i+10] :'_',
																	buff[i+11] ? buff[i+11] : '_',
																	buff[i+12] ? buff[i+12] : '_',
																	buff[i+13] ? buff[i+13] : '_',
																	buff[i+14] ? buff[i+14] : '_',
																	buff[i+15] ? buff[i+15] : '_');

			str+=part;
			m_ListBox.AddString (str);
		}
	//}
	enableButtons (TRUE);

	m_ListBox.AddString ("Read finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Read done !\n");
}

void CASPIsnoopDlg::OnWritemark() 
{
	enableButtons (FALSE);
	m_ListBox.AddString ("Write File Mark....");
	UpdateData (TRUE);
	DWORD code;
	if ((code=m_pASPI->WriteFileMark  (m_cTapeHost,m_cTapeID,m_cTapeLun,1,m_bSetMark,FALSE)) != ASPIERR_OK)
		Error (code);		
	enableButtons (TRUE);
	WriteFileMarkDone();
}
void CASPIsnoopDlg::WriteFileMarkDone (void)
{
	CString str;
	m_ListBox.AddString ("Write File Mark finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Write File Mark done !\n");
}

void CASPIsnoopDlg::OnWrite() 
{
	enableButtons (FALSE);
	m_ListBox.AddString ("Write....");
	UpdateData (TRUE);
	CString str;
	if (m_hIOBuffer != NULL)
		GlobalFree (m_hIOBuffer);
	m_hIOBuffer=GlobalAlloc (GHND,m_dwBlkSize);
	m_pIOBuffer=(char *)GlobalLock (m_hIOBuffer);
	DWORD pos;
	m_pASPI->GetPosition(m_cTapeHost,m_cTapeID,m_cTapeLun,&pos);
	str.Format ("SounDWorX#%06d",pos);
	strncpy ((char *)m_pIOBuffer,LPCTSTR(str),16);
	DWORD code;
	if ((code=m_pASPI->Write  (	m_cTapeHost,
								m_cTapeID,
								m_cTapeLun,
								m_pIOBuffer,
								1,
								m_dwBlkSize,
								TRUE)) != ASPIERR_OK)
		Error (code);
	enableButtons (TRUE);
	WriteDone();
}
void CASPIsnoopDlg::WriteDone (void)
{
	CString str;
	m_ListBox.AddString ("Write finished.");
	m_ListBox.SetTopIndex (m_ListBox.GetCount()-1);
	UpdateData (FALSE);
	TRACE ("ASPIsnoop: Write done !\n");
}

void CASPIsnoopDlg::OnGetpos() 
{
	DWORD dwPosition=0;
	enableButtons (FALSE);
	m_ListBox.AddString ("Get Position....");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -