WINDOWS核心编程之进程(二)

原创 2007年09月16日 10:18:00
1.进程的实例句柄
加载到进程地址空间的每个可执行文件或DLL文件均被产生一个唯一的实例句柄,就是hinstExe参数.有些这个参数的类型为HMODULE类型,
注意:这两个类型是完全相同的对象。原因在于16位的Windows中,HMODULE和HINSTANCE用于标识不同的东西。
 
当你在vc的环境里的link里category选ouput有个base ,这标识着可执行文件的映像加载到的基地址.vc链接程序使用的默认基地址是0x00400000,这是最低地址,如果指定应确保在0x00400000或大于这个地址。
 
要得到这个地址的值可以用HMODULE GetModuleHandle(PCTSTR pszModule)函数处理。
pszModule就是可执行文件或dll文件的名字,返回就是加载到进程的基地址。如果设定此参数为NULL, 返回的就是可执行文件的基地址了。
注意:可执行文件映像的基地址与可执行文件的基地址的区别.
GetModuleHandle函数的两个重要特性
1.如果调用进程不使用常用的对话框函数,那么调用GetModuleHandle并为它传递:ComDlg32”后,就会返回NULL, 尽管ComDlg32.dll可能加载到了其它进程的地址空间.
2.如果GetModuleHandle(NULL)在dll中调用,返回的也是可执行文件的基地址,而不是DLL文件的基地址.
 
2.进程的命令行
要获得一个指向进程的完整命令行的指针,可以用GetCommandLine函数
GetCommandLine();
函数返回一个指向包含完整命令行的缓存的指针,是个完整路径名.
 
再介绍个函数CommandLineToArgv,它是将字符串分割成它的各个标记,比如argc,其返回一个字符串指针的数组
PWSTR CommandLineToArgv(PWSTR pszCmdLine, int* pNumArgs);
pNumArgs是整数地址,设置为命令行中参数的数目.
CommaneLineToArgv负责在内部分配内存,应用程序不释放该内存,它是在进程运行终止时由os来释放的,如果子自已来释放,应用HeapFree函数
 
3.进程的环境变量
每个进程都有一个与它相关的环境块.环境块是进程的地址空间中分配的一个内存块.每个环境块都包含一组字符串.
例如
VarName1 = VarValue1/0
VarName2 = VarValue2/0
………………………….
/0
注意
例如
XYZ= Windows
ABC=Windows
虽然XYZ与ABC有相同的值,但二者是不同的.
XYZ =Home
XYZ=Work
也是不同的,中间的空格区别了它们
Win98的环境变量写在了autoexec.bat里
Win2000中环境变量的名在
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SessionManager/Environment里
值写在了
HKEY_CURRENT_USER/Environment
只有拥有管理员的身份才可能对其进行修改。
使用DWORD GetEnvironmentVariable(PCTSTR pszName, PTSTR pszValue, DWORD cchValue);可以确定某个环境变量是否存在以及它的值。
第一个参数为名称,第二个为存放变量值的缓存, 第三个参数为缓存的大小(用字符数来表示)。
BOOL SetEnvironmentVariable(PCTSTR pszName, PCTSTR pszValue)修改与添加,删除变量,如果不存在pszName这样的变量就添加一个新的变量,如何存在就修改为pszValue。如果pszValue为NULL,就删除此变量。
 
4.进程的亲缘性
进程中的线程可以在主计算机中的任何一个CPU上执行。但是一个进程的线程可能被强制在可用CPU的子集上运行,这就叫进程的亲缘性。
 
5.进程的错误模式
UINT SetErrorMode(UINT fuErrorMode);
表要加上
CreateProcess里有一个参数指定了这个,使子进程错误如何处理
进程的当前驱动器和目录
如果调用CreateFile打开一个文件(不设定路径),那么系统就在当前驱动器和目录中查找该文件。用DWORD GetCurrentDirectory(DWORD cchCurDir, PTSTR pszCurDIr)可以得到
用BOOL SetCurrentDirectory(PCTSTR pszCurDir); 可以指定路径。
 
6.进程的当前目录
系统对进程的当前驱动器与目录保持跟踪,但它不跟踪每个驱动器的当前目录。这种支持是通过进程的环境字符串来提供的。例如进程有下面的两个环境变量。
=C:=C:/Utility/Bin
=D:=D:/Program Files
上面表示,驱动器C的进程的当前目录是/Utility/Bin, D的是/Program Files;
如果调用一个函数,传递一个驱动器全名,但不是当前的驱动器,那么系统就查看进程的环境块,找出与指定驱动器名相关的变量。如果存在,系统将该变量的值用作当前驱动器。如果不存在,系统将假设指定驱动器的当前目录是它的根目录。
例如进程的当前目录是C:/Utility/Bin,但调用CreateFile打开D:ReadMe.txt, 那么系统查看环境变量=D.如果=D存在,系统就从D:/Program File目录打开该ReadMe.txt文件。如果=D不存在,系统将从驱动器D的根目录来打开ReadMe.txt。
 
待续...............
 

相关文章推荐

《windows核心编程系列》四谈谈进程的建立和终止

http://blog.csdn.net/ithzhang/article/details/7927682转载请注明出处! 第二部分:工作机理 第一章:进程 上一章介...
  • ithzhang
  • ithzhang
  • 2012年08月31日 09:23
  • 10099

Windows核心编程学习笔记--进程和线程的优先级

线程调度、优先级和关联性  From:http://blog.csdn.net/drecik__/article/details/8095467     每个线程都有一个CONTEXT结构,保存在线...

windows 核心编程 笔记之 进程

发表时间:2013.5.18 内容:windows进程(process) 作者:郑金玮   如上图所示,windows任务管理器中的进程Tab列中列出了系统管理的所有进程,我们经常利用任务...

Windows核心编程学习笔记(15)--进程和线程与CPU的关联性

Drecik学习经验分享 转载请注明出处:http://blog.csdn.net/drecik__/article/details/8096253   默认情况下,Windows Vist或以...

基于visual c++之windows核心编程代码分析(63)无模块dll进程注射

我们在信息安全编程的时候经常需要进行dll进程注入,我们在编程中如何实现呢。需要引用Psapi.Lib,具体可以百度下载之。其头文件如下,odule Name: psapi.h Abstr...

《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限

 win7或者vista默认运行程序是在受限制的环境下运行的,以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在 管理员模式下运行。当然CreateProcess函数没有提...

Windows核心编程学习笔记(12)--线程与进程运行的时间

Drecik学习经验分享 转载请注明出处:http://blog.csdn.net/drecik__/article/details/8093724   如果是一般精度要求可以使用GetThre...

windows核心编程之进程&线程

在前一章总结内核对象时提到过进程内核对象和线程内核对象,但是对进程线程以及进程内核对象和线程内核对象在其中的意义还不是很清楚,下面就详细说说进程与线程,进程内核对象和线程内核对象,进程与进程内核对象,...

《Windows核心编程》——四 进程

前言     一般将进程定义为一个正在运行的程序的一个实例,它由两部分组成:     ①一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方     ②一个地址空间,其中...

Windows核心编程学习笔记(14)--进程和线程的优先级

Drecik学习经验分享 转载请注明出处:http://blog.csdn.net/drecik__/article/details/8095467   1. 进程优先级 Windows支...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WINDOWS核心编程之进程(二)
举报原因:
原因补充:

(最多只允许输入30个字)