[笔记]Windows核心编程《三》进程

系列文章目录

[笔记]Windows核心编程《一》错误处理、字符编码
[笔记]Windows核心编程《二》内核对象
[笔记]Windows核心编程《三》进程
[笔记]Windows核心编程《四》作业
[笔记]快乐的LInux命令行《五》什么是shell
[笔记]Windows核心编程《五》线程基础
[笔记]Windows核心编程《六》线程调度、优先级和关联性
[笔记]Windows核心编程《七》用户模式下的线程同步
[笔记]Windows核心编程《八》用内核对象进行线程同步
[笔记]Windows核心编程《九》同步设备I/O和异步设备I/O
[笔记]Windows核心编程《十一》Windows线程池
[笔记]Windows核心编程《十二》纤程
[笔记]Windows核心编程《十三》windows内存体系结构
[笔记]Windows核心编程《十四》探索虚拟内存
[笔记]Windows核心编程《十五》在应用程序中使用虚拟内存
[笔记]Windows核心编程《十六》线程栈
[笔记]Windows核心编程《十七》内存映射文件
[笔记]Windows核心编程《十八》堆栈
[笔记]Windows核心编程《十九》DLL基础
[笔记]Windows核心编程《二十》DLL的高级操作技术
[笔记]Windows核心编程《二十一》线程本地存储器TLS
[笔记]Windows核心编程《二十二》注入DLL和拦截API
[笔记]Windows核心编程《二十三》结构化异常处理

进程

进程必须有一个线程

PrimaryThread 主线程

进程销毁

主线程的入口点函数返回 return(推荐)

进程的所有线程自然死亡(几乎不出现)
要么进程所有线程都调用ExitThread

调用ExitProcess 强制退出(不推荐)

在进程的一个子线程中调用ExitProcess,
缺陷:
ExitProcess 后的代码会无法执行,会有资源没有释放,因为c/c++运行库也许不能执行正确的清理工作,包括全局对象的析构和本地对象的析构。

在另一个进程调用TerminalProcess(不推荐)

在另一个进程的任意线程中调用TerminalProcess,传入被终止的进程handle。
缺陷:
被终止进程得不到终止的通知,进程得不到正确清理,也不能阻止它被强行终止,但是操作系统会在终止后彻底清理的,确保不会泄露任何操作系统资源(进程的 内存,文件,内核对象计数,用户对象,GDI对象都会被销毁)。

链接器子系统开关

将子系统的正确类型嵌入最终生成的可执行文件。

visitual studio中设置子系统方式:属性-》链接器-》子系统

/Subsystem:console 控制台程序 入口

_tmain(Main):处理ascii字符和字符串的CUI程序(控制台程序)
对应嵌入可执行文件的启动函数 mainCRTStartup

_tmain(wMain):处理Unicode字符和字符串的CUI程序(控制台程序)
对应嵌入可执行文件的启动函数 wMainCRTStartup

/Subsystem:Windows GUI程序 入口

_tWinMain(WinMain):处理ascii字符和字符串的GUI程序(图形化程序)
对应嵌入可执行文件的启动函数 WinMainCRTStartup

_tWinMain(wWinMain):处理Unicode字符和字符串的GUI程序(图形化程序)
对应嵌入可执行文件的启动函数 wWinMainCRTStartup

main函数运行生命周期

C运行时库函数

这些C运行时库函数,主要完成以下任务:

  1. 获取进程命令行指针;
  2. 获取进程环境变量指针;
  3. 初始化C/C++运行时库的全局变量,如果你包含了头Stdlib.h,那么你就可以访问这些变量!//errno这就是一个全局变量。_enrion这是环境变量指针
  4. 初始化malloc函数的内存堆;
  5. 为C++全局类,调用构造函数。

malloc 函数,不要轻易使用,因为这个函数一般来说,最终会调用windows API函数,我们直接调用virtualAlloc windowsAPI函数,效率会高!

main函数运行生命周期

Kenerl 调用XXXCRTStartup函数;
XXXCRTStartup函数调用main函数;
main函数退出;
exit函数被调用(真正调用的是crt0dat.c中的)

