📄 aspisnoopdlg.cpp
字号:
// 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 + -