《windows 核心编程》学习笔记

 

1、为了使应用程序的执行更高效,占用更少内存,方便与 COM、.NET FRAMEWORK 集成,一开始就应该使用 Unicode 来开发程序,函数尽量用 W 版本

 

2、在使用 WinExec 和 OpenFile 的地方,应该用 CreateProcess 和 CreateFile 来代替,因为老函数不支持 Unicode 字符串,而且 windows库的老函数内部实现其实是调用了新函数,新函数功能也更多,C语言中的老函数则是“自力更生”。

 

3、字符串使用:

TCHAR/PTSTR -> 字符/字符串

BYTE/PBYTE -> 字节/字节指针和数据缓冲区

执行全局替换,将 PSTR ——> PTSTR

不要用 Kernel32 中的字符串处理方法,比如 lstrcat, lstrcpy

对于字符串比较,分为两种情况:程序字符串用:CompareStringOrdinal,用户字符串:CompareString(Ex)

关于多字节与宽字节:https://blog.****.net/lizuqingblog/article/details/19545671

将多字节字符串转换为宽字节:MultiByteToWideChar(),反向操作:WideCharToMultiByte()

 

4、内核对象

内核对象的含义:作为一个软件开发者,你会创建,打开,操作内核对象。系统会创建和操作多种类型的内核对象,例如access token 对象, event 对象,file对象,file-mapping对象,I/O完成端口对象,job对象,mailslot对象,mutex对象,pipe对象,process对象,semaphore对象,thread对象,waitable time对象,和threa pool worker factory对象.有一个自由的WinObj工具允许你看到所有的内核对象列表。

内核对象——使用计数

《windows 核心编程》学习笔记

忽略正确的安全访问标志是很多开发人员最大的失误之一,只要使用了正确的安全能访问标志,程序就很容易在不同版本的windows之间进行移植。几乎所有创建内核对象的函数都有一个允许我们制定安全属性信息的参数,比如 CreateFileMapping()、CreateThread()、CreateFile()、CreateSemaphore() 相反,用于创建用户对象或者 GDI对象的函数都没有 PSECRITY_ATTRIBUTES 参数,比如 CreateIcon()。

内核对象个数 == 进程的句柄数

跨进程边界共享内核对象(为了实现进程间的对象共享):

《windows 核心编程》学习笔记

对于第二种解决方法,实际上很多(并非全部)内核对象都可以命名,比如下面的函数可以创建命名的内核对象:CreateMutex()、CreateEvent()、CreateSemaphore()、CreateWaitableTimer()、CreateFileMapping()、CreateJobObject()

 

5、工作机理

>> 关于进程

《windows 核心编程》学习笔记

HMODULE 和 HINSTANCE 完全是一回事。

可执行文件的映像具体加载到哪一个基地址,完全是由连接器决定的,不同的连接器使用不同的默认基地址。比如 VS 的 0x00400000。为了知道一个EXE或DLL被加载到进程地址空间的什么位置,可以用 GetModuleHandle(Ex) 来返回一个句柄/基地址。

关于进程的终止(应该保证只有在主线程的入口点函数返回之后,这个应用程序的进程才终止,只有这样,才能保证主线程的所有资源都被正确清理):

《windows 核心编程》学习笔记

 

>> 作业

Windows 提供了一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么,最好将作业对象想象成一个进程容器,但是,创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。

 

6、线程

进程实际上很懒,什么都不做,真正做事的是线程,进程说白了其实只是众多线程的一个容器。

与进程终止相似,终止运行线程的方法也有4种:

《windows 核心编程》学习笔记

通过线程函数返回的方式有如下有点:

《windows 核心编程》学习笔记

 

7、关于线程调度