Windows核心编程(四)进程的创建与终止

1、进程是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构。操作系统内核通过它管理进程,即进程控制块(PCB)。

进程一般被定义为一个正在运行的程序的一个实例,它由两部分组成:

1)内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。

2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,还包括动态内存分配,比如线程堆栈和堆的分配。

进程是有惰性的,进程要做任何事情,必须让一个线程在它的上下文中运行。该线程负责执行进程地址空间包含的代码。每个线程都有它自己的一组CPU寄存器和它自己的堆栈。

2、Windows支持两种类型的应用程序:GUI程序和CUI程序。

前者是我们经常接触的,具有窗口外观的窗口应用程序。后者是控制台应用程序。在使用vc来开发应用程序时,会设置各种链接器开关。链接器根据这些开关将子系统的正确类型嵌入最终生成的可执行文件。对于CUI程序这个开关是/SUBSYSTEM:CONSOLE。对于GUI程序,则是/SUBSYSTEM:WINDOWS。这些开关会告诉链接器在链接时链接什么入口函数。对于GUI程序它的入口点函数时WinMain,CUI程序是main。


3、在入口点函数之前还有一个被称为启动函数的函数。该函数用来初始化C/C++运行库、构造全局和静态的C++对象等。根据应用程序类型的不同,启动函数也不一样。

ANSI字符集下,GUI程序的启动函数是WinMainCRTStartup,入口函数是WinMain。CUI的启动函数是mainCRTStartup,入口函数是main。Unicode字符集下,GUI程序的启动函数是wWinMainCRTStartup,入口函数是wWinMain,CUI的启动函数是wmainCRTStartup,入口点函数时wmain。

Int WINAPI _tWinMain(
       HINSTANCE  hInstanceExe,
       HINSTANCE,
       PTSTR  pszCmdLine,
       int  nCmdShow );
int _tmain (
    int argc,
    TCHAR  *argv[],
    TCHAR  *envp[] );

我们在写控制台下的应用程序时,可以通过argv来引用命令行参数,这都是启动函数的功劳。它会在进入入口函数之前帮我们做其他工作:

1)获取命令行指针。

2)获取指向环境变量的指针

3)初始化C/C++运行库的全局变量。

4)初始化C运行库内存分配函数。

5)调用所有全局和静态C++类对象的构造函数。

完成所有这些工作后,启动函数就会调用应用程序的入口点函数。入口点函数返回后启动函数获得入口点函数返回值,并将其传递给C运行库函数exit。Exit函数将调用所有全局和静态C++类对象的析构函数和其他清理工作。然后将入口函数的返回值传递给ExitProcess函数,结束进程并设置返回值为退出代码。


4、进程实例句柄:

加载到进程地址空间的可执行文件或是DLL都有一个实例句柄。用以标识它在进程地址空间的位置。可执行文件的实例句柄被当做WinMain函数的第一个参数(hInstanceExe)传入。它实际上是一个内存基地址。系统将可执行文件的映像加载到进程地址空间中的这个位置。映像加载到哪个地址是由链接器决定的。不同的链接器使用不同的默认基地址。exe文件和dll都会有一个默认的首选基地址。exe文件是400000,dll是10000000。

为了获得一个可执行文件或dll文件被加载到进程地址空间的位置,可以使用GetModuleHandle函数。
HMODULE GetModuleHandle(PCTSTR pszModule);

它需要一个以/0结尾标示可执行文件或dll的名字字符串为参数。当传入NULL时,此时将会返回主调进程可执行文件的基地址,即使此时代码在一个dll文件中仍然是这样。如果此时代码在dll中执行,我们想何知道此时代码正在什么模块中运行,这可以通过GetModuleHandleEx得到。将GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS作为它的第一个参数,再将当前函数的地址作为它的第二个参数,函数执行完毕,最后一个参数将保存出入的函数所在dll的基地址。

总结:GetModuleHandle函数的两大特征:
1)它只检查主调进程的地址空间。
2)向其传递NULL值会返回进程的地址空间中的可执行文件的基地址。


5、进程的命令行:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值