Exemplo n.º 1
0
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
	CExceptionHandle::MapSEtoCE();
	try
	{
		// 在最开始需要进行初始化,否则可能会导致程序中的硬件id不一致.
		// 读取Hardware id
		InitHardwareId();

	}
	catch(CExceptionHandle eH)
	{
		g_strHardwareId = "NULL Can not get Hardware";
		eH.SetThreadName ("BKUI _tWinMain GetHardwareId Error");
		eH.RecordException ();
	}

	CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"读取了硬件ID");
	//判断gid的长度,如果不为32位,则补充为32位长度
	g_AppBranch.CheckHID();

	// 检测访问自身进程权限的句柄,如果限制访问,退出
	if(!g_AppBranch.CheckToken())
	{
		CRecordProgram::GetInstance()->FeedbackError(MY_PRO_NAME, MY_COMMON_ERROR, L"CheckToken错误");
		return 0;
	}
	if(wcslen(lpstrCmdLine) > 0)
	{
		WCHAR sLine[256] = {0};
		swprintf(sLine, 256, L"输入参数%s",lpstrCmdLine);
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, sLine);
	}

	if(_tcsncmp(lpstrCmdLine, _T("-renamechk"), 10) == 0)
	{
		g_AppBranch.RenameChk();
		return 0;
	}

	//注释掉该部分的支持,改为反馈处理,时间设置为5s超时
	//if (_tcsncmp(lpstrCmdLine, _T("-ifeedback"), 10) == 0)
	//{
	//	// 如果本地没有SN,生成一个SN并写入注册表,否则返回原有的SN
	//	CSNManager::GetInstance()->GetSN();

	//	//CUserBehavior::GetInstance()->BeginFeedBack();//!!!!!这个放在这里,创建反馈线程,否则有些消息反馈不回去
	//	CUserBehavior::GetInstance()->Action_Install(1);

	//	CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"安装反馈");
	//	//g_AppBranch.Install();
	//	//CUserBehavior::GetInstance()->CloseFeedBack();

	//	// 安装并启动驱动
	//	return 0;
	//}
	//else if (_tcsncmp(lpstrCmdLine, _T("-dfeedback"), 10) == 0)
	//{
	//	// 发送卸载程序的数据到服务器
	//	CUserBehavior::GetInstance()->Action_Uninstall(1);
	//	//CUserBehavior::GetInstance()->BeginFeedBack();
	//	CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"卸载驱动");
	//	// 卸载驱动
	//	//g_AppBranch.UnInstall();
	//	//CUserBehavior::GetInstance()->CloseFeedBack();
	//	return 0;
	//}


	setlocale(LC_ALL, "CHS");
	// 初始化
	CResourceManager::Initialize();
	if(_tcsncmp(lpstrCmdLine, _T("-startuac "), 10) == 0)
	{
		g_AppBranch.RunUAC(lpstrCmdLine);
		return 0;
	}

	if(_tcsncmp(lpstrCmdLine, _T("-ShellExecute "), 14) == 0)
	{
		g_AppBranch.Shell(lpstrCmdLine);
		return 0;
	}

	if(_tcsncmp(lpstrCmdLine, _T("-uac"), 4) == 0)
	{
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"启动了UAC");
		// 提升权限,进行驱动安装
		CListManager::Initialize(true);
		return 0;
	}

	//////////////////////////////////////////////////////////////////////////
	// 参数解析
	if (_tcsncmp(lpstrCmdLine, _T("-wait"), 5) == 0)
	{
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"延迟启动");
		Sleep(5000);//5s后重启财金汇
	}
	// IE内核进程
	else if (_tcsncmp(lpstrCmdLine, _T("-! "), 3) == 0)
	{
		// 启动内核进程
		CUserBehavior::GetInstance()->BeginFeedBack();//!!!!!这个放在这里,创建反馈线程,否则有些消息反馈不回去
		CHostContainer::GetInstance()->GetHostName(kFeedback);
		g_AppBranch.RunIECoreProcess(lpstrCmdLine);
		return 0;
	}

	// 安装驱动
	if (_tcsncmp(lpstrCmdLine, _T("-i"), 2) == 0)
	{
		// 如果本地没有SN,生成一个SN并写入注册表,否则返回原有的SN
		CSNManager::GetInstance()->GetSN();

		CUserBehavior::GetInstance()->Action_Install(1);
		//CUserBehavior::GetInstance()->BeginFeedBack();//!!!!!这个放在这里,创建反馈线程,否则有些消息反馈不回去

		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"安装驱动");
		g_AppBranch.Install();
		//CUserBehavior::GetInstance()->CloseFeedBack();

		// 安装并启动驱动
		return 0;
	}
	else if (_tcsncmp(lpstrCmdLine, _T("-upi"), 4) == 0)
	{
		// 如果本地没有SN,生成一个SN并写入注册表,否则返回原有的SN
		CSNManager::GetInstance()->GetSN();

		//CBankData::GetInstance()->UpdateDB();//新版本的安装要升级旧版本的数据库

		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"升级安装驱动");
		// 安装并启动驱动
		return g_AppBranch.Install();
	}
	// 卸载程序
	else if (_tcsncmp(lpstrCmdLine, _T("-d"), 2) == 0)
	{
		// 发送卸载程序的数据到服务器
		CUserBehavior::GetInstance()->Action_Uninstall(1);
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"卸载驱动");
		// 卸载驱动
		g_AppBranch.UnInstall();
		TerminateProcess(::GetCurrentProcess(), 0);
		return 0;
	}
	else if (_tcsncmp(lpstrCmdLine, _T("-upd"), 4) == 0 && wcslen(lpstrCmdLine) == 4)
	{
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"升级卸载驱动");
		// 卸载驱动
		return g_AppBranch.UnInstall();
	}
	// 清除用户信息,在内核进程中被调用
	else if (_tcsncmp(lpstrCmdLine, _T("-clean"), 6) == 0)
	{
		HANDLE hMutex = CreateMutexW(NULL, FALSE, L"UI_SECURITY_MUTEX");

		// 根据操作系统的版本来清除历史记录
		CleanHistoryMain();

		//if( hMutex )
			//::CloseHandle(hMutex);
		
		return 0;
	}

	// pop 调用,用来更改显示页
	if (_tcsncmp(lpstrCmdLine, _T("-agent"), 6) == 0)
	{
		wstring mail = lpstrCmdLine;
		mail = mail.substr(6, wstring::npos);
		if(g_AppBranch.PopSetPage(mail))
			return 0;
		CUserBehavior::GetInstance()->Action_ProgramStartup(kPopupWin);//Svr启动反馈
		// 错误代码写入到本地日志中
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"Svr启动财金汇");
	}
		//RunUAC();
	//重新生成黑名单
	//add by bh 2011 3 20 保护UI
	if (_tcsncmp(lpstrCmdLine, _T("-ncheck"), 7) != 0 &&  _tcsncmp(lpstrCmdLine, _T("-verchange"), 10) != 0)
	{
		g_AppBranch.GenerationBlackCache();
		//黑白名单由pop发送到驱动,故把该检测pop是否启动的位置提到最前,这样做才能解决UI进程被有道注入的问题
		if(!g_AppBranch.CheckPop(false)) // 检测Pop是否在运行中,如果pop没有运行那么就启动泡泡
		{
			g_AppBranch.CloseHandle();
			return 0;
		}
	}

	if (g_AppBranch.IsAlreadyRunning())
	{
		return 0;
	}

	if (_tcsncmp(lpstrCmdLine, _T("-ncheck"), 7) != 0 &&  _tcsncmp(lpstrCmdLine, _T("-verchange"), 10) != 0)
	{
		CProcessManager::_()->SetFilterId( 0 );
		CProcessManager::_()->SetFilterId( (UINT32)GetCurrentProcessId() );
	}
	
		g_strSkinDir = ::GetModulePath();
		g_strSkinDir += _T("\\Skin\\");

		::OleInitialize(NULL);

		// 初始化GDI对象
		Gdiplus::GdiplusStartupInput gdiplusStartupInput; 
		ULONG_PTR gdiplusToken;
		Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

		// 初始化CRichEditCtrl对象,并对其进行挂钩
		::AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
		::LoadLibrary(CRichEditCtrl::GetLibraryName());

		DoPatchRichEditHook();

		// 初始化皮肤显示
		CSkinLoader::Initialize();
		ThreadCacheDC::CreateThreadCacheDC();
		new CSkinManager();
		g_pSkin->RefreshAllSkins(false);

		// 安装时的安全检测,由于需要资源,所以要放在这个位置
		if (_tcsncmp(lpstrCmdLine, _T("-ncheck"), 7) == 0)
		{			
			g_AppBranch.CloseHandle();
			return  g_AppBranch.InstallCheck();
		}

		INT64 tBase = 129383136000000000;//s2,100纳秒为单位,格林尼治时间2011.1.1号和1601年之间的差值
		FILETIME tCurrent;
		GetSystemTimeAsFileTime(&tCurrent);
		INT64 tIntCur = tCurrent.dwHighDateTime * 0x100000000 + tCurrent.dwLowDateTime;//
		if(tIntCur < tBase)
		{
			mhMessageBox(NULL,L"检测到您的系统时间异常,您将无法使用财金汇,请修改您的系统时间后再运行财金汇",L"财金汇",MB_OK);
			return 1;		
		}

		if (_tcsncmp(lpstrCmdLine, _T("-verchange"), 10) == 0 && wcslen(lpstrCmdLine) == 10)
		{
			// 如果本地没有SN,生成一个SN并写入注册表,否则返回原有的SN
			CBankData::GetInstance()->InstallUpdateDB();//升级数据库

			// 安装并启动驱动
			return 0;
		}
		// 检查是否需要安装升级包
		if(!g_AppBranch.UpdateCheck())
		{
			g_AppBranch.CloseHandle();
			return 0;
		}
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"检查是否需要安装升级包");

		//////////////////////////////////////////////////////////////////////////
		//////////////////////////////////////////////////////////////////////////
		// gao 2010-12-16 将listmanager读取内核和UI数据分开
		CListManager::Initialize(false);
		CHostContainer::GetInstance()->GetHostName(kFeedback);
		CBankData::GetInstance()->CloseDB();
		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"初始化ListManager");		// 初始化全局变量
		// 等待IE内核进程退出
		int testtime = 0;
		while(g_AppBranch.CheckIECoreProcess() == true)
		{
			testtime ++;
			if(testtime > 15)
			{
				mhMessageBox(NULL,L"财金汇运行异常,请稍等后重新启动财金汇",L"财金汇检测",MB_OK);
				CRecordProgram::GetInstance()->FeedbackError(MY_PRO_NAME, MY_COMMON_ERROR, L"内核运行异常,关闭内核");

				// 这里应该增加关闭另一个进程的函数。
				//::TerminateProcess();
				g_AppBranch.TerminateIECore();
				g_AppBranch.CloseHandle();
				return 0;			
			}

			Sleep(2000);
		}

		//////////////////////////////////////////////////////////////////////////
		// Main Frame

		// 显示界面
		int nShowWindow = SW_SHOW;
		RECT rcWnd;
		DWORD dwMax = 0;
		//获得frame的大小和显示状态
		g_AppBranch.GetFramePos(nShowWindow,rcWnd,dwMax);

		// 安装时用于找窗口用的空窗口
		CSignalWnd* pSignalWnd = new CSignalWnd;
		HWND hSignalWnd = pSignalWnd->Create(NULL, CWindow::rcDefault);
	


