《Windows核心编程》进程

本文聚焦于深入解析Windows核心编程的概念,特别是进程管理的相关知识。详细介绍了进程的构成、内核对象与地址空间的关系,以及如何通过WinMain、GetModuleHandle等API进行进程操作。同时,阐述了环境变量的获取与设置方法,以及进程的错误模式与驱动器目录的管理。旨在为读者提供全面的Windows核心编程入门指南。

《Windows程序设计》先放下了,不知道为什么,看不下去了,后面的感觉不是那么重要。

开始了《Windows核心编程》。


《Windows核心编程》进程
可以说是读书笔记吧,怎么样从书中提取到对自己有用的东西,是一门学问,本人正在学习中,写的不好,大家见谅。

一般将进程定义为一个正在运行的程序的实例,它由以下两部分构成:
1、一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。
2、一个地址空间,其中包括所有可执行文件或DLL模块的代码和数据。此外,还包含动态内存分配,比如线程堆栈和堆的分配。
实际执行程序的是进程内的线程。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PTSTR szCmdLine,int iCmdShow);
hInstance是一个实例句柄,一般常用于加载资源。hInstance实际是一个内存基地址。

HMODULE GetModuleHandle(LPCTSTR lpModuleName);
获取一个应用程序或动态链接库的模块句柄。其实也是一个地址。
前提:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。

LPVOID p=GetEnvironmentStrings();为当前进程返回系统环境变量
FreeEnvironmentStrings(p);释放系统环境变量
可以使用下面代码的输出看一下:
    LPWCH p=GetEnvironmentStrings();
    printf("%S\n",p);
    FreeEnvironmentStrings(p);
    
DWORD GetEnvironmentVariable(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nSize);
判断一个环境变量是否存在,并获取它的值。

void PrintfEnvironmenVariable(PCTSTR pszVariableName)
{
    PTSTR pszValue=NULL;
    DWORD dwResult=GetEnvironmentVariable(pszVariableName,pszValue,0);
    if(dwResult!=0)
    {
        DWORD size=dwResult*sizeof(TCHAR);
        pszValue=(PTSTR)malloc(size);
        GetEnvironmentVariable(pszVariableName,pszValue,size);
        _tprintf(TEXT("%s=%s\n"),pszVariableName,pszValue);
        free(pszValue);
    }
    else
    {
        _tprintf(TEXT("'%s'=<unknown value>\n"),pszVariableName);
    }
}

添加一个变量,删除一个变量,或者修改一个变量,pszValue为NULL,则从环境块中删除。
BOOL SetEnvironmentVariable(PCTSTR pszName,PCTSTR pszValue);

进程的错误模式:
与每个进程都关联了一组标志,这些标志的作用是让系统知道进程如何响应严重错误,包括磁盘介质错误、未处理的异常、文件查找错误以及数据对齐错误等。
进程可以调用SetErrorMode来告诉系统如何处理这些错误。
UINT SetErrorMode(UINT fuErrorMode);
默认情况下,子进程会继承父进程的错误模式标志。

进程当前所在的驱动器和目录,可以使用下面两个函数来获取和设置其所在进程的当前驱动器和目录。
WinDef.h文件中被定义为260的常量MAX_PATH是目录名称或文件名称的最大字符数,一般使用MAX_PATH。
DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);
nBufferLength 缓冲区的长度;lpBuffer 指定一个预定义字串,用于装载当前目录;
调用成功 返回装载到lpBuffer的字节数,如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度。
BOOL SetCurrentDirectory(PCTSTR pszCurDir);切换当前进程的当前工作目录。

系统版本:
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO *)&os);//调用GetVersionEx函数OSVERSIONINFOEX结构必须将指针类型强制转换

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值