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

📄 fpdumpwdlg.cpp

📁 一个使用aspiw32.dll可以读取交换机5ess备份磁带内容的程序
💻 CPP
字号:
// FPDUMPWDlg.cpp : implementation file
//

#include "stdafx.h"
#include "FPDUMPW.h"
#include "FPDUMPWDlg.h"
#include "aspiw32.h"
#include "DialogSettings.h"
#include <io.h>
#include <direct.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString strFileName;
BYTE	HostAdapterID = 0;
BYTE	TargetID = 3;
BYTE	LUN = 0;
// 后台线程
UINT DumpWatcher( LPVOID pParam )
{
	IsWatcherRunning = TRUE;
	bCancelWatcher = FALSE;
	CWnd *pDialog;
	CButton *pbtnSetting;
	CButton *pbtnClose;
	pDialog = AfxGetMainWnd();
	pbtnSetting = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_SETTINGS));
	pbtnSetting->EnableWindow(FALSE);
	pbtnClose = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_CLOSE));
	pbtnClose->EnableWindow(FALSE);

	//	::MessageBox(NULL,strFileName,"MESSAGE",MB_OK);
	// 1. Wait until tape is ready...
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"等待磁带机就绪...");
	for (;;)
	{
		if (bCancelWatcher) goto ExitLoop;
		if (IO_ALL_TEST_UNIT_READY(HostAdapterID,TargetID,LUN)==SS_COMP) break;
	}
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"磁带机已经就绪");

	// 2. Load the tape
	if (bCancelWatcher) goto ExitLoop;
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"正在装载磁带...");
	if (IO_TAPE_LOAD(HostAdapterID,TargetID,LUN,0,1,1)!=SS_COMP)
	{
		pDialog->SetDlgItemText(IDC_DUMPSTATUS,"装载磁带出错");
		goto ExitLoop;
	}
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"装载磁带完成");

	// 3. read files
	if (bCancelWatcher) goto ExitLoop;
	{
		CString strFileNameEx;
		char szTag[12];
		int nStatus = 1; // 1 头,2 身体,3 尾
		int n = 1;
		int block = 0;
		FILE *fp = NULL;

		for (;;)
		{
			BYTE	buf[2048];
			int		nBlockLen;
			BOOLEAN	bFileMark;
			BOOLEAN bILI;
			BOOLEAN bEOM;
			BOOLEAN bValid;
			BYTE	bSenseKey;
			for (;;)
			{
				if (bCancelWatcher) goto ExitLoop;
				if (IO_ALL_TEST_UNIT_READY(HostAdapterID,TargetID,LUN)==SS_COMP) break;
			}
			if (bCancelWatcher) goto ExitLoop;
			IO_TAPE_READ(HostAdapterID,TargetID,LUN,2048,&(buf[0]),&nBlockLen,&bFileMark,&bEOM,&bILI,&bValid,&bSenseKey);
			if (bValid==0)
			{
				pDialog->SetDlgItemText(IDC_DUMPSTATUS,"读磁带的过程中发生了无法预料的错误");
				fclose(fp);
				fp = NULL;
				goto ExitLoop;
			}
			if (nBlockLen>0)
			{
				if (nBlockLen<=2048)
				{
					if (fp==NULL)
					{
						switch(nStatus)
						{
						case 1:
							sprintf(szTag,".H%2.2d",n);
							break;
						case 2:
							sprintf(szTag,".D%2.2d",n);
							break;
						case 3:
							sprintf(szTag,".E%2.2d",n);
							break;
						}
						strFileNameEx = strFileName+ CString(szTag);

						pDialog->SetDlgItemText(IDC_DUMPSTATUS,CString("正在创建文件")+strFileNameEx);

						fp = fopen(strFileNameEx,"wb");
						if (fp==NULL)
						{
							pDialog->SetDlgItemText(IDC_DUMPSTATUS,CString("无法创建文件")+strFileNameEx);
							goto ExitLoop2;
						}
					}
					fwrite(&(buf[0]),1,nBlockLen,fp);
				} else
				{
					pDialog->SetDlgItemText(IDC_DUMPSTATUS,"磁带数据缓冲区太小");
					fclose(fp);
					fp = NULL;
					goto ExitLoop;
				}
			}
			if (bSenseKey==8)
			{
				if (fp!=NULL)
				{
					fclose(fp);
					fp = NULL;
				}
				pDialog->SetDlgItemText(IDC_DUMPSTATUS,"读磁带顺利结束");
				goto ExitLoop2;
			}
			if ((bFileMark)&&(fp!=NULL))
			{
				nStatus = (nStatus % 3) + 1;
				fclose(fp);
				fp = NULL;
			}
		}
	}
ExitLoop:
	pDialog->SetDlgItemText(IDC_DUMPSTATUS,"用户中断了读磁带");