#ifndef SINGLE_PROCESS
		// 安全检测
		if(!g_AppBranch.SecurityCheck())
		{
			g_AppBranch.CloseHandle();
			return 0;
		}

		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"通过安全检查");

#endif
		CUserBehavior::GetInstance()->BeginFeedBack();//!!!!!这个放在这里,创建反馈线程,否则有些消息反馈不回去
		//////////////////////////////////////////////////////////////////////////
		// 用户行为反馈(启动)
		if (_tcsncmp(lpstrCmdLine, _T(""), 1) == 0)
		{
			CUserBehavior::GetInstance()->Action_ProgramStartup(kDesktop);

			// 在本地记录错误日志
			CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"用户启动程序");
		}


		//////////////////////////////////////////////////////////////////////////

		g_AppBranch.RefreshCurrency();
#ifndef SINGLE_PROCESS
		// 开启定时检测挂钩和注册表的函数
		g_AppBranch.StartMonitor();
#endif

		//////////////////////////////////////////////////////////////////////////

		// 创建亲显示UI框架
		CMainFrame *pFrame = new CMainFrame();
		dwMax = 1;//启动最大化
		HWND hFrame = pFrame->Create(NULL, rcWnd, _T("财金汇"), (dwMax ? WS_MAXIMIZE : 0) | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN);

		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"财金汇界面启动");

		pFrame->ShowWindow(nShowWindow);
		pFrame->UpdateWindow();

		// 创建ie内核进程
		CProcessManager::_()->CreateProcess(pFrame->m_hWnd);

		//RunUAC();
		HOOKKEY::disablePrintKey();
	
 		HOOKKEY::installHook();// 安装键盘钩子
 		HOOKKEY::addNPB();

		//控制显示向导
		//g_AppBranch.CheckGuide(hFrame);去掉该显示功能

		CRecordProgram::GetInstance()->RecordCommonInfo(MY_PRO_NAME, MY_COMMON_PROCESS, L"财金汇界面消息");


		//消息循环
		MSG msg;
		while (::GetMessage(&msg, NULL, 0, 0))
		{
			if (msg.message == WM_KEYDOWN && msg.wParam == VK_TAB)
			{
				if (GetKeyState(VK_CONTROL) & 0x8000)
				{
					pFrame->FS()->pCate->ToggleItem();
					continue;
				}
			}

			::TranslateMessage(&msg);
			::DispatchMessage(&msg);
 			HOOKKEY::uninstallHook();
 			HOOKKEY::installHook();
		}

		//////////////////////////////////////////////////////////////////////////
		// 用户行为反馈(退出)


		CUserBehavior::GetInstance()->Action_ProgramExit();
		CUserBehavior::GetInstance()->CloseFeedBack();//关闭反馈线程
		// 在本地记录错误日志
		// 反馈过滤名单
		//////////////////////////////////////////////////////////////////////////

#ifndef SINGLE_PROCESS
		// 关闭检测
		g_AppBranch.StopMonitor();
#endif

		CleanHistoryMain(FALSE);


	try
	{
		OleUninitialize( );
		HOOKKEY::EnablePrintKey();
		g_AppBranch.CloseHandle();
	}
	catch(CExceptionHandle eH)
	{
		eH.SetThreadName ("BKUI _tWinMain Thread Error");
		eH.RecordException ();
	}
	return 0;
}