打开目录

// AppTemplateDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "SimpleEnDecode.h"
#include "AppTemplateDlg.h"
#include "Password.h"
#include "afxdialogex.h"

extern CHAR *g_szCurrentDir;

// CAppTemplateDlg 对话框
IMPLEMENT_DYNAMIC(CAppTemplateDlg, CDialogEx)

/*重载构造函数,调用*/
CAppTemplateDlg::CAppTemplateDlg(BOOL bType, CWnd *pParent)
	: CDialogEx(CAppTemplateDlg::IDD, pParent)
	,m_bType(bType)
	,m_strPassword(_T(""))
	,m_strDirectory(_T(""))
	,m_strLog(_T(""))
	,m_strTitile(_T("简单文件加解密程序→解密文件"))
//	,m_strLogFileName(_T(""))
	,m_strNewFileName(_T(""))
	,m_strRun(_T("解密文件"))
	,m_strFileNameArray()
	,m_strErrorFileNameArray()
	,m_hFileRead(NULL)
	,m_hFileWrite(NULL)
	,m_hMappingRead(NULL)
	,m_hMappingWrite(NULL)
	,m_llFileSize(0)
	,m_llFileSizeNew(0)
	,m_pThread(NULL)
{
	/*设置日志绝对路径*/
	if (bType)
	{
		m_strTitile		= _T("简单文件加解密程序→加密文件");
		m_strRun			= _T("加密文件");
		sprintf(m_szLogFileName, "%s\\SimpleEnDecode Logs\\LogEncode.txt", g_szCurrentDir);
	}
	else
	{
		sprintf(m_szLogFileName, "%s\\SimpleEnDecode Logs\\LogDecode.txt", g_szCurrentDir);
	}

	ZeroMemory(m_szRoot, ROOT_LENTH * sizeof(CHAR));
	ZeroMemory(&m_stHeader, sizeof(HEADER));
	ZeroMemory(m_szFileName, MAX_PATH * sizeof(CHAR));
	ZeroMemory(m_szNewFileName, MAX_PATH * sizeof(CHAR));
	ZeroMemory(m_szPassword, BUF_SIZE * sizeof(UCHAR));
	ZeroMemory(m_szWork, BUF_SIZE * sizeof(UCHAR));
	ZeroMemory(&m_SysInfo, sizeof(SYSTEM_INFO));
	sprintf(m_szAdvSettingsPath, "%s\\AdvSettings", g_szCurrentDir);
	sprintf(m_szAppName, "%s\\AdvSettings\\SimpleEnDecode.ini", g_szCurrentDir);
	
	/*设置高级配置信息*/
	m_bAdvSwitch = FALSE;
	/*只有存在了配置文件,才初始化这些配置变量*/
	if (TRUE == PathFileExistsA(m_szAppName))
	{
		/*设置节信息*/
		sprintf(m_szSwitchTitle,	"SWITCH");
		sprintf(m_szSwitchKey,		"TYPE");
		sprintf(m_szStringTitle,	"ENCODESTRING");
		sprintf(m_szStringKey,		"METHORD");
		sprintf(m_szArrayTitle,	"RANDOMARRAY");
		for (int i = 0; i < BUF_SIZE; i += 16)
		{
			sprintf(m_szArrayKey[i/16], "%02X--%02X", i, i + 15);
		}
	}
}

CAppTemplateDlg::~CAppTemplateDlg()
{
	/*这里都强制关闭文件句柄,防止程序异常退出时有未关闭的句柄*/
	/*
	CloseHandle(m_hFileRead);
	CloseHandle(m_hFileWrite);
	CloseHandle(m_hMappingRead);
	CloseHandle(m_hMappingWrite);
	*/
}

void CAppTemplateDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);

	DDX_Control(pDX, IDB_RUN, m_BtnRun);
	DDX_Control(pDX, IDL_FILELIST, m_ListFile);
	DDX_Control(pDX, IDP_RUNNING, m_ProcCtrl);
}

BEGIN_MESSAGE_MAP(CAppTemplateDlg, CDialogEx)
	ON_BN_CLICKED(IDB_BROWSEDIR,	&CAppTemplateDlg::OnClickedIdbBrowsedir)
	ON_BN_CLICKED(IDB_BROWSEFILES,	&CAppTemplateDlg::OnClickedIdbBrowsefiles)
	ON_BN_CLICKED(IDB_RUN,			&CAppTemplateDlg::OnClickedIdbRun)
