打开目录


// 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;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值