Windows核心编程&进程
1. 进程的定义
说白了进程就是一个正在运行的执行程序,包含内核对象和独立的地址空间,内核对象负责统计和管理进程信息,地址空间包括所有可执行文件或DLL
模块的代码和数据、动态内存分配(线程堆和栈的分配)
2. 应用程序启动入口点函数
/SUBSYSTEM:CONSOLE 对应_tmain(Main)或_tmain(Wmain)
/SUBSYSTEM:WINDOWS 对应_tWinMain(WinMain)或_tWinMain(wWinMain)
上面4个启动函数的用途:
a. 获取指向新进程的完成命令行的指针
b. 获取指向新进程的环境变量的指针
c. 初始化C/C++运行库的全局变量,如果包含了StdLib.h,我们的代码可以访问这些变量
_osver/_winmajor/_winminor/_winver/_argc/_argv(_wargv)/_envion(_wenvion)/_pgmptr(_wpgmptr)
d. 初始化C运行库内存分配函数(malloc和calloc)和其他底层I/O例程使用的heep
e. 调用所有全局和静态C++类对象的构造函数
3. 进程实例句柄(HINSTANCE或HMODULE)
实际值是一个基地址,如何知道一个可执行文件或DLL文件被加载到进程地址空间的什么位置:
使用HMODULE GetMoudleHandle(PCTSTR pszMoudle)函数,传入文件名。如果传入的文件名为NULL,返回主调进程的可执行文件基地址
如果调用GetModileHandle(NULL)的代码在DLL中,返回值是可执行文件的基地址而不是DLL文件基地址
注:使用编译器提供的伪变量_ImageBase指向当前正在运行的模块的基地址可以帮助我们知道DLL正在什么模块中运行
4. 进程的环境变量
(1) 要注意环境块中的字符串会包含“=::=::\....”或“=”开头的,这种字符串不作为环境变量使用
(2) 当前进程环境变量可通过_tmain函数的第三个参数TCHAR *env[]获得,以等号开头的那些无效字符串在接收到env之前就以前被移除
void DumpEnvironment(TCHAR **pEnv) { TCHAR **pElement = NULL; pElement = pEnv; TCHAR * pCurrent = NULL; ; while (pElement != NULL) { pCurrent = *pElement; if (NULL == pCurrent) { cout << "没有更多的环境变量了" << endl; } else { _tprintf_s(_T("[%u] %s\r\n"), nCount, pCurrent); } nCount ++; pElement ++; } }
(3) 等号用于分割名称和值,注意空格是有意义的
(4) 可替换字符串的使用,如%USERDDDDDDD%\Fate
5. 进程当前所在的驱动器和目录
(1) DWORD GetCurrentDirectory(DWORD cchCurDir, PTSTR pszCurDir)
如果提供的缓存区不够大,将返回路径的长度包括‘\0’,若要知道确切的长度可以将缓冲区设为NULL
如果调用成功,返回的长度将不包括‘\0’
(2) MAX_PATH 文件中定义为260
6. 当主线程的入口点函数返回时,会返回到C/C++的运行库代码,后者将正确清理进程使用的全部C运行时资源。释放了C运行时资源之后,C运行时
启动代码将显示的调用ExitProcess,并将入口点函数的返回值传递给它。这就说明只需要从主线程的入口点函数返回,就会终止整个进程
7. 进程内核对象的声明周期大于等于进程生命周期,当一个进程终止的时候如果系统中还有另一个进程打开了这个进程的内核对象的句柄,那么进程内
核对象的使用计数不会为0,那么他们就不会被销毁
8. 理解CloseHead的实际作用和意义
附录:
(1) int _tmain(int argc, TCHAR *argv[]);
如果需要访问进程的环境变量,可以写成:
int _tmain(int argc, TCHAR *argv[], TCHAR *env[]);
(2) GetModuleHandle
(3) GetModuleHandleEx
(4) 宏UNREFERENCED_PARAMETER(hPrevInstance)
(5) PTSTR GetCommand();
返回一个缓存区指针,缓存区中包含完整的命令行(其中还包含已执行文件的完整路径名)
(6)GetEnvironmentVariable
判断一个环境变量的值是否存在,存在的话值为多少
(7) ExpandEnvironmentStrings
(8) SetEnvironmentVariable
添加、修改和删除一个变量
Windows核心编程&进程的更多相关文章
- Windows核心编程:第4章 进程
Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- 回忆读windows 核心编程
看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...
- 《Windows核心编程》第5版 学习进度备忘
学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
- windows核心编程-互斥器(Mutexes)
线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了临界区线程同步-----windows核心编程-关键段(临界区)线程同步,这章我来介绍一下互斥器(Mutexes)在线程同步中的 ...
随机推荐
- VMware仅主机模式虚拟机无法ping通物理机
问题描述 在VMware Workstation中新建了一个虚拟机CentOS7,网络适配器选择的是"仅主机模式",结果,物理机ping不通虚拟机,虚拟机也ping不通物理机. 原 ...
- OLEDB数据源
title: OLEDB数据源 date: 2018-01-12 21:42:37 tags: [OLEDB, 数据库编程, VC++, 数据库] categories: windows 数据库编程 ...
- rjs 合并压缩完 js 后 js 不压缩的问题
线下用 requirejs 开发完后,代码上线前要用 rjs 将多个有依赖关系的 js 文件压成一个,然后某天居然发现压成一个的 js 文件,没有压缩!!!几万行的 js!!! 很显然,是 uglif ...
- Python 集合 深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- 初识mysql学习笔记
使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...
- 前端请求参数MD5加密校验,参数串解密
首先引入MD5加密库:=>https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js; 步骤:=>1.请求前对参数进行字典升序排序,排 ...
- [翻译]QT core wallet manual 狗狗币核心钱包使用教程
译注:比特币没赶上可以玩狗狗币啊,水电厂包不起可以用CPU挖啊.为了顺应时代潮流,了解一下区(fa)块(heng)链(cai)和加密货币技术,准备从研究狗狗币开始.网上找了一圈没有看到很好的入门级教程 ...
- flask-sqlalchemy基本操作数据库
# -*- coding: utf-8 -*- from sqlalchemy.ext.declarative import declarative_base from sqlalchemy impo ...
- List集合及新特性引用
ArrayList就是动态数组,也是一个对象. 创建一个ArrayList对象,该对象存放在堆内存中,且是一个内存连续的内存区域. 1.ArrayList是用数组实现的,这个数组的内存是连续的,不存在 ...
- 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路
这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...