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核心编程》之“Windows挂钩”(三)

本文主要结合之前两篇介绍的“Windows挂钩”知识,讲解《Windows核心编程》一书中的“DIPS"示例程序和我的调试经验。 一、程序功能介绍 1,功能需求     DIPS.exe应用程序使...
  • Sagittarius_Warrior
  • Sagittarius_Warrior
  • 2016年08月12日 14:56
  • 570

WINDOWS核心编程之进程(二)

我爱北京天安门 天安门上太阳升 伟大领袖毛主席 指引我们向前进 2004年7月14日  晚20:30 ...
  • carbon107
  • carbon107
  • 2004年07月14日 20:57
  • 1524

<windows核心编程>动态链接库(一)

自出版Windows操作系统以来,动态链接库(DLL)一直是这个操作系统的基础。Windows API中所有的函数都包含在DLL中,3个最重要的DLL是 Kernel32.dll:它包含用于管理内存、...
  • u012307430
  • u012307430
  • 2014年02月12日 00:34
  • 611

《Windows核心编程》之“Windows挂钩”(二)

本文接上篇,继续探讨“Windows挂钩”,包括:跨进程的“窗口子类化”,使用Windows Hook注入DLL,跨进程窗口通讯,进程间共享内存和示例程序调试总结。...
  • Sagittarius_Warrior
  • Sagittarius_Warrior
  • 2016年08月11日 16:54
  • 410

《Windows核心编程》之“Windows挂钩”(一)

《Windows核心编程》一书中介绍了一种针对带窗口的Windows应用程序的“DLL注入”的方法——Windows Hook(窗口挂钩)。本系列文章将探讨这种技术的原理和分享我的实验心得。...
  • Sagittarius_Warrior
  • Sagittarius_Warrior
  • 2016年08月11日 15:27
  • 897

Windows核心编程(十八)DLL基础

DLL全称dynamic linking library。即动态链接库。广泛应用与windows及其他系统中。   windows中所有API都包含在DLL中。三个最重要的DLL是Kernel3...
  • woshibendangao
  • woshibendangao
  • 2014年04月06日 12:18
  • 880

Windows核心编程:(二)进程

一,一般将进程定义成一个正在运行的程序的一个实例,有以下两部分构成: (1)一个内核对象,操作系统用它来管理进程。 (2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据,还包含动态内...
  • Windows_and_Linux
  • Windows_and_Linux
  • 2015年03月11日 11:18
  • 257

《Windows核心编程》读书笔记二十章 DLL高级技术

第二十章 DLL高级技术 本章内容 20.1 DLL模块的显示载入和符号链接 20.2 DLL的入口点函数 20.3 延迟载入DLL 20.4 函数转发器 20.5 已知的DLL 20.6 DLL重定...
  • sesiria
  • sesiria
  • 2017年12月18日 10:29
  • 125

Windows核心编程之线程内幕

1.线程内核对象(操作系统接口CreateThread内部实现) 2.线程数据块_tiddata(C/C++运行时库的实现 _beginthreadex与_beginthread) 3.线程结束_...
  • supreme_24
  • supreme_24
  • 2016年04月27日 21:21
  • 352

windows程序设计学习笔记--动态链接库

动态链接库是包含许多函数的独立文件,这些函数可以被应用程序和其他DLL调用以完成某些特定的工作。 一个动态链接库只有在另一个模块调用其包含的函数时,才被启动。动态链接:程序运行时,把模块中函数调用链...
  • x13262608581
  • x13262608581
  • 2016年07月24日 10:29
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WINDOWS核心编程之进程(二)
举报原因:
原因补充:

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