![v2-15c1cd6aeebe5c4d0a379e62b1c242de_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=a9c8eb8b-292e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-15c1cd6aeebe5c4d0a379e62b1c242de_1440w.jpg?source=172ae18b)
最近在学习Windows底层原理,准备写个系列文章分享给大家,Michael Li(微软实习期间的Mentor,为人超好)在知乎回答过一些关于学习[Windows原理的书籍推荐](微软官方有没有公布过Windows的工作细节?),大家可以拜读其中一本来入门。我是先从《Windows核心编程》开始了解一些Windows底层管理与硬件交互的原理,然后买了一套冬瓜哥撰写的《大话计算机》系列丛书,学有余力的童鞋强烈推荐你去看看,这套书对计算机整体的运作原理讲解的很系统,涉及了计算机组成原理、网络原理、编译原理、操作系统、硬件等,可以作为不错的入门教材。
[Windows核心编程(第5版)电子书及配套代码](ckjbug/Windows-Core-Programming)
学习前需要理解一些系统专业词汇的概念,比如:系统资源、内存管理、句柄、内核态/用户态、Hook、事件、消息等。不然后续对Windows底层原理的理解会有些误差和盲区,例如很容易将系统资源和CPU资源(CPU使用率)相混淆。
![v2-12d09b8c04969372e59421cda42aa295_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=a9c8eb8b-292e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-12d09b8c04969372e59421cda42aa295_b.jpg)
![v2-f0b2d662174a3d933d8e811221570fc8_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a9c8eb8b-292e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-f0b2d662174a3d933d8e811221570fc8_b.jpg)
有哪些内核对象:
令牌对象 Token
事件对象 Event
文件对象 File
文件映射对象 Mapping File
线程对象 Thread
时钟对象 Timer
线程池对象 ThreadPool
I/O完成端对象 Completion port
工作对象 Job
邮槽对象 Mailslot
互斥对象 Mutex
管道对象 Pipe
进程对象 Process
信号灯对象 Semaphore
...
内核对象的结构:
公用部分(安全描述符、计数器) + 个性部分
句柄、Windows数据类型:
WORD:16位无符号整型数据
DWORD:32位无符号整型数据(DWORD32)
DWORD64:64位无符号整型数据
INT:32位有符号整型数据类型
INT_PTR:指向INT数据类型的指针类型
INT32:32位符号整型
INT64:64位符号整型
UINT:无符号INT
LONG:32位符号整型(LONG32)
ULONG:无符号LONG
LONGLONG:64位符号整型(LONG64)
SHORT:无符号短整型(16位)
LPARAM:消息的L参数
WPARAM:消息的W参数
HANDLE:对象的句柄,最基本的句柄类型
HICON:图标的句柄
HINSTANCE:程序实例的句柄
HKEY:注册表键的句柄
HMODULE:模块的句柄
HWND:窗口的句柄
LPSTR:字符指针,也就是字符串变量
LPCSTR:字符串常量
LPCTSTR:根据环境配置,如果定义了UNICODE宏,则是LPCWSTR类型,否则则为LPCSTR类型
LPCWSTR:UNICODE字符串常量
LPDWORD:指向DWORD类型数据的指针
CHAR:8比特字节
TCHAR:如果定义了UNICODE,则为WCHAR,否则为CHAR
UCHAR:无符号CHAR
WCHAR:16位Unicode字符
BOOL:布尔型变量
BYTE:字节类型(8位)
CONST:常量
FLOAT:浮点数据类型
SIZE_T:表示内存大小,以字节为单位,其最大值是CPU最大寻址范围
VOID:无类型,相当于标准C语言中的void
WINAPI:Windows API的函数调用方式,常见于SDK头文件中对API函数的声明中,相当于_stdcall(更严格地说,这不是数据类型,而是一种函数调用约定
BYTE 8位 unsigned char
CHAR 8位 char
BOOL 16位 int
DWORD 32位 unsigned long int
HANDLE 一般句柄
HWND 32位 long int
LONG 32位 long int
LPCSTR 指向字符串的 const 指针
LPSTR 指向字符串的指针
SHORT 16位短整数
UINT 32位无符号长整数
WORD 16位无符号短整数
BITMAP 独立于逻辑设备的位图(DIB)
LOGBRUSH 逻辑刷
LOGFONT 逻辑字体
LOGPEN 逻辑笔
MSG 窗口消息
POINT 点
RECT 矩形
WNDCLASS 窗口类结构
hBitmap 为保存DIB图像信息的内存域的句柄
hBrush 当画图时用于填满设备范围的刷子的句柄
hCtl 子窗口控件的句柄
hCursor 鼠标光标句柄
hDc 设备描述表句柄
hDlg 文本字体的句柄
hFont 文本字体的句柄
hIcon 图标的句柄
hInstance windows应用程序实例句柄
hMem 内存块句柄
hMenu 菜单或弹出式菜单句柄
hModule 模式的句柄,常用于从一可执行文件获取资源数据
hPalette 颜色调色板
hPen 当在设备上画图时用于指明线型的笔的句柄
hRgn 在窗口上剪贴一块区域的句柄
hTask 独立于已执行的任务的句柄
hWnd 窗口句柄