Windows核心编程:第4章 进程

Github

https://github.com/gongluck/Windows-Core-Program.git

//第4章 进程.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "第4章 进程.h"

#include <shellapi.h>
#pragma warning(disable:4996)//GetVersionEx

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    HMODULE hModule = GetModuleHandle(nullptr);//获取主调进程的可执行文件的基地址(只检查主调进程的地址空间)
    HMODULE hMoudle2 = nullptr;
    GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPTSTR)wWinMain, &hMoudle2);//获取wWinMain所在模块的基地址,对于dll很有用的

    //获取模块路径
    TCHAR moudlename[_MAX_PATH] = { 0 };
    DWORD dret = GetModuleFileName(hMoudle2, moudlename, sizeof(moudlename));
    dret = GetLongPathName(moudlename, moudlename, sizeof(moudlename));

    TCHAR* cmdline = GetCommandLine();
    int argsnum = 0;
    PWSTR* ppArgv = CommandLineToArgvW(GetCommandLineW(), &argsnum);//切分命令行参数
    for (int i = 0; i < argsnum; ++i)
    {
        ppArgv[i];//第i个参数
    }
    HeapFree(GetProcessHeap(), 0, ppArgv);
    ppArgv = nullptr;

    LPTSTR envirstr = GetEnvironmentStrings();//获取完整的环境变量字符串
    FreeEnvironmentStrings(envirstr);
    envirstr = nullptr;

    //获取一个环境变量
    DWORD len = GetEnvironmentVariable(TEXT("一个环境变量名"), nullptr, 0);
    PTSTR pszvalue = new TCHAR[len];
    GetEnvironmentVariable(TEXT("一个环境变量名"), pszvalue, len);
    //扩展环境变量字符串
    len = ExpandEnvironmentStrings(pszvalue, nullptr, 0);
    PTSTR pszvalue2 = new TCHAR[len];
    ExpandEnvironmentStrings(pszvalue, pszvalue2, len);
    delete[] pszvalue2;
    delete[] pszvalue;
    pszvalue = nullptr;

    SetEnvironmentVariable(TEXT("一个环境变量名"), TEXT("1"));//添加or修改
    SetEnvironmentVariable(TEXT("一个环境变量名"), nullptr);//删除

    //工作目录
    len = GetCurrentDirectory(0, nullptr);
    PTSTR dir = new TCHAR[len];
    GetCurrentDirectory(len, dir);
    delete[] dir;
    dir = nullptr;

    dir = new TCHAR[_MAX_PATH];
    GetFullPathName(TEXT("Windows核心编程.sln"), _MAX_PATH, dir, nullptr);//不好用,但这个函数可以获取每个驱动器对应的当前目录~
    delete[] dir;
    dir = nullptr;

    //系统版本
    OSVERSIONINFOEX ver = { 0 };
    ver.dwOSVersionInfoSize = sizeof(ver);
    GetVersionEx((LPOSVERSIONINFO)&ver);

    //比较版本差异
    //构造一个版本
    OSVERSIONINFOEX osver = { 0 };
    osver.dwOSVersionInfoSize = sizeof(osver);
    osver.dwMajorVersion = 6;
    osver.dwPlatformId = VER_PLATFORM_WIN32_NT;
    //比较标记
    DWORDLONG condition = 0;
    VER_SET_CONDITION(condition, VER_MAJORVERSION, VER_EQUAL);//要求VER_MAJORVERSION相等
    VER_SET_CONDITION(condition, VER_MINORVERSION, VER_EQUAL);
    VER_SET_CONDITION(condition, VER_PLATFORMID, VER_EQUAL);
    //比较版本
    BOOL verret = VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, condition);//返回FALSE,用GetLastError查看原因

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SECURITY_ATTRIBUTES sap, sat;
    sap.nLength = sizeof(sap);
    sap.lpSecurityDescriptor = nullptr;
    sap.bInheritHandle = TRUE;//进程可继承
    sat.nLength = sizeof(sat);
    sat.lpSecurityDescriptor = nullptr;
    sat.bInheritHandle = FALSE;//线程不可继承
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    TCHAR processcmd[] = TEXT("README.TXT");
    BOOL bret = CreateProcess(TEXT("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE"), processcmd, &sap, &sat, TRUE/*新进程继承句柄*/, CREATE_SUSPENDED | NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &pi);
    //此时进程内核引用计数==2
    ResumeThread(pi.hThread);
    TerminateProcess(pi.hProcess, 10);//(异步)终止进程
    WaitForSingleObject(pi.hProcess, INFINITE);
    GetExitCodeProcess(pi.hProcess, &dret);//==1
    CloseHandle(pi.hProcess);//==0
    CloseHandle(pi.hThread);//==0

    //手动提升进程权限
    SHELLEXECUTEINFO sei = { sizeof(sei) };
    sei.lpVerb = TEXT("runas");//特权提升
    sei.lpFile = TEXT("NOTEPAD.EXE");
    sei.lpParameters = TEXT("README.TXT");
    sei.nShow = SW_SHOWNORMAL;
    sei.fMask = SEE_MASK_NOCLOSEPROCESS;//使返回进程句柄
    bret = ShellExecuteEx(&sei);

    //进程令牌
    HANDLE htoken = nullptr;
    bret = OpenProcessToken(sei.hProcess, TOKEN_QUERY, &htoken);
    TOKEN_ELEVATION_TYPE elevationtype;//获取启动类型
    bret = GetTokenInformation(htoken, TokenElevationType, &elevationtype, sizeof(elevationtype), &len);
    CloseHandle(htoken);
    htoken = nullptr;

    bret = CloseHandle(sei.hProcess);//SEE_MASK_NOCLOSEPROCESS

    system("pause");
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 基于用户管理恢复的处理