END_MESSAGE_MAP()

// CAppTemplateDlg 消息处理程序

void CAppTemplateDlg::OnClickedIdbBrowsedir()
{
	/*如果Button可见,则表示选择任务取消*/
	if (TRUE == m_BtnRun.IsWindowVisible())
	{
		m_strLog = _T("任务取消");
		WriteLog();
	}
	EmptyAll();
	InitCommonControls();
	BROWSEINFO bf	= {0};
	bf.lpszTitle	= _T("简单文件加解密程序→选择文件所在目录:");
	bf.hwndOwner	= this->m_hWnd;
	bf.pidlRoot	= NULL;
	TCHAR strBrowsePath[MAX_PATH];
	/*选择加密目录*/
	LPITEMIDLIST lpItem = SHBrowseForFolder(&bf);
	SHGetPathFromIDList(lpItem, strBrowsePath);
	/*释放资源*/
	LPMALLOC lpMalloc;
	if(E_FAIL == SHGetMalloc(&lpMalloc)) 
	{
		return;
	}
	lpMalloc->Free(lpItem);
	lpMalloc->Release();

	m_strDirectory += strBrowsePath;
	/*如果选择的是非法目录比如(计算机或者我的电脑)*/
	if (TRUE == m_strDirectory.IsEmpty())
	{
		return ;
	}

	CFileFind fd;
	CString strFindPath;
	/*设置搜索路径*/
	if (_T(":\\") == m_strDirectory.Right(2))
	{
		/*如果选择的是磁盘根目录,则加上“*.*” */
		strFindPath = m_strDirectory + _T("*.*");
	}
	else
	{
		/*如果选择的是文件夹目录,则加上“\\*.*”*/
		strFindPath = m_strDirectory + _T("\\*.*");
	}
	/*开始搜索指定目录下的所有文件*/
	fd.FindFile( strFindPath);
	BOOL bRet = fd.FindFile( strFindPath);
	while (FALSE != bRet)
	{
		bRet = fd.FindNextFile();
		/*去除点目录和其他目录项*/
		if ( fd.IsDots() || fd.IsDirectory())
		{
			continue;
		}
		/*保存文件名到CStringArray对象中*/
		m_strFileNameArray.Add( fd.GetFilePath());
	}
	/*如果选择目录下没有文件*/
	if (0 == m_strFileNameArray.GetSize())
	{
		MessageBox(_T("当前目录为空,无可操作文件"));
		return ;
	}
	/*设置窗口静态文本内容*/
	SetDlgItemText(IDT_DIRECTORY, m_strDirectory);
	SetDlgItemText(IDT_TIP_DIR, _T("选择的路径为:"));
	/*任务开始前在末尾加两个换行*/
	m_strLog = _T("\r\n");
	WriteLog(FALSE);
	/*在ListBox控件中添加文件信息*/
	for(int i = 0; i < m_strFileNameArray.GetCount(); i++)
	{
		m_ListFile.AddString( m_strFileNameArray[i]);
		m_strLog = _T("选择任务文件:") + m_strFileNameArray[i];
		WriteLog();
	}
	SetHorizonScole();
	/*显示操作按钮*/
	m_BtnRun.ShowWindow(TRUE);
}

