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;
}
Windows核心编程:第4章 进程的更多相关文章
- Windows核心编程 第四章 进程(上)
第4章 进 程 本章介绍系统如何管理所有正在运行的应用程序.首先讲述什么是进程,以及系统如何创建进程内核对象,以便管理每个进程.然后将说明如何使用相关的内核对象来对进程进行操作.接着,要介绍进 ...
- windows核心编程---第四章 进程
上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构.操作系统内核通过 ...
- Windows核心编程 第四章 进程(下)
4.3 终止进程的运行 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回(最好使用这个方法) . • 进程中的一个线程调用E x i t P r o c e s s函数(应该避免 ...
- Windows核心编程 第四章 进程(中)
4.2 CreateProcess函数 可以用C r e a t e P r o c e s s函数创建一个进程: BOOL CreateProcessW( _In_opt_ LPCWSTR lpAp ...
- windows核心编程 第5章job lab示例程序 解决小技巧
看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里” 用process explorer程序查看 ...
- windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程 第27章 硬件输入模型和局部输入状态
第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...
- Windows核心编程 第十七章 -内存映射文件(下)
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...
随机推荐
- html中 和空格的区别
Non-Breaking Space 注意是 这6个字符是一个整体, 在html中, 是空格的占位符.一个 代表一个空格:两个 代表两个空格,即使用几个 就显示几个空格. 但是普通的空格在h ...
- ubuntu14上安装nltk
安装nltk 1)在buntu终端命令键入:wget https://bootstrap.pypa.io/ez_setup.py,下载ez_setup.py. 2)下载完成后后,键入:sudo py ...
- 【Game】2048小游戏
每个男孩都有一个游戏梦吧,本例简单讲述一款很火的游戏<2048>的制作. 本例参考地址:https://www.imooc.com/learn/76 游戏准备 1.游戏的逻辑(2048大家 ...
- Linux上安装java+tomcat+mysql运行环境
centos6.5jdk"1.7.0_79"mysql5.6apache-tomcat-7.0.53 安装jdk:1.先到oracle下载rpm包:jdk-7u80-linux-x ...
- Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用
Eventlog Analyzer日志管理系统.日志分析工具.日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设 ...
- GO介绍,环境的配置和安装 简单使用
1. 介绍与安装 Golang 是什么 Go 亦称为 Golang(按照 Rob Pike 说法,语言叫做 Go,Golang 只是官方网站的网址),是由谷歌开发的一个开源的编译型的静态语言. Gol ...
- 【转】Centos yum 换源
[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...
- R入门(一)
简单的算术操作和向量运算 向量赋值:函数c( ),参数可以是一个或多个数,也可以是向量 赋值符号‘<-’ 向量运算:exp(),log(),sin(),tan(),sqrt(),max(),mi ...
- JAVA遇上HTML-----JSP 篇基本概念
Java Web简介 1.什么是WEB应用程序: Web应用程序是一种可以通过Web访问的应用程序.Web应用程序的一个最大好处是用户很容易访问应用程序.用户只需要有浏览器即可,不需要再安装其他软件. ...
- 微信小程序使用三元表达式切换图片
1.data里定义切换图片的地址和切换的标识 data:{ show:true, yes:"http://101.89.144.168:9090//files/jk/yd/images/in ...