Browse Source

完成离线模式

JeffWang 3 years ago
parent
commit
439d8dbe51

+ 8 - 2
Source/OGCAssist/OGCAssist/PipeClient.cpp

@@ -164,9 +164,10 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
             continue;
         }
 
-		Utility::dprintf(_T("ReadMsgThread->Start ReadFile……\n"));
+		Utility::dprintf(_T("ReadMsgThread->Start1 ReadFile……\n"));
 #if 1 // 分配足够大的缓冲,保证C/S两端通信内容不超过该大小;
         bSuccess = ReadFile(pInstance->m_hPipeInst, m_IoRead.szBuffer, BUFSIZE, &m_IoRead.dwBufferSize,	(OVERLAPPED*)&pInstance->m_IoRead);
+		Utility::dprintf(_T("ReadMsgThread->Start2 ReadFile……\n"));
         if ( bSuccess )
         {
             // 打印结果;
@@ -176,6 +177,7 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
         else
         {          
             // 等待完成;
+			Utility::dprintf(_T("ReadMsgThread->WaitFinish……\n"));
             if ( !WaitFinish(pInstance->m_hPipeInst, &m_IoRead) )
             {
                 // 出现错误;
@@ -306,19 +308,23 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
 	DWORD dwWait = -1;
 	DWORD dwTransBytes = -1;
 
+	Utility::dprintf(_T("WaitFinish->WaitForSingleObject 1\n"));
 	// 等待读写操作完成;
 	dwWait = WaitForSingleObject(pIoContext->m_Overlapped.hEvent,INFINITE);
+	Utility::dprintf(_T("WaitFinish->WaitForSingleObject 2\n"));
 	switch(dwWait)
 	{
 	case 0:
 		if (bPendingIO)
 		{
+			Utility::dprintf(_T("WaitFinish->GetOverlappedResult 1\n"));
 			// 获取Overlapped结果;
 			if( GetOverlappedResult(hPipe, &pIoContext->m_Overlapped, &dwTransBytes, TRUE) == FALSE)
 			{
-				printf("ConnectNamedPipe  failed   %d\n",GetLastError());
+				Utility::dprintf(_T("WaitFinish->GetOverlappedResult->ConnectNamedPipe  failed   %d\n"),GetLastError());
 				return FALSE;
 			}
+			Utility::dprintf(_T("WaitFinish->GetOverlappedResult 2\n"));
 		}
 		break;
 		// 读写完成;

+ 269 - 0
Source/OGCAssistTool/OGCAssistTool/Base64.cpp

@@ -0,0 +1,269 @@
+#include "StdAfx.h"
+#include "Base64.h"
+
+CBase64::CBase64(void)
+{
+}
+
+CBase64::~CBase64(void)
+{
+}
+
+const char CBase64::sm_base64digits[65] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+const char CBase64::sm_base64val[128] = {
+	BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
+	BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
+	BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
+	52, 53, 54, 55,  56, 57, 58, 59,  60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
+	BAD,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,
+	15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25,BAD, BAD,BAD,BAD,BAD,
+	BAD, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,
+	41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51,BAD, BAD,BAD,BAD,BAD
+};
+
+/************************************************************************/
+/*  函数:[6/2/2016 IT];
+/*  描述:将字节转换为Base64字符;
+/*  参数:;
+/*  	[IN] pbinary:			要转换成Base64字符的二进制字节数组;
+/*  	[IN] nbinaryLen:		pbinary所指向的缓存大小;
+/*  	[OUT] pOutBase64:		返回转换后的Base64字符,以'\0'结束;
+/*  返回:返回转换成功后的Base64字符数;
+/*  注意:注意参数1是字节BYTE,返回的pOutBase64是人为加上'\0'结束符;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void CBase64::binToBase64(IN const unsigned char *pbinary, IN size_t nbinaryLen, OUT char *pOutBase64)
+{
+	for ( ; nbinaryLen >= 3; nbinaryLen -= 3, pbinary += 3) 
+	{
+		*pOutBase64++ = sm_base64digits[pbinary[0] >> 2];
+		*pOutBase64++ = sm_base64digits[((pbinary[0] << 4) & 0x30) | (pbinary[1] >> 4)];
+		*pOutBase64++ = sm_base64digits[((pbinary[1] << 2) & 0x3c) | (pbinary[2] >> 6)];
+		*pOutBase64++ = sm_base64digits[pbinary[2] & 0x3f];
+	}
+
+	if (nbinaryLen > 0) 
+	{
+		unsigned char fragment;
+		*pOutBase64++ = sm_base64digits[pbinary[0] >> 2];
+		fragment = (pbinary[0] << 4) & 0x30;
+
+		if (nbinaryLen > 1)
+			fragment |= pbinary[1] >> 4;
+
+		*pOutBase64++ = sm_base64digits[fragment];
+		*pOutBase64++ = (nbinaryLen < 2) ? '=' : sm_base64digits[(pbinary[1] << 2) & 0x3c];
+		*pOutBase64++ = '=';
+	}
+	*pOutBase64 = '\0';
+}
+
+/************************************************************************/
+/*  函数:[6/2/2016 IT];
+/*  描述:将Base64字符串转为化二进制字节字符串;
+/*  参数:;
+/*  	[IN] pBase64:		要转化成二进制字节字符串的Base64字符;
+/*  	[OUT] pbinary:		返回转化成二进制字节的字符串;
+/*  	[IN] maxLen:		pbinary指向的缓存大小;
+/*  返回:返回转化成二进制字节字符数;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+int CBase64::base64ToBin(IN const char *pBase64, OUT unsigned char *pbinary, IN size_t maxLen)
+{
+	size_t len = 0;
+	unsigned char digit1, digit2, digit3, digit4;
+
+	if (pBase64[0] == '+' && pBase64[1] == ' ')
+		pBase64 += 2;
+	if (pBase64[0] == '\r')
+		return 0;
+
+	while (*pBase64 && *pBase64 != '\r' /*&& digit4 != '='*/) 
+	{
+		digit1 = pBase64[0];
+		if (decode64(digit1) == BAD)
+			return -1;
+		digit2 = pBase64[1];
+		if (decode64(digit2) == BAD)
+			return -1;
+		digit3 = pBase64[2];
+		if (digit3 != '=' && decode64(digit3) == BAD)
+			return -1; 
+		digit4 = pBase64[3];
+		if (digit4 != '=' && decode64(digit4) == BAD)
+			return -1;
+		pBase64 += 4;
+
+		++len;
+		if (maxLen && len > maxLen)
+			return -1;
+
+		*(pbinary++) = (decode64(digit1) << 2) | (decode64(digit2) >> 4);
+		if (digit3 != '=') 
+		{
+			++len;
+			if (maxLen && len > maxLen)
+				return -1;
+			*(pbinary++) = ((decode64(digit2) << 4) & 0xf0) | (decode64(digit3) >> 2);
+			if (digit4 != '=') 
+			{
+				++len;
+				if (maxLen && len > maxLen)
+					return -1;
+				*(pbinary++) = ((decode64(digit3) << 6) & 0xc0) | decode64(digit4);
+			} // if
+		} // if
+	} // while
+
+	return len;
+}
+
+#ifndef VC60
+/************************************************************************/
+/*  函数:StringToBase64[1/14/2017 IT];
+/*  描述:将指定字符串转成Base64字符串;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+CStringA CBase64::StringToBase64A(IN CStringA strSource)
+{
+	CStringA strBase64 = "";
+	// 计算出Base64字符长度;
+	INT nBase64Len = CalcBase64Len(strSource.GetLength());
+	CHAR* pBase64 = new CHAR[nBase64Len+1];
+	memset(pBase64, 0, nBase64Len+1);
+	binToBase64((const unsigned char*)strSource.GetString(), strSource.GetLength(), pBase64);
+
+	strBase64 = pBase64;
+	if (pBase64) delete []pBase64;
+
+	return strBase64;
+}
+
+CStringW CBase64::StringToBase64W(IN CStringW strSource)
+{
+	CStringW strBase64 = L"";
+	// 获取多字节字符字节数;
+	int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, strSource, -1, NULL, 0, NULL, NULL);
+	if ( cbMultiByte == 0 )
+		return L"";
+
+	// 转换成多字节字符;
+	CHAR *pMultiByteStr = new CHAR[cbMultiByte+1];
+	memset(pMultiByteStr, 0, cbMultiByte + 1);
+	int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, strSource, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
+	if (nWriteNum != cbMultiByte)
+	{
+		if (pMultiByteStr) 
+			delete []pMultiByteStr;
+		return L"";
+	}
+
+	// 计算出Base64字符长度;
+	INT nBase64Len = CalcBase64Len(cbMultiByte);
+	CHAR *pBase64 = new CHAR[nBase64Len+1];
+	memset(pBase64, 0, nBase64Len+1);
+	binToBase64((const unsigned char*)pMultiByteStr, cbMultiByte, pBase64);
+
+	strBase64 = pBase64;
+	if (pBase64) delete []pBase64;
+	if (pMultiByteStr) delete []pMultiByteStr;
+
+	return strBase64;
+}
+
+/************************************************************************/
+/*  函数:[1/14/2017 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+CStringA CBase64::Base64ToStringA(IN CStringA strBase64)
+{
+	CStringA strResult = "";
+	// 计算出结果长度;
+	INT nStrlen = CalcBinLen(strBase64.GetLength());
+	BYTE *pString = new BYTE[nStrlen+1];
+	memset(pString, 0, nStrlen+1);
+	base64ToBin(strBase64, pString, nStrlen);
+
+	strResult = (char*)pString;
+	if ( pString) delete []pString;
+
+	return strResult;
+}
+
+CStringW CBase64::Base64ToStringW(IN CStringW strBase64)
+{
+	CStringW strResult = L"";
+	// 获取多字节字符字节数;
+	int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, strBase64, -1, NULL, 0, NULL, NULL);
+	if ( cbMultiByte == 0 )
+		return L"";
+
+	// 转换成多字节字符;
+	CHAR *pMultiByteStr = new CHAR[cbMultiByte+1];
+	memset(pMultiByteStr, 0, cbMultiByte + 1);
+	int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, strBase64, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
+	if (nWriteNum != cbMultiByte)
+	{
+		if (pMultiByteStr) 
+			delete []pMultiByteStr;
+		return L"";
+	}
+
+	// 计算出Bin字符长度;
+	INT nStrlen = CalcBinLen(cbMultiByte);
+	CHAR *pString = new CHAR[nStrlen+1];
+	memset(pString, 0, nStrlen+1);
+	base64ToBin(pMultiByteStr, (unsigned char*)pString, nStrlen );
+
+	// 获取宽字符字节数;
+	int cchWideChar  = MultiByteToWideChar(CP_ACP, 0, pString, -1, NULL, 0);
+	if ( cchWideChar == 0 )
+		return L"";
+
+	// 转换成宽字符串;
+	WCHAR *pResult = new WCHAR[cchWideChar];
+	memset(pResult, 0 , sizeof(WCHAR)*cchWideChar);
+	nWriteNum = MultiByteToWideChar(CP_ACP, 0, pString, -1, pResult, cchWideChar );
+	if ( nWriteNum != cchWideChar)
+		return L"";
+
+	strResult = pResult;
+	if ( pResult ) delete[] pResult;
+	if (pString) delete []pString;
+	if (pMultiByteStr) delete []pMultiByteStr;
+
+	return strResult;
+}
+#endif

+ 79 - 0
Source/OGCAssistTool/OGCAssistTool/Base64.h

@@ -0,0 +1,79 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[5/24/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __BASE64_CODE__
+#define __BASE64_CODE__
+
+#pragma once
+
+class CBase64
+{
+public:
+	CBase64(void);
+	~CBase64(void);
+
+	/************************************************************************/
+	/*  函数:[5/24/2016 IT];
+	/*  描述:获取指定字符串长度对应的Base64字符长度;
+	/*  参数:;
+	/*  	[IN] len:要计算的字符长度;
+	/*  返回:返回指定长度len的字符串转换为编码Base64对应的长度,并多加一个'\0'结束符;
+	/*  注意:;
+	/************************************************************************/
+	static int CalcBase64Len(IN const size_t& len) {
+		return (len / 3 + (len % 3 ? 1 : 0)) * 4 + 1; // one more byte for '\0'
+	}
+
+	static void binToBase64(IN const unsigned char *pbinary, IN size_t nbinaryLen, OUT char *pOutBase64);
+
+	/************************************************************************/
+	/*  函数:[5/24/2016 IT];
+	/*  描述:获取指定Base64字符串长度对应的字节长度;
+	/*  参数:;
+	/*  	[IN] len:要计算的Base64字符长度;
+	/*  返回:返回指定长度len的Base64字符串转换为字节对应的长度;
+	/*  注意:;
+	/************************************************************************/
+	static int CalcBinLen(size_t len) {
+		return len / 4 * 3; 
+	}
+
+	static int base64ToBin(IN const char *pBase64, OUT unsigned char *pbinary, IN size_t maxLen);
+
+private:
+	static char decode64(unsigned char ch) {
+		return ch < 128 ? sm_base64val[ch] : BAD;
+	}
+
+private:
+	enum {BAD = -1};
+	// 必须是ASCII字符;
+	static const char sm_base64digits[65];
+	// 必须是ASCII字符;
+	static const char sm_base64val[128];
+
+	// mfc版本;
+public:
+#ifndef VC60
+	static CStringA StringToBase64A(IN CStringA strSource);
+	static CStringW StringToBase64W(IN CStringW strSource);
+	static CStringA Base64ToStringA(IN CStringA strBase64);
+	static CStringW Base64ToStringW(IN CStringW strBase64);
+#endif
+};
+
+#endif // __BASE64_CODE__

+ 14 - 5
Source/OGCAssistTool/OGCAssistTool/DlgLogin.cpp

@@ -13,7 +13,7 @@ IMPLEMENT_DYNAMIC(CDlgLogin, CDialogEx)
 CDlgLogin::CDlgLogin(CWnd* pParent /*=NULL*/)
 	: CDialogEx(CDlgLogin::IDD, pParent)
 {
-
+	m_bConfigLogin=FALSE;
 }
 
 CDlgLogin::~CDlgLogin()
@@ -68,6 +68,12 @@ BOOL CDlgLogin::OnInitDialog()
 
 	((CButton*)GetDlgItem(CHECK_OFFLINE))->SetCheck(GLOBAL::g_config.nOffline);
 
+	if (m_bConfigLogin)
+	{
+		GetDlgItem(CHECK_OFFLINE)->EnableWindow(FALSE);
+		GetDlgItem(EDIT_LINE)->EnableWindow(FALSE);
+	}
+
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
 }
