鱼C论坛

 找回密码
 立即注册
查看: 5142|回复: 4

[Windows] 【进阶】《windows内核安全与驱动开发》

[复制链接]
发表于 2016-11-19 17:40:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
TB1eC4MIFXXXXaOXpXXXXXXXXXX_!!0-item_pic.jpg_430x430q90.jpg

$ f' b' s# ~. x9 q
7 t8 }3 G9 ?" H' Z书名:《windows内核安全与驱动开发》0 ?* q( q, l8 X, j
作者:谭文;陈铭霖2 x% d3 b% D/ M* }- {" a. w4 V
出版社:电子工业出版社% x! B# Y' ^* `
出版年:2015年6月1日(第1版)
2 W! q" m) b5 }+ N. n定价:139.00元
3 j! a  H/ k8 g! F' [7 a3 M, e装帧:平装8 A, R/ Q6 e4 V" u
ISBN:9787121262159
( p/ G' R# S3 j$ W( [
& G0 F, F9 L! v  A购买链接:
9 P1 R6 u' o0 x1 F; n! m; s6 i  C& @; [$ v/ M; p; T


: t* d' M3 j3 M) X亚马逊 -> 传送门4 d7 s# a9 W; U, k3 t) p+ b

7 Y# H1 F- l( G/ w. F, x( ]+ D当当网 -> 传送门
9 h% V6 X) g7 P5 c
5 N2 u2 Y: W: v$ {& ]4 t  I! x1 [京东 -> 传送门0 N: T( d$ B" X' a
% U2 y1 Z1 e& u1 V
天猫 -> 传送门
/ Z" m% F; o: M/ {9 S
9 Y$ o$ L) \; E3 r1 `8 S; M% D; G2 g
内容简介:
; j3 U; Z7 K$ c+ X9 ?' {; N
; o8 `' ]/ y- s( t1 h& Q6 O: o
3 E& X4 l& j# \. ~  O
本书的前身是《天书夜读——从汇编语言到Windows内核编程》和《寒江独钓——Windows内核安全编程》。与 Windows 客户端安全软件开发相关的驱动程序开发是本书的主题。书中的程序使用环境从 32 位到 64 位,从 Windows XP 到 Windows 8 都有涉及,大部分程序不经过修改即可在 Windows 10 上运行。同时本书也深入浅出地介绍了进行内核安全编程所需要的操作系统、汇编等基础知识。
0 C! _4 ^# `* s6 K. c6 Q& l# }# F1 }) E, v: G1 `# g8 `% ]
本书共分三篇,基础篇囊括了驱动开发的基础知识,降低了入门的难度;开发篇介绍了在实际工作中可能遇到的各种开发需求的技术实现,包括:串口的过滤、键盘的过滤、磁盘的虚拟、磁盘的过滤、文件系统的过滤与监控、文件系统透明加密、文件系统微过滤驱动、网络传输层过滤、Windows 过滤平台、NDIS 协议驱动、NDIS 小端口驱动、NDIS 中间层驱动、IA-32 汇编基础、IA-32 体系中的内存地址、处理器权限级别切换、IA-32 体系结构中的中断和 Windows 内核挂钩;高级篇包含了汇编语言、操作系统原理、处理器体系架构相关的内容。本书是由长期从事这个行业的工程师自己写的,所以处处以实用为准。对细节的考究主要体现在对实际问题的解决,而不是知识的详尽程度上。
% A/ M" ~' D' i4 a
6 |9 O4 C! P; F0 J& V目录:
+ v5 I4 N- G' p' d1 {3 O0 ^8 M% p# @, g, [

  U% U. b9 z2 e) {
基 础 篇
! v! V+ w. L" ~
( X; ]* _  b# e' J: T第1章 内核上机指导2 % B' g; d' U; G% {
9 e7 L  C* F  q* z1 I4 ~
1.1 下载和使用WDK2 & Q) n9 q0 X  R
1.1.1 下载并安装WDK2
1 s8 p4 o8 t! |+ n$ z- r  W+ Y1.1.2 编写第一个C文件4 6 F% A* D3 q& G! D6 M
1.1.3 编译一个工程5 $ x8 T, }* R6 u. x
1.2 安装与运行6
* e- ]9 e, ?8 Y' z) @$ X1.2.1 下载一个安装工具6 + H7 _! n' k. x: _8 m( f4 _
1.2.2 运行与查看输出信息7
+ U$ ]6 y+ V" n. v1.2.3 在虚拟机中运行8 0 N- T* b  z3 E1 d1 L. d
1.3 调试内核模块9
' Q) q2 J* e& ~1.3.1 下载和安装WinDbg9
$ f! A. r: U& `' C/ j1.3.2 设置Windows XP调试执行9
( y+ Z' w* q" }1.3.3 设置Vista调试执行10 ( r2 O/ J& [9 j! e
1.3.4 设置VMware的管道虚拟串口11 # f! z* d5 s! f4 D9 {# L# y- H
1.3.5 设置Windows内核符号表12 9 ?, i" e' E* n" w
1.3.6 实战调试first13 / {) l1 ]6 L8 a- h
7 K: B+ P$ W; C
第2章 内核编程环境及其特殊性16 / H) x: M7 {* _+ W. B- g- D
; ?; ~$ J/ |& k# q- x- w
2.1 内核编程的环境16
- m0 [3 Q! G5 j) Y2.1.1 隔离的应用程序16
; J# \% ]1 t  X& F2.1.2 共享的内核空间17
& i4 v- e4 ]1 ^# ~/ }, X4 p4 r/ P- u2.1.3 无处不在的内核模块18 3 z: m& B% l: p+ d7 g% A
2.2 数据类型19
% L9 ]2 j! z  a3 E0 \" J2.2.1 基本数据类型19
8 B4 w" @6 c) n4 w! X& F7 _2.2.2 返回状态19 2 m" B7 G* M6 a* |- T
2.2.3 字符串20 * Y6 e/ ]+ z: n0 q7 S5 Y7 g
2.3 重要的数据结构21
) ~. R4 C; \8 ]2 x1 d" L2.3.1 驱动对象21
) i5 z8 z4 Z' h/ _3 w& w2.3.2 设备对象22
7 w& J; @# D8 @8 l1 X$ s9 d9 \2.3.3 请求24
+ m$ H* f1 K7 o& q5 L- M2.4 函数调用25
( |. K- i5 H6 ?. l6 M2.4.1 查阅帮助25 $ r. t8 i) {5 O3 w  I8 O6 V* P
2.4.2 帮助中有的几类函数26
$ C5 p$ Z4 ?; A) a0 _: N* V, R) }2.4.3 帮助中没有的函数28
! X6 J1 w. n8 u; r5 G2.5 Windows的驱动开发模型29
: H, R% B; |9 j5 r2.6 WDK编程中的特殊点30
1 J" p, |+ d# y& }& N4 b2.6.1 内核编程的主要调用源30
5 w6 d0 V2 W$ p4 i2.6.2 函数的多线程安全性30
: Y" P- M) D2 j3 J2.6.3 代码的中断级32
- c; |: S4 k) w, z, _2.6.4 WDK中出现的特殊代码32 / O  T8 J9 l0 a. P- v- c1 v

6 `5 D% t. y5 Y, L0 m' \+ g- W第3章 字符串与链表35 ( r0 y6 v* Q# h; s- R
! x- W2 M2 L9 z& \+ I+ l$ s
3.1 字符串操作35
- b. j9 n2 _; R# j6 a0 ~3.1.1 使用字符串结构35
0 e0 t# j' W  w- ?- J6 p3.1.2 字符串的初始化36 ( t$ L4 D% d% h: c5 P+ Q
3.1.3 字符串的拷贝37
+ [/ J, ~' j3 m% E. N' i5 {* S7 a3.1.4 字符串的连接38 & O6 o3 x" d: W+ \
3.1.5 字符串的打印38 5 c2 a2 O$ j" |0 _  ?5 Q. v5 i
3.2 内存与链表40
% I1 \2 c' i1 V: k3.2.1 内存的分配与释放40
3 ]3 m% D  r" }) B, C% G3.2.2 使用LIST_ENTRY41
# C) Q6 ]4 O$ [' |: o3.2.3 使用长长整型数据43 # o2 Y- M- y8 j/ H
3.3 自旋锁44 7 w2 J' u4 z1 ?' v% t4 u% x- ]
3.3.1 使用自旋锁44
) p5 n1 R. ~; J2 q7 L6 d6 _. K3.3.2 在双向链表中使用自旋锁45 + R1 n' r$ W# N
3.3.3 使用队列自旋锁提高性能46
6 n! ]1 O1 s4 `! B- {; X0 }  t5 C) n; |6 U. T: q* W
第4章 文件、注册表、线程47
0 K) ]$ c- S: ~) g% H! S8 _) G' I) h4 Q8 q$ K2 X
4.1 文件操作47
( a+ C9 r% v6 ~* Y4.1.1 使用OBJECT_ATTRIBUTES47 3 {  k- `1 L6 _& E2 }& e3 t, `4 W' `
4.1.2 打开和关闭文件48
8 D- Z2 N& w) r7 N5 Y( [4.1.3 文件读/写操作51
( Q5 o8 p2 B7 v: \  |( z4.2 注册表操作53
* E! |: [) a2 B4.2.1 注册表键的打开53 . e9 v1 M% W6 ?7 r+ |
4.2.2 注册表键值的读55 6 w- y, G- C; Z6 I! [
4.2.3 注册表键值的写57 / c( @& r- A& |
4.3 时间与定时器58
* ~& H* L4 ]# t4.3.1 获得当前“滴答”数58
: b% I' B5 ^% x* Z4.3.2 获得当前系统时间58 2 ]0 A! u0 L( O: C
4.3.3 使用定时器59
7 ?: e' X4 Y+ j( c" s- A) R4 n& w/ \4.4 线程与事件62 8 e4 t7 z& U" j4 t* u
4.4.1 使用系统线程62 : j, l9 c) {, Z" d1 z; O
4.4.2 在线程中睡眠63
2 f/ D  ^' b" a6 \9 R4.4.3 使用同步事件64 7 r( Z, s) q! x
2 r! N+ i& F, U6 ~. a4 M# {
第5章 应用与内核通信67 7 @  E& x1 ]& W

( B1 Y: N5 y8 }4 o# t( W! E( i) T5.1 内核方面的编程68 " ^' D0 H/ A' {+ x) ]: b' @
5.1.1 生成控制设备68
- u' d! A7 O' j5.1.2 控制设备的名字和符号链接70 3 x9 s& p9 K8 p: G
5.1.3 控制设备的删除71 0 J5 D5 p  _* u% [  |; |0 Y' L* [
5.1.4 分发函数72
  ?7 t( N3 B  l7 X" ~* A5.1.5 请求的处理73
) I" r. T. ]# Z: T5.2 应用方面的编程74 4 ?- T) |6 E/ p5 p: D% w! a% I
5.2.1 基本的功能需求74 . [: k  M2 z0 g' p8 I  p3 S& a* l
5.2.2 在应用程序中打开与关闭设备75 & Z* G6 _  T- A/ Q# S9 ?; i. T
5.2.3 设备控制请求75 * K) \2 F4 j  Z2 S
5.2.4 内核中的对应处理77
4 M0 p: @* O0 |! U2 @% @5.2.5 结合测试的效果79
% v' o! Y( @, m! R4 @0 _+ x5.3 阻塞、等待与安全设计80 # r* h) ]9 A) F/ v( v
5.3.1 驱动主动通知应用80
3 N& H: Z* J  [+ I5.3.2 通信接口的测试81
6 b+ h1 f5 L/ ~% f8 _, u5.3.3 内核中的缓冲区链表结构83
$ r9 s9 c; v! J; {$ t* d5.3.4 输入:内核中的请求处理中的安全检查84 : K- u" ]6 J# R7 H0 n4 _
5.3.5 输出处理与卸载清理85
. ?* C* N; a& |( A$ j8 V. |+ A" t' S( V4 U& |3 K. d# w
第6章 64位和32位内核开发差异88
: ]0 L& `) `! P$ p# i3 f
8 U: K3 T4 `; ]! k, ?6.1 64位系统新增机制88 8 H3 {7 r7 P$ o8 C- }
6.1.1 WOW64子系统88
# J" v. w7 q: U6.1.2 PatchGuard技术91 & f9 A1 e& P. p0 A2 i" v( i
6.1.3 64位驱动的编译、安装与运行91 ! b" ^1 A$ c$ [- ~
6.2 编程差异92 $ K6 ^( t, Q  O* W$ c6 T
6.2.1 汇编嵌入变化92
' n+ l/ @1 f5 K! {; ?3 j- F. d& A6.2.2 预处理与条件编译93 ' Q) E; {% G( B: J3 x
6.2.3 数据结构调整93
2 t4 ?, m% N! n. S! f  d0 J( B% r8 g( q# d2 k2 Q: g: X

4 M* p, W! a! e) a0 O开 发 篇
. K; j, y: A5 r* w8 X* n
  A! `$ X; i4 M0 o) O第7章 串口的过滤96
! C" y3 ~# d+ k% q' a# ]9 ]) Q+ q0 f" s1 x8 V8 I
7.1 过滤的概念96
# M" L( Z/ E2 D" U0 n( k7.1.1 设备绑定的内核API之一97
) N$ \  y3 r8 J7.1.2 设备绑定的内核API之二98 * B& Z2 R* v& d& ]
7.1.3 生成过滤设备并绑定98   h$ p- V  W( n4 B- D
7.1.4 从名字获得设备对象100
6 z+ Y: g2 T# m! s- F0 r( ?+ y7.1.5 绑定所有串口101
) k' P" F  b  i2 Z6 I7 b# w) e7.2 获得实际数据102 * n' S; S: [! P: s8 e' S0 h4 t8 ]
7.2.1 请求的区分102 4 v6 e8 S7 p9 P
7.2.2 请求的结局103 3 D; g9 H0 n( `+ B
7.2.3 写请求的数据104
! f4 H& N2 J/ Y9 W& I. c4 G7.3 完整的代码105 6 m: y6 R' p/ l7 x
7.3.1 完整的分发函数105
% r6 E; V9 {( d' B" s  U- C" y; T7.3.2 如何动态卸载106
8 K2 A4 T$ ]8 D+ @' p7.3.3 代码的编译与运行107 6 n: U3 ]' N) o
* ?/ Z+ N1 g% s5 U. Q2 Q* N
第8章 键盘的过滤109 * q* r: j. x. v- P7 }" u
3 T! F7 ~: `: R/ g3 k8 C, Y4 f
8.1 技术原理110 9 r% ~: g# P/ X5 M
8.1.1 预备知识110
; V2 s* u4 P% ~7 w7 I8.1.2 Windows中从击键到内核110 / _5 o6 Z: D1 i% j
8.1.3 键盘硬件原理112 ( O  ^! t$ L& e8 k1 C0 V$ g
8.2 键盘过滤的框架112
( t$ S5 C' W2 c8.2.1 找到所有的键盘设备112 ( ?+ y8 ?0 d% \0 O/ c
8.2.2 应用设备扩展115
( T0 L8 B4 U" J) k8.2.3 键盘过滤模块的DriverEntry117 8 ~5 u; u' ^' G* T7 e/ o9 I3 }
8.2.4 键盘过滤模块的动态卸载117
# b% W+ X9 O9 `( x8.3 键盘过滤的请求处理119
4 u5 D7 Y, i7 l9 G! K! c2 Z8.3.1 通常的处理119
; _3 u1 D7 `$ g! P' u; F8.3.2 PNP的处理120
$ S5 _1 m7 [6 l9 o% h( b8.3.3 读的处理121 ! C6 i; c! n6 [7 k7 A; w" X, a% e# L
8.3.4 读完成的处理122
' n) Q& x# t# f. l' i" l8.4 从请求中打印出按键信息123 5 W& _" D4 O1 A# u- s, }0 P* F3 E
8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA123 ) d$ P6 r1 O+ h  K% {' {
8.4.2 从KEYBOARD_INPUT_DATA中得到键124 ' N) {& i! Q( ]! Z2 Z
8.4.3 从MakeCode到实际字符124
9 w+ q  ^- d* C5 g9 p+ M. b  _  D/ F8.5 Hook分发函数126
* P1 P4 Q6 r7 Z6 E7 }# m; h3 _8.5.1 获得类驱动对象126
, Q7 ]1 h! U- _9 _5 }8.5.2 修改类驱动的分发函数指针127 7 I9 {8 y8 `: C8 H) Z( j- ^% _  g
8.5.3 类驱动之下的端口驱动128 " I9 w" G, w' C  A9 ]0 o$ z# J
8.5.4 端口驱动和类驱动之间的协作机制129
0 |$ p/ Z$ B) @6 Y8.5.5 找到关键的回调函数的条件129 $ B1 w- ?, A9 e0 s. g7 P1 f
8.5.6 定义常数和数据结构130
5 L) R( ?! T, t# x0 M+ |) i  D8.5.7 打开两种键盘端口驱动寻找设备131 4 r; p5 X9 F8 q  K3 r
8.5.8 搜索在KbdClass类驱动中的地址133
( u4 H  W! D+ s5 S! P1 h8.6 Hook键盘中断反过滤135
2 j3 Z6 Y6 p7 P1 \8.6.1 中断:IRQ和INT136 . i1 i4 w9 e* m! a
8.6.2 如何修改IDT136
* p& }6 d7 z3 k$ h3 u6 q8.6.3 替换IDT中的跳转地址137 : e' l* T, j4 S" H& s, D
8.6.4 QQ的PS/2反过滤措施139 ' G" k' m' ^: W' c& n
8.7 直接用端口操作键盘139
7 ?& c) P* B! b; o- O: y5 f/ Q8.7.1 读取键盘数据和命令端口139 4 R" E( F8 ], e9 q) L) F) S: i
8.7.2 p2cUserFilter的最终实现140
6 W# t& i$ w) D' C, `& K3 s7 F- X* R: r2 M
第9章 磁盘的虚拟143 - j+ T; F1 j+ Q( Y
# s& n+ P1 {" o3 M
9.1 虚拟的磁盘143 3 U8 G; I+ U* l5 A1 o' I  t9 j- N
9.2 一个具体的例子143 , E# G+ v  ?# j( x3 D4 }  D2 @
9.3 入口函数144 / y2 \* v" `6 _% i% i4 V$ [/ O
9.3.1 入口函数的定义144 9 f. H$ Q' P& ^: j+ P
9.3.2 Ramdisk驱动的入口函数145 4 a1 S2 c  g2 a4 W1 L" S
9.4 EvtDriverDeviceAdd函数146 9 ?% n! g# g' |/ H( R/ U- y/ f# i
9.4.1 EvtDriverDeviceAdd的定义146
7 a% _. c* s2 p, h) B* a$ ^9.4.2 局部变量的声明146 2 M: d7 K, w6 B) o. j  O7 `
9.4.3 磁盘设备的创建147
3 J8 g; E1 A1 Z5 l7 K5 Z9.4.4 如何处理发往设备的请求148
$ [0 d2 x, ^( B9.4.5 用户配置的初始化149
: q4 u/ ^- n+ e6 q+ C9.4.6 链接给应用程序151
, i' P. U0 X1 H% a; r( I. v; A9.4.7 小结152
, u* u7 b+ _. d- B+ v9.5 FAT12/16磁盘卷初始化152 - |$ ~% y, V/ |
9.5.1 磁盘卷结构简介152
+ `/ u/ ]1 E4 ^; [7 p' p9.5.2 Ramdisk对磁盘的初始化154
1 \. R- L- [2 C4 Z4 f( l# \9.6 驱动中的请求处理160 , T& H# F: `' I+ d
9.6.1 请求的处理160
8 ^" I6 L/ F, {3 h! J1 |$ |% m9.6.2 读/写请求160
7 x, q4 \! n0 V9.6.3 DeviceIoControl请求162
; d. Y/ }- X0 e  L! k9.7 Ramdisk的编译和安装164
1 s2 b: o1 t0 J! g- S9.7.1 编译164
* D4 ^3 u* p# G3 u6 n0 y9.7.2 安装164 ! o: D0 ?4 O% T9 F, V' {+ ?# A0 k
9.7.3 对安装的深入探究165
$ ]1 U* W& ^( Z; z* ^& }1 a) c' m" n! Z
第10章 磁盘的过滤167
1 j) ?" T) k- L- c# `* ~  [4 `% ~+ y" f
10.1 磁盘过滤驱动的概念167 6 `7 I) V, f5 x
10.1.1 设备过滤和类过滤167
1 {. }! `( Y6 v2 w5 k4 l10.1.2 磁盘设备和磁盘卷设备过滤驱动167 3 s9 w# l) a  u! q8 {1 x0 W
10.1.3 注册表和磁盘卷设备过滤驱动168
& n6 ^5 z. w& D( m+ V0 s- I0 ~- I# j10.2 具有还原功能的磁盘卷过滤驱动168
6 L" e2 Y: \) i7 H* I9 A& M; t10.2.1 简介168 : G  I/ K" F8 x, W$ t7 m$ I( U7 R
10.2.2 基本思想169 / w# \* y9 S* o( H1 P9 O7 a# m
10.3 驱动分析169
0 Z6 S2 A+ ~; c- W8 m10.3.1 DriverEntry函数169 . M. ~3 T- g9 D# Z. j1 G* k
10.3.2 AddDevice函数170
) H7 D, T8 v1 d. ~10.3.3 PnP请求的处理174
  _" @8 V! q: p10.3.4 Power请求的处理178
; q' x) X* s* @; w- \+ S10.3.5 DeviceIoControl请求的处理178
# K8 F6 c) R) }6 y) a' C; J10.3.6 bitmap的作用和分析182
  t6 g/ [9 r9 b& Y; P# m10.3.7 boot驱动完成回调函数和稀疏文件187 2 Y3 D2 I3 l- a/ X2 w1 n$ M8 X
10.3.8 读/写请求的处理190 6 X( n: q. k5 _

9 E; m  V! k6 O5 V; W第11章 文件系统的过滤与监控199 ) v5 c4 D$ n/ f9 M1 k4 o

  R8 c& v1 r$ Z& g11.1 文件系统的设备对象200
- X9 p1 M% o: J7 Q) c5 Z2 a11.1.1 控制设备与卷设备200 # q4 m0 Q% [- d; V% B
11.1.2 生成自己的一个控制设备201 % O; g7 ~6 e+ X
11.2 文件系统的分发函数202 8 }. T# Q, _6 F& x
11.2.1 普通的分发函数202
1 o, S* ^0 X: i8 R. `* }$ Y% h11.2.2 文件过滤的快速IO分发函数203
* J4 y0 Z" P, Y. ], x& _# b11.2.3 快速IO分发函数的一个实现205 ! j) C& W; g# M3 w9 k! ~" h2 G% {! f
11.2.4 快速IO分发函数逐个简介206
1 G$ t6 h. w$ F11.3 设备的绑定前期工作207
+ E- s6 k, L! T0 A+ m' h11.3.1 动态地选择绑定函数207 + x2 F) r+ B9 A; ^# [4 `
11.3.2 注册文件系统变动回调208 9 d0 D4 ?% f5 l) t7 D  I7 ~0 m
11.3.3 文件系统变动回调的一个实现209 0 i# z5 a. W( M2 s' N
11.3.4 文件系统识别器211
2 z; X$ u" Z* [7 \0 [' L: v11.4 文件系统控制设备的绑定212
  i) s$ O' j4 m# u1 T' r0 p$ X$ a$ S) v11.4.1 生成文件系统控制设备的过滤设备212
! A# e# Z3 O) K: x  f9 c7 U11.4.2 绑定文件系统控制设备213 4 H* n: [+ w9 T' x* z5 k
11.4.3 利用文件系统控制请求215   v; I5 W$ W7 y' X8 L- i
11.5 文件系统卷设备的绑定217
) d+ B$ H, ]9 D  e8 I/ b: H* |11.5.1 从IRP中获得VPB指针217
2 M$ t( B! \/ T$ g9 n/ i& M5 j11.5.2 设置完成函数并等待IRP完成218
( G  ~/ P: @' a11.5.3 卷挂载IRP完成后的工作221
) B3 x0 W6 k% c8 X5 g1 P: N11.5.4 完成函数的相应实现223
/ u- @$ K9 Z# W& U! z% R11.5.5 绑定卷的实现224 ) n: A& s9 Q+ K- w$ \8 ]
11.6 读/写操作的过滤226 7 z/ b: ~6 V$ L' r: m
11.6.1 设置一个读处理函数226
) U! L# ~4 r, \: c3 p4 u( i11.6.2 设备对象的区分处理227
; l2 a( i3 E. a- K. S7 E$ ]# I8 ~11.6.3 解析读请求中的文件信息228
( a5 M) G: P- T# x: E11.6.4 读请求的完成230
6 w  c& u1 @9 D! G11.7 其他操作的过滤234
; d0 f0 S! S8 f11.7.1 文件对象的生存周期234
4 z) m% p7 V! q! L; F8 m( E11.7.2 文件的打开与关闭235
$ ]$ K- h- V+ e  ]& {( ?0 ]11.7.3 文件的删除237
6 U" Q6 s- |4 U+ \/ u: ~11.8 路径过滤的实现238
2 i: p' S& b% ^* }5 D6 K8 j8 _( i11.8.1 取得文件路径的三种情况238
( h5 P" Q" U8 y2 u' P11.8.2 打开成功后获取路径238 ( M  j# L: c2 H# X
11.8.3 在其他时刻获得文件路径240 $ T! X5 g0 K- @' [- R  p
11.8.4 在打开请求完成之前获得路径名240 % L% Q9 {7 S9 b6 M6 o# K4 O
11.8.5 把短名转换为长名242
" l2 V5 c8 B- {% G& U11.9 把sfilter编译成静态库243
. n) z9 M! U* \! N1 ?0 s11.9.1 如何方便地使用sfilter243
, x" _. c9 b" R7 q& y% I( S& [11.9.2 初始化回调、卸载回调和绑定回调244 8 w" `4 M) s! T2 s" m. l
11.9.3 绑定与回调245 & r: y4 g1 f- S3 G1 J% `) Q- B
11.9.4 插入请求回调246
0 J7 y8 h9 N$ `+ h! x2 A11.9.5 如何利用sfilter.lib249
; g) [! S1 {' Y
. W# W/ a& N+ m5 I第12章 文件系统透明加密252 0 w& E6 r9 y! S
$ n4 @2 s5 j( b
12.1 文件透明加密的应用252
) }" g$ M- |% Q- q, A  |: e12.1.1 防止企业信息泄密252 / ^; N; R) P3 w1 M1 [) _
12.1.2 文件透明加密防止企业信息泄密253 : W& A) s( I. X% }
12.1.3 文件透明加密软件的例子253 0 d# B+ J/ L- y' I
12.2 区分进程254 . z: ^$ X; ~: P$ N' X4 U
12.2.1 机密进程与普通进程254 * v8 x, ^6 T9 Y! a% J" O  ?. [
12.2.2 找到进程名字的位置255
$ w, R! A0 X0 m( r' J. E6 t8 q12.2.3 得到当前进程的名字256 - |2 p* K6 G6 J$ ^* g# `- C5 c* d: ]
12.3 内存映射与文件缓冲257 . P' j* q# {8 Q% C" X- N
12.3.1 记事本的内存映射文件257 & r( y3 ^3 v: K8 Y' v8 l0 ~
12.3.2 Windows的文件缓冲258 9 Y& o- a3 L, q
12.3.3 文件缓冲:明文还是密文的选择259
8 K$ Y+ w' c$ C  D1 W4 \12.3.4 清除文件缓冲260
& z! P9 o  q% W) G12.4 加密标识263
4 H8 Q7 Z2 B& Z: D$ Z& G, K12.4.1 保存在文件外、文件头还是文件尾 263: E! p& o8 Q4 Q4 }0 Q+ |2 Q
12.4.2 隐藏文件头的大小 264
3 i3 l; h# M% B: o6 i$ Z4 ]& }12.4.3 隐藏文件头的设置偏移 266* x  M8 A8 ], u* O- f( D. M
12.4.4 隐藏文件头的读/写偏移 267
# q$ O, o. v: J! b12.5 文件加密表 267
; ^8 ~8 b3 z9 h* }; p; j. w12.5.1 何时进行加密操作 267, M: i8 \0 @, O2 G2 [
12.5.2 文件控制块与文件对象 268
1 A0 C0 a& m5 V  e12.5.3 文件加密表的数据结构与初始化 269
: m$ e% E! g1 N3 t1 v. P+ ]12.5.4 文件加密表的操作:查询 2709 ~% E/ ~  N& P( h0 X6 }, g
12.5.5 文件加密表的操作:添加 271! z" n* h+ C  k9 s3 Z* ]
12.5.6 文件加密表的操作:删除 272
: f  U% o) ^, s1 T0 S12.6 文件打开处理 273* o% s1 l& ~# t: P+ p
12.6.1 直接发送IRP进行查询与设置操作 274
! R! g5 U7 k! \12.6.2 直接发送IRP进行读/写操作 276
' J9 ^7 @: \/ O% L* N; N12.6.3 文件的非重入打开 277! S/ g0 e0 v$ Y, N: h- `
12.6.4 文件的打开预处理 280
1 i' A1 a4 w7 C+ G12.7 读/写加密和解密 285* M& q3 N9 g- L8 |4 E
12.7.1 在读取时进行解密 285
" @3 Q7 `: a2 k, G' j12.7.2 分配与释放MDL 286
# y4 {6 ~( G8 D" T12.7.3 写请求加密 2876 `6 B8 X& ^" c. j* Z
12.8 crypt_file的组装 289
1 g& a5 Y: ^: W: w12.8.1 crypt_file的初始化 289; `4 p# _' ~' D( \" ?
12.8.2 crypt_file的IRP预处理 290, s7 J  X; g4 S0 X* _* [
12.8.3 crypt_file的IRP后处理 293
! M; J1 W0 M7 T# ?/ z( b% T2 f* L
第13章 文件系统微过滤驱动 297
# ?0 h8 L2 \. b6 q1 I' z
  T! F" J$ ]/ m13.1 文件系统微过滤驱动简介 2979 M$ P2 }" ^, a: s
13.1.1 文件系统微过滤驱动的由来 2979 @" K5 v& f% l$ L/ I
13.1.2 Minifilter的优点与不足 298  f5 ~9 S( g8 ^% B
13.2 Minifilter的编程框架 298: H4 U3 x5 k6 A$ x" B
13.2.1 微文件系统过滤的注册 2999 w  U* X7 C/ d) j
13.2.2 微过滤器的数据结构 300/ s+ G! c; A. W( l8 T6 K
13.2.3 卸载回调函数 303
  K% t3 d2 _3 w13.2.4 预操作回调函数 303
& p/ ?* _" `8 {9 ]% _; Z) o13.2.5 后操作回调函数 306" X  {. C0 B1 C  g' o5 c
13.2.6 其他回调函数 3070 l; Q1 m9 O- S$ h7 j3 J9 L
13.3 Minifilter如何与应用程序通信 3090 ~9 M, c( l) B7 F
13.3.1 建立通信端口的方法 3102 t; T/ M, \& y$ s
13.3.2 在用户态通过DLL使用通信端口的范例 311
0 C8 U/ ^) a9 ^$ S13.4 Minifilter的安装与加载 314
* v9 Y" D% x% A3 a) |13.4.1 安装Minifilter的INF文件 314' o$ |6 n& s- v% G+ `( V* A3 e
13.4.2 启动安装完成的Minifilter 316: z" k1 o( A: i* i