/*
修改历史:
	1: 自定义文件对话框所选文件名内存空间,系统默认的空间不足以存储大量文件。
	2: 设置最大可操作文件数量为256,可根据需要继续加大。
*/
void CAppTemplateDlg::OnClickedIdbBrowsefiles()
{
	/*如果Button可见,则表示选择任务取消*/
	if (TRUE == m_BtnRun.IsWindowVisible())
	{
		m_strLog = _T("任务取消");
		WriteLog();
	}

	EmptyAll();

	CFileDialog DlgFile(TRUE, NULL, NULL,
		OFN_HIDEREADONLY | 
		OFN_OVERWRITEPROMPT | 
		OFN_ALLOWMULTISELECT | 
		OFN_FILEMUSTEXIST |
		OFN_EXPLORER );
	/*设置缓冲区大小,防止文件名过长,或者选择文件过多的情况出现*/
	/*定义缓冲区*/
	CString strFileName;
	/*定义最大文件数量,这里使用256*/
	const int c_cMaxFiles = 256;
	/*定义缓冲区大小*/
	const int c_cbBufSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
	/*设置文件对话框属性*/
	DlgFile.m_ofn.lpstrFile = strFileName.GetBuffer(c_cbBufSize);
	DlgFile.m_ofn.nMaxFile	= c_cbBufSize;
	if(IDCANCEL == DlgFile.DoModal())
	{
		/*如果没有选择文件*/
		return ;
	}
	
	/*遍历所有选择文件,保存到CStringArray对象中*/
	POSITION po		= DlgFile.GetStartPosition();	
	while(NULL != po)
	{
		CString strPath = DlgFile.GetNextPathName(po);
		m_strFileNameArray.Add(strPath);
	}
	
	/*文件对话框使用完毕,释放内存*/
	strFileName.ReleaseBuffer();

	/*设定选择的路径信息*/
	int nDirIdx = m_strFileNameArray[0].ReverseFind('\\');
	m_strDirectory = m_strFileNameArray[0].Left(nDirIdx+1);
	SetDlgItemText(IDT_TIP_DIR, _T("选择的路径为:"));
	SetDlgItemText(IDT_DIRECTORY, m_strDirectory);

	/*任务开始前在日志末尾加换行*/
	m_strLog = _T("\r\n");
	WriteLog(FALSE);
	
	/*添加文件信息到ListBox控件中*/
	for (int i = 0; i< m_strFileNameArray.GetCount(); i++)
	{
		m_ListFile.AddString(m_strFileNameArray[i]);
		m_strLog = _T("选择任务文件:") + m_strFileNameArray[i];
		WriteLog();
	}
	
	/*根据选择文件路径的长度设置控件的水平滚动条*/
	SetHorizonScole();
	
	/*显示加密按钮*/
	m_BtnRun.ShowWindow(TRUE);
}

void CAppTemplateDlg::SetHorizonScole(void)
{
	CString		str;
	CSize		sz;
	TEXTMETRIC	tm;
	int			dx	= 0;
	CDC*			pDC	= m_ListFile.GetDC();
	CFont*		pFont = m_ListFile.GetFont();

	/*获取ListBox的字体*/
	CFont* pOldFont = pDC->SelectObject(pFont);
	/*获取字体的属性,长宽等*/
	pDC->GetTextMetrics(&tm); 
	/*获取最长字符串*/
	for (int i = 0; i < m_ListFile.GetCount(); i++)
	{
		m_ListFile.GetText(i, str);
		sz = pDC->GetTextExtent(str);
		sz.cx += tm.tmAveCharWidth;
		if (sz.cx > dx)
			dx = sz.cx;
	}
	/*恢复原来字体*/
	pDC->SelectObject(pOldFont);
	m_ListFile.ReleaseDC(pDC);
	
	/*设置列表框的水平滚动条属性*/
	m_ListFile.SetHorizontalExtent(dx);
}

void CAppTemplateDlg::WriteLog(BOOL bType)
{
	extern CHAR* g_szCurrentDir;
	CString strLog = m_strLog;
	
	/*获取当前时间*/
	CTime time = CTime::GetCurrentTime();
	CString strTime = time.Format(_T("%Y年%m月%d日 %H:%M:%S:"));
	strTime += _T("    ");
	if (FALSE == bType)
	{
		strTime = _T("    ");
		if (_T("\r\n") == m_strLog)
		{
			strTime = _T("");
		}
	}
	strTime += strLog;
	/*\r\n是文件中的换行符*/
	strTime += _T("\r\n");
	CHAR buf[MAX_PATH];
	ZeroMemory(buf, MAX_PATH * sizeof(CHAR));
	GetASCIIArray(strTime,buf,MAX_PATH);
	
	/*打开文件*/
	FILE *pFile = fopen(m_szLogFileName, "ab+");
	ASSERT(NULL != pFile);
	
	/*定位到文件末尾*/
	fseek(pFile, 0, SEEK_END);	
	
	/*写文件*/
	UINT nLen = strlen(buf);
	if(nLen != fwrite(buf , sizeof(CHAR), nLen, pFile))
	{
		MessageBox(_T("Write Log File Failed!"));
	}
	
	/*清空文件缓存*/
	fflush(pFile);
	
	/*关闭文件*/
	if(EOF == fclose(pFile))
	{
		MessageBox(_T("Close Log File Failed"));
		return ;
	}
	
	pFile = NULL;
}