@@ -113,7 +119,7 @@ void CDlgLogin::OnBnClickedOk()
 	GetDlgItemText(EDIT_ACCOUNT, strAccount);
 	GetDlgItemText(EDIT_PASSWORD, strPassword);
 
-#ifdef _DEBUG //offline
+#ifndef _DEBUG //offline
 	GLOBAL::g_config.nOffline = ((CButton*)GetDlgItem(CHECK_OFFLINE))->GetCheck();
 	_stprintf_s(GLOBAL::g_config.szLine, _T("%s"), strLine.GetString());
 	WritePrivateProfileString(_T("LOGIN"), _T("line"), GLOBAL::g_config.szLine, GLOBAL::g_szConfigFile);
@@ -155,7 +161,7 @@ void CDlgLogin::OnBnClickedOk()
 		}
 
 		CString strDynamicPassword;
-		strDynamicPassword.Format(_T("OGC%s"), CTime::GetCurrentTime().Format(_T("%y%m%d")));
+		strDynamicPassword.Format(_T("OGC%s"), CTime::GetCurrentTime().Format(_T("%Y%m%d%w%p")));
 		if ( strPassword != strDynamicPassword )
 		{
 			MessageBox(_T("密码错误"), _T("提示"), MB_OK);
@@ -164,14 +170,17 @@ void CDlgLogin::OnBnClickedOk()
 	}
 	else
 	{
-		CMD5 md5((BYTE*)strPassword.GetString(), strPassword.GetLength()*sizeof(TCHAR));
+		std::string user;
+		CharEncoding::UNICODE2ASCII(GLOBAL::g_config.szAccount, user);
+		set_enc((const unsigned char *)user.c_str(), user.size());
+		des_crypt(strPassword, strPassword,DES_ENCRYPT);
 		if ( _tcscmp(GLOBAL::g_config.szAccount, strAccount.GetString()) != 0 )
 		{
 			MessageBox(_T("账号错误"), _T("提示"), MB_OK);
 			return;
 		}
 
-		if ( _tcscmp(GLOBAL::g_config.szPassword, md5.GetMD5Digest()) != 0 )
+		if ( _tcscmp(GLOBAL::g_config.szPassword, strPassword.GetString()) != 0 )
 		{
 			MessageBox(_T("账号错误"), _T("提示"), MB_OK);
 			return;

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/DlgLogin.h

@@ -15,11 +15,13 @@ public:
 	enum { IDD = DLG_LOGIN };
 
 protected:
+	BOOL m_bConfigLogin;
 	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV Ö§³Ö
 
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	void SetConfigLogin() { m_bConfigLogin = TRUE; };
 	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
 	afx_msg void OnBnClickedOk();
 	afx_msg void OnBnClickedCancel();

+ 7 - 2
Source/OGCAssistTool/OGCAssistTool/OGCAssistTool.rc

@@ -184,6 +184,11 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
 EXSTYLE WS_EX_STATICEDGE
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
+    LTEXT           "되쩌瑯뵀錦맣:",IDC_STATIC,261,146,57,8
+    EDITTEXT        EDIT_ACCOUNT,324,144,146,14,ES_AUTOHSCROLL
+    LTEXT           "되쩌쵱쯤錦맣:",IDC_STATIC,261,165,57,8
+    EDITTEXT        EDIT_PSW,324,163,146,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "괏닸",BTN_SAVE_CONFIG,662,290,50,14
 END
 
 
@@ -285,9 +290,9 @@ BEGIN
     PAGE_CONFIG, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 493
+        RIGHTMARGIN, 722
         TOPMARGIN, 7
-        BOTTOMMARGIN, 236
+        BOTTOMMARGIN, 312
     END
 END
 #endif    // APSTUDIO_INVOKED

+ 16 - 0
Source/OGCAssistTool/OGCAssistTool/OGCAssistTool.vcproj

@@ -323,6 +323,14 @@
 		<Filter
 			Name="Core"
 			>
+			<File
+				RelativePath=".\Base64.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Base64.h"
+				>
+			</File>
 			<File
 				RelativePath=".\CharConvert.cpp"
 				>
@@ -359,6 +367,14 @@
 				RelativePath=".\DataImpl.h"
 				>
 			</File>
+			<File
+				RelativePath=".\des.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\des.h"
+				>
+			</File>
 			<File
 				RelativePath=".\Global.cpp"
 				>

+ 16 - 0
Source/OGCAssistTool/OGCAssistTool/OGCAssistToolDlg.cpp

@@ -10,6 +10,7 @@
 #include "PageConfig.h"
 #include "PageStatistics.h"
 #include "Injection.h"
+#include "DlgLogin.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -338,10 +339,25 @@ void COGCAssistToolDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult)
 	m_pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);
 	//得到新的页面
 	m_CurSelTab = m_tabCtrl.GetCurSel();
+
+	if ( m_CurSelTab == 3 )
+	{
+#pragma region 登录对话框;
+		CDlgLogin LoginDlg;
+		LoginDlg.SetConfigLogin();
+		if ( LoginDlg.DoModal() != IDOK )
+		{
+			return;
+		}
+#pragma endregion
+	}
+
 	//把新的页面显示出来
 	m_pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);
 	m_pDialog[m_CurSelTab]->UpdateData(TRUE);
 
