windows核心编程2-------进程

1.进程:
        进程是一个正在运行的程序的实例,由两部分组成:一个是操作系统用来管理进程的内核对象,一个是地址空间,包含所有可执行模块或dll模块的代码和数据,还包含动态分配的内存空间,如线程堆栈和堆。
        进程是不活跃的,必须由线程来执行进程空间地址中的代码,每个线程都有它自己的一组CPU寄存器和自己的堆栈,每个进程至少有一个线程,如果没有线程执行进程空间地址的代码,进程就没有存在的意义了,系统会回收没有现成的进程。

2.windows应用程序和main函数:
       windows支持两种应用程序,一个是图形界面程序(GUI),一个是控制台用户界面程序(CUI),系统根据链接开关,来判定是那种类型的程序,如果链接开关室/SUBSYSTEM:CONDOLE表示CUI,如果是/SUBSYSTEM:WINDOWS是GUI程序,两种链接开关,间接决定应用程序启动时进入哪个进入点函数,进入点函数有4个:
        WinMain,wWinMain, main, wmain。如果设置了链接开关,GUI会找WinMain或wWinMain,如果是CUI找main或wmain,如果找不到对应的函数,就会报错,启动失败。如果灵活一点就不设置链接开关,应用程序会根据代码中的入口点函数,自动确定程序的类型。使用VS的同学可以在链接->系统->子系统中设置。

3.进程的实例句柄:
        研究下进程创建的流程:首先加载每个可执行文件(exe)或dll文件,这些文件都被赋予一个独一无二的实例句柄,系统分配实例句柄后,可以通过函数:HMODULE GetModuleHandle(OCTSTR pszModule):来获取实例句柄,这个实例句柄比较特殊,返回了系统将可执行文件的映像加载到进程地址空间时使用的基本地址空间,所以通过此函数可以获取加载的基地址。此函数的使用为传递要获取的可执行文件的名字,或者传递NULL,传递NULL表示要获取调用此代码的基地址。下面帖下代码:
windows核心编程2-------进程

4.进程的命令行:
       当一个新进程创建时,他要传递一个名两行,可以通过函数PTSTR GetCommandLine();获取该命令行。
5.进程环境变量:
        环境变量可以替代长字符创等,类似系统层面的define定义。每个进程都有一个与他有关的环境块,环境块是进程的地址空间中分配的一个内存块,一般都是a = b,中间=表示环境变量a用于表示b。

6.当前进程的目录:
        可以通过函数:DWORD GetCurrentDirectory( DWORD cchCurDir, PTSTR pszCurDir),获取当前目录

7.终止程序运行:
       a.通过主程序进入点函数返回,b.通过一个线程调用ExitProcess函数,c.另一个线程调用TerminateProcess函数。
       当进程终止运行时,下列操作将启动运行:
       1).进程中剩余的所有线程全部终止运行
        2).进程指定的所有用户对象和GDI对象均被释放,所有内核对象均被关闭,如果其他进程打开了这些句柄,那么内核对象不会撤销。
        3).进程的退出代码将从STILL_ACTIVE改为传递给ExitProcess或TeminateProcess的代码。
        4).进程内核对象的状态变成收到通知的状态。
        5).进程内核对象的使用计数减1.



                                                书籍引用:Windows核心编程