BOOL CAppTemplateDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	

	HANDLE hCurThread = GetCurrentThread();
	SetThreadPriority(hCurThread, THREAD_PRIORITY_LOWEST);


	this->SetWindowText(m_strTitile);
	SetDlgItemText(IDB_RUN, m_strRun);
	m_BtnRun.ShowWindow(FALSE);
	GetSystemInfo(&m_SysInfo);

	/*判断日志目录是否存在*/
	CHAR dir[MAX_PATH];
	sprintf(dir, "%s\\SimpleEnDecode Logs", g_szCurrentDir);
	if (FALSE == PathFileExistsA(dir))
	{
		CreateDirectoryA(dir,NULL);
	}
	
	/*设置进度条*/
	m_ProcCtrl.SetPos(0);
	
	/*判断日志文件大小是否到达警戒线*/
	CHAR szFileName[MAX_PATH];
	if (TRUE == m_bType)
	{
		sprintf(szFileName, "%s\\SimpleEnDecode Logs\\LogEncode.txt", dir);
		if (TRUE == PathFileExistsA(szFileName))
		{
			HANDLE hFile = CreateFileA(szFileName,
				GENERIC_READ,
				0,
				NULL,
				OPEN_EXISTING,
				FILE_ATTRIBUTE_NORMAL,
				NULL);
			ASSERT(INVALID_HANDLE_VALUE != hFile);
			DWORD dwHigh = 0;
			DWORD dwLow = 0;
			dwLow = GetFileSize(hFile, &dwHigh);
			LONGLONG llSize =dwHigh;
			llSize = (llSize << 32) + dwLow;
			CloseHandle(hFile);
			if (WARNING_SIZE <= llSize )
			{
				if (IDOK == MessageBox(_T("加密日志文件大小超过1M,点确定清理,取消跳过"),NULL,MB_OKCANCEL))
				{
					DeleteFileA(szFileName);
				}// end of MessageBox
			}//end of size compare

		}//end of PathFileExists
	}
	else
	{
		sprintf(szFileName, "%s\\SimpleEnDecode Logs\\LogDecode.txt", dir);
		if (TRUE == PathFileExistsA(szFileName))
		{
			HANDLE hFile = CreateFileA(szFileName,
				GENERIC_READ,
				0,
				NULL,
				OPEN_EXISTING,
				FILE_ATTRIBUTE_NORMAL,
				NULL);
			ASSERT(INVALID_HANDLE_VALUE != hFile);
			DWORD dwHigh = 0;
			DWORD dwLow = 0;
			dwLow = GetFileSize(hFile, &dwHigh);
			LONGLONG llSize =dwHigh;
			llSize = (llSize << 32) + dwLow;
			CloseHandle(hFile);
			if (WARNING_SIZE <= llSize )
			{
				if (IDOK == MessageBox(_T("解密日志文件大小超过1M,点确定清理,取消跳过"),NULL,MB_OKCANCEL))
				{
					DeleteFileA(szFileName);
				}//end of MessageBox
			}//end of size compare

		}//end of PathFileExists
	}//end of type check


	/*加载配置信息*/
	if (ERROR_OK != LoadIni())
	{
		this->EndDialog(ERROR_WRONGARRAY);
		return FALSE;
	}

	return TRUE;  
}

void CAppTemplateDlg::EmptyAll(void)
{
	/*清空ListBox内容*/
	int nLen = m_ListFile.GetCount();
	for (int i = 0; i < nLen; )
	{
		m_ListFile.DeleteString(0);
		nLen = m_ListFile.GetCount();
	}

	m_strFileNameArray.RemoveAll();
	m_strErrorFileNameArray.RemoveAll();
	m_strDirectory	= _T("");
	m_strPassword		= _T(""); 
	m_strLog			= _T("");
	m_strNewFileName	= _T("");
	m_strCurrentFile	= _T("");

	SetDlgItemText(IDT_TIP_FILE, _T(""));
	SetDlgItemText(IDT_FILENAME, _T(""));
	SetDlgItemText(IDT_TIP_DIR, _T("请选择文件路径"));
	SetDlgItemText(IDT_DIRECTORY, _T("点击下方浏览选择文件或者目录"));
	
	/*清空头部结构体*/
	ZeroMemory(&m_stHeader, sizeof(HEADER));

	/*以下为清空部分变量的ASCII码数组*/
	ZeroMemory(m_szFileName, MAX_PATH * sizeof(CHAR));
	ZeroMemory(m_szNewFileName, MAX_PATH * sizeof(CHAR));
	ZeroMemory(m_szPassword, BUF_SIZE * sizeof(UCHAR));
	ZeroMemory(m_szRoot, ROOT_LENTH * sizeof(CHAR));
	ZeroMemory(m_szWork, BUF_SIZE * sizeof(UCHAR));
	
	/*隐藏操作按钮*/
	m_BtnRun.ShowWindow(FALSE);
	/*设置进度条*/
	m_ProcCtrl.SetPos(0);
	
}