, _: {; s$ _7 F0 {. v- J5 v第14章 网络传输层过滤 317
) s% b; g! Q( t" R. _, X" O8 M
+ p5 V6 F% {% _, v% X* o* m8 O+ J14.1 TDI概要 3176 O' Q  d2 ?2 ~! C" b
14.1.1 为何选择TDI 317
, A5 l* _% E6 e0 J14.1.2 从socket到Windows内核 318- {6 n! z& j. z' {
14.1.3 TDI过滤的代码例子 3199 b% E& d. w) ?% I0 h+ H. _* J
14.2 TDI的过滤框架 319) l& l& C/ K9 i
14.2.1 绑定TDI的设备 319# Q% ~1 w: a, _) o
14.2.2 唯一的分发函数 3204 M2 D1 }2 G% S
14.2.3 过滤框架的实现 322
- A5 S' ?- Q$ W, e. v14.2.4 主要过滤的请求类型 323
8 H" k7 T/ @8 {9 k3 V14.3 生成请求:获取地址 324( Z' O0 J' {" H' ?$ I
14.3.1 过滤生成请求 324
' Z! C* H6 S8 P* d7 y3 w14.3.2 准备解析IP地址与端口 3266 O' g3 @; k; t4 O, Q  }
14.3.3 获取生成的IP地址和端口 327# L2 g1 b' R4 A0 d
14.3.4 连接终端的生成与相关信息的保存 329* x7 j5 g; i' d( b6 ?8 x) I3 c
14.4 控制请求 330
/ M. {) j4 Q  g) d$ u* h( h14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330
0 R3 R% L9 a9 c8 M14.4.2 TDI_CONNECT的过滤 332
( G& |! F" S. U, M; k* [14.4.3 其他的次功能号 333
! E1 [4 a, @9 s2 N14.4.4 设置事件的过滤 3342 E, F9 Y* p- a; y
14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 3365 s5 Y/ M5 ?9 a0 T# g
14.4.6 直接获取发送函数的过滤 337+ M- K1 H+ C; f- [" p! D
14.4.7 清理请求的过滤 339, U) K! \+ n* M: y( \2 S( _( K
14.5 本书例子tdifw.lib的应用 341
( T* f- j0 y/ s# v14.5.1 tdifw库的回调接口 3416 x/ I  c) F0 g4 f/ d4 u" T( X
14.5.2 tdifw库的使用例子 342
6 Z6 x1 |) D* t+ Z, w
4 H; n: X$ a3 U/ h3 e3 Q第15章 Windows过滤平台 345
% C" r! i% {, X- u  y; }
+ Y. p# l" I$ l1 [! n15.1 WFP简介 345
; d( L4 k3 Z1 J15.2 WFP框架 345" e$ U2 g: R9 C) K; z! W
15.3 基本对象模型 347
. a5 g, _% Q. Q, F* L( g- x15.3.1 过滤引擎 347
( Y: o2 ~+ @! R' g  Y! R1 X6 ?15.3.2 垫片 347$ T$ g6 S' v# w) ~( G" i" u# Z
15.3.3 呼出接口 347
  @, C  a9 q1 a, a3 z9 s15.3.4 分层 348
; f4 w& I6 ?6 H5 ]0 J- V15.3.5 子层 349
0 a' ^! M3 K. M* ~3 Q: ~/ W15.3.6 过滤器 350
; P# ]7 Z( Z( I% m9 z15.3.7 呼出接口回调函数 354
$ x" E5 L0 s- M) ?15.4 WFP操作 359
; U8 F# d9 ~. W$ b) C$ k15.4.1 呼出接口的注册与卸载 360) ^  \% e" F/ K$ N& Q
15.4.2 呼出接口的添加与移除 360
4 ]7 _, A# T; S# C15.4.3 子层的添加与移除 361! m- `3 }- y/ A3 c, v7 s% o8 d% t
15.4.4 过滤器的添加 362
+ E* {( ]7 N+ Z* `  r3 N+ l15.5 WFP过滤例子 362# U. `! B% r, m5 d8 f

9 L/ c, ]! y- `5 D1 q/ O5 \1 k第16章 NDIS协议驱动 370
4 X4 B4 m' C; a
/ W. \1 Q  N+ C3 w5 }16.1 以太网包和网络驱动架构 370! f3 c, s4 Z2 q0 b: K( Y6 h- k1 q% o
16.1.1 以太网包和协议驱动 370
' I- \7 b5 S6 h8 R3 Z7 \) e16.1.2 NDIS网络驱动 3716 V1 A4 l6 h. B) S2 a
16.2 协议驱动的DriverEntry 372% O8 r0 V# s/ g9 A
16.2.1 生成控制设备 372% ?) f% Z3 p' ^+ {% H
16.2.2 注册协议 374
6 K) ~8 T# m1 \* ?( `% p16.3 协议与网卡的绑定 3755 J* B. |# @  D. L% \( A* t$ Q
16.3.1 协议与网卡的绑定概念 375- K; z& L4 r& J0 }+ C8 Y$ t. n
16.3.2 绑定回调处理的实现 376
! k( [9 c  a$ e& H16.3.3 协议绑定网卡的API 378( o, n( c4 E2 }, c9 |5 R
16.3.4 解决绑定竞争问题 379# b! ]. Q! v8 \# N. \% {
16.3.5 分配接收和发送的包池与缓冲池 380
. z2 d" I; F# C# \$ j! y8 M) b16.3.6 OID请求的发送和请求完成回调 381
/ s2 r- b0 D! m) j16.3.7 ndisprotCreateBinding的最终实现 385, t, P! R3 i0 j' V' K  {# \) B
16.4 绑定的解除 390$ e  f1 N1 {+ @
16.4.1 解除绑定使用的API 390
3 ]6 L0 H( Z/ s! j, V16.4.2 ndisprotShutdownBinding的实现 392) G! A% C" L4 v
16.5 在用户态操作协议驱动 395, n, X! D5 F2 }4 d& j) h  G
16.5.1 协议的收包与发包 395
% {* k, Z6 X* t! K16.5.2 在用户态编程打开设备 396
& _3 T9 ?5 R" _16.5.3 用DeviceIoControl发送控制请求 397$ m0 L2 {& t) Z4 l) K
16.5.4 用WriteFile发送数据包 3997 ~6 u/ }, s3 W$ h) d
16.5.5 用ReadFile发送数据包 400
+ j; \) z* g  b+ D0 ?6 c16.6 在内核态完成功能的实现 402
/ Z1 ]- O7 N% }* z7 {7 E16.6.1 请求的分发与实现 402
. E% x9 f& _$ \) n( H16.6.2 等待设备绑定完成与指定设备名 402
' f) S! r( N: V. ?; g) e16.6.3 指派设备的完成 403
/ D% r% I5 H; J& T, }3 {9 l* m1 Q16.6.4 处理读请求 406* {6 {. i  v2 q9 v3 \/ s: N
16.6.5 处理写请求 408, [, P% T! z, q+ F5 Q8 [
16.7 协议驱动的接收回调 412' K# v/ d0 d' _# [9 s1 f5 t. \/ x# n
16.7.1 和接收包有关的回调函数 412" D/ J# e3 g# B7 c- ^+ {
16.7.2 ReceiveHandler的实现 4131 j; v8 x  b/ d! Q
16.7.3 TransferDataCompleteHandler的实现 417
+ M3 t' A# ?( s6 q6 b% D  \9 W) C: |16.7.4 ReceivePacketHandler的实现 418+ `" ?$ \3 b7 F! l% R1 N, M, x' ?
16.7.5 接收数据包的入队 420
6 L2 E) W( p9 M9 Z8 G16.7.6 接收数据包的出队和读请求的完成 4222 T' q3 c8 ^7 r7 F1 x# W
& U4 g& }; R& y" ?9 X. h( I
第17章 NDIS小端口驱动 4277 b& c! w0 e) S% R, i. B
: Z; _3 O" I6 K; ]' h* p5 f8 K
17.1 小端口驱动的应用与概述 427
+ x4 i" b; A. T- ~+ k: _. ]( F17.1.1 小端口驱动的应用 427
; _6 T7 r. [. ], h6 g5 E1 U17.1.2 小端口驱动示例 428$ T5 e" B% @/ D+ {9 O$ w+ M
17.1.3 小端口驱动的运作与编程概述 429
& w) `% d7 a: ]6 j/ ]* t" l- F17.2 小端口驱动的初始化 429
( D. y' V( }8 B: H17.2.1 小端口驱动的DriverEntry 429. w9 V+ n& w- F6 _
17.2.2 小端口驱动的适配器结构 4313 k( [$ C" k: }7 ~. N" e) b' q
17.2.3 配置信息的读取 433& D, O& k+ a* g+ n1 u
17.2.4 设置小端口适配器上下文 433# s% T$ O6 D" p: e7 u+ S
17.2.5 MPInitialize的实现 434
1 y. U) R. G) Q6 f" \) f( C17.2.6 MPHalt的实现 437
9 y: {/ |6 i+ U17.3 打开ndisprot设备 438
! r; C& z# p1 Z6 @& d9 `* P17.3.1 IO目标 438$ u: E5 i# s8 ]+ d
17.3.2 给IO目标发送DeviceIoControl请求 4396 c, @9 h3 J* O" E% ~7 J
17.3.3 打开ndisprot接口并完成配置设备 4415 i, m( {0 U: _! E8 w
17.4 使用ndisprot发送包 443
$ H7 l6 c: H8 I+ c, o! r. k17.4.1 小端口驱动的发包接口 443& }, w7 ~- F$ q% y. y% I8 ~& U8 P
17.4.2 发送控制块(TCB) 444
4 a+ \8 S. Z4 y4 `( }) b17.4.3 遍历包组并填写TCB 446& N) G9 I  S# s' i, l
17.4.4 写请求的构建与发送 449
7 l; P, f  O' q  w7 Q# ?6 L) j17.5 使用ndisprot接收包 451
# q' |. d' }. Q5 x9 a6 C+ c  E2 H9 X8 r, [5 i17.5.1 提交数据包的内核API 451  T& _7 m3 Z, b2 r. d2 F1 a& p
17.5.2 从接收控制块(RCB)提交包 452# C' @  T2 Z! w9 x6 u: k; J
17.5.3 对ndisprot读请求的完成函数 454. S' b$ d; g" q; _& l
17.5.4 读请求的发送 456- R6 b! m6 c7 k8 L) {
17.5.5 用于读包的WDF工作任务 4573 `( L9 l: Z* L
17.5.6 ndisedge读工作任务的生成与入列 459
3 l& V2 [+ j8 }. {8 E$ ]; _" i17.6 其他的特征回调函数的实现 461
: B/ }2 T: p5 a5 x, P, U& K17.6.1 包的归还 461
8 y6 x" J, j3 b+ p! r% m8 K17.6.2 OID查询处理的直接完成 462
! ?9 c4 n, p* E/ E7 y% k( ^17.6.3 OID设置处理 4656 m2 W2 l( i+ A# h
, c5 Y3 D0 ^6 v
第18章 NDIS中间层驱动 467" D. \; m6 j; }/ G% Z: r

# z9 Q. [& W& M8 ^/ F$ ?18.1 NDIS中间层驱动概述 467
1 ?' E+ T7 y2 d8 Q0 _' ^18.1.1 Windows网络架构总结 467
# l" [2 y/ ~! g  k- D18.1.2 NDIS中间层驱动简介 468
0 l; W4 m7 M% Z3 B! z/ |# o: _) F) ]18.1.3 NDIS中间层驱动的应用 469/ n2 |" i) q8 m( @# O
18.1.4 NDIS包描述符结构深究 470
$ f9 F. A: t8 ?+ i5 S18.2 中间层驱动的入口与绑定 473
& t% e# ?! M- G& N3 k* m/ _18.2.1 中间层驱动的入口函数 473% y; j" K3 q/ t- ]" @
18.2.2 动态绑定NIC设备 474. h1 t0 \* _& p2 l' L7 j7 G0 g+ a
18.2.3 小端口初始化(MpInitialize) 475
" l2 H- L# ]& h8 w8 z- W18.3 中间层驱动发送数据包 477
3 ~( Z: L& s: f1 H9 g18.3.1 发送数据包原理 477
. \, P% }" o. m6 {( {6 P' ~/ O18.3.2 包描述符“重利用” 478
* w- }) j: `% U; R7 Z2 ^0 H18.3.3 包描述符“重申请” 481% }0 g' V# n- H! f3 l
18.3.4 发送数据包的异步完成 482
* |2 ]7 P, \; q; R18.4 中间层驱动接收数据包 484! H) |/ N. L' G$ T4 |
18.4.1 接收数据包概述 484" N: W3 P7 \" Y. ~- O
18.4.2 用PtReceive接收数据包 485
2 s. R  f4 {/ {" `) R) |8 S. J% v18.4.3 用PtReceivePacket接收 490+ A+ D7 S6 Z- H# ~
18.4.4 对包进行过滤 491* h3 {8 m/ A8 q* s$ k
18.5 中间层驱动程序查询和设置 494
- C' v* C: T& N18.5.1 查询请求的处理 494; l# E3 r/ m3 x* Z1 }- D9 z3 g
18.5.2 设置请求的处理 496
3 N' ^; O3 W, J; w, M. a18.6 NDIS句柄 498
1 y2 S1 q% ], W: v) c18.6.1 不可见的结构指针 498
  o1 `" f( O1 [18.6.2 常见的NDIS句柄 499( X) Q' t1 l( b: _6 H
18.6.3 NDIS句柄误用问题 5006 }& o8 f4 X1 }
18.6.4 一种解决方案 502
2 \6 S( n, x4 ?5 @+ [6 J8 R18.7 生成普通控制设备 5039 l3 f1 w$ K6 x# R6 h1 Z
18.7.1 在中间层驱动中添加普通设备 503
9 N# m7 r; n3 D  h3 O18.7.2 使用传统方法来生成控制设备 505/ |7 }5 P) h+ B7 ?; m6 ~2 I

8 M" S) m5 f; A% }7 n  [" @( T第19章 IA-32汇编基础 511) I. q7 m9 I: d) z
( c. y  J4 g6 L5 v" z) r- Q* {$ S
19.1 x86内存、寄存器与堆栈 5112 ]2 [( `/ j. F6 T* l6 j$ [2 E$ R
19.1.1 _asm关键字 511+ v! O2 c5 O" O2 [5 N+ ~! R: N
19.1.2 x86中的mov指令 5129 l. e" |9 X# j% m: [( e# W) B: _
19.1.3 x86中的寄存器与内存 512
0 `: c4 M8 n' ~( A1 R& J, M19.1.4 赋值语句的实现 513
0 p! Y9 g6 y/ }% d19.2 x86中函数的实现 5142 @# t1 E1 A% ?, M( `6 |- b
19.2.1 一个函数的例子 514
% l$ [* w) v5 K% |19.2.2 堆栈的介绍 515+ b! Y( y8 L2 ~0 ~. M
19.2.3 寄存器的备份和恢复 516
; {% ?7 O4 q' o19.2.4 内部变量与返回值 518- M: X9 e; ?+ t4 K& ^0 k6 W* H, h4 g
19.3 x86中函数的调用与返回 521& c' i, `! X9 q7 P! a2 M
19.3.1 函数的调用指令call 521  s! C% Z( b' [* Z7 t
19.3.2 通过堆栈传递参数 521
7 }: y1 J/ e3 Q8 G# l19.3.3 从函数返回 523* s9 \: {0 m9 x6 x7 s; K
19.3.4 三种常见的调用协议 524, W1 |* `- g6 K' l% j
19.4 从32位汇编到64位汇编 526
  w6 ^' m' f# H, Z/ {19.4.1 Intel 64与IA-32体系架构简介 526
! ^& ?% c/ e5 D% L$ d: C19.4.2 64位指令与32位指令 526, [4 b  z6 N( z$ j4 n3 c
19.4.3 通用寄存器 527$ H& g# _$ R; X+ Y' S9 i3 X0 v
19.5 64位下的函数实现 528
  x4 y3 [2 O4 `* A& Z$ k19.5.1 函数概览 528
4 o  k# ^! ^  e3 z. I0 E19.5.2 32位参数的传递 529
$ D$ A# q3 {. ~7 d4 X- q19.5.3 64位参数与返回值 530; y, i% o* m3 `0 [# H
19.5.4 栈空间的开辟与恢复 531
$ a# h  I6 s1 L. \
; t4 P/ _7 L' ^5 M第20章 IA-32体系中的内存地址 534
0 o  A  D  v5 g- I, w. s, u: @! ~; ]
$ [- l0 W8 [, S$ z! z8 J20.1 内存的虚拟地址 5340 A/ j! t  [$ @  d  G: ~& }# K7 N$ _% z
20.1.1 C语言中的内存地址 534
$ j) g3 B. l" R# h7 k/ q20.1.2 虚拟地址的构成 535
: k0 f  N1 P4 Q20.1.3 段的选择 536
( N( }* M& M' T2 Q20.2 全局描述符表和段描述符 538
' O2 r, q/ x' b. ?$ o+ k20.2.1 全局描述符表 538
: `! T, O, ^' T9 S( k3 |20.2.2 段类型 539
. k; H2 X4 q. w+ _; D2 s20.2.3 段寄存器与段选择子 540; C3 N3 E! N& l7 d2 z
20.2.4 64位模式下的段 541
0 [/ B8 T5 D6 o7 M1 G% U20.3 分段编程实践 542
% `" Q2 N, m: F20.3.1 系统表寄存器的结构 542
2 w5 h" ]# r% M" u0 [# ?& E3 R20.3.2 在汇编语言中获取全局描述表的位置 543- r% J+ @% Q2 q
20.3.3 调试范例:sgdt指令的错误使用 545& I3 `- I' u2 u; T% E9 ^; O
20.3.4 在64位下获得全局描述符表 547
' a( P3 {- p: y20.4 线性地址基础 549
- L8 r, Z8 N5 R5 D1 l0 x3 e- q20.4.1 分页控制机制 550
; D# p. O6 f2 v) |1 G0 l- n) T3 X20.4.2 线性地址的转换 551
9 M' @7 e8 e( Y6 ]20.4.3 混合页面大小 552& G0 P6 e0 t$ j0 d3 K0 k
20.4.4 32位物理地址的页目录和页表项 552
0 U8 Q& D8 \* Z, H& n* q20.5 各种特殊分页方式 5557 e" f. ~6 C4 p( v  Z0 u
20.5.1 PAE分页方式 5553 d7 v: @1 z- `& z: M* s
20.5.2 PSE-36分页机制 558' X: P2 y. _; d! e5 W, @7 x% B
20.5.3 IA-32e模式下的线性地址 559' `4 s$ t/ c* o. N* b
20.6 分页编程实践 562" f/ p2 K' a* X2 z6 o* k8 m
20.6.1 页目录和页目录指针表的获取 562
5 X! H- R1 T" O) x+ S8 {/ i20.6.2 页表的获取 5649 u$ i$ j) G8 Z& n' g) q2 b
20.6.3 线性地址的结构 567
' m2 [9 V" k" x+ a8 _& m# O+ |; \8 F8 g: Z/ c* ?
第21章 处理器权限级别切换 571
3 n$ z2 @7 ?5 P: s8 a- _# O2 u! Y2 k' c4 y$ d, o
21.1 Ring0和Ring3权限级别 571$ F$ e2 R" {3 ]' v  Q
21.2 保护模式下的分页内存保护 572+ ~8 y% w7 H1 H. |: V# p
21.3 分页内存不可执行保护 574
+ i( Y- F. L) V, |4 i* l' @% t# U+ R21.3.1 不可执行保护原理 574
6 ?3 H' i, O# n6 s& Q: l" L( ~21.3.2 不可执行保护的漏洞 575
" F3 ~: y, C( f; h2 E21.3.3 上机实践 577
8 W6 h* ?0 h1 J" R6 s2 Q- H  y21.4 权限级别的切换 579
" b2 }6 a) H* G1 Z: U21.4.1 调用门及其漏洞 579
) Z0 ~( @* E; M0 g5 A21.4.2 sysenter和sysexit指令 5811 s: ?1 C$ y8 |- s( J& f
21.4.3 上机实践 583
2 N, D/ l; }% c# ?
! B2 E9 D, N) E, z第22章 IA-32体系结构中的中断 585' R( ]( U7 T: b. i
6 \# U5 a, H0 r" E
22.1 中断基础知识 5855 D" E% p3 w* F- x
22.1.1 中断描述符表 5854 B: M4 |( M$ X/ N  H* r& b
22.1.2 中断处理过程 5874 D3 X, J7 l6 `7 L; w
22.1.3 64位模式下的中断处理机制 5892 S9 x. r2 z1 {: C- S# @+ n
22.1.4 多核下的中断 589, g+ _2 I+ @4 [. y) S$ n
22.2 Windows中断机制 593
1 s5 ]6 ^8 I" Y' O8 \/ W22.3 中断编程实践 596
! T$ e: {: C3 G22.3.1 IDT Hook 596$ F. T8 i1 D1 @0 V$ ^% v1 M
22.3.2 巧用IDT Hook实现安全防护 598
, a2 @& e; `3 H9 w9 z) ?' G3 \' v8 q$ p9 P
第23章 Windows内核挂钩 601
* j+ n: b/ I! l7 z7 x. a% E  s2 O1 u6 q
23.1 系统服务描述符表挂钩 602! J$ @9 [  N7 x5 ]4 H' N4 E6 n+ a1 q+ u
23.1.1 系统服务描述符表(SSDT) 602
% K: V2 m3 [! n1 P23.1.2 系统服务描述符表挂钩的意图 6039 N1 Q9 u. l7 Z0 |$ p
23.1.3 寻找要挂钩的函数的地址 604" l4 p& V. u5 h9 L% U$ Z/ f
23.1.4 函数被挂钩的过程 605) J3 X5 ~$ H7 |+ c0 j% m+ A1 W9 W
23.1.5 具体实现的代码 606
( w8 L* I: H- R7 r; r+ j) P! t23.2 函数导出表挂钩 608# _1 z1 P# _' ~
23.2.1 内核函数的种类 608+ }' z! x* v; V$ e+ s- H& v
23.2.2 挂钩IoCallDriver 610
9 m5 y. Z: D  [" b# |23.2.3 对跳转地址进行修改 611
. ~5 \$ F/ _$ X- T23.3 Windows 7系统下IofCallDriver的跟踪 612
& Y9 _9 ^9 A& ^: c23.4 Windows 7系统下内联挂钩 615' c% Y9 d" U) h2 u% R
23.4.1 写入跳转指令并拷贝代码 615
, T4 Q+ N1 ]  q) E+ @2 H23.4.2 实现中继函数 6175 L: g. y/ M/ |/ g
; l( J8 [8 X- z5 ?/ m. v! O" L2 y" d6 n
! O6 s) V7 j! d& B
高 级 篇9 q( c) Q5 Q' k' k" Y

+ D$ ]: b& j( f3 X' Q第24章 Windows通知与回调 620  G* G: o* H2 i1 ^, e/ B
; k6 ~9 {/ N1 U- Y
24.1 Windows的事件通知与回调 620" U2 _: e% I& O( o8 \
24.2 常用的事件通知 6202 o' K2 i! k0 m
24.2.1 创建进程通知 621
* ]# ]' }4 p! u* Z24.2.2 创建线程通知 625: q8 g' c$ |9 i; r/ f. R3 i+ C
24.2.3 加载模块通知 626$ M. c6 D3 s: y9 R
24.2.4 注册表操作通知 6296 g) q1 k& i8 ^: n  s
24.3 Windows回调机制 636' U$ @  |* N2 O5 D
24.3.1 回调对象 636
" N2 ^( I, P, @" ]* Z24.3.2 回调对象的创建 637
- w9 w0 L% Y- N7 y1 a% m0 B: _24.3.3 回调对象的注册 637
- U# w3 K2 ?5 m6 g* ~% E# L24.3.4 回调的通告 638
" v& \' E6 d8 j/ k! y0 ~24.4 安全的死角,回调的应用 639
* k' I; i3 @9 v5 M9 _& [/ Y3 D( r2 a6 k/ h5 P
第25章 保护进程 640
- \7 n- Z5 [/ [+ z( }: _* ]" U' K8 Y, }2 c
25.1 内核对象简介 640
$ Q: V! [  L  K# V1 c: v25.2 内核对象的结构 641
5 m. m: c; Y6 j6 A25.3 保护内核对象 642
2 ?' |7 B) ~& \& S! R4 \25.3.1 处理对象的打开 6431 Z2 B" x9 {& c: ]3 i
25.3.2 处理句柄的复制 6449 ^% ?1 U2 R! A0 `# d6 H8 D
25.3.3 处理句柄的继承 646
6 |9 c- n# ?% }) S8 i* I9 o25.4 进程的保护 652% X5 k. y0 d6 V3 o& K5 @
25.4.1 保护原理 652
3 J3 u& ]. H5 b, c* c" `25.4.2 Vista以后的进程对象保护 654
5 B: Z, L6 [+ R1 y  z9 }25.4.3 进程的其他保护 655
9 ~8 d0 p+ u- a! k: X! q2 l( n3 p. {# \* R+ c; a( i
附录A 如何使用本书的源码光盘 6561 f7 ]' ]. @$ f* r
" N: ^7 q( G6 X# A
附录B 练习题 659
8 R( E  G2 g8 a; m& D
& Y) l1 ]0 c4 c. ~9 o$ R$ w- W" c% l2 X  f% A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-25 11:01:33 | 显示全部楼层
会驱动的都是大神啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 22:34:32 | 显示全部楼层
哦,这个,额,不知道他讲的操作系统的内核指的是什么,这个,很好,我很想学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-24 16:33:16 | 显示全部楼层
推荐 windows内核编程本身参考资料就很少 网络驱动等开发应用更是可怜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 14:54:42 | 显示全部楼层
都不能下载的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 04:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表