ExitLoop2:
	pbtnSetting = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_SETTINGS));
	pbtnSetting->EnableWindow(TRUE);
	pbtnClose = (CButton*)(pDialog->GetDlgItem(IDC_DUMP_CLOSE));
	pbtnClose->EnableWindow(TRUE);
	IsWatcherRunning = FALSE;
	return 0;
}

// 信号灯
BOOLEAN		 bCancelWatcher;
CWinThread		*pDumpWatcher;
BOOLEAN		 IsWatcherRunning = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFPDUMPWDlg dialog

CFPDUMPWDlg::CFPDUMPWDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFPDUMPWDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFPDUMPWDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFPDUMPWDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFPDUMPWDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFPDUMPWDlg, CDialog)
	//{{AFX_MSG_MAP(CFPDUMPWDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_DUMP_START, OnDumpStart)
	ON_BN_CLICKED(IDC_DUMP_CANCEL, OnDumpCancel)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_DUMP_SETTINGS, OnDumpSettings)
	ON_BN_CLICKED(IDC_DUMP_CLOSE, OnDumpClose)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFPDUMPWDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 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
	
	// TODO: Add extra initialization here
	pDumpWatcher	= NULL;
	if (!LoadASPIManager())
	{
		MessageBox("无法载入ASPI管理模块,程序无法继续","严重错误",MB_ICONERROR);
		EndDialog(FALSE);
	}
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CFPDUMPWDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 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 CFPDUMPWDlg::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 CFPDUMPWDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CFPDUMPWDlg::OnDumpStart() 
{
	// TODO: Add your control notification handler code here
	CString strDir;
	CString strName;
	GetDlgItemText(IDC_EDIT1,strDir);
	GetDlgItemText(IDC_EDIT2,strName);
	strDir.TrimLeft();
	strDir.TrimRight();
	strName.TrimLeft();
	strName.TrimRight();
	if ((strDir.GetLength()!=0)&&(strDir.Right(1)!=CString("\\")))
	{
		strDir += CString("\\");
	}

	strFileName = strDir + strName;
	if (strFileName.GetLength()==0)
	{
		MessageBox("子目录名和存盘名不能全部为空","参数错误",MB_ICONERROR);
		return ;
	}
	if (strDir.GetLength()>0)
	{
		CString strSearch = strDir + "*.*";
		struct _finddata_t fileinfo;
		CString strPath = strDir.Left(strDir.GetLength()-1);
		long handle;
	// 判断子目录是否存在
		handle = _findfirst(strSearch,&fileinfo);
		if (handle==-1)
		{
			int nRes = MessageBox("子目录不存在,是否要创建?","参数错误",MB_ICONERROR|MB_YESNO);
			if (nRes==IDYES)
			{
				if (-1==_mkdir(strPath))
				{
					MessageBox("无法创建子目录?","参数错误",MB_ICONERROR|MB_OK);
				}
			}
		} else
		{
			_findclose(handle);
		}
	}

	// 判断文件是否存在
	FILE *fp;
	CString strFirstFileName;
	strFirstFileName = strFileName + ".D01";
	fp = fopen((LPCSTR)strFirstFileName,"rb");
	if (fp!=NULL) 
	{
		fclose(fp);
		if (IDNO==MessageBox("文件已存在,要覆盖吗?","文件名重复",MB_YESNO))
			return ;
	}

	pDumpWatcher = AfxBeginThread(DumpWatcher,NULL);
}

void CFPDUMPWDlg::OnDumpCancel() 
{
	// TODO: Add your control notification handler code here
	if (!IsWatcherRunning)
		return;
	bCancelWatcher	= TRUE;
//	WaitForSingleObject(pDumpWatcher->m_hThread,INFINITE);
//	pDumpWatcher=NULL;
}

void CFPDUMPWDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnClose();
}

void CFPDUMPWDlg::OnDumpSettings() 
{
	// TODO: Add your control notification handler code here

	CDialogSettings myDialogSettings;
	myDialogSettings.m_HostAdapterID = HostAdapterID;
	myDialogSettings.m_TargetID		 = TargetID;
	myDialogSettings.m_LUN			 = LUN;

	if (IDOK==myDialogSettings.DoModal())
	{
		HostAdapterID = myDialogSettings.m_HostAdapterID;
		TargetID      = myDialogSettings.m_TargetID;
		LUN			  = myDialogSettings.m_LUN;
	}
}

void CFPDUMPWDlg::OnDumpClose() 
{
	// TODO: Add your control notification handler code here
	EndDialog(0);
}

void CFPDUMPWDlg::OnOK() 
{
	// TODO: Add extra validation here
	return;
//	CDialog::OnOK();
}

void CFPDUMPWDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	if (IsWatcherRunning)
		return;
	CDialog::OnCancel();
}

⌨️ 快捷键说明

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