void CAppTemplateDlg::GetASCIIArray(CString &str, CHAR *pBuf, int nLen)
{
	TCHAR *p = str.GetBuffer(0);
	ZeroMemory(pBuf, nLen * sizeof(CHAR));

#ifdef _UNICODE
	char *pszBuf = new char [nLen]; 
	WideCharToMultiByte(CP_ACP, 0, p, -1,pszBuf, nLen, NULL, NULL);
	strncpy(pBuf, pszBuf, strlen(pszBuf));
	delete pszBuf;
#else
	strncpy(pBuf, p, strlen(p));
#endif
}

void CAppTemplateDlg::CreateWorkArray(void) 
{
	if (TRUE == m_strPassword.IsEmpty())
	{
		MessageBox(_T("密码为空!"));
		return ;
	}

	UCHAR chSrc[BUF_SIZE];
	UCHAR chDes[BUF_SIZE];
	ZeroMemory(chSrc, BUF_SIZE * sizeof(UCHAR));
	ZeroMemory(chDes, BUF_SIZE * sizeof(UCHAR));

	UCHAR uc;
	size_t i = 0;
	int nIndex = 0;

	for (; i < strlen((char*)m_szPassword); i++)
	{
		chSrc[i] = m_szPassword[i];
		m_szWork[i] = (UCHAR)(i & 0xff);

	}

	for (; i < BUF_SIZE ; i++)
	{
		chSrc[i] = (UCHAR)(i & 0xff);
		m_szWork[i] = (UCHAR)(i & 0xff);
	}

	for (i = 0; i < BUF_SIZE; i++)
	{
		int n = ((i<<4) % BUF_SIZE) + (i>>4);
		chDes[i] = chSrc [n];
	}

	for (i = 0; i < BUF_SIZE; i++)
	{
		nIndex	= chDes[i];
		uc		= m_szWork[nIndex];
		m_szWork[nIndex]	= m_szWork[i];
		m_szWork[i]		= uc;
	}

	for (i = 0; i < BUF_SIZE; i+=2)
	{
		UCHAR uc = m_szWork[i];
		m_szWork[i] = m_szWork[i+1];
		m_szWork[i+1] = uc;
	}

}

BOOL CAppTemplateDlg::TypeInPassword(void)
{
	CPassword psw;
	if (IDCANCEL == psw.DoModal())
	{
		MessageBox(_T("没有输入密码!"));
		return FALSE;
	}

	/*获取密码的ASCII码*/
	GetASCIIArray(m_strPassword, (CHAR*)m_szPassword, BUF_SIZE);

	return TRUE;
}