+
+
 	*pResult = 0;
 }
 

+ 29 - 1
Source/OGCAssistTool/OGCAssistTool/PageConfig.cpp

@@ -27,6 +27,7 @@ void CPageConfig::DoDataExchange(CDataExchange* pDX)
 
 
 BEGIN_MESSAGE_MAP(CPageConfig, CDialogEx)
+	ON_BN_CLICKED(BTN_SAVE_CONFIG, &CPageConfig::OnBnClickedSaveConfig)
 END_MESSAGE_MAP()
 
 
@@ -37,7 +38,34 @@ BOOL CPageConfig::OnInitDialog()
 	CDialogEx::OnInitDialog();
 
 	// TODO:  在此添加额外的初始化
-	SetBackgroundColor(RGB(255,255,255));
+	SetBackgroundColor(RGB(200,200,200));
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
 }
+
+void CPageConfig::OnBnClickedSaveConfig()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	CString strAccount;
+	CString strPassword;
+	GetDlgItemText(EDIT_ACCOUNT, strAccount);
+	GetDlgItemText(EDIT_PSW, strPassword);
+
+	if ( strAccount.IsEmpty() || strPassword.IsEmpty() )
+	{
+		MessageBox(_T("账号和密码不能为空!"), _T("提示!"), MB_ICONWARNING);
+		return;
+	}
+
+	_stprintf_s(GLOBAL::g_config.szAccount, _T("%s"), strAccount.GetString());
+
+	std::string user;
+	CharEncoding::UNICODE2ASCII(GLOBAL::g_config.szAccount, user);
+	set_enc((const unsigned char *)user.c_str(), user.size());
+	des_crypt(strPassword, strPassword,DES_ENCRYPT);
+	_stprintf_s(GLOBAL::g_config.szPassword, _T("%s"), strPassword.GetString());
+	WritePrivateProfileString(_T("LOGIN"), _T("account"), GLOBAL::g_config.szAccount, GLOBAL::g_szConfigFile);
+	WritePrivateProfileString(_T("LOGIN"), _T("password"), GLOBAL::g_config.szPassword, GLOBAL::g_szConfigFile);
+
+	MessageBox(_T("修改成功!"), _T("提示!"), MB_OK);
+}

+ 1 - 0
Source/OGCAssistTool/OGCAssistTool/PageConfig.h

@@ -20,4 +20,5 @@ protected:
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	afx_msg void OnBnClickedSaveConfig();
 };

+ 930 - 0
Source/OGCAssistTool/OGCAssistTool/des.cpp

