windows内核初识--2

1.进程内核对象

进程的定义:一个内核对象+一个地址空间。

进程与线程 :

  • 进程是惰性的,从来不做事。全部事情让线程做
  • 进程可以有一个或多个线程。
  • 进程一启动就自动创建一个线程,这个线程称为主线程。
  • 单CPU多线程同步运行,操作系统会轮询调度给每个线程调度时间,从而营造“并发”运行假象。多CPU则可以实现真正并发。

2.进程实例句柄

任何加载到进程地址空间中的可执行文件或者DLL文件都被赋予了一个实例句柄。 在Windows中有很多需要传入moudle的函数: DWORD WINAPI  GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename,  DWORD nSize  );

如何获得hModule句柄?

1.WinMain(HINSTACE  hInstan, …),main函数第一个参数就是当前进程的实例句柄.

2.传入NULL获取当前进程文件的全路径。

3.通过HMODULE GetModulehandle(PTCTSTR pszMoudle)获取加载到进程中的dll句柄。

4.通过函数地址获得当前module句柄 :

BOOL WINAPI GetModuleHandleExW(DWORD    dwFlags, LPCWSTR ModuleName, HMODULE* phModule ); 在dwFlags传入GET_MODULE_HANDLE_EX_FLAG_FROM_ADRESS标识,将当前函数地址作为第二个参数传入,即可获得当前链接库module.

3.进程命令行和环境变量

系统在创建进程时,会传一个命令行给进程,该命令行几乎总是非空的。

第一个标记总是用于创建该进程的可执行性文件名称。许多类型的应用程序会忽略该标记后传给主函数。例如C运行库执行GUI程序时。

可以通过GetCommoandLine()函数获取命令行,我们可以通过命令行实现进程间的通信。

进程环境变量

进程都有与之关联的环境块,由该进程分配的内存,用于存储环境变量,如下字符串:

用户登录Windows时,系统会创建外壳程序,并将一组环境字符串与之关联,主要通过如下注册表读取: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment HKEY_CURRENT_USER\Environment

修改电脑环境变量生效:

增加或改动环境变量,为了保证更改对所有应用程序生效,需要注销重新登录。

部分进程(资源管理器、任务栏等)可以接受WM_SETTINGCHANGE消息,可以发送该消息是指立即生效,如下: SendMessage(HWND_BROADCAST, WM_SETTINGCHAGE,0,TEXT(“Environment”))

进程环境变量的继承与修改

通常,子进程会集承父进程的环境变量,不过也可以在创建子进程时指定继承的环境变量。 我们平时创建的应用程序都是外壳进程的子进程,因此自动继承了“我的电脑的环境变量”。

因为环境变量是在进程内部分配的内存,因此我们可以再进程中修改环境变量,而不影响器父进程,windows函数如下: SetEnvironmentVariable(PTSCTR pszName, PCTSTR pszValue);

可以增加、修改或删除某个环境变量的值,删除时将pszValue设为NULL。

4.进程驱动器和目录

当前驱动器和目录:

操作系统内部记录着一个进程的当前驱动器和目录,可以通过GetCurrentDirectorySetCurrentDirectory()两个函数获取和设置当前目录。

进程的当前目录:

系统记录着进程的当前驱动器和目录,但是未记录各个驱动器的当前目录。

其通过进程的环境变量记录,例如一个进程可以有如下环境变量:

=C:=C:\Program Files =D:=D:\Aaa

上面表明进程在C盘下的当前目录为\Program Files,在D盘下的当前目录Aaa 。

举例: 当前进程当前目录为C:\Program Files,而我们调用CreateFile打开D:1.txt,那么系统就会查找环境变量=D:,如果该环境变量存在,且是Aaa那么就尝试打开D:\Aaa\1.txt,如果不存在该环境变量或不打开失败则尝试打开D盘根目录下的1.txt文件。

设置或获得指定盘符的当前目录

GetFullPathName(“C:”, MAX_PATH, szDir, NULL);

通过设置环境变量值或c运行库函数_chdir(),设置指定盘符的当前目录。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章