ERROR_RET CAppTemplateDlg::OpenFiles()
{
	m_hFileRead = CreateFileA(m_szFileName,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (INVALID_HANDLE_VALUE == m_hFileRead)
	{
		TRACE(_T("打开文件失败"));
		return ERROR_FILE_OPEN_FAILED;
	}

	m_hFileWrite = CreateFileA(m_szNewFileName,
		GENERIC_WRITE | GENERIC_READ,
		FILE_SHARE_WRITE,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (INVALID_HANDLE_VALUE == m_hFileWrite)
	{
		TRACE(_T("打开文件失败"));
		CloseHandle(m_hFileRead);
		return ERROR_FILE_OPEN_FAILED;
	}

	return ERROR_OK;
}

ERROR_RET CAppTemplateDlg::CreateMappings()
{
	m_hMappingRead = CreateFileMappingA(m_hFileRead,
		NULL,
		PAGE_READONLY,
		HIGHULONG(m_llFileSize),
		LOWULONG(m_llFileSize),
		NULL);
	if (NULL == m_hMappingRead)
	{
		int n = GetLastError();
		CString str;
		str.Format(_T("Old GetLastError == %d"),n);
		MessageBox(str);
		TRACE(_T("创建文件映射失败"));
		CloseHandle(m_hFileRead);
		CloseHandle(m_hFileWrite);
		return ERROR_FILE_MAPPING;
	}

	m_hMappingWrite = CreateFileMappingA(m_hFileWrite,
		NULL,
		PAGE_READWRITE,
		HIGHULONG(m_llFileSizeNew),
		LOWULONG(m_llFileSizeNew),
		NULL);
	if (NULL == m_hMappingWrite)
	{
		int n = GetLastError();
		CString str;
		str.Format(_T("New GetLastError == %d"),n);
		MessageBox(str);
		TRACE(_T("创建文件映射失败"));
		CloseHandle(m_hFileRead);
		CloseHandle(m_hFileWrite);
		CloseHandle(m_hMappingRead);
		return ERROR_FILE_MAPPING;
	}

	return ERROR_OK;
}

void CAppTemplateDlg::EraseFile()
{
	SetDlgItemText(IDT_TIP_FILE, _T("擦除文件:"));
	HANDLE hFile = CreateFileA(m_szFileName,
		GENERIC_WRITE | GENERIC_READ, 
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	ASSERT( INVALID_HANDLE_VALUE != hFile);

	/*if size of file is zero, set position 100*/
	if (0 == m_llFileSize)
	{
		CloseHandle(hFile);
		DeleteFileA(m_szFileName);
		MoveFileA(m_szNewFileName, m_szFileName);
		m_ProcCtrl.SetPos(100);
		return ;
	}

	HANDLE hMap = CreateFileMappingA(hFile,
		NULL,
		PAGE_READWRITE,
		0,
		0,
		NULL);
	ASSERT(NULL != hMap);

	LONGLONG llOffset	= 0;
	DWORD	dwBlock	= m_SysInfo.dwAllocationGranularity * BLOCK_RATIO ;
	LONGLONG llCurSize = m_llFileSize;
	
	while (0 < llCurSize)
	{
		if (llCurSize < dwBlock)
		{
			dwBlock = LOWULONG(llCurSize);
		}

		CHAR *pRead = (CHAR*) MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, HIGHULONG(llOffset),LOWULONG(llOffset),dwBlock);
		ASSERT(NULL != pRead);
		
		for (DWORD i = 0; i < dwBlock; i++)
		{
			pRead[i] = 0;
		}

		UnmapViewOfFile(pRead);

		/*set process ctrl pos , when erasing file, add 50*/
		LONGLONG llpos = ((m_llFileSize - llCurSize) * 100 / (m_llFileSize * 2)) + 50;
		m_ProcCtrl.SetPos(llpos);

		llOffset  += dwBlock;
		llCurSize -= dwBlock;
	}
	m_ProcCtrl.SetPos(100);
	CloseHandle(hMap);
	CloseHandle(hFile);

	DeleteFileA(m_szFileName);
	MoveFileA(m_szNewFileName,m_szFileName);
}

void CAppTemplateDlg::CreatekeyPassword(UCHAR *pKey)
{
	/*根据口令长度的奇偶性,采用不同方法加密*/
	if (0 == (m_stHeader.dwPasswordLen & 0x1))
	{
		/*密码长度是偶数*/
		/*偶数位*/
		for (UINT i = 0; i < BUF_SIZE; i += 2)
		{
			UCHAR ucHigh = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf);
			UCHAR ucLow	= (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4);
			UCHAR uc = (ucHigh << 4) + ucLow;
			pKey[i] = uc;
		}
		/*奇数位*/
		for (UINT i = 1; i < BUF_SIZE; i +=2)
		{
			UCHAR ucHigh = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4);
			UCHAR ucLow  = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf);
			UCHAR uc = (ucHigh << 4) + ucLow;
			pKey[i] = uc;
		}
	}
	else
	{
		/*密码长度是奇数*/
		/*偶数位*/
		for (UINT i = 0; i < BUF_SIZE; i += 2)
		{
			UCHAR ucHigh = (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4);
			UCHAR ucLow  = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf);
			UCHAR uc = (ucHigh << 4) + ucLow;
			pKey[i] = uc;
		}
		/*奇数位*/
		for (UINT i = 1; i < BUF_SIZE; i +=2)
		{
			UCHAR ucHigh = (m_szPassword[i] >> 4) ^ (g_ucKeyArray[i] & 0xf);
			UCHAR ucLow	= (m_szPassword[i] & 0xf) ^ (g_ucKeyArray[i] >> 4);
			UCHAR uc = (ucHigh << 4) + ucLow;
			pKey[i] = uc;
		}
	}
}

