MiniCA.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:32k
源码类别:

CA认证

开发平台:

Visual C++

  1. // MiniCA.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "MiniCA.h"
  5. #include "..htmlincludehtmlhelp.h"
  6. #include "Evp.h"
  7. #include "MiniMainDlg.h"
  8. #define _WIN32_WINNT  0x0400
  9. #include "wincrypt.h"
  10. #include "MiniMainDlg.h"
  11. #include ".GenericClassGetHardSoftInfo.h"
  12. #include ".GenericClasscgfiltyp.h" // CGCFileTypeAccess
  13. #include <locale.h>
  14. #include ".ControlSplashSplashWnd.h"
  15. #include ".GenericClassLanguage.h"
  16. #include "MiniCt.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. BOOL CMiniCaApp::m_bIsBig = FALSE;
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CMiniCaApp
  25. BEGIN_MESSAGE_MAP(CMiniCaApp, CWinApp)
  26. //{{AFX_MSG_MAP(CMiniCaApp)
  27. // NOTE - the ClassWizard will add and remove mapping macros here.
  28. //    DO NOT EDIT what you see in these blocks of generated code!
  29. //}}AFX_MSG
  30. ON_COMMAND(ID_HELP, CWinApp::OnHelp)//屏蔽此句可以去掉帮助按钮
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CMiniCaApp construction
  34. CMiniCaApp::CMiniCaApp()
  35. {
  36. // TODO: add construction code here,
  37. // Place all significant initialization in InitInstance
  38. // m_bServer = FALSE;
  39. m_bHpxs = FALSE;
  40. m_HelpArray.Add("ca_ext.htm");
  41. m_HelpArray.Add("ca_center.htm");
  42. m_HelpArray.Add("ca_sslclient.htm");
  43. m_HelpArray.Add("ca_sslserver.htm");
  44. m_HelpArray.Add("ca_evp.htm");
  45. m_HelpArray.Add("ca_raserver.htm");
  46. m_HelpArray.Add("ca_asn1.htm");
  47. m_HelpArray.Add("ca_ocspserver.htm");
  48. m_HelpArray.Add("ca_ocspclient.htm");
  49. m_HelpArray.Add("cacert_info.htm");
  50. m_HelpArray.Add("ca_reg.htm");
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // The one and only CMiniCaApp object
  54. CMiniCaApp theApp;
  55. HINSTANCE g_hInst = NULL;
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CMiniCaApp initialization
  58. int CMiniCaApp::HexToTen(const char * pHex)//16--->10
  59. {
  60.     DWORD dwHexNum=0;
  61.     for (; *pHex!=0 ; pHex++)
  62.     {
  63.         dwHexNum *= 16;
  64.         if ((*pHex>='0') && (*pHex<='9'))
  65.             dwHexNum += *pHex-'0';
  66.         else if ((*pHex>='a') && (*pHex<='f'))
  67.             dwHexNum += *pHex-'a'+10;
  68.         else if ((*pHex>='A') && (*pHex<='F'))
  69.             dwHexNum += *pHex-'A'+10;
  70.         else
  71.             -1;
  72.     }
  73. return dwHexNum;
  74. }
  75. BOOL CMiniCaApp::CheckSolfCode(CString pathExt/*被验证文件路径*/,
  76.    CString dllName/*dll名称*/,UINT dllId/*资源ID*/)//检验验证码
  77. {
  78. static HINSTANCE hLibrary;
  79. if ((hLibrary = LoadLibrary(dllName)) == NULL)
  80. {
  81. return FALSE;
  82. }
  83. else
  84. {
  85. //得到摘要结果
  86. CString mdname("sha1");
  87. char outMsg[100]="";
  88. unsigned char md_value[MAX_MD_SIZE]="";
  89. char bufsing[MAX_MD_SIZE*2]="";
  90. unsigned int md_len;
  91. if(!CEvp::Digest(mdname.GetBuffer(0),pathExt.GetBuffer(0),0,md_value,&md_len, outMsg))
  92. {
  93. return FALSE;
  94. }
  95. /*得到公钥*/
  96. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_VERIFY_CERT),"CERT");
  97. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  98. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  99. LPSTR lpCert=(LPSTR)LockResource(hgCert);
  100. //取得DLL中的验证码
  101. char buf[513]={0};//长度512
  102. int nBufferMax=513;
  103. if(LoadString(hLibrary,dllId,buf,nBufferMax)==0)//取得错误IDS_STR_MINICA
  104. {
  105. LPVOID lpMsgBuf;
  106. FormatMessage( 
  107. FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  108. FORMAT_MESSAGE_FROM_SYSTEM | 
  109. FORMAT_MESSAGE_IGNORE_INSERTS,
  110. NULL,
  111. GetLastError(),
  112. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  113. (LPTSTR) &lpMsgBuf,
  114. 0,
  115. NULL 
  116. );
  117. TRACE0((LPTSTR)lpMsgBuf);
  118. LocalFree( lpMsgBuf );
  119. return FALSE;
  120. }
  121. char lm[257]={0};//保存乱码
  122. char temp[3]={0};//临时变量
  123. //regcode 保存16进制数据 类似B5C3 D6F8->对应2个乱码汉字
  124. //取出B5转换成10进制,存入乱码的一个位置
  125. for(UINT j=0;j<strlen(buf);j+=2)
  126. {
  127. strncpy(temp,buf+j,2);
  128. lm[j/2]=HexToTen(temp);
  129. }
  130. if(CEvp::VerifySign(lpCert,lenCert,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//内存区域
  131. lm/*签名结果,注册表->转换*/,outMsg))
  132. {
  133. return TRUE;
  134. }
  135. else
  136. return FALSE;
  137. }
  138. }
  139. BOOL CMiniCaApp::InitInstance()
  140. {
  141. // Standard initialization
  142. // If you are not using these features and wish to reduce the size
  143. //  of your final executable, you should remove from the following
  144. //  the specific initialization routines you do not need.
  145. // if(IsReg() == 1)
  146. // m_bServer = FALSE;
  147. // else if(IsReg() == 2)
  148. // m_bServer = TRUE;//是否开发服务器程序
  149. // get full file path to program executable file
  150. // GetModuleFileName(NULL,sMiniCA.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
  151. // sMiniCA.ReleaseBuffer();
  152. // _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  153. TCHAR szProgPath[MAX_PATH * 2];
  154. ::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));
  155. CString sMiniCA;
  156. sMiniCA.Format("%s", szProgPath);
  157. //得到可执行文件路径
  158. int nPos;
  159. nPos = sMiniCA.ReverseFind ('\');
  160. m_AppPath = sMiniCA.Left (nPos);
  161. CharSetIsBig();
  162. CString strCmdLine;
  163. strCmdLine.Format("%s", m_lpCmdLine);
  164. if(strCmdLine.Find("I love hpxs") != -1)
  165. {
  166. CSplashWnd::EnableSplashScreen(0); //splash 3 - 2
  167. m_bHpxs = TRUE;
  168. // m_bServer = TRUE;
  169. }
  170. //得到命令行参数,判断是否WINEVP
  171. CString strEvpFile;
  172. strEvpFile.Format("%s", strCmdLine);
  173. //命令行是带""的,需要去掉""
  174. strEvpFile.Replace(""", " ");
  175. strEvpFile.TrimLeft();
  176. strEvpFile.TrimRight();
  177. CString ext;
  178. ext = strEvpFile.Right(3);
  179. if(ext.CompareNoCase("Evp") == 0)
  180. {
  181. CSplashWnd::ShowSplashScreen(3000, "JPG", "IDR_SPLASHEVP", NULL); //splash 3 - 1
  182. }
  183. else
  184. {
  185. CSplashWnd::ShowSplashScreen(3000, "JPG", "IDR_SPLASHCA", NULL); //splash 3 - 1
  186. }
  187. if (!AfxOleInit())///初始化COM库,MFC 程序不用收回COM库      用于托放支持
  188. {
  189. AfxMessageBox(NormalCode("初始化ADO失败"));
  190. return FALSE;
  191. }
  192. ::AfxInitRichEdit();
  193. // AfxEnableControlContainer(); //SimpleBrowser 控件专用
  194. //初始化OPENSSL
  195. SSL_load_error_strings(); // leak  ERR_free_strings()
  196. OpenSSL_add_all_algorithms(); //leak EVP_cleanup(void);
  197. //设置文件关联开始 - 注册表删除只能靠卸载程序
  198. CString csTempText;
  199. CGCFileTypeAccess TheFTA;
  200. TheFTA.SetExtension("evp");
  201. // just pass file path in quotes on command line
  202. csTempText  = szProgPath;
  203. csTempText += " "%1"";
  204. TheFTA.SetShellOpenCommand(csTempText);
  205. TheFTA.SetDocumentShellOpenCommand(csTempText);
  206. TheFTA.SetDocumentClassName("evpfile");
  207. // use first icon in program
  208. csTempText  = szProgPath;
  209. csTempText += ",0";
  210. TheFTA.SetDocumentDefaultIcon(csTempText);
  211. TheFTA.RegSetAllInfo();
  212. //设置关联结束
  213. #ifdef _AFXDLL
  214. Enable3dControls(); // Call this when using MFC in a shared DLL
  215. #else
  216. Enable3dControlsStatic(); // Call this when linking to MFC statically
  217. #endif
  218. m_ImgList.Create(16,16,TRUE|ILC_COLOR24,16,1);
  219. HICON hIcon =  NULL;
  220. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  221. MAKEINTRESOURCE(IDI_ICON_NONE), IMAGE_ICON, 16, 16, 0);
  222. m_ImgList.Add(hIcon);//0
  223. DestroyIcon(hIcon);
  224. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  225. MAKEINTRESOURCE(IDI_ICON_ALL), IMAGE_ICON, 16, 16, 0);
  226. m_ImgList.Add(hIcon);//1
  227. DestroyIcon(hIcon);
  228. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  229. MAKEINTRESOURCE(IDI_ICON_SOME), IMAGE_ICON, 16, 16, 0);
  230. m_ImgList.Add(hIcon);//2
  231. DestroyIcon(hIcon);
  232. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  233. MAKEINTRESOURCE(IDI_ICON15), IMAGE_ICON, 16, 16, 0);
  234. m_ImgList.Add(hIcon);//3
  235. DestroyIcon(hIcon);
  236. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  237. MAKEINTRESOURCE(IDI_ICON14), IMAGE_ICON, 16, 16, 0);
  238. m_ImgList.Add(hIcon);//4
  239. DestroyIcon(hIcon);
  240. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  241. MAKEINTRESOURCE(IDI_ICON18), IMAGE_ICON, 16, 16, 0);
  242. m_ImgList.Add(hIcon);//5
  243. DestroyIcon(hIcon);
  244. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  245. MAKEINTRESOURCE(IDI_ICON4), IMAGE_ICON, 16, 16, 0);
  246. m_ImgList.Add(hIcon);//6
  247. DestroyIcon(hIcon);
  248. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  249. MAKEINTRESOURCE(IDI_ICON_MOD1), IMAGE_ICON, 16, 16, 0);
  250. m_ImgList.Add(hIcon);//7
  251. DestroyIcon(hIcon);
  252. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  253. MAKEINTRESOURCE(IDI_ICON_MOD1), IMAGE_ICON, 16, 16, 0);
  254. m_ImgList.Add(hIcon);//8
  255. DestroyIcon(hIcon);
  256. hIcon =  (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  257. MAKEINTRESOURCE(IDI_ICON_MOD3), IMAGE_ICON, 16, 16, 0);
  258. m_ImgList.Add(hIcon);//9
  259. DestroyIcon(hIcon);
  260. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  261. MAKEINTRESOURCE(IDI_ICON_ASN1VIEW), IMAGE_ICON, 16, 16, 0);
  262. m_ImgList.Add(hIcon);//10
  263. DestroyIcon(hIcon);
  264. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  265. MAKEINTRESOURCE(IDI_ICON_BLUE), IMAGE_ICON, 16, 16, 0);
  266. m_ImgList.Add(hIcon);//11
  267. DestroyIcon(hIcon);
  268. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  269. MAKEINTRESOURCE(IDI_ICON_LIST), IMAGE_ICON, 16, 16, 0);
  270. m_ImgList.Add(hIcon);//12
  271. DestroyIcon(hIcon);
  272. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  273. MAKEINTRESOURCE(IDI_ICON_GREEN), IMAGE_ICON, 16, 16, 0);
  274. m_ImgList.Add(hIcon);//13
  275. DestroyIcon(hIcon);
  276. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  277. MAKEINTRESOURCE(IDI_ICON_RED), IMAGE_ICON, 16, 16, 0);
  278. m_ImgList.Add(hIcon);//14
  279. DestroyIcon(hIcon);
  280. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  281. MAKEINTRESOURCE(IDI_ICON_RESERT), IMAGE_ICON, 16, 16, 0);
  282. m_ImgList.Add(hIcon);//15
  283. DestroyIcon(hIcon);
  284. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  285. MAKEINTRESOURCE(IDI_ICON_ERROR), IMAGE_ICON, 16, 16, 0);
  286. m_ImgList.Add(hIcon);//16
  287. DestroyIcon(hIcon);
  288. CMiniMainDlg dlg;
  289. //安装根证书
  290. LPSTR lpCert = NULL;
  291. DWORD lenCert=0;//公钥长度,私钥长度
  292. /*得到公钥*/
  293. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_DERCERT_ROOT),"CERT");
  294. lenCert = SizeofResource(NULL, hRsrc); 
  295. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  296. lpCert = (LPSTR)LockResource(hgCert);
  297. AddRootToStore(lpCert, lenCert);
  298. m_pMainWnd = &dlg;
  299. //重启,存在前一个实例则不检测数据库
  300. // if ((_stricmp(m_lpCmdLine,"reset")!=0))//重启
  301. {
  302. //检测是否已经打开,如果打不开,则重新写入
  303. CString lpszFile =  m_AppPath + "\MiniCA.mdb";
  304. CFile file;
  305. if(!file.Open(lpszFile, CFile::modeRead))
  306. {
  307. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_INI_MDB),"INI");
  308. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  309. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  310. LPSTR lpCert=(LPSTR)LockResource(hgCert);
  311. if(file.Open(lpszFile,CFile::modeCreate|CFile::modeWrite)) //存文件
  312. {
  313. file.Write(lpCert,lenCert);
  314. file.Close();
  315. }
  316. }
  317. }
  318. g_hInst = theApp.m_hInstance;
  319. int nResponse = dlg.DoModal();
  320. if (nResponse == IDOK)
  321. {
  322. // TODO: Place code here to handle when the dialog is
  323. //  dismissed with OK
  324. }
  325. else if (nResponse == IDCANCEL)
  326. {
  327. // TODO: Place code here to handle when the dialog is
  328. //  dismissed with Cancel
  329. }
  330. // Since the dialog has been closed, return FALSE so that we exit the
  331. //  application, rather than start the application's message pump.
  332. return FALSE;
  333. }
  334. BOOL CMiniCaApp::AddRootToStore(char * lpCert, UINT lenCert) //加入der格式根证书
  335. {
  336. HCERTSTORE      hLinkStoreHandle;
  337. PCCERT_CONTEXT pCertContext = NULL;
  338. BOOL bAdd = FALSE;
  339. char outBuf[10240] = {0};
  340. UINT outLen = 10240;
  341. char out[1024] = {0};
  342. //转换证书格式为DER
  343. if(CertFormatConver(lpCert, lenCert, "",
  344. outBuf, &outLen, "", DER,out))
  345. {
  346. pCertContext = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
  347. (PBYTE)outBuf, outLen);
  348. if(!pCertContext)
  349. return FALSE;
  350. hLinkStoreHandle = CertOpenSystemStore(NULL,"ROOT");//源
  351. // Add a certificate to hLinkStoreHandle store.
  352. bAdd = CertAddCertificateContextToStore(
  353. hLinkStoreHandle,             // The store handle.
  354. pCertContext,                  // A pointer to a Cert.
  355. CERT_STORE_ADD_USE_EXISTING,  // If a matching cert exists use it.
  356. NULL                          // Do not make any extra copy of the certificate.
  357. );
  358. CertCloseStore(hLinkStoreHandle,CERT_CLOSE_STORE_CHECK_FLAG);
  359. }
  360. return bAdd;
  361. }
  362. void CMiniCaApp::WinHelp(DWORD dwData, UINT nCmd) 
  363. {
  364. // TODO: Add your specialized code here and/or call the base class
  365. CString strHelp,strId;
  366. strHelp=m_pszHelpFilePath;
  367. strHelp+="::/html/";
  368. // int index=((CPropertySheet *)AfxGetMainWnd())->GetActiveIndex();
  369. // strHelp+=m_HelpArray[index];
  370. // HtmlHelp(NULL,strHelp, HH_DISPLAY_TOPIC, 0);
  371. //CWinApp::WinHelp(dwData, nCmd);
  372. }
  373. CString CMiniCaApp::GetMachineCode()//得到机器码
  374. {
  375. DWORD dwCpuSerial = 0;
  376. CGetMachineInfo m_Info;
  377. CString strIdeSerial(m_Info.HardDriveSerialNumber);
  378. if(strIdeSerial.IsEmpty()) //没有取得硬盘序号
  379. {
  380. HKEY hKey;
  381. LONG rc = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\Description\System\CentralProcessor\0", 0, KEY_READ, &hKey);
  382. if(rc == ERROR_SUCCESS)
  383. {
  384. DWORD cbBuffer = sizeof (DWORD);
  385. rc = ::RegQueryValueEx(hKey, "FeatureSet", NULL, NULL, (LPBYTE)(&dwCpuSerial), &cbBuffer);
  386. RegCloseKey (hKey);
  387. }
  388. }
  389. // GetVolumeInformation("C:\",NULL,NULL,&strIdeSerial,NULL,NULL,NULL,NULL);//得到c盘序号
  390. CString strIDE;
  391. strIDE.Format("%X%s",dwCpuSerial * 2, strIdeSerial);
  392. // AfxMessageBox(strIDE);
  393. //首先根据硬盘序号sha1
  394. CString mdname("sha1");
  395. char outMsg[100]="";
  396. unsigned char md_value[MAX_MD_SIZE]="";
  397. char buf[1024*2]="";
  398. unsigned int md_len;
  399. UCHAR bufsign[1024]={0};
  400. UINT lensign=0;
  401. // CString strADD;//附加信息
  402. // strADD.LoadString(IDS_STR_MINICA);
  403. // strIDE += strADD;
  404. if(!CEvp::Digest(mdname.GetBuffer(0),strIDE.GetBuffer(0),strIDE.GetLength(),
  405. md_value,&md_len, outMsg))//消息摘要
  406. {
  407. return "";
  408. }
  409. for(UINT i=0;i<md_len;i++)
  410. {
  411. sprintf((char *)&buf[i*2],"%02X",md_value[i]);//02x标示1个16进制变为2个字符,空补零
  412. }
  413. CString str512(buf);
  414. return str512;
  415. }
  416. BOOL CMiniCaApp::CheckRegCode(CString username,CString regcode,BOOL type)//检验注册码
  417. {
  418. //首先根据用户名sha1
  419. CString mdname("sha1");
  420. char outMsg[100]="";
  421. unsigned char md_value[MAX_MD_SIZE]="";
  422. char buf[1024*2]="";
  423. unsigned int md_len;
  424. UCHAR bufsign[1024]={0};
  425. int lensign=0;
  426. char lm[257]={0};//保存乱码
  427. char temp[3]={0};//临时变量
  428. username += GetMachineCode();
  429. CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
  430. // strADD.LoadString(IDS_STR_MINICA);
  431. username += strADD;
  432. if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
  433. md_value,&md_len, outMsg))//消息摘要
  434. {
  435. // m_RegListB.AddMsg(outMsg, M_ERROR);
  436. return FALSE;
  437. }
  438. char * Cert = 0;
  439. if(type)
  440. {
  441. Cert = MAKEINTRESOURCE(IDR_REGE_CERT);//企业
  442. }
  443. else
  444. Cert = MAKEINTRESOURCE(IDR_REGI_CERT);//个人
  445. HRSRC hRsrc=FindResource(NULL,Cert,"CERT");
  446. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  447. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  448. LPSTR lpCert=(LPSTR)LockResource(hgCert);
  449. //regcode 保存16进制数据 类似B5C3 D6F8->对应2个乱码汉字
  450. //取出B5转换成10进制,存入乱码的一个位置
  451. for(int j=0;j<regcode.GetLength();j+=2)
  452. {
  453. strncpy(temp,regcode.GetBuffer(0)+j,2);
  454. lm[j/2]=HexToTen(temp);
  455. }
  456. if(CEvp::VerifySign(lpCert,lenCert,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//内存区域
  457. lm/*签名结果,注册表->转换*/,outMsg))
  458. {
  459. return TRUE;
  460. }
  461. else
  462. return FALSE;
  463. }
  464. UINT CMiniCaApp::IsReg()
  465. {
  466. HKEY hKEY;//定义有关的 hKEY, 在查询结束时要关闭。 
  467. CString strMiniCA,strUser,strRegCode;
  468. strMiniCA.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串 
  469. strUser.LoadString(IDS_REG_USER);
  470. strRegCode.LoadString(IDS_REG_CODE);
  471. //hKEY,第一个参数为根键名称,第二个参数表。 
  472. //表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
  473. //访问注册表,hKEY则保存此函数所打开的键的句柄。 
  474. long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strMiniCA, 0, KEY_READ, &hKEY)); 
  475. if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则终止程序的执行 
  476. {
  477. return FALSE;
  478. //查询用户名 
  479. DWORD Type=REG_SZ;
  480. DWORD UserLen=256; 
  481. LPBYTE lUser=new BYTE[UserLen]; 
  482. //hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,″RegisteredOwner″。 
  483. //表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
  484. //查询的数据,cbData_1表示预设置的数据长度。 
  485. long ret=::RegQueryValueEx(hKEY, strUser, NULL, &Type, lUser, &UserLen); 
  486. if(ret!=ERROR_SUCCESS) 
  487. delete [] lUser;
  488. ::RegCloseKey(hKEY); 
  489. return FALSE; 
  490. //查询注册吗
  491. DWORD RegLen=513; //长度+1
  492. LPBYTE lRegCode=new BYTE[RegLen]; 
  493. ret=::RegQueryValueEx(hKEY, strRegCode, NULL,&Type,lRegCode,&RegLen); 
  494. if(ret!=ERROR_SUCCESS) 
  495. delete [] lUser;
  496. delete [] lRegCode;
  497. ::RegCloseKey(hKEY); 
  498. return FALSE; 
  499. //将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。 
  500. CString User = CString(lUser); 
  501. CString RegCode = CString(lRegCode); 
  502. delete [] lUser; 
  503. delete [] lRegCode;
  504. //校验用户名和注册吗
  505. BOOL bType = FALSE;
  506. UINT len = RegCode.GetLength();
  507. if(len == 256)
  508. bType = TRUE;
  509. else if(len == 128)
  510. bType = FALSE;
  511. ret = CheckRegCode(User,RegCode,bType);
  512. if(!ret)
  513. {
  514. ::RegCloseKey(hKEY); 
  515. return 0;
  516. }
  517. ::RegCloseKey(hKEY); 
  518. return (bType)?2:1; //0 - 未注册 1 - 个人版 2 -企业版
  519. }
  520. //根证书            100    110
  521. //服务器证书        200    210 
  522. //客户端证书        300    310
  523. //加密证书          400    410 
  524. //签名证书          500    510
  525. //注册用户首先查询外部证书不存在或不使用则取得内部证书
  526. //未注册用户取得内部证书
  527. //如果bInsideOnly == TRUE,则只读取内部证书
  528. BOOL CMiniCaApp::GetCertPair(UINT ID,  char * sCert, DWORD & dLen, CString & sPwd,
  529.  BOOL bInsideOnly, CColorListBox * pList)
  530. {
  531. BOOL bExter = FALSE;//外部
  532. UINT uResource = 0;
  533. CString strInfo;
  534. CColorListBox * p_List = NULL;
  535. if(!pList)
  536. {
  537. p_List = &((CMiniMainDlg *)AfxGetMainWnd())->m_ListBox;
  538. }
  539. else
  540. {
  541. p_List = pList;
  542. }
  543. switch(ID) //根,服务器(加密),客户端(签名)
  544. {
  545. case 100:
  546. uResource = IDR_ROOT_CERT;
  547. strInfo = "根公钥";
  548. break;
  549. case 110:
  550. uResource = IDR_ROOT_KEY;
  551. strInfo = "根私钥";
  552. break;
  553. case 200:
  554. case 400:
  555. strInfo = "加密公钥";
  556. uResource = IDR_ENC_CERT;
  557. break;
  558. case 210:
  559. case 410:
  560. strInfo = "加密私钥";
  561. uResource = IDR_ENC_KEY;
  562. break;
  563. case 300:
  564. case 500:
  565. strInfo = "验证公钥";
  566. uResource = IDR_SIGN_CERT;
  567. break;
  568. case 310:
  569. case 510:
  570. strInfo = "签名私钥";
  571. uResource = IDR_SIGN_KEY;
  572. break;
  573. case 600:
  574. strInfo = "文件公钥";
  575. uResource = IDR_FILE_CERT;
  576. break;
  577. case 610:
  578. strInfo = "文件私钥";
  579. uResource = IDR_FILE_KEY;
  580. break;
  581. default:
  582. return FALSE;
  583. }
  584. if(!bInsideOnly && IsReg())
  585. {
  586. CFile file;
  587. CString m_CdbPath = GetAppPath() + "\CertDB.CDB";
  588. if(file.Open(m_CdbPath,CFile::modeRead))
  589. {
  590. for(;;)
  591. {
  592. stuCertDB CertDB;
  593. int len = file.Read(&CertDB,sizeof(stuCertDB));
  594. if(len==0)
  595. break;
  596. CString str;
  597. // if(CertDB._bUSED)//证书库中存在项目并且使用
  598. if(CertDB._uID == ID && CertDB._bUSED)//证书库中存在项目并且使用
  599. {
  600. //sCert = CertDB._chINFO;
  601. memcpy(sCert, CertDB._chINFO, CertDB._uLENGTH);
  602. dLen = CertDB._uLENGTH;
  603. sPwd = CertDB._chPWD;
  604. bExter = TRUE; //已经加载到了
  605. if(IsWindow(p_List->m_hWnd))
  606. {
  607. CString str;
  608. // str.Format("加载外部...",strInfo);
  609. str.Format("加载外部证书...",strInfo);
  610. p_List->AddMsg(str,M_WARING);
  611. break;
  612. }
  613. }
  614. }
  615. file.Close();
  616. }
  617. }
  618. if(!bExter) //没有加载到外部证书
  619. {
  620. HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(uResource),"CERT");
  621. dLen = SizeofResource(NULL, hRsrc); 
  622. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  623. memcpy(sCert, (LPSTR)LockResource(hgCert), dLen);
  624. if(IsWindow(p_List->m_hWnd))
  625. {
  626. CString str;
  627. // str.Format("加载内部%s...",strInfo);
  628. str.Format("加载内部证书...",strInfo);
  629. p_List->AddMsg(str,M_WARING);
  630. }
  631. }
  632. return TRUE;
  633. }
  634. //new 外部证书全部改为根证书,也就是可以在5各根证书中选择任何一个
  635. BOOL CMiniCaApp::GetRootCert(char * sCert, DWORD & dCertLen, char * sKey, DWORD & dKeyLen, CString & sPwd,
  636.  BOOL bInsideOnly, CColorListBox * pList)
  637. {
  638. BOOL bExter = FALSE;//外部
  639. UINT uResource = 0;
  640. CString strInfo;
  641. CColorListBox * p_List = NULL;
  642. if(!pList)
  643. {
  644. p_List = &((CMiniMainDlg *)AfxGetMainWnd())->m_ListBox;
  645. }
  646. else
  647. {
  648. p_List = pList;
  649. }
  650. if(!bInsideOnly && IsReg())
  651. {
  652. stuCertDB CertDB[10]; //zui多10各证书
  653. stuCertDB * pCertDB[10]; //指针数组 按顺序指向上面的证书 [0] -> 100, [1] -> 110 , [2] -> [200];
  654. // int len = sizeof(stuCertDB * [10]);
  655. memset(pCertDB, 0, sizeof(stuCertDB * [10]));
  656. int nIndex = 0;
  657. CFile file;
  658. CString m_CdbPath = GetAppPath() + "\CertDB.CDB";
  659. if(file.Open(m_CdbPath,CFile::modeRead))
  660. {
  661. for(nIndex = 0; ;nIndex++)
  662. {
  663. //由于保存证书的无序性,导致可能公鈅在后,私鈅在前,而且顺序也不一定是100,110,200,210
  664. int len = file.Read(&CertDB[nIndex], sizeof(stuCertDB));
  665. if(len==0)
  666. break;
  667. }
  668. file.Close();
  669. }
  670. //顺序排列指针
  671. for(int i = 0; i <= nIndex; i++)
  672. {
  673. switch(CertDB[i]._uID)
  674. {
  675. case 100:
  676. pCertDB[0] = &CertDB[i];
  677. break;
  678. case 110:
  679. pCertDB[1] = &CertDB[i];
  680. break;
  681. case 200:
  682. pCertDB[2] = &CertDB[i];
  683. case 210:
  684. pCertDB[3] = &CertDB[i];
  685. break;
  686. case 300:
  687. pCertDB[4] = &CertDB[i];
  688. break;
  689. case 310:
  690. pCertDB[5] = &CertDB[i];
  691. break;
  692. case 400:
  693. pCertDB[6] = &CertDB[i];
  694. break;
  695. case 410:
  696. pCertDB[7] = &CertDB[i];
  697. break;
  698. case 500:
  699. pCertDB[8] = &CertDB[i];
  700. break;
  701. case 510:
  702. pCertDB[9] = &CertDB[i];
  703. break;
  704. }
  705. }
  706. for(i = 0; i < 5; i++)
  707. {
  708. int j = i*2;
  709. if(pCertDB[j] && pCertDB[j+1]) //首先判断是否有效
  710. {
  711. if(pCertDB[j]->_bUSED && pCertDB[j+1]->_bUSED)//证书库中存在项目并且使用
  712. {
  713. //sCert = CertDB._chINFO;
  714. memcpy(sCert, pCertDB[j]->_chINFO, pCertDB[j]->_uLENGTH);
  715. dCertLen = pCertDB[j]->_uLENGTH;
  716. memcpy(sKey, pCertDB[j+1]->_chINFO, pCertDB[j+1]->_uLENGTH);
  717. dKeyLen = pCertDB[j+1]->_uLENGTH;
  718. sPwd = pCertDB[j+1]->_chPWD;
  719. bExter = TRUE; //已经加载到了
  720. if(IsWindow(p_List->m_hWnd))
  721. {
  722. CString str;
  723. CString strInfo;
  724. if(i == 0)
  725. strInfo = MiniCT_1801;
  726. else if(i == 1)
  727. strInfo = MiniCT_1806;
  728. else if(i == 2)
  729. strInfo = MiniCT_1807;
  730. else if(i == 3)
  731. strInfo = MiniCT_1808;
  732. else if(i == 4)
  733. strInfo = MiniCT_1809;
  734. str.Format("加载外部%s...", strInfo);
  735. p_List->AddMsg(str,M_WARING);
  736. }
  737. break;
  738. }
  739. }
  740. }
  741. }
  742. if(!bExter) //没有加载到外部证书
  743. {
  744. HRSRC hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_ROOT_CERT),"CERT");
  745. dCertLen = SizeofResource(NULL, hRsrc); 
  746. HGLOBAL hgCert = LoadResource(NULL,hRsrc);
  747. memcpy(sCert, (LPSTR)LockResource(hgCert), dCertLen);
  748. hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_ROOT_KEY),"CERT");
  749. dKeyLen = SizeofResource(NULL, hRsrc); 
  750. hgCert = LoadResource(NULL,hRsrc);
  751. memcpy(sKey, (LPSTR)LockResource(hgCert), dKeyLen);
  752. if(IsWindow(p_List->m_hWnd))
  753. {
  754. CString str;
  755. // str.Format("加载内部%s...",strInfo);
  756. str.Format("加载内部证书...",strInfo);
  757. p_List->AddMsg(str,M_WARING);
  758. }
  759. }
  760. return TRUE;
  761. }
  762. OsType CMiniCaApp::GetOsType()
  763. {
  764. OsType  ShellType;
  765. DWORD winVer;
  766. OSVERSIONINFO *osvi;
  767. winVer=GetVersion();
  768. if(winVer<0x80000000)
  769. {/*NT */
  770. ShellType=WinNT3;
  771. osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
  772. if (osvi!=NULL)
  773. {
  774. memset(osvi,0,sizeof(OSVERSIONINFO));
  775. osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
  776. GetVersionEx(osvi);
  777. if(osvi->dwMajorVersion==4L)ShellType=WinNT4;
  778. else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Win2000;
  779. else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WinXP;
  780. free(osvi);
  781. }
  782. }
  783. else if(LOBYTE(LOWORD(winVer))<4)
  784. ShellType=Win32s;
  785. else
  786. {
  787. ShellType=Win95;
  788. osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
  789. if (osvi!=NULL)
  790. {
  791. memset(osvi,0,sizeof(OSVERSIONINFO));
  792. osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
  793. GetVersionEx(osvi);
  794. if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Win98;
  795. else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WinME;
  796. free(osvi);
  797. }
  798. }
  799. return ShellType;
  800. }
  801. CImageList * CMiniCaApp::GetImgList()
  802. {
  803. return &m_ImgList;
  804. }
  805. CString CMiniCaApp::GetAppPath()
  806. {
  807. return m_AppPath;
  808. }
  809. BOOL CMiniCaApp::IsHpxs()
  810. {
  811. return m_bHpxs;
  812. }
  813. //--------------------------------------------------------------------------- 
  814. //函数输入Gb字符,返回Big5字符 
  815. //--------------------------------------------------------------------------- 
  816. CString CMiniCaApp::Gb2Big5(CString sGb) 
  817. char* pszGbt=NULL; //Gb编码的繁体字符 
  818. char* pszGbs=NULL; //Gb编码的简体字符 
  819. wchar_t* wszUnicode=NULL; //Unicode编码的字符 
  820. char* pszBig5=NULL; //Big5编码的字符 
  821. CString sBig5; //返回的字符串 
  822. int iLen=0; //需要转换的字符数 
  823. pszGbs = sGb.GetBuffer(0); //读入需要转换的字符参数 
  824. //计算转换的字符数 
  825. iLen = MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ; 
  826. //给pszGbt分配内存 
  827. pszGbt = new char[iLen*2+1]; 
  828. //转换Gb码简体到Gb码繁体,使用API函数LCMapString 
  829. int iSucceed = LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2); 
  830. //给wszUnicode分配内存 
  831. wszUnicode = new wchar_t[iLen+1]; 
  832. //转换Gb码到Unicode码,使用了API函数MultiByteToWideChar 
  833. iSucceed = MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen); 
  834. //计算转换的字符数 
  835. iLen = WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; 
  836. //给pszBig5分配内存 
  837. pszBig5 = new char[iLen+1]; 
  838. //转换Unicode码到Big5码,使用API函数WideCharToMultiByte 
  839. iSucceed = WideCharToMultiByte(950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ; 
  840. //返回Big5码字符 
  841. sBig5 = pszBig5; 
  842. //释放内存 
  843. delete [] wszUnicode; 
  844. delete [] pszGbt; 
  845. delete [] pszBig5; 
  846. return sBig5; 
  847. //---------------------------- 
  848. //函数输入Big5字符,返回Gb简体字符 
  849. //---------------------------- 
  850. CString CMiniCaApp::Big2Gb(CString sBig) 
  851.    char* pszBig5=NULL; //Big5编码的字符 
  852.    wchar_t* wszUnicode=NULL; //Unicode编码的字符 
  853.    char* pszGbt=NULL; //Gb编码的繁体字符 
  854.    char* pszGbs=NULL; //Gb编码的简体字符 
  855.    CString sGb; //返回的字符串 
  856.    int iLen=0; //需要转换的字符数 
  857.    
  858.    pszBig5=sBig.GetBuffer(0); //读入需要转换的字符参数 
  859.    
  860.    //计算转换的字符数 
  861.    iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ; 
  862.    //给wszUnicode分配内存 
  863.    wszUnicode=new wchar_t[iLen+1]; 
  864.    //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar 
  865.    MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);    
  866.    //计算转换的字符数 
  867.    iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; 
  868.    //给pszGbt分配内存 
  869.    pszGbt=new char[iLen+1]; 
  870.    //给pszGbs分配内存 
  871.    pszGbs=new char[iLen+1]; 
  872.    //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte 
  873.    WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; 
  874. //转换Gb码繁体到Gb码简体,使用API函数LCMapString 
  875.    LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen); 
  876.    
  877.    //返回Gb码简体字符 
  878.    sGb=pszGbs; 
  879.    
  880.    //释放内存 
  881.    delete [] wszUnicode; 
  882.    delete [] pszGbt; 
  883.    delete [] pszGbs; 
  884.    
  885.    return sGb; 
  886. BOOL CMiniCaApp::CharSetIsBig()
  887. {
  888. HDC hDc = GetWindowDC(NULL);
  889. int CharSet = GetTextCharset(hDc);
  890. ReleaseDC(NULL, hDc);
  891. m_bIsBig = (CharSet == CHINESEBIG5_CHARSET) ? TRUE : FALSE;
  892. return m_bIsBig;
  893. }
  894. BOOL CMiniCaApp::IsBig()
  895. {
  896. return m_bIsBig;
  897. }
  898. CString CMiniCaApp::NormalCode(CString strGb)
  899. {
  900. if(m_bIsBig) //繁体环境
  901. return Gb2Big5(strGb);
  902. else 
  903. return strGb;
  904. }
  905. CString CMiniCaApp::LmToHText(UCHAR * pValue, UINT uLen) //乱码转16进制
  906. {
  907. char * pBuf = new char[2*uLen+1];
  908. memset(pBuf, 0, 2*uLen+1);
  909. for(unsigned i=0; i<uLen; i++)
  910. {
  911. sprintf(pBuf+i*2,"%02X",pValue[i]);//02x标示1个16进制变为2个字符,空补零
  912. }
  913. CString str;
  914. str.Format("%s",pBuf);
  915. delete [] pBuf;
  916. return str;
  917. }
  918. UINT CMiniCaApp::HTextToLm(char * pValue,char * pOut) //16进制转乱码
  919. {
  920. UINT uLen = strlen(pValue);
  921. char temp[3]={0};//临时变量
  922. char * lm = new char[uLen];
  923. memset(lm,0,uLen);
  924. for(UINT j=0;j<uLen;j+=2)
  925. {
  926. strncpy(temp,pValue+j,2);
  927. lm[j/2]=HexToTen(temp);
  928. }
  929. memcpy(pOut,lm,uLen/2);
  930. delete [] lm;
  931. return uLen/2;
  932. }
  933. BOOL CMiniCaApp::IsXpStyle()
  934. {
  935. return m_ThemeHelper.IsAppThemed();
  936. }
  937. /*
  938. 1、建議把嚮導改成spy by sby 的形式導引...
  939. 2、建議加入選項設定的help查詢功能
  940. 3、提高編碼到4096或更高..因為現在的加密要求以非常要求
  941. 4、建議提供線上申請憑證機制。 
  942. 5、建議加入對目錄檔案做加密解密的功能...
  943. 6、建議獨立出一支開啟瀏覽加密後的文件檔的程式^^*/
  944. int CMiniCaApp::ExitInstance() 
  945. {
  946. // TODO: Add your specialized code here and/or call the base class
  947. // _CrtDumpMemoryLeaks(); // leak 内存泄漏检测 2 - 2
  948. m_ImgList.DeleteImageList();
  949. //以下某些东西可能会使程序发生异常,需要最后添加
  950. /* CRYPTO_cleanup_all_ex_data();
  951. ERR_remove_state(0);
  952. CONF_modules_unload(1);
  953. CONF_modules_free();
  954. ERR_free_strings();
  955. EVP_cleanup();*/
  956. return CWinApp::ExitInstance();
  957. }
  958. BOOL CMiniCaApp::PreTranslateMessage(MSG* pMsg) 
  959. {
  960. // TODO: Add your specialized code here and/or call the base class
  961. if (CSplashWnd::PreTranslateAppMessage(pMsg))
  962. {
  963.         return TRUE; //splash 3 -3 
  964.     }
  965. return CWinApp::PreTranslateMessage(pMsg);
  966. }
  967. BOOL WINAPI CMiniCaApp::MakeSureDirectoryPathExists(LPCTSTR pszDirPath)
  968. {
  969.     LPTSTR p, pszDirCopy;
  970.     DWORD dwAttributes;
  971.     // Make a copy of the string for editing.
  972.     __try
  973.     {
  974.         pszDirCopy = (LPTSTR)_tCharAlloc(lstrlen(pszDirPath) + 1);
  975.         if(pszDirCopy == NULL)
  976.             return FALSE;
  977.         lstrcpy(pszDirCopy, pszDirPath);
  978.         p = pszDirCopy;
  979.         //  If the second character in the path is "", then this is a UNC
  980.         //  path, and we should skip forward until we reach the 2nd  in the path.
  981.         if((*p == TEXT('\')) && (*(p+1) == TEXT('\')))
  982.         {
  983.             p++;            // Skip over the first  in the name.
  984.             p++;            // Skip over the second  in the name.
  985.             //  Skip until we hit the first "" (\Server).
  986.             while(*p && *p != TEXT('\'))
  987.             {
  988.                 p = CharNext(p);
  989.             }
  990.             // Advance over it.
  991.             if(*p)
  992.             {
  993.                 p++;
  994.             }
  995.             //  Skip until we hit the second "" (\ServerShare).
  996.             while(*p && *p != TEXT('\'))
  997.             {
  998.                 p = CharNext(p);
  999.             }
  1000.             // Advance over it also.
  1001.             if(*p)
  1002.             {
  1003.                 p++;
  1004.             }
  1005.         }
  1006.         else if(*(p+1) == TEXT(':')) // Not a UNC.  See if it's <drive>:
  1007.         {
  1008.             p++;
  1009.             p++;
  1010.             // If it exists, skip over the root specifier
  1011.             if(*p && (*p == TEXT('\')))
  1012.             {
  1013.                 p++;
  1014.             }
  1015.         }
  1016. while(*p)
  1017.         {
  1018.             if(*p == TEXT('\'))
  1019.             {
  1020.                 *p = TEXT('');
  1021.                 dwAttributes = GetFileAttributes(pszDirCopy);
  1022.                 // Nothing exists with this name.  Try to make the directory name and error if unable to.
  1023.                 if(dwAttributes == 0xffffffff)
  1024.                 {
  1025.                     if(!CreateDirectory(pszDirCopy, NULL))
  1026.                     {
  1027.                         if(GetLastError() != ERROR_ALREADY_EXISTS)
  1028.                         {
  1029.                             _tCharFree(pszDirCopy);
  1030.                             return FALSE;
  1031.                         }
  1032.                     }
  1033.                 }
  1034.                 else
  1035.                 {
  1036.                     if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
  1037.                     {
  1038.                         // Something exists with this name, but it's not a directory... Error
  1039.                         _tCharFree(pszDirCopy);
  1040.                         return FALSE;
  1041.                     }
  1042.                 }
  1043.  
  1044.                 *p = TEXT('\');
  1045.             }
  1046.             p = CharNext(p);
  1047.         }
  1048.     }
  1049.     __except(EXCEPTION_EXECUTE_HANDLER)
  1050.     {
  1051.         // SetLastError(GetExceptionCode());
  1052.         _tCharFree(pszDirCopy);
  1053.         return FALSE;
  1054.     }
  1055.     _tCharFree(pszDirCopy);
  1056.     return TRUE;
  1057. }