// windows程序分析工具Dlg.cpp : 实现文件 // #include "stdafx.h" #include "windows程序分析工具.h" #include "windows程序分析工具Dlg.h" #include "afxdialogex.h" #include "MyTabCtrl.h" #include "DLG_Process.h" #include "DLG_Window.h" #include <commctrl.h> #ifdef _DEBUG #define new DEBUG_NEW #endif //HWND g_hWnd; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // Cwindows程序分析工具Dlg 对话框 Cwindows程序分析工具Dlg::Cwindows程序分析工具Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Cwindows程序分析工具Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void Cwindows程序分析工具Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); // DDX_Control(pDX, IDC_TAB1, m_ctrlTab); DDX_Control(pDX, IDC_TAB1, m_ctrlTab); } BEGIN_MESSAGE_MAP(Cwindows程序分析工具Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_UAC, &Cwindows程序分析工具Dlg::OnBnClickedButtonUac) END_MESSAGE_MAP() // Cwindows程序分析工具Dlg 消息处理程序 BOOL Cwindows程序分析工具Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //button_UAC(m_hWnd); m_ctrlTab.InsertTab(2,L"窗口", L"进程"); m_ctrlTab.AddDlg(2, IDD_DLG_Window,new CDLG_Window, IDD_DLG_Process, new CDLG_Process); m_ctrlTab.SetSelAndShow(0); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void Cwindows程序分析工具Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void Cwindows程序分析工具Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR Cwindows程序分析工具Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } //void Cwindows程序分析工具Dlg::OnBnClickedButton1() //{ // // TODO: 在此添加控件通知处理程序代码 // button_UAC(m_hWnd); //} //************************************ // Method: button_UAC // FullName: Cwindows程序分析工具Dlg::button_UAC // Access: public // Returns: bool // Qualifier: UAC提示按钮 //************************************ bool Cwindows程序分析工具Dlg::button_UAC(HWND hWnd) { //1. 获得本进程的令牌 HANDLE hToken = NULL; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hToken)) { return false; } //2. 获取提升类型 TOKEN_ELEVATION_TYPE ElevationType = TokenElevationTypeDefault; BOOL bIsAdmin = false; DWORD dwSize = 0; if (GetTokenInformation(hToken,TokenElevationType,&ElevationType, sizeof(TOKEN_ELEVATION_TYPE),&dwSize)) { //2.1 创建管理员组的对应SID BYTE adminSID[SECURITY_MAX_SID_SIZE]; dwSize = sizeof(adminSID); CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,&adminSID,&dwSize); //2.2 判断当前进程运行用户角色是否为管理员 if (ElevationType==TokenElevationTypeLimited) { //a. 获取连接令牌的句柄 HANDLE hUnfilteredToken = NULL; GetTokenInformation(hToken,TokenLinkedToken,(PVOID)&hUnfilteredToken, sizeof(HANDLE),&dwSize); //b. 检查这个原始的令牌是否包含管理员的SID if (!CheckTokenMembership(hUnfilteredToken, &adminSID, &bIsAdmin)) return false; CloseHandle(hUnfilteredToken); } else { bIsAdmin = IsUserAnAdmin(); } CloseHandle(hToken); } //3. 判断具体的权限状况 BOOL bFullToken = false; switch (ElevationType) { case TokenElevationTypeDefault:/*默认的用户或UAC被禁用*/ if (IsUs[erAnAdmin()) bFullToken = true;//默认用户有管理员权限 else bFullToken = false;//默认用户不是管理员组 break; case TokenElevationTypeFull:/*已经成功提高进程权限*/ if (IsUserAnAdmin()) bFullToken = true;//当前以管理员权限运行 else bFullToken = false;//当前未以管理员权限运行 break; case TokenElevationTypeLimited:/*进程在以有限的权限运行*/ if (IsUserAnAdmin()) bFullToken = false;//用户有管理员权限,但进程权限有限 else bFullToken = false;//用户不是管理员组,且进程权限有限 } //4. 根据权限的不同控制按钮的显示 if (!bFullToken) Button_SetElevationRequiredState(::GetDlgItem(hWnd, IDC_UAC),!bFullToken); else ::ShowWindow(::GetDlgItem(hWnd, IDC_UAC), SW_HIDE); } void Cwindows程序分析工具Dlg::OnBnClickedButtonUac() { // TODO: 在此添加控件通知处理程序代码 //1. 隐藏当前窗口 ::ShowWindow(::GetDlgItem(m_hWnd, IDD_WINDOWS_DIALOG), SW_HIDE); //2. 获取当前程序路径 WCHAR szApplication[MAX_PATH] = {0}; DWORD cchLength = _countof(szApplication); QueryFullProcessImageName(GetCurrentProcess(), 0, szApplication, &cchLength); //3. 以管理员权限重新打开进程 SHELLEXECUTEINFO sei = {sizeof(SHELLEXECUTEINFO)}; sei.lpVerb = L"runas";//请求提升权限 sei.lpFile = szApplication;//可执行文件路径 sei.lpParameters = NULL;//不需要参数 sei.nShow = SW_SHOWNORMAL;//正常显示窗口 ShellExecuteEx(&sei); //if (ShellExecuteEx(&sei)) // ExitProcess(0); //else ::ShowWindow(::GetDlgItem(m_hWnd, IDD_WINDOWS_DIALOG), SW_SHOWNORMAL); } //提升为调试权限 //BOOL EnableDebugPrivilege(BOOL fEnable) //{ // BOOL fOk = FALSE; // HANDLE hToken; // //以修改权限的方式,打开进程的令牌 // if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) // { // //令牌权限结构体 // TOKEN_PRIVILEGES tp; // tp.PrivilegeCount = 1; // //获得LUID // LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid); // tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; // //修改权限 // AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL); // fOk = (GetLastError()==ERROR_SUCCESS); // CloseHandle(hToken); // } // return(fOk); //}