void CAppTemplateDlg::OnCancel()
{
	if (NULL != m_pThread)
	{
		MessageBox(_T("有任务正在运行,请稍后退出"));
		return;
	}
	
	/*如果Button可见,则表示选择任务取消*/
	if (TRUE == m_BtnRun.IsWindowVisible())
	{
		m_strLog = _T("任务取消");
		WriteLog();
	}
	CDialogEx::OnCancel(); 
}

void CAppTemplateDlg::ShowLogFile()
{
	/*获取notepad的绝对路径*/
	CHAR exe[MAX_PATH];
	GetWindowsDirectoryA(exe, MAX_PATH);
	sprintf(exe, "%s\\Notepad.exe", exe);

	/*设置命令行参数*/
	CHAR lpcmd[MAX_PATH];
	sprintf(lpcmd, " %s", m_szLogFileName);

	/*设置进程启动信息*/
	STARTUPINFOA si;
	ZeroMemory(&si,sizeof(STARTUPINFOA));
	si.cb = sizeof(STARTUPINFOA);

	/*设置进程返回信息*/
	PROCESS_INFORMATION pi;
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	
	/*启动进程*/
	CreateProcessA(exe,lpcmd,NULL,NULL,TRUE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,&pi);

	/*关闭进程线程句柄*/
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
}

ERROR_RET CAppTemplateDlg::LoadIni()
{
	//如果文件不存在,表示没有进行配置,返回正常
	if (FALSE == PathFileExistsA(m_szAppName))
	{
		return ERROR_OK;
	}
	else
	{
		GetPrivateProfileStringA(m_szSwitchTitle, m_szSwitchKey, "", m_szSwitchValue, 20, m_szAppName);
		
		/*如果没有开启高级配置*/
		if (0 == strcmp(m_szSwitchValue, "OFF"))
		{
			/*设置状态位*/
			m_bAdvSwitch = FALSE;
			return ERROR_OK;
		}
		
		/*如果开启高级配置*/
		if (0 == strcmp(m_szSwitchValue, "ON"))
		{
			/*设置状态位*/
			m_bAdvSwitch = TRUE;
			
			/*读取加密字符串*/
			GetPrivateProfileStringA(m_szStringTitle, m_szStringKey, "", m_szStringValue, 100, m_szAppName);
			
			/*检查字符串合法性*/
			for (size_t i = 0; i < strlen(m_szStringValue); i++)
			{
				if (
					(m_szStringValue[i] == 'A' || m_szStringValue[i] == 'a') || 
					(m_szStringValue[i] == 'B' || m_szStringValue[i] == 'b') ||
					(m_szStringValue[i] == 'C' || m_szStringValue[i] == 'c') ||
					(m_szStringValue[i] == 'D' || m_szStringValue[i] == 'd') 
					)
				{
					//Do Nothing
					continue;
				}
				else
				{
					MessageBox(_T("加密字符串不合法!"));
					return ERROR_ENCODESTRING;
				}
			}
			/*读取数组状态*/
			for (int i = 0; i < 16 ; i++)
			{
				GetPrivateProfileStringA(m_szArrayTitle, m_szArrayKey[i], "", m_szArrayValue[i], 100, m_szAppName);
			}
			
			/*每次处理一个数的字符串*/
			char buf[4];
			buf[3] = '\0';
			/*给随机数组赋值*/
			for (int i = 0; i < 16; i++)
			{
				for (int j = 0; j < 16; j++)
				{
					strncpy(buf, m_szArrayValue[i] + 4 * j, 3);
					m_Arr[i * 16 +j] = atoi(buf);
				}
			}

			/*检查赋值后随机数组有效性*/
			for (int i = 0; i < BUF_SIZE-1; i++)
			{
				for (int j = i+1; j < BUF_SIZE; j++)
				{
					if (m_Arr[i] == m_Arr[j])
					{
						MessageBox(_T("加密数组不合法"));
						return ERROR_WRONGARRAY;
					}
				}
			}

			return ERROR_OK;
		}

		/*如果既不是ON,也不是OFF,返回系统错误*/
		return ERROR_SYSTEM;
	}
}

猜你喜欢

转载自robinsnelson.iteye.com/blog/1673157
今日推荐