Oracle支持多种方式来管理数据文件的备份与恢复来保证数据库的可靠与完整。除了使用RMAN工具以及第三方备份与恢复工具之外,基于

492
来自专栏乐沙弥的世界

Oracle AWR管理与维护

  AWR是Automatic Workload Repository的简称,中文叫着自动工作量资料档案库。对于AWR的管理,主要是针对快照和基线的管理而言。比...

890
来自专栏乐沙弥的世界

Oracle OWI 等待事件视图(v$session_wait/v$session_event/v$system_event)

    通常情况下,用户提交一条SQL语句,总会存在这样或那样的等待事件。也就是说由于所需资源被占用导致进程不得不处于等待状态。Oracle为我们提供了获取这些...

793
来自专栏乐沙弥的世界

delete archivelog all 无法彻底删除归档日志?

    最近在因归档日志暴增,使用delete archivelog all貌似无法清除所有的归档日志,到底是什么原因呢?

711
来自专栏我的博客

Sqlite使用说明

安装apt-get install slqite .databases List names and files of attached databases(列...

3314
来自专栏沃趣科技

Oracle Data Guard Feature 12cR2系列(一)

Data Guard是Oracle推出的一种高可用性数据库方案,从Oracle 9i开始正式更名为Oracle Data Guard。Data Guard在11...

1424
来自专栏沃趣科技

ASM 翻译系列第三十三弹:REQUIRED_MIRROR_FREE_MB的含义

原作者:Bane Radulovic 译者: 陈亚军 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

36110
来自专栏Golang语言社区

【Go 语言社区】Go实现个留言本

一、分析 要实现这个下面是几个重要的东西。 1.数据库操作(go怎么操作数据库)、 2.输出js,css,图片等 3.html显示 ...

3609
来自专栏乐沙弥的世界

基于同一主机配置 Oracle 11g Data Guard

       Oracle Data Guard 为企业数据库提供了最有效和最全面的数据可用性、数据保护和灾难恢复解决方案。它集成管理、监视和自动化软件基础架构...

721
来自专栏Java学习123

powerdesigner 15 如何导出sql schema

2825

扫码关注云+社区