static void __cdecl doexit (
        int code,
        int quick,
        int retcaller
        )

这个函数主要做以下事情:
1.调用_onexit函数注册的所有函数;
2.调用C++销毁函数销毁所有的全局和静态类对象;
3.如果_CRTDBG_LEAK_CHECK_DF标志被设置,那么调用CrtDumpMemoryLeaks函数,列出泄露内存。
4.调用ExitProcess函数,系统杀死当前进程!

exit(0),ExitProcess,和TerminateProcess

获得系统

GetVersion() 获得版本号

#include <windows.h>
#include <stdio.h>

#include <VersionHelpers.h> 

void main()
{
    DWORD dwVersion = 0; 
    DWORD dwMajorVersion = 0;
    DWORD dwMinorVersion = 0; 
    DWORD dwBuild = 0;
    LPOSVERSIONINFOW lpVersionInformation;
    dwVersion = GetVersion();//GetVersionEx(lpVersionInformation);

    if (IsWindowsXPOrGreater()) {
        printf("Yes\n");
    };
	printf("%0x\n",dwVersion);
 
    // Get the Windows version.
	//一个子就是WORD;
	WORD Version=LOWORD(dwVersion);
	//dwVersion中,其地位字,
    dwMajorVersion = (DWORD)(LOBYTE(Version));
	//Version字的低字节代表大版本号
    dwMinorVersion = (DWORD)(HIBYTE(Version));
	//Version字的高字节代表小版本号

    // Get the build number.

    if (dwVersion < 0x80000000)              
        dwBuild = (DWORD)(HIWORD(dwVersion));
	//dwVersion的高位字,表示build号。

    printf("Version is %d.%d (%d)\n", 
                dwMajorVersion,
                dwMinorVersion,
                dwBuild);

	getchar();
}

CreateProcess函数

函数

BOOL CreateProcess
(
	LPCTSTR lpApplicationName,
	LPTSTR lpCommandLine,
	LPSECURITY_ATTRIBUTES lpProcessAttributes,
	LPSECURITY_ATTRIBUTES lpThreadAttributes,
	BOOL bInheritHandles,
	DWORD dwCreationFlags,
	LPVOID lpEnvironment,
	LPCTSTR lpCurrentDirectory,
	LPSTARTUPINFO lpStartupInfo,
	LPPROCESS_INFORMATIONlpProcessInformation
);

参数解释

运行流程

当一个应用程序调用(或最终结束于)某个进程创建函数,比如CreateProcess 、CreateProcessAsUser、CreateProcessWithTokenW或CreateProcessWithLogonW时,一个Windows子系统进程就被创建起来了

创建一个Windows进程的过程,是由操作系统的三个部分执行一系列步骤来完成的,这三个部分是:

  • 客户方的windows库Kernel32.dll(在CreateProcessAsUser、 CreateProcessWithTokenW.或CreateProcessWithLogonW的情况下时,部分工作是由Advapi32.dl先做的)
  • Windows执行体.
  • Windows子系统进程(Csrss)。
    下面的列表概括了在利用Windows的CreateProcess函数来创建一个进程时所涉及的主要阶段:
  1. 验证参数,转换Windows子系统标志和选项为对应的原生形式:解析、验证和转换属性列表为其原生形式。
  2. 打开将要在该进程中执行的映像文件(.exe)。
  3. 创建Windows执行体进程对象。
  4. 创建初始线程(栈、执行环境,以及Windows执行体线程对象)。
  5. 进行创建之后的、Windows子系统特有的进程初始化。
  6. 开始执行初始线程(除非指定了CREATE SUSPENDED标志)。
  7. 在新进程和线程的环境中,完成地址空间的初始化(比如加载必要的DL),并开始执行程序。

图5.6显示了Windows在创建一个进程时所遵从的步骤的总体情况:
在这里插入图片描述

NtCreateProcess函数

CreateUserProcess的更底层实现是该函数

总结

1.使用
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools
有一些工具 包括GuidGen.exe

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值