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核心编程&进程的更多相关文章

  1. Windows核心编程:第4章 进程

    Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...

  2. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  3. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  4. 回忆读windows 核心编程

    看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...

  5. 《Windows核心编程》第5版 学习进度备忘

    学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...

  6. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  7. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  8. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  9. windows核心编程-互斥器(Mutexes)

    线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了临界区线程同步-----windows核心编程-关键段(临界区)线程同步,这章我来介绍一下互斥器(Mutexes)在线程同步中的 ...

随机推荐

  1. Pyqt4的对话框 -- 预定义对话框

    QinputDialog提供了一种获取用户单值数据的简介形式. 它接受的数据有字符串.数字.列表中的一项数据 # QInputDialog 输入对话框 # 本示例包含一个按钮和一个行编辑部件.单击按钮 ...

  2. Python模块学习------ 多线程threading(2)

    一.避免使用thread模块,使用threading模块的原因: 1. 更高级别的threading模块更为先进,对线程的支持更加完善.而且使用thread模块的属性有可能会与threading 出现 ...

  3. 【数论】洛谷P1372又是毕业季

    题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...

  4. css的常用效果总结

    1.模糊遮罩效率,模糊滤镜效果 -webkit-filter: blur(3px); -moz-filter: blur(3px); -o-filter: blur(3px); -ms-filter: ...

  5. Django--进阶--中间件的使用

    - 中间件是什么? 中间件是一个钩子框架,它们可以介入Django 的请求和响应处理过程.它是一个轻量级.底层的“插件”系统,用于在全局修改Django 的输入或输出. 每个中间件组件负责完成某个特定 ...

  6. JIRA开启时间追踪并为问题记录工作日志

    在升级版的JIRA中(4.2or4.3),我们可以使用其记录工作日志的功能.之前研究了很长时间,就是找不到初始预估时间在哪里设置,但是剩余工作时间与耗费时间都可以填写.根据官网的帮助文档也没找到合适的 ...

  7. Flask源码流程剖析

    在此之前需要先知道类和方法,个人总结如下:  1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法 2.类是type创建,创建类时候type的__i ...

  8. HDU5447 Good Numbers

    http://acm.hdu.edu.cn/showproblem.php?pid=5447 网上好像只找到java的题解,写完就发一下c++代码咯,顺便纪念一下+存个int128板子 做法可以看tj ...

  9. 【Java学习笔记之八】JavaBean中布尔类型使用注意事项

    JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...

  10. Kafka入门介绍

    1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...