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 条评论
登录 后参与评论

相关文章

来自专栏Java学习123

powerdesigner 15 如何导出sql schema

3357
来自专栏沃趣科技

Oracle Data Guard Feature 12cR2系列(一)

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

1584
来自专栏乐沙弥的世界

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

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

781
来自专栏乐沙弥的世界

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

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

612
来自专栏沃趣科技

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

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

37610
来自专栏我的博客

Sqlite使用说明

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

3614
来自专栏技术点滴

黑客常用WinAPI函数整理

黑客常用WinAPI函数整理 之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Wi...

1936
来自专栏乐沙弥的世界

rman 还原归档日志(restore archivelog)

     听说过还原(restore)数据库,表空间及数据库文件,使用归档日志恢复(recover)数据库,表空间,数据库文件。咦,还有还原归档日志这一说法呢?...

1694
来自专栏乐沙弥的世界

RMAN catalog 的创建和使用

在存储恢复目录的数据库创建表空间用于存储恢复目录schema及恢复目录数据(本文使用已经创建好的数据库catadb来存储恢复目录)

962
来自专栏数据和云

数据恢复:隐含参数_minimum_giga_scn被废弃后如何调SCN

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 在很多数据恢复的场景中,我们可能需要调节SCN,但是一个重要的隐含参数...

30210

扫码关注云+社区

领取腾讯云代金券