@@ -0,0 +1,930 @@
+#include "stdafx.h"
+#include "des.h"
+#include <string.h>
+#include "Base64.h"
+#include "CharEncoding.h"
+
+static unsigned char deskey[9] = "moka/psw";
+//static const unsigned char desiv[9] = "WorkbyIT";
+
+// 32-bit integer manipulation macros (big endian)
+#ifndef GET_ULONG_BE
+#define GET_ULONG_BE(n,b,i)                             \
+{                                                       \
+	(n) = ( (unsigned long) (b)[(i)] << 24 )        \
+	| ( (unsigned long) (b)[(i) + 1] << 16 )        \
+	| ( (unsigned long) (b)[(i) + 2] <<  8 )        \
+	| ( (unsigned long) (b)[(i) + 3]       );       \
+}
+#endif
+
+#ifndef PUT_ULONG_BE
+#define PUT_ULONG_BE(n,b,i)                             \
+{                                                       \
+	(b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
+	(b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
+	(b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
+	(b)[(i) + 3] = (unsigned char) ( (n)       );       \
+}
+#endif
+
+//Expanded DES S-boxes
+static const unsigned long SB1[64] =
+{
+	0x01010400, 0x00000000, 0x00010000, 0x01010404,
+	0x01010004, 0x00010404, 0x00000004, 0x00010000,
+	0x00000400, 0x01010400, 0x01010404, 0x00000400,
+	0x01000404, 0x01010004, 0x01000000, 0x00000004,
+	0x00000404, 0x01000400, 0x01000400, 0x00010400,
+	0x00010400, 0x01010000, 0x01010000, 0x01000404,
+	0x00010004, 0x01000004, 0x01000004, 0x00010004,
+	0x00000000, 0x00000404, 0x00010404, 0x01000000,
+	0x00010000, 0x01010404, 0x00000004, 0x01010000,
+	0x01010400, 0x01000000, 0x01000000, 0x00000400,
+	0x01010004, 0x00010000, 0x00010400, 0x01000004,
+	0x00000400, 0x00000004, 0x01000404, 0x00010404,
+	0x01010404, 0x00010004, 0x01010000, 0x01000404,
+	0x01000004, 0x00000404, 0x00010404, 0x01010400,
+	0x00000404, 0x01000400, 0x01000400, 0x00000000,
+	0x00010004, 0x00010400, 0x00000000, 0x01010004
+};
+
+static const unsigned long SB2[64] =
+{
+	0x80108020, 0x80008000, 0x00008000, 0x00108020,
+	0x00100000, 0x00000020, 0x80100020, 0x80008020,
+	0x80000020, 0x80108020, 0x80108000, 0x80000000,
+	0x80008000, 0x00100000, 0x00000020, 0x80100020,
+	0x00108000, 0x00100020, 0x80008020, 0x00000000,
+	0x80000000, 0x00008000, 0x00108020, 0x80100000,
+	0x00100020, 0x80000020, 0x00000000, 0x00108000,
+	0x00008020, 0x80108000, 0x80100000, 0x00008020,
+	0x00000000, 0x00108020, 0x80100020, 0x00100000,
+	0x80008020, 0x80100000, 0x80108000, 0x00008000,
+	0x80100000, 0x80008000, 0x00000020, 0x80108020,
+	0x00108020, 0x00000020, 0x00008000, 0x80000000,
+	0x00008020, 0x80108000, 0x00100000, 0x80000020,
+	0x00100020, 0x80008020, 0x80000020, 0x00100020,
+	0x00108000, 0x00000000, 0x80008000, 0x00008020,
+	0x80000000, 0x80100020, 0x80108020, 0x00108000
+};
+
+static const unsigned long SB3[64] =
+{
+	0x00000208, 0x08020200, 0x00000000, 0x08020008,
+	0x08000200, 0x00000000, 0x00020208, 0x08000200,
+	0x00020008, 0x08000008, 0x08000008, 0x00020000,
+	0x08020208, 0x00020008, 0x08020000, 0x00000208,
+	0x08000000, 0x00000008, 0x08020200, 0x00000200,
+	0x00020200, 0x08020000, 0x08020008, 0x00020208,
+	0x08000208, 0x00020200, 0x00020000, 0x08000208,
+	0x00000008, 0x08020208, 0x00000200, 0x08000000,
+	0x08020200, 0x08000000, 0x00020008, 0x00000208,
+	0x00020000, 0x08020200, 0x08000200, 0x00000000,
+	0x00000200, 0x00020008, 0x08020208, 0x08000200,
+	0x08000008, 0x00000200, 0x00000000, 0x08020008,
+	0x08000208, 0x00020000, 0x08000000, 0x08020208,
+	0x00000008, 0x00020208, 0x00020200, 0x08000008,
+	0x08020000, 0x08000208, 0x00000208, 0x08020000,
+	0x00020208, 0x00000008, 0x08020008, 0x00020200
+};
+
+static const unsigned long SB4[64] =
+{
+	0x00802001, 0x00002081, 0x00002081, 0x00000080,
+	0x00802080, 0x00800081, 0x00800001, 0x00002001,
+	0x00000000, 0x00802000, 0x00802000, 0x00802081,
+	0x00000081, 0x00000000, 0x00800080, 0x00800001,
+	0x00000001, 0x00002000, 0x00800000, 0x00802001,
+	0x00000080, 0x00800000, 0x00002001, 0x00002080,
+	0x00800081, 0x00000001, 0x00002080, 0x00800080,
+	0x00002000, 0x00802080, 0x00802081, 0x00000081,
+	0x00800080, 0x00800001, 0x00802000, 0x00802081,
+	0x00000081, 0x00000000, 0x00000000, 0x00802000,
+	0x00002080, 0x00800080, 0x00800081, 0x00000001,
+	0x00802001, 0x00002081, 0x00002081, 0x00000080,
+	0x00802081, 0x00000081, 0x00000001, 0x00002000,
+	0x00800001, 0x00002001, 0x00802080, 0x00800081,
+	0x00002001, 0x00002080, 0x00800000, 0x00802001,
+	0x00000080, 0x00800000, 0x00002000, 0x00802080
+};
+
+static const unsigned long SB5[64] =
+{
+	0x00000100, 0x02080100, 0x02080000, 0x42000100,
+	0x00080000, 0x00000100, 0x40000000, 0x02080000,
+	0x40080100, 0x00080000, 0x02000100, 0x40080100,
+	0x42000100, 0x42080000, 0x00080100, 0x40000000,
+	0x02000000, 0x40080000, 0x40080000, 0x00000000,
+	0x40000100, 0x42080100, 0x42080100, 0x02000100,
+	0x42080000, 0x40000100, 0x00000000, 0x42000000,
+	0x02080100, 0x02000000, 0x42000000, 0x00080100,
+	0x00080000, 0x42000100, 0x00000100, 0x02000000,
+	0x40000000, 0x02080000, 0x42000100, 0x40080100,
+	0x02000100, 0x40000000, 0x42080000, 0x02080100,
+	0x40080100, 0x00000100, 0x02000000, 0x42080000,
+	0x42080100, 0x00080100, 0x42000000, 0x42080100,
+	0x02080000, 0x00000000, 0x40080000, 0x42000000,
+	0x00080100, 0x02000100, 0x40000100, 0x00080000,
+	0x00000000, 0x40080000, 0x02080100, 0x40000100
+};
+
+static const unsigned long SB6[64] =
+{
+	0x20000010, 0x20400000, 0x00004000, 0x20404010,
+	0x20400000, 0x00000010, 0x20404010, 0x00400000,
+	0x20004000, 0x00404010, 0x00400000, 0x20000010,
+	0x00400010, 0x20004000, 0x20000000, 0x00004010,
+	0x00000000, 0x00400010, 0x20004010, 0x00004000,
+	0x00404000, 0x20004010, 0x00000010, 0x20400010,
+	0x20400010, 0x00000000, 0x00404010, 0x20404000,
+	0x00004010, 0x00404000, 0x20404000, 0x20000000,
+	0x20004000, 0x00000010, 0x20400010, 0x00404000,
+	0x20404010, 0x00400000, 0x00004010, 0x20000010,
+	0x00400000, 0x20004000, 0x20000000, 0x00004010,
+	0x20000010, 0x20404010, 0x00404000, 0x20400000,
+	0x00404010, 0x20404000, 0x00000000, 0x20400010,
+	0x00000010, 0x00004000, 0x20400000, 0x00404010,
+	0x00004000, 0x00400010, 0x20004010, 0x00000000,
+	0x20404000, 0x20000000, 0x00400010, 0x20004010
+};
+
+static const unsigned long SB7[64] =
+{
+	0x00200000, 0x04200002, 0x04000802, 0x00000000,
+	0x00000800, 0x04000802, 0x00200802, 0x04200800,
+	0x04200802, 0x00200000, 0x00000000, 0x04000002,
+	0x00000002, 0x04000000, 0x04200002, 0x00000802,
+	0x04000800, 0x00200802, 0x00200002, 0x04000800,
+	0x04000002, 0x04200000, 0x04200800, 0x00200002,
+	0x04200000, 0x00000800, 0x00000802, 0x04200802,
+	0x00200800, 0x00000002, 0x04000000, 0x00200800,
+	0x04000000, 0x00200800, 0x00200000, 0x04000802,
+	0x04000802, 0x04200002, 0x04200002, 0x00000002,
+	0x00200002, 0x04000000, 0x04000800, 0x00200000,
+	0x04200800, 0x00000802, 0x00200802, 0x04200800,
+	0x00000802, 0x04000002, 0x04200802, 0x04200000,
+	0x00200800, 0x00000000, 0x00000002, 0x04200802,
+	0x00000000, 0x00200802, 0x04200000, 0x00000800,
+	0x04000002, 0x04000800, 0x00000800, 0x00200002
+};
+
+static const unsigned long SB8[64] =
+{
+	0x10001040, 0x00001000, 0x00040000, 0x10041040,
+	0x10000000, 0x10001040, 0x00000040, 0x10000000,
+	0x00040040, 0x10040000, 0x10041040, 0x00041000,
+	0x10041000, 0x00041040, 0x00001000, 0x00000040,
+	0x10040000, 0x10000040, 0x10001000, 0x00001040,
+	0x00041000, 0x00040040, 0x10040040, 0x10041000,
+	0x00001040, 0x00000000, 0x00000000, 0x10040040,
+	0x10000040, 0x10001000, 0x00041040, 0x00040000,
+	0x00041040, 0x00040000, 0x10041000, 0x00001000,
+	0x00000040, 0x10040040, 0x00001000, 0x00041040,
+	0x10001000, 0x00000040, 0x10000040, 0x10040000,
+	0x10040040, 0x10000000, 0x00040000, 0x10001040,
+	0x00000000, 0x10041040, 0x00040040, 0x10000040,
+	0x10040000, 0x10001000, 0x10001040, 0x00000000,
+	0x10041040, 0x00041000, 0x00041000, 0x00001040,
+	0x00001040, 0x00040040, 0x10000000, 0x10041000
+};
+
+//PC1: left and right halves bit-swap
+static const unsigned long LHs[16] =
+{
+	0x00000000, 0x00000001, 0x00000100, 0x00000101,
+	0x00010000, 0x00010001, 0x00010100, 0x00010101,
+	0x01000000, 0x01000001, 0x01000100, 0x01000101,
+	0x01010000, 0x01010001, 0x01010100, 0x01010101
+};
+
+static const unsigned long RHs[16] =
+{
+	0x00000000, 0x01000000, 0x00010000, 0x01010000,
+	0x00000100, 0x01000100, 0x00010100, 0x01010100,
+	0x00000001, 0x01000001, 0x00010001, 0x01010001,
+	0x00000101, 0x01000101, 0x00010101, 0x01010101,
+};
+
+static const unsigned char odd_parity_table[128] = { 1,  2,  4,  7,  8,
+11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
+47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
+82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
+115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
+143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
+171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
+199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
+227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
+254 
+};
+
+#define WEAK_KEY_COUNT 16
+
+static const unsigned char weak_key_table[WEAK_KEY_COUNT][DES_KEY_SIZE] =
+{
+	{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+	{ 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
+	{ 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
+	{ 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
+
+	{ 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
+	{ 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
+	{ 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
+	{ 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
+	{ 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
+	{ 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
+	{ 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
+	{ 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
+	{ 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
+	{ 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
+	{ 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
+	{ 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
+};
+
+// Initial Permutation macro
+#define DES_IP(X,Y)                                             \
+{                                                               \
+	T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \
+	T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \
+	T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \
+	T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \
+	Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF;                    \
+	T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T;                   \
+	X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF;                    \
+}
+
+// Final Permutation macro
+#define DES_FP(X,Y)                                             \
+{                                                               \
+	X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF;                    \
+	T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T;                   \
+	Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF;                    \
+	T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \
+	T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \
+	T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \
+	T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \
+}
+
+// DES round macro
+#define DES_ROUND(X,Y)                          \
+{                                               \
+	T = *SK++ ^ X;                              \
+	Y ^= SB8[ (T) & 0x3F ] ^              		\
+	SB6[ (T >>  8) & 0x3F ] ^              \
+	SB4[ (T >> 16) & 0x3F ] ^              \
+	SB2[ (T >> 24) & 0x3F ];               \
+	\
+	T = *SK++ ^ ((X << 28) | (X >> 4));         \
+	Y ^= SB7[ (T) & 0x3F ] ^              		\
+	SB5[ (T >>  8) & 0x3F ] ^              \
+	SB3[ (T >> 16) & 0x3F ] ^              \
+	SB1[ (T >> 24) & 0x3F ];               \
+}
+
+#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; }
+
+void set_enc(const unsigned char *enc, const int &nlen)
+{
+	memset((void*)deskey, 0, 9);
+	memcpy_s((void*)deskey, nlen > 8 ? 8 : nlen, enc, nlen > 8 ? 8 : nlen);
+}
+
+void des_key_set_parity( unsigned char key[DES_KEY_SIZE] )
+{
+	for(int i = 0; i < DES_KEY_SIZE; i++ )
+		key[i] = odd_parity_table[key[i] / 2];
+}
+
+int des_key_check_key_parity( const unsigned char key[DES_KEY_SIZE] )
+{
+	for(int i = 0; i < DES_KEY_SIZE; i++ )
+		if( key[i] != odd_parity_table[key[i] / 2] )
+			return( 1 );
+
+	return( 0 );
+}
+
+int des_key_check_weak( const unsigned char key[DES_KEY_SIZE] )
+{
+	for(int i = 0; i < WEAK_KEY_COUNT; i++ )
+		if( memcmp( weak_key_table[i], key, DES_KEY_SIZE) == 0 )
+			return( 1 );
+
+	return( 0 );
+}
+
+unsigned __int64 des_enc_len(const unsigned __int64& nlen)
+{
+	unsigned __int64 npaddinglen = nlen;
+	int npad = nlen&7;//nFileLen & 7 <=> nFileLen%8
+	if ( npad != 0 )
+	{
+		npaddinglen += 8 - npad;
+	}
+	return npaddinglen;
+}
+
+unsigned __int64 des_dec_len(const unsigned char* input, unsigned __int64 nlen)
+{
+	while( input[--nlen] == 0x00 );
+	return ++nlen;
+}
+
+/************************************************************************/
+/*  函数:des_setkey[6/5/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+static void des_setkey( unsigned long SK[32], const unsigned char key[8] )
+{
+	int i;
+	unsigned long X, Y, T;
+
+	GET_ULONG_BE( X, key, 0 );
+	GET_ULONG_BE( Y, key, 4 );
+
+	// Permuted Choice 1
+	T =  ((Y >>  4) ^ X) & 0x0F0F0F0F;  X ^= T; Y ^= (T <<  4);
+	T =  ((Y      ) ^ X) & 0x10101010;  X ^= T; Y ^= (T      );
+
+	X =   (LHs[ (X      ) & 0xF] << 3) | (LHs[ (X >>  8) & 0xF ] << 2)
+		| (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ]     )
+		| (LHs[ (X >>  5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
+		| (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
+
+	Y =   (RHs[ (Y >>  1) & 0xF] << 3) | (RHs[ (Y >>  9) & 0xF ] << 2)
+		| (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ]     )
+		| (RHs[ (Y >>  4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
+		| (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
+
+	X &= 0x0FFFFFFF;
+	Y &= 0x0FFFFFFF;
+
+	// calculate subkeys
+	for( i = 0; i < 16; i++ )
+	{
+		if( i < 2 || i == 8 || i == 15 )
+		{
+			X = ((X <<  1) | (X >> 27)) & 0x0FFFFFFF;
+			Y = ((Y <<  1) | (Y >> 27)) & 0x0FFFFFFF;
+		}
+		else
+		{
+			X = ((X <<  2) | (X >> 26)) & 0x0FFFFFFF;
+			Y = ((Y <<  2) | (Y >> 26)) & 0x0FFFFFFF;
+		}
+
+		*SK++ =   ((X <<  4) & 0x24000000) | ((X << 28) & 0x10000000)
+			| ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
+			| ((X <<  6) & 0x01000000) | ((X <<  9) & 0x00200000)
+			| ((X >>  1) & 0x00100000) | ((X << 10) & 0x00040000)
+			| ((X <<  2) & 0x00020000) | ((X >> 10) & 0x00010000)
+			| ((Y >> 13) & 0x00002000) | ((Y >>  4) & 0x00001000)
+			| ((Y <<  6) & 0x00000800) | ((Y >>  1) & 0x00000400)
+			| ((Y >> 14) & 0x00000200) | ((Y      ) & 0x00000100)
+			| ((Y >>  5) & 0x00000020) | ((Y >> 10) & 0x00000010)
+			| ((Y >>  3) & 0x00000008) | ((Y >> 18) & 0x00000004)
+			| ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
+
+		*SK++ =   ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
+			| ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
+			| ((X >>  2) & 0x02000000) | ((X <<  1) & 0x01000000)
+			| ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
+			| ((X <<  3) & 0x00080000) | ((X >>  6) & 0x00040000)
+			| ((X << 15) & 0x00020000) | ((X >>  4) & 0x00010000)
+			| ((Y >>  2) & 0x00002000) | ((Y <<  8) & 0x00001000)
+			| ((Y >> 14) & 0x00000808) | ((Y >>  9) & 0x00000400)
+			| ((Y      ) & 0x00000200) | ((Y <<  7) & 0x00000100)
+			| ((Y >>  7) & 0x00000020) | ((Y >>  3) & 0x00000011)
+			| ((Y <<  2) & 0x00000004) | ((Y >> 21) & 0x00000002);
+	}
+}
+
+/************************************************************************/
+/*  函数:des_setkey_enc[6/5/2016 IT];
+/*  描述:设置DES加密密钥(56bit,加密);
+/*  参数:;
+/*  	[IN] ctx:要被初始化的DES结构体;
+/*  	[IN] key:8字节长度的加解密密钥;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void des_setkey_enc( IN des_context *ctx, IN const unsigned char key[8] )
+{
+	des_setkey( ctx->sk, key );
+}
+
+/************************************************************************/
+/*  函数:des_setkey_dec[6/5/2016 IT];
+/*  描述:设置DES解密密钥(56bit,解密);;
+/*  参数:;
+/*  	[IN] ctx:要被初始化的DES结构体;
+/*  	[IN] key:8字节长度的加解密密钥;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void des_setkey_dec( IN des_context *ctx, IN const unsigned char key[8] )
+{
+	int i;
+
+	des_setkey( ctx->sk, key );
+
+	for( i = 0; i < 16; i += 2 )
+	{
+		SWAP( ctx->sk[i], ctx->sk[30 - i] );
+		SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
+	}
+}
+
+/************************************************************************/
+/*  函数:[6/5/2016 IT];
+/*  描述:DES-ECB模式下加解密;
+/*  参数:;
+/*  	[IN] ctx:已经初始化过的DES结构体;
+/*  	[IN] input:64bit的输入缓存块;
+/*  	[OUT] output:64bit的输出缓存块;
+/*  返回:成功返回0;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+int des_crypt_ecb( IN des_context *ctx, IN const unsigned char input[8], OUT unsigned char output[8] )
+{
+	int i;
+	unsigned long X, Y, T, *SK;
+
+	SK = ctx->sk;
+
+	GET_ULONG_BE( X, input, 0 );
+	GET_ULONG_BE( Y, input, 4 );
+
+	DES_IP( X, Y );
+
+	for( i = 0; i < 8; i++ )
+	{
+		DES_ROUND( Y, X );
+		DES_ROUND( X, Y );
+	}
+
+	DES_FP( Y, X );
+
+	PUT_ULONG_BE( Y, output, 0 );
+	PUT_ULONG_BE( X, output, 4 );
+
+	return( 0 );
+}
+
+
+/************************************************************************/
+/*  函数:des_crypt_cbc[6/5/2016 IT];
+/*  描述:DES-CBC模式加解密;
+/*  参数:;
+/*  	[IN] ctx:已经初始化过的DES结构体;
+/*  	[IN] mode:加密或解密模式;
+/*  	[IN] length:input长度;
+/*  	[IN] iv:初始向量(使用后更新);
+/*  	[IN] input:要加密或解密的数据;
+/*  	[OUT] output:加密或解密的数据;
+/*  返回:成功返回0;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+int des_crypt_cbc( IN des_context *ctx, IN int mode, IN int length, IN unsigned char iv[8], IN const unsigned char *input, OUT unsigned char *output )
+{
+	int i;
+	unsigned char temp[8];
+
+	if( length % 8 )
+		return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH );
+
+	if( mode == DES_ENCRYPT )
+	{
+		while( length > 0 )
+		{
+			for( i = 0; i < 8; i++ )
+				output[i] = (unsigned char)( input[i] ^ iv[i] );
+
+			des_crypt_ecb( ctx, output, output );
+			memcpy( iv, output, 8 );
+
+			input  += 8;
+			output += 8;
+			length -= 8;
+		}
+	}
+	else /* DES_DECRYPT */
+	{
+		while( length > 0 )
+		{
+			memcpy( temp, input, 8 );
+			des_crypt_ecb( ctx, input, output );
+
+			for( i = 0; i < 8; i++ )
+				output[i] = (unsigned char)( output[i] ^ iv[i] );
+
+			memcpy( iv, temp, 8 );
+
+			input  += 8;
+			output += 8;
+			length -= 8;
+		}
+	}
+
+	return( 0 );
+}
+
+/************************************************************************/
+/*  函数:des_crypt_cbc[6/5/2016 IT];
+/*  描述:DES-CBC模式加解密;
+/*  参数:;
+/*  	[IN] ctx:已经初始化过的DES结构体;
+/*  	[IN] mode:加密或解密模式;
+/*  	[IN] length:input长度;
+/*  	[IN] iv:初始向量(使用后更新);
+/*  	[IN] input:要加密或解密的数据;
+/*  	[OUT] output:加密或解密的数据;
+/*  返回:成功返回0;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+int des_crypt_cbc(IN int mode, IN int length, IN const unsigned char *input, OUT unsigned char *output, IN const int& outMaxlen )
+{
+	if ( length == 0 )
+		return -1;
+
+	int i;
+	des_context ctx;
+	if ( mode == DES_ENCRYPT )
+		des_setkey_enc(&ctx, deskey);
+	else
+		des_setkey_dec(&ctx, deskey);
+
+	int nInputlen = length;
+	unsigned char *result = output;
+	unsigned char iv[9] = "JeffWang";	// 此值固定;
+	unsigned char temp[8];
+
+	int npadlen = length & 7;
+	if( npadlen != 0 )
+	{
+		length += 8 - npadlen;
+		nInputlen = length;
+	}
+
+	if( mode == DES_ENCRYPT )
+	{
+		while( length > 0 )
+		{
+			for( i = 0; i < 8; i++ )
+			{
+				if ( length == 8 && npadlen != 0)
+				{
+					if ( i >= npadlen )
+						output[i] = (unsigned char)( 0x00 ^ iv[i] );
+					else
+						output[i] = (unsigned char)( input[i] ^ iv[i] );
+				}
+				else
+					output[i] = (unsigned char)( input[i] ^ iv[i] );
+			}
+
+			des_crypt_ecb( &ctx, output, output );
+			memcpy( iv, output, 8 );
+
+			input  += 8;
+			output += 8;
+			length -= 8;
+		}
+
+		// 将加密结果转换成base64;
+		// 1.计算出Base64的长度,CalcBase64Len的参数必须是字节长度,而非字符数;
+		INT nBaseLen = CBase64::CalcBase64Len(nInputlen);
+		if ( nBaseLen > outMaxlen )
+			return -1;
+
+		// 2.创建Base64缓存;
+		CHAR *pBase64 = new CHAR[nBaseLen + 1];
+		memset(pBase64, 0, nBaseLen + 1);
+
+		// 3.转化出Base64字符;
+		CBase64::binToBase64(result, nInputlen, pBase64);
+		memset(result, 0, outMaxlen);
+		memcpy(result, pBase64, nBaseLen);
+
+		if ( pBase64 )
+			delete []pBase64;
+	}
+	else /* DES_DECRYPT */
+	{
+		// 将base64转换成密文状态;
+		// 1.计算出字节长度;
+		INT nByteLen = CBase64::CalcBinLen(length);
+
+		// 2.创建Byte缓存区;
+		BYTE *pBytes = new BYTE[nByteLen];
+		memset(pBytes, 0, nByteLen);
+
+		// 3.转化成字节;
+		length = CBase64::base64ToBin((char*)input, pBytes, nByteLen);
+		result = pBytes;
+		while ( pBytes[length-1] == 0x00 )
+			--length;
+
+		while( length > 0 )
+		{
+			memcpy( temp, pBytes, 8 );
+			des_crypt_ecb( &ctx, pBytes, output );
+
+			for( i = 0; i < 8; i++ )
+				output[i] = (unsigned char)( output[i] ^ iv[i] );
+
+			memcpy( iv, temp, 8 );
+
+			pBytes += 8;
+			output += 8;
+			length -= 8;
+		}
+
+		if ( result )
+			delete []result;
+	}
+
+	return( 0 );
+}
+
+int des_crypt(IN CString strInput, IN CString& strOutput, IN const int &mode /* = DES_ENCRYPT */)
+{
+	if ( strInput.IsEmpty() )
+		return -1;
+
+	unsigned char* pInput = NULL;
+	int nInputlen = strInput.GetLength();
+
+#ifdef UNICODE
+	pInput = (unsigned char*)CharEncoding::UNICODE2ASCII(strInput.GetBuffer());
+	nInputlen = strlen((char*)pInput);
+#else
+	pInput = new unsigned char[nInputlen+1];
+	memset(pInput, 0, nInputlen+1);
+	memcpy(pInput, strInput, nInputlen);
+#endif
+
+	int nOutputlen = nInputlen;
+	if ( mode == DES_ENCRYPT )
+	{
+		// 计算密文长度,不足8位补齐;
+		nOutputlen = des_enc_len(nInputlen);
+		// 计算密文转成base64的长度,用于创建输出缓存;
+		nOutputlen = CBase64::CalcBase64Len(nOutputlen);
+	}
+	else
+	{
+		nOutputlen = CBase64::CalcBinLen(nInputlen);
+	}
+
+	unsigned char* pOutput = new unsigned char[nOutputlen+1];
+	memset(pOutput, 0, nOutputlen + 1);
+
+	if ( des_crypt_cbc(mode, nInputlen, pInput, pOutput, nOutputlen) == -1)
+		return -1;
+
+#ifdef UNICODE
+	WCHAR* pWide = CharEncoding::ASCII2UNICODE((char*)pOutput);
+	strOutput.Format(_T("%s"), pWide);
+	if ( pWide )
+		delete []pWide;
+#else
+	strOutput.Format(_T("%s"), pOutput);
+#endif
+
+	if ( pInput )
+		delete []pInput;
+	if ( pOutput )
+		delete []pOutput;
+
+	return 0;
+}
+
+/************************************************************************/
+/*  函数:[12/21/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void DES_EncryptFile(IN LPCTSTR lpFile, IN LPBYTE lpKey, IN LPBYTE lpVI, IN LPCTSTR lpEncryFile)
+{
+	if ( lpFile == NULL )
+		return;
+
+	if ( lpKey == NULL || lpVI == NULL )
+		return;
+
+	BYTE szKey[9] = {0};
+	INT nKeyLen = strlen((char*)lpKey);
+	if (nKeyLen != 8 )
+		return;
+
+	memcpy(szKey, lpKey, 8);
+
+	BYTE szvi[9] = {0};
+	INT nVILen = strlen((char*)lpVI);
+	if ( nVILen != 8 ) 
+		return;
+
+	memcpy(szvi, lpVI, 8);
+
+	CFile cf;
+	BYTE *pFileData = NULL;
+	BYTE *pOutData = NULL;
+	INT nPadLen = 0;
+	UINT64 nFileLen = 0;
+	UINT64 nOutLen = 0;
+	if ( cf.Open(lpFile, CFile::modeRead) )
+	{
+		nFileLen = cf.GetLength();
+		pFileData = new BYTE[nFileLen];
+		memset(pFileData, 0, nFileLen);
+
+		cf.Read(pFileData,nFileLen);
+		cf.Close();
+	}
+	else
+	{
+		DWORD dwError = GetLastError();
+		TRACE("%d", dwError);
+		return;
+	}
+
+	if ( strncmp((char*)pFileData, "<?>", 3) == 0 )
+	{// 已加密的,退出;
+		delete []pFileData;
+		return;
+	}
+
+	// 不足8的倍数,补齐;
+	nOutLen = des_enc_len(nFileLen);
+	pOutData = new BYTE[nOutLen + 1 ];
+	memset(pOutData, 0, nOutLen + 1 );
+
+	des_context des;
+	if ( des_key_check_key_parity(szKey) == 1)
+	{
+		des_key_set_parity(szKey);
+		if ( des_key_check_key_parity(szKey) == 0 )
+		{
+			des_setkey_enc(&des, szKey);
+		}
+	}
+	else
+		des_setkey_enc(&des, szKey);
+
+	des_crypt_cbc(&des, DES_ENCRYPT, nOutLen, szvi, pFileData, pOutData);
+
+	CFile cfo;
+	if ( cfo.Open(lpEncryFile, CFile::modeCreate|CFile::modeWrite) )
+	{
+		cfo.Write("<?>", 3);
+		cfo.Write(&nFileLen, sizeof(UINT64));
+		cfo.Write(pOutData, nOutLen);
+		cfo.Close();
+	}
+
+	if ( pOutData )
+		delete []pOutData;
+
+	if ( pFileData)
+		delete []pFileData;
+}
+
+/************************************************************************/
+/*  函数:[12/21/2016 IT];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void DES_DecryptFile(IN LPCTSTR lpFile, IN LPBYTE lpKey, IN LPBYTE lpVI, IN LPCTSTR lpDecryFile)
+{
+	if ( lpFile == NULL )
+		return;
+
+	if ( lpKey == NULL || lpVI == NULL )
+		return;
+
+	INT nKeyLen = strlen((char*)lpKey);
+	if (nKeyLen != 8 )
+		return;
+
+	BYTE szvi[9] = {0};
+	INT nVILen = strlen((char*)lpVI);
+	if ( nVILen != 8 ) 
+		return;
+
+	memcpy(szvi, lpVI, 8);
+
+	CFile cf;
+	BYTE *pFileData = NULL;
+	BYTE *pOutData = NULL;
+	UINT64 nFileLen = 0;
+	if ( cf.Open(lpFile, CFile::modeRead) )
+	{
+		nFileLen = cf.GetLength();
+		pFileData = new BYTE[nFileLen];
+		memset(pFileData, 0, nFileLen);
+
+		cf.Read(pFileData,nFileLen);
+		cf.Close();
+	}
+	else
+	{
+		DWORD dwError = GetLastError();
+		TRACE("%d", dwError);
+		return;
+	}
+
+	if ( strncmp((char*)pFileData, "<?>", 3) != 0 )
+	{// 不是加密文件;
+		delete []pFileData;
+		return;
+	}
+
+	// 加密的长度,必定是8的倍数;
+	UINT64 nOutLen = nFileLen-3-sizeof(UINT64);
+	pOutData = new BYTE[nOutLen + 1];
+	memset(pOutData, 0, nOutLen + 1);
+
+	des_context des;
+	if ( des_key_check_key_parity(lpKey) == 1)
+	{
+		des_key_set_parity(lpKey);
+		if ( des_key_check_key_parity(lpKey) == 0 )
+		{
+			des_setkey_dec(&des, lpKey);
+		}
+	}
+	else
+		des_setkey_dec(&des, lpKey);
+	des_crypt_cbc(&des, DES_DECRYPT, nOutLen, szvi, pFileData+3+sizeof(UINT64), pOutData);
+
+	CFile cfo;
+	memcpy(&nOutLen, pFileData+3, sizeof(UINT64)); // 获取实际文件长度;
+	if ( cfo.Open(lpDecryFile, CFile::modeCreate|CFile::modeWrite) )
+	{
+		cfo.Write(pOutData, nOutLen);
+		cfo.Close();
+	}
+
+	if ( pOutData )
+		delete []pOutData;
+
+	if (pFileData)
+		delete []pFileData;
+}

+ 60 - 0
Source/OGCAssistTool/OGCAssistTool/des.h

@@ -0,0 +1,60 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [ItCivilian], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[Home];
+/*  日    期:[6/5/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[ItCivilian];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+
+#ifndef __SSL_DES_20160606__
+#define __SSL_DES_20160606__
+
+#define DES_ENCRYPT     1
+#define DES_DECRYPT     0
+#define DES_KEY_SIZE    8
+
+#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH               -0x0C00
+
+// DES结构体;
+typedef struct
+{
+	unsigned long sk[32];       // DES 子密钥(由用户输入的密钥生成);
+}des_context;
+
+// 设置密钥校验位为偶校验;
+void des_key_set_parity( unsigned char key[8] );
+// 判断密钥校验位是否为偶校验;
+int des_key_check_key_parity( const unsigned char key[8] );
+// 判断密钥是否为弱密钥;
+int des_key_check_weak( const unsigned char key[8] );
+
+// 返回加密时填充后的明文长度;
+unsigned __int64 des_enc_len(const unsigned __int64& nlen);
+// 返回解密后,去除填充的长度;
+unsigned __int64 des_dec_len(const unsigned char* input, unsigned __int64 nlen);
+
+void set_enc(const unsigned char *enc, const int &nlen);
+// DES-ECB模式加解密;
+int des_crypt_ecb( IN des_context *ctx, IN const unsigned char input[8], IN unsigned char output[8] );
+// DES-CBC模式加解密;
+int des_crypt_cbc( IN des_context *ctx, IN int mode, IN int length, IN unsigned char iv[8], IN const unsigned char *input, IN unsigned char *output );
+
+// DES-CBC模式加解密;
+int des_crypt_cbc(IN int mode, IN int length, IN const unsigned char *input, IN unsigned char *output, IN const int& outMaxlen );
+int des_crypt(IN CString strInput, IN CString& strOutput, IN const int &mode = DES_ENCRYPT);
+// 加密文件;
+void DES_EncryptFile(IN LPCTSTR lpFile, IN LPBYTE lpKey, IN LPBYTE lpVI, IN LPCTSTR lpEncryFile);
+// 解密文件;
+void DES_DecryptFile(IN LPCTSTR lpFile, IN LPBYTE lpKey, IN LPBYTE lpVI, IN LPCTSTR lpDecryFile);
+
+#endif // __SSL_DES_20160606__

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/resource.h

@@ -19,12 +19,14 @@
 #define EDIT_PASSWORD                   1001
 #define IDC_BUTTON1                     1001
 #define BTN_QUERY                       1001
+#define BTN_SAVE_CONFIG                 1001
 #define EDIT_LINE                       1002
 #define IDC_EDIT1                       1002
 #define EDIT_BATCH_NUM                  1002
 #define CHECK_OFFLINE                   1003
 #define IDC_EDIT2                       1003
 #define EDIT_BATCH_NUMBER               1003
+#define EDIT_PSW                        1003
 #define IDC_CHECK1                      1004
 #define CHECK_LOCK                      1004
 #define CHECK_TEST_TIME                 1004

+ 1 - 1
Source/OGCAssistTool/OGCAssistTool/stdafx.h

@@ -41,7 +41,7 @@
 #include "MTVERIFY.H"
 #include "Global.h"
 #include "CharEncoding.h"
-
+#include "des.h"
 extern void dprintf(TCHAR* pszStr, ...);
 
 

+ 73 - 73
Source/Setup.suf

@@ -152,79 +152,6 @@
 </FileData>
 <FileData>
 <FldRef>0</FldRef>
-<FullName>F:\cfg\bin\OGCAssistTool\db\ogc.db</FullName>
-<FileName>ogc.db</FileName>
-<Source>F:\cfg\bin\OGCAssistTool\db</Source>
-<Ext>db</Ext>
-<RTSource>Archive</RTSource>
-<Desc/>
-<Recurse>1</Recurse>
-<MatchMode>0</MatchMode>
-<Dest>%AppFolder%\db</Dest>
-<Overwrite>1</Overwrite>
-<Backup>0</Backup>
-<Protect>0</Protect>
-<InstallOrder>1000</InstallOrder>
-<SCStartRoot>0</SCStartRoot>
-<SCStartProgs>0</SCStartProgs>
-<SCAppFld>0</SCAppFld>
-<SCStartup>0</SCStartup>
-<SCDesk>0</SCDesk>
-<SCQLaunch>0</SCQLaunch>
-<SCStartPinOption>0</SCStartPinOption>
-<SCCust>0</SCCust>
-<CustSCPath/>
-<SCDesc/>
-<SCComment/>
-<SCArgs/>
-<SCWork/>
-<UseExtIco>0</UseExtIco>
-<IcoFN/>
-<IcoIdx>0</IcoIdx>
-<IcoShowMd>0</IcoShowMd>
-<IcoHK>0</IcoHK>
-<RegTTF>0</RegTTF>
-<TTFName/>
-<RegOCX>0</RegOCX>
-<RegTLB>0</RegTLB>
-<SupInUse>0</SupInUse>
-<Compress>1</Compress>
-<UseOrigAttr>1</UseOrigAttr>
-<Attr>0</Attr>
-<NoCRC>0</NoCRC>
-<NoRemove>0</NoRemove>
-<Shared>0</Shared>
-<OSCond>
-<OS>32768</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-<OS>65535</OS>
-</OSCond>
-<RTCond/>
-<BuildConfigs>
-<Cfg>All</Cfg>
-</BuildConfigs>
-<Package>None</Package>
-<Packages/>
-<Notes/>
-<CompSize>0</CompSize>
-<CRC>0</CRC>
-<StoreOnly>0</StoreOnly>
-</FileData>
-<FileData>
-<FldRef>0</FldRef>
 <FullName>F:\cfg\bin\OGCAssistTool\OGC_Tool_V2.21.1.3_210929\CA310SDK.bat</FullName>
 <FileName>CA310SDK.bat</FileName>
 <Source>F:\cfg\bin\OGCAssistTool\OGC_Tool_V2.21.1.3_210929</Source>
@@ -8326,6 +8253,79 @@
 <CRC>0</CRC>
 <StoreOnly>0</StoreOnly>
 </FileData>
+<FileData>
+<FldRef>0</FldRef>
+<FullName>F:\cfg\repos_deltae_auxiliary_tool\DB\ogc.db</FullName>
+<FileName>ogc.db</FileName>
+<Source>F:\cfg\repos_deltae_auxiliary_tool\DB</Source>
+<Ext>db</Ext>
+<RTSource>Archive</RTSource>
+<Desc/>
+<Recurse>1</Recurse>
+<MatchMode>0</MatchMode>
+<Dest>%AppFolder%</Dest>
+<Overwrite>1</Overwrite>
+<Backup>0</Backup>
+<Protect>0</Protect>
+<InstallOrder>1000</InstallOrder>
+<SCStartRoot>0</SCStartRoot>
+<SCStartProgs>0</SCStartProgs>
+<SCAppFld>0</SCAppFld>
+<SCStartup>0</SCStartup>
+<SCDesk>0</SCDesk>
+<SCQLaunch>0</SCQLaunch>
+<SCStartPinOption>0</SCStartPinOption>
+<SCCust>0</SCCust>
+<CustSCPath/>
+<SCDesc/>
+<SCComment/>
+<SCArgs/>
+<SCWork/>
+<UseExtIco>0</UseExtIco>
+<IcoFN/>
+<IcoIdx>0</IcoIdx>
+<IcoShowMd>0</IcoShowMd>
+<IcoHK>0</IcoHK>
+<RegTTF>0</RegTTF>
+<TTFName/>
+<RegOCX>0</RegOCX>
+<RegTLB>0</RegTLB>
+<SupInUse>0</SupInUse>
+<Compress>1</Compress>
+<UseOrigAttr>1</UseOrigAttr>
+<Attr>0</Attr>
+<NoCRC>0</NoCRC>
+<NoRemove>0</NoRemove>
+<Shared>0</Shared>
+<OSCond>
+<OS>32768</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+<OS>65535</OS>
+</OSCond>
+<RTCond/>
+<BuildConfigs>
+<Cfg>All</Cfg>
+</BuildConfigs>
+<Package>None</Package>
+<Packages/>
+<Notes/>
+<CompSize>0</CompSize>
+<CRC>0</CRC>
+<StoreOnly>0</StoreOnly>
+</FileData>
 </ArchiveFiles>
 <ExternalFiles/>
 <BeforeInstallingScreens>