创建驱动设备(打开、关闭、读取。写入)

驱动代码

#include<ntddk.h>

#define SYM_NAME L"\\??\\MaoYu"

// 驱动对象卸载的处理函数(回调)
void unLoad(PDRIVER_OBJECT pDriverObject)
{
	// 如果驱动设备存在
	if (pDriverObject->DeviceObject)
	{
		// 删除符号链接
		UNICODE_STRING symName;
		RtlInitUnicodeString(&symName, SYM_NAME);			// 初始化字符结构
		IoDeleteSymbolicLink(&symName);							// 删除符号链接

		// 删除驱动设备
		IoDeleteDevice(pDriverObject->DeviceObject);

		DbgPrint("删除设备成功");									// 打印调式信息
	}

	// 打印驱动卸载成功消息
	DbgPrint("驱动卸载成功++++++++");
}

// IRP 请求 创建(回调)	 1.驱动设备	2.rip对象
NTSTATUS myCreate(PDEVICE_OBJECT pDveice, PIRP prip)
{
	DbgPrint("用户 创建动作");

	// 将信息设置为0
	prip->IoStatus.Information = 0L;

	// IRP的处理状态
	{
		// 将请求设置为成功
		prip->IoStatus.Status = STATUS_SUCCESS;

		//	指示已完成了IO请求 1.IRP指针  2.系统定义的CCHAR常数  
		IoCompleteRequest(prip, IO_NO_INCREMENT);
	}

	return STATUS_SUCCESS;
}

// IRP 请求 清除	(回调)	 1.驱动设备	2.rip对象
NTSTATUS myCleanUp(PDEVICE_OBJECT pDveice, PIRP prip)
{
	DbgPrint("用户 清除动作");

	// 将信息设置为0
	prip->IoStatus.Information = 0L;

	// IRP的处理状态
	{
		// 将请求设置为成功
		prip->IoStatus.Status = STATUS_SUCCESS;

		//	指示已完成了IO请求 1.IRP指针  2.系统定义的CCHAR常数  
		IoCompleteRequest(prip, IO_NO_INCREMENT);
	}

	return STATUS_SUCCESS;
}

// IRP 请求 关闭(回调)	 1.驱动设备	2.rip对象
NTSTATUS myClose(PDEVICE_OBJECT pDveice, PIRP prip)
{
	DbgPrint("用户 关闭动作");

	// 将信息设置为0
	prip->IoStatus.Information = 0L;

	// IRP的处理状态
	{
		// 将请求设置为成功
		prip->IoStatus.Status = STATUS_SUCCESS;

		//	指示已完成了IO请求 1.IRP指针  2.系统定义的CCHAR常数  
		IoCompleteRequest(prip, IO_NO_INCREMENT);
	}

	return STATUS_SUCCESS;
}

// IRP 请求 读取(回调)	 1.驱动设备	2.rip对象
NTSTATUS myRead(PDEVICE_OBJECT pDveice, PIRP prip)
{
	DbgPrint("用户 读取动作");

	// 返回一个指向呼叫者的I / O栈位置指定IRP,返回一个IO栈位置的结构体指针
	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(prip);

	// 拿到IRP要读取的大小
	ULONG size = pStack->Parameters.Read.Length;

	// 处理IRP读取动作
	{
		// 拿到IRP的缓冲区		SystemBuffer 指向系统空间缓冲区的指针 PVOID类型
		PVOID buffer = prip->AssociatedIrp.SystemBuffer;

		// 定义一个字符串
		const char* content = "我是大猫鱼";

		// 计算字符串的长度
		size_t count = strlen(content);

		// 将数据写入到 IRP 缓冲区
		RtlCopyMemory(buffer, content, strlen(content));

		// IRP的格式信息 赋值为写入的长度
		prip->IoStatus.Information = count;
	}

	// IRP结果的处理状态
	{
		// 将请求设置为成功
		prip->IoStatus.Status = STATUS_SUCCESS;

		//	指示已完成了IO请求 1.IRP指针  2.系统定义的CCHAR常数  
		IoCompleteRequest(prip, IO_NO_INCREMENT);
	}

	return STATUS_SUCCESS;
}


// IRP 请求 写入(回调)	 1.驱动设备	2.rip对象
NTSTATUS myWrite(PDEVICE_OBJECT pDveice, PIRP prip)
{
	DbgPrint("用户 写入动作");

	// 返回一个指向呼叫者的I / O栈位置指定IRP,返回一个IO栈位置的结构体指针
	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(prip);

	// 拿到IRP要写入的大小
	ULONG size = pStack->Parameters.Write.Length;

	// 拿到IRP的缓冲区		SystemBuffer 指向系统空间缓冲区的指针 PVOID类型
	PVOID buffer = prip->AssociatedIrp.SystemBuffer;

	// 处理IRP请求
	{
		// 将IRP缓冲区的内容拷贝到设备扩展字节缓冲区
		RtlCopyMemory(pDveice->DeviceExtension, buffer, size);

		// IRP的格式信息 赋值为写入的长度
		prip->IoStatus.Information = size;

		// 打印调式信息
		DbgPrint("IRP:%s", (PCHAR)pDveice->DeviceExtension);
	}

	// IRP结果的处理状态
	{
		// 将请求设置为成功
		prip->IoStatus.Status = STATUS_SUCCESS;

		//	指示已完成了IO请求 1.IRP指针  2.系统定义的CCHAR常数  
		IoCompleteRequest(prip, IO_NO_INCREMENT);
	}
	
	return STATUS_SUCCESS;
}

// 驱动入口函数	1.驱动对象指针		2.路径的对象指针
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{

	// 设置驱动对象卸载回调以及打印调式信息
	{
		// 设置驱动对象的卸载函数
		pDriverObject->DriverUnload = unLoad;

		// 打印驱动加载成功消息
		DbgPrint("驱动加载:%wS", pRegPath->Buffer);
	}

	// 驱动的名称
	UNICODE_STRING deviceName;

	// 驱动设备对象指针
	PDEVICE_OBJECT pDevice = NULL;

	// 创建驱动设备
	{
		// 初始化Unicode字符串的计数器
		RtlInitUnicodeString(&deviceName, L"\\Device\\MaoYu");

		// 创建一个驱动程序使用的设备对象。
		NTSTATUS  status = IoCreateDevice(
			pDriverObject,							// 驱动对象地址
			1024L,									// 设备扩展的字节数大小
			&deviceName,							// 驱动设备的名称
			FILE_DEVICE_UNKNOWN,			// 未知的设备
			0L,											// 有关设备的其它信息
			TRUE,										// 是否代表专业对象
			&pDevice);									// 驱动设备的指针

		// 如果驱动设备创建失败
		if (status != STATUS_SUCCESS)
		{
			DbgPrint("创建驱动设备失败");		// 打印错误信息
			return status;
		}
	}

	// 创建对外的符号链接
	{

		UNICODE_STRING symName;			// 设备符号链接

		// 初始化设备符号字符结构
		RtlInitUnicodeString(&symName, SYM_NAME);

		// 创建符号链接  1.符号链接的字符结构 2.驱动设备的名称
		NTSTATUS status = IoCreateSymbolicLink(&symName, &deviceName);

		if (status != STATUS_SUCCESS)
		{
			DbgPrint("创建符号链接失败");		// 打印错误信息			
			IoDeleteDevice(pDevice);			// 删除设备
			return status;
		}
	}


	// 设置 驱动对象的标志类型 通过缓冲区进行 IO处理,注意要进行按位 或运算
	pDevice->Flags |= DO_BUFFERED_IO;

	// 处理IRP请求
	{
		// IRP创建动作
		pDriverObject->MajorFunction[IRP_MJ_CREATE] = myCreate;

		// IRP清除动作
		pDriverObject->MajorFunction[IRP_MJ_CLEANUP] = myCleanUp;

		// IRP关闭动作
		pDriverObject->MajorFunction[IRP_MJ_CLOSE] = myClose;

		// IRP读取动作
		pDriverObject->MajorFunction[IRP_MJ_READ] = myRead;

		// IRP写入动作
		pDriverObject->MajorFunction[IRP_MJ_WRITE] = myWrite;
	}



	return STATUS_SUCCESS;
}

c++代码

#include<iostream>
#include<string>
#include<Windows.h>

int main(const int argc, const char** argv)
{

	HANDLE hFile = NULL;

	hFile = ::CreateFileW(
		L"\\\\.\\MaoYu",
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	if (hFile == INVALID_HANDLE_VALUE)
	{
		std::cout << "设备打开失败" << std::endl;
		system("pause");
		return 1;
	}
	else
	{
		std::cout << "设备打开成功" << std::endl;
	}

	system("pause");

	// 读取
	{
		PCHAR buffer[1024]{ 0 };

		if (::ReadFile(hFile, buffer, sizeof(buffer), NULL, NULL))
		{
			printf("%s", buffer);
		}
		else
		{
			std::cout << "读取错误" << std::endl;
			system("pause");
			::CloseHandle(hFile);
			return 1;
		}
		system("pause");
	}

		// 写入
	{
		std::string str = "hello word";

		if (::WriteFile(hFile, str.c_str(), str.length(), NULL, NULL))
		{
			std::cout << "写入成功" << std::endl;
		}
		else
		{
			std::cout << "写入失败" << std::endl;
		}
	}
	system("pause");
	::CloseHandle(hFile);
}

这简单的实例,简单的流程解释
// 驱动端
1.创建一个驱动设备
2.创建这个设备的外部符号链接
3.设置这个设备的通信标志(Flags)
4.设置IRP请求的回调函数

// 用户端
1.打开一个设备
2.读取设备的数据
3.写入数据到设备

它们直接的交互,则是通过一个缓冲区。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 内核上机指导 2 1.1 下载和使用WDK 2 1.1.1 下载并安装WDK 2 1.1.2 编写第一个C文件 4 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 8 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows XP调试执行 9 1.3.3 设置Vista调试执行 10 1.3.4 设置VMware的管道虚拟串口 11 1.3.5 设置Windows内核符号表 12 1.3.6 实战调试first 13 第2章 内核编程环境及其特殊性 16 2.1 内核编程的环境 16 2.1.1 隔离的应用程序 16 2.1.2 共享的内核空间 17 2.1.3 无处不在的内核模块 18 2.2 数据类型 19 2.2.1 基本数据类型 19 2.2.2 返回状态 19 2.2.3 字符串 20 2.3 重要的数据结构 21 2.3.1 驱动对象 21 2.3.2 设备对象 22 2.3.3 请求 24 2.4 函数调用 25 2.4.1 查阅帮助 25 2.4.2 帮助中有的几类函数 26 2.4.3 帮助中没有的函数 28 2.5 Windows的驱动开发模型 29 2.6 WDK编程中的特殊点 30 2.6.1 内核编程的主要调用源 30 2.6.2 函数的多线程安全性 30 2.6.3 代码的中断级 32 2.6.4 WDK中出现的特殊代码 32 第3章 字符串与链表 35 3.1 字符串操作 35 3.1.1 使用字符串结构 35 3.1.2 字符串的初始化 36 3.1.3 字符串的拷贝 37 3.1.4 字符串的连接 38 3.1.5 字符串的打印 38 3.2 内存与链表 40 3.2.1 内存的分配与释放 40 3.2.2 使用LIST_ENTRY 41 3.2.3 使用长长整型数据 43 3.3 自旋锁 44 3.3.1 使用自旋锁 44 3.3.2 在双向链表中使用自旋锁 45 3.3.3 使用队列自旋锁提高性能 46 第4章 文件、注册表、线程 47 4.1 文件操作 47 4.1.1 使用OBJECT_ATTRIBUTES 47 4.1.2 打开关闭文件 48 4.1.3 文件读/写操作 51 4.2 注册表操作 53 4.2.1 注册表键的打开 53 4.2.2 注册表键值的读 55 4.2.3 注册表键值的写 57 4.3 时间与定时器 58 4.3.1 获得当前“滴答”数 58 4.3.2 获得当前系统时间 58 4.3.3 使用定时器 59 4.4 线程与事件 62 4.4.1 使用系统线程 62 4.4.2 在线程中睡眠 63 4.4.3 使用同步事件 64 第5章 应用与内核通信 67 5.1 内核方面的编程 68 5.1.1 生成控制设备 68 5.1.2 控制设备的名字和符号链接 70 5.1.3 控制设备的删除 71 5.1.4 分发函数 72 5.1.5 请求的处理 73 5.2 应用方面的编程 74 5.2.1 基本的功能需求 74 5.2.2 在应用程序中打开关闭设备 75 5.2.3 设备控制请求 75 5.2.4 内核中的对应处理 77 5.2.5 结合测试的效果 79 5.3 阻塞、等待与安全设计 80 5.3.1 驱动主动通知应用 80 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位系统新增机制 88 6.1.1 WOW64子系统 88 6.1.2 PatchGuard技术 91 6.1.3 64位驱动的编译、安装与运行 91 6.2 编程差异 92 6.2.1 汇编嵌入变化 92 6.2.2 预处理与条件编译 93 6.2.3 数据结构调整 93 开 发 篇 第7章 串口的过滤 96 7.1 过滤的概念 96 7.1.1 设备绑定的内核API之一 97 7.1.2 设备绑定的内核API之二 98 7.1.3 生成过滤设备并绑定 98 7.1.4 从名字获得设备对象 100 7.1.5 绑定所有串口 101 7.2 获得实际数据 102 7.2.1 请求的区分 102 7.2.2 请求的结局 103 7.2.3 写请求的数据 104 7.3 完整的代码 105 7.3.1 完整的分发函数 105 7.3.2 如何动态卸载 106 7.3.3 代码的编译与运行 107 第8章 键盘的过滤 109 8.1 技术原理 110 8.1.1 预备知识 110 8.1.2 Windows中从击键到内核 110 8.1.3 键盘硬件原理 112 8.2 键盘过滤的框架 112 8.2.1 找到所有的键盘设备 112 8.2.2 应用设备扩展 115 8.2.3 键盘过滤模块的DriverEntry 117 8.2.4 键盘过滤模块的动态卸载 117 8.3 键盘过滤的请求处理 119 8.3.1 通常的处理 119 8.3.2 PNP的处理 120 8.3.3 读的处理 121 8.3.4 读完成的处理 122 8.4 从请求中打印出按键信息 123 8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 123 8.4.2 从KEYBOARD_INPUT_DATA中得到键 124 8.4.3 从MakeCode到实际字符 124 8.5 Hook分发函数 126 8.5.1 获得类驱动对象 126 8.5.2 修改类驱动的分发函数指针 127 8.5.3 类驱动之下的端口驱动 128 8.5.4 端口驱动和类驱动之间的协作机制 129 8.5.5 找到关键的回调函数的条件 129 8.5.6 定义常数和数据结构 130 8.5.7 打开两种键盘端口驱动寻找设备 131 8.5.8 搜索在KbdClass类驱动中的地址 133 8.6 Hook键盘中断反过滤 135 8.6.1 中断:IRQ和INT 136 8.6.2 如何修改IDT 136 8.6.3 替换IDT中的跳转地址 137 8.6.4 QQ的PS/2反过滤措施 139 8.7 直接用端口操作键盘 139 8.7.1 读取键盘数据和命令端口 139 8.7.2 p2cUserFilter的最终实现 140 第9章 磁盘的虚拟 143 9.1 虚拟的磁盘 143 9.2 一个具体的例子 143 9.3 入口函数 144 9.3.1 入口函数的定义 144 9.3.2 Ramdisk驱动的入口函数 145 9.4 EvtDriverDeviceAdd函数 146 9.4.1 EvtDriverDeviceAdd的定义 146 9.4.2 局部变量的声明 146 9.4.3 磁盘设备创建 147 9.4.4 如何处理发往设备的请求 148 9.4.5 用户配置的初始化 149 9.4.6 链接给应用程序 151 9.4.7 小结 152 9.5 FAT12/16磁盘卷初始化 152 9.5.1 磁盘卷结构简介 152 9.5.2 Ramdisk对磁盘的初始化 154 9.6 驱动中的请求处理 160 9.6.1 请求的处理 160 9.6.2 读/写请求 160 9.6.3 DeviceIoControl请求 162 9.7 Ramdisk的编译和安装 164 9.7.1 编译 164 9.7.2 安装 164 9.7.3 对安装的深入探究 165 第10章 磁盘的过滤 167 10.1 磁盘过滤驱动的概念 167 10.1.1 设备过滤和类过滤 167 10.1.2 磁盘设备和磁盘卷设备过滤驱动 167 10.1.3 注册表和磁盘卷设备过滤驱动 168 10.2 具有还原功能的磁盘卷过滤驱动 168 10.2.1 简介 168 10.2.2 基本思想 169 10.3 驱动分析 169 10.3.1 DriverEntry函数 169 10.3.2 AddDevice函数 170 10.3.3 PnP请求的处理 174 10.3.4 Power请求的处理 178 10.3.5 DeviceIoControl请求的处理 178 10.3.6 bitmap的作用和分析 182 10.3.7 boot驱动完成回调函数和稀疏文件 187 10.3.8 读/写请求的处理 190 第11章 文件系统的过滤与监控 199 11.1 文件系统的设备对象 200 11.1.1 控制设备与卷设备 200 11.1.2 生成自己的一个控制设备 201 11.2 文件系统的分发函数 202 11.2.1 普通的分发函数 202 11.2.2 文件过滤的快速IO分发函数 203 11.2.3 快速IO分发函数的一个实现 205 11.2.4 快速IO分发函数逐个简介 206 11.3 设备的绑定前期工作 207 11.3.1 动态地选择绑定函数 207 11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制设备 213 11.4.3 利用文件系统控制请求 215 11.5 文件系统卷设备的绑定 217 11.5.1 从IRP中获得VPB指针 217 11.5.2 设置完成函数并等待IRP完成 218 11.5.3 卷挂载IRP完成后的工作 221 11.5.4 完成函数的相应实现 223 11.5.5 绑定卷的实现 224 11.6 读/写操作的过滤 226 11.6.1 设置一个读处理函数 226 11.6.2 设备对象的区分处理 227 11.6.3 解析读请求中的文件信息 228 11.6.4 读请求的完成 230 11.7 其他操作的过滤 234 11.7.1 文件对象的生存周期 234 11.7.2 文件的打开关闭 235 11.7.3 文件的删除 237 11.8 路径过滤的实现 238 11.8.1 取得文件路径的三种情况 238 11.8.2 打开成功后获取路径 238 11.8.3 在其他时刻获得文件路径 240 11.8.4 在打开请求完成之前获得路径名 240 11.8.5 把短名转换为长名 242 11.9 把sfilter编译成静态库 243 11.9.1 如何方便地使用sfilter 243 11.9.2 初始化回调、卸载回调和绑定回调 244 11.9.3 绑定与回调 245 11.9.4 插入请求回调 246 11.9.5 如何利用sfilter.lib 249 第12章 文件系统透明加密 252 12.1 文件透明加密的应用 252 12.1.1 防止企业信息泄密 252 12.1.2 文件透明加密防止企业信息泄密 253 12.1.3 文件透明加密软件的例子 253 12.2 区分进程 254 12.2.1 机密进程与普通进程 254 12.2.2 找到进程名字的位置 255 12.2.3 得到当前进程的名字 256 12.3 内存映射与文件缓冲 257 12.3.1 记事本的内存映射文件 257 12.3.2 Windows的文件缓冲 258 12.3.3 文件缓冲:明文还是密文的选择 259 12.3.4 清除文件缓冲 260 12.4 加密标识 263 12.4.1 保存在文件外、文件头还是文件尾 263 12.4.2 隐藏文件头的大小 264 12.4.3 隐藏文件头的设置偏移 266 12.4.4 隐藏文件头的读/写偏移 267 12.5 文件加密表 267 12.5.1 何时进行加密操作 267 12.5.2 文件控制块与文件对象 268 12.5.3 文件加密表的数据结构与初始化 269 12.5.4 文件加密表的操作:查询 270 12.5.5 文件加密表的操作:添加 271 12.5.6 文件加密表的操作:删除 272 12.6 文件打开处理 273 12.6.1 直接发送IRP进行查询与设置操作 274 12.6.2 直接发送IRP进行读/写操作 276 12.6.3 文件的非重入打开 277 12.6.4 文件的打开预处理 280 12.7 读/写加密和解密 285 12.7.1 在读取时进行解密 285 12.7.2 分配与释放MDL 286 12.7.3 写请求加密 287 12.8 crypt_file的组装 289 12.8.1 crypt_file的初始化 289 12.8.2 crypt_file的IRP预处理 290 12.8.3 crypt_file的IRP后处理 293 第13章 文件系统微过滤驱动 297 13.1 文件系统微过滤驱动简介 297 13.1.1 文件系统微过滤驱动的由来 297 13.1.2 Minifilter的优点与不足 298 13.2 Minifilter的编程框架 298 13.2.1 微文件系统过滤的注册 299 13.2.2 微过滤器的数据结构 300 13.2.3 卸载回调函数 303 13.2.4 预操作回调函数 303 13.2.5 后操作回调函数 306 13.2.6 其他回调函数 307 13.3 Minifilter如何与应用程序通信 309 13.3.1 建立通信端口的方法 310 13.3.2 在用户态通过DLL使用通信端口的范例 311 13.4 Minifilter的安装与加载 314 13.4.1 安装Minifilter的INF文件 314 13.4.2 启动安装完成的Minifilter 316 第14章 网络传输层过滤 317 14.1 TDI概要 317 14.1.1 为何选择TDI 317 14.1.2 从socket到Windows内核 318 14.1.3 TDI过滤的代码例子 319 14.2 TDI的过滤框架 319 14.2.1 绑定TDI的设备 319 14.2.2 唯一的分发函数 320 14.2.3 过滤框架的实现 322 14.2.4 主要过滤的请求类型 323 14.3 生成请求:获取地址 324 14.3.1 过滤生成请求 324 14.3.2 准备解析IP地址与端口 326 14.3.3 获取生成的IP地址和端口 327 14.3.4 连接终端的生成与相关信息的保存 329 14.4 控制请求 330 14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330 14.4.2 TDI_CONNECT的过滤 332 14.4.3 其他的次功能号 333 14.4.4 设置事件的过滤 334 14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336 14.4.6 直接获取发送函数的过滤 337 14.4.7 清理请求的过滤 339 14.5 本书例子tdifw.lib的应用 341 14.5.1 tdifw库的回调接口 341 14.5.2 tdifw库的使用例子 342 第15章 Windows过滤平台 345 15.1 WFP简介 345 15.2 WFP框架 345 15.3 基本对象模型 347 15.3.1 过滤引擎 347 15.3.2 垫片 347 15.3.3 呼出接口 347 15.3.4 分层 348 15.3.5 子层 349 15.3.6 过滤器 350 15.3.7 呼出接口回调函数 354 15.4 WFP操作 359 15.4.1 呼出接口的注册与卸载 360 15.4.2 呼出接口的添加与移除 360 15.4.3 子层的添加与移除 361 15.4.4 过滤器的添加 362 15.5 WFP过滤例子 362 第16章 NDIS协议驱动 370 16.1 以太网包和网络驱动架构 370 16.1.1 以太网包和协议驱动 370 16.1.2 NDIS网络驱动 371 16.2 协议驱动的DriverEntry 372 16.2.1 生成控制设备 372 16.2.2 注册协议 374 16.3 协议与网卡的绑定 375 16.3.1 协议与网卡的绑定概念 375 16.3.2 绑定回调处理的实现 376 16.3.3 协议绑定网卡的API 378 16.3.4 解决绑定竞争问题 379 16.3.5 分配接收和发送的包池与缓冲池 380 16.3.6 OID请求的发送和请求完成回调 381 16.3.7 ndisprotCreateBinding的最终实现 385 16.4 绑定的解除 390 16.4.1 解除绑定使用的API 390 16.4.2 ndisprotShutdownBinding的实现 392 16.5 在用户态操作协议驱动 395 16.5.1 协议的收包与发包 395 16.5.2 在用户态编程打开设备 396 16.5.3 用DeviceIoControl发送控制请求 397 16.5.4 用WriteFile发送数据包 399 16.5.5 用ReadFile发送数据包 400 16.6 在内核态完成功能的实现 402 16.6.1 请求的分发与实现 402 16.6.2 等待设备绑定完成与指定设备名 402 16.6.3 指派设备的完成 403 16.6.4 处理读请求 406 16.6.5 处理写请求 408 16.7 协议驱动的接收回调 412 16.7.1 和接收包有关的回调函数 412 16.7.2 ReceiveHandler的实现 413 16.7.3 TransferDataCompleteHandler的实现 417 16.7.4 ReceivePacketHandler的实现 418 16.7.5 接收数据包的入队 420 16.7.6 接收数据包的出队和读请求的完成 422 第17章 NDIS小端口驱动 427 17.1 小端口驱动的应用与概述 427 17.1.1 小端口驱动的应用 427 17.1.2 小端口驱动示例 428 17.1.3 小端口驱动的运作与编程概述 429 17.2 小端口驱动的初始化 429 17.2.1 小端口驱动的DriverEntry 429 17.2.2 小端口驱动的适配器结构 431 17.2.3 配置信息的读取 433 17.2.4 设置小端口适配器上下文 433 17.2.5 MPInitialize的实现 434 17.2.6 MPHalt的实现 437 17.3 打开ndisprot设备 438 17.3.1 IO目标 438 17.3.2 给IO目标发送DeviceIoControl请求 439 17.3.3 打开ndisprot接口并完成配置设备 441 17.4 使用ndisprot发送包 443 17.4.1 小端口驱动的发包接口 443 17.4.2 发送控制块(TCB) 444 17.4.3 遍历包组并填写TCB 446 17.4.4 写请求的构建与发送 449 17.5 使用ndisprot接收包 451 17.5.1 提交数据包的内核API 451 17.5.2 从接收控制块(RCB)提交包 452 17.5.3 对ndisprot读请求的完成函数 454 17.5.4 读请求的发送 456 17.5.5 用于读包的WDF工作任务 457 17.5.6 ndisedge读工作任务的生成与入列 459 17.6 其他的特征回调函数的实现 461 17.6.1 包的归还 461 17.6.2 OID查询处理的直接完成 462 17.6.3 OID设置处理 465 第18章 NDIS中间层驱动 467 18.1 NDIS中间层驱动概述 467 18.1.1 Windows网络架构总结 467 18.1.2 NDIS中间层驱动简介 468 18.1.3 NDIS中间层驱动的应用 469 18.1.4 NDIS包描述符结构深究 470 18.2 中间层驱动的入口与绑定 473 18.2.1 中间层驱动的入口函数 473 18.2.2 动态绑定NIC设备 474 18.2.3 小端口初始化(MpInitialize) 475 18.3 中间层驱动发送数据包 477 18.3.1 发送数据包原理 477 18.3.2 包描述符“重利用” 478 18.3.3 包描述符“重申请” 481 18.3.4 发送数据包的异步完成 482 18.4 中间层驱动接收数据包 484 18.4.1 接收数据包概述 484 18.4.2 用PtReceive接收数据包 485 18.4.3 用PtReceivePacket接收 490 18.4.4 对包进行过滤 491 18.5 中间层驱动程序查询和设置 494 18.5.1 查询请求的处理 494 18.5.2 设置请求的处理 496 18.6 NDIS句柄 498 18.6.1 不可见的结构指针 498 18.6.2 常见的NDIS句柄 499 18.6.3 NDIS句柄误用问题 500 18.6.4 一种解决方案 502 18.7 生成普通控制设备 503 18.7.1 在中间层驱动中添加普通设备 503 18.7.2 使用传统方法来生成控制设备 505 第19章 IA-32汇编基础 511 19.1 x86内存、寄存器与堆栈 511 19.1.1 _asm关键字 511 19.1.2 x86中的mov指令 512 19.1.3 x86中的寄存器与内存 512 19.1.4 赋值语句的实现 513 19.2 x86中函数的实现 514 19.2.1 一个函数的例子 514 19.2.2 堆栈的介绍 515 19.2.3 寄存器的备份和恢复 516 19.2.4 内部变量与返回值 518 19.3 x86中函数的调用与返回 521 19.3.1 函数的调用指令call 521 19.3.2 通过堆栈传递参数 521 19.3.3 从函数返回 523 19.3.4 三种常见的调用协议 524 19.4 从32位汇编到64位汇编 526 19.4.1 Intel 64与IA-32体系架构简介 526 19.4.2 64位指令与32位指令 526 19.4.3 通用寄存器 527 19.5 64位下的函数实现 528 19.5.1 函数概览 528 19.5.2 32位参数的传递 529 19.5.3 64位参数与返回值 530 19.5.4 栈空间的开辟与恢复 531 第20章 IA-32体系中的内存地址 534 20.1 内存的虚拟地址 534 20.1.1 C语言中的内存地址 534 20.1.2 虚拟地址的构成 535 20.1.3 段的选择 536 20.2 全局描述符表和段描述符 538 20.2.1 全局描述符表 538 20.2.2 段类型 539 20.2.3 段寄存器与段选择子 540 20.2.4 64位模式下的段 541 20.3 分段编程实践 542 20.3.1 系统表寄存器的结构 542 20.3.2 在汇编语言中获取全局描述表的位置 543 20.3.3 调试范例:sgdt指令的错误使用 545 20.3.4 在64位下获得全局描述符表 547 20.4 线性地址基础 549 20.4.1 分页控制机制 550 20.4.2 线性地址的转换 551 20.4.3 混合页面大小 552 20.4.4 32位物理地址的页目录和页表项 552 20.5 各种特殊分页方式 555 20.5.1 PAE分页方式 555 20.5.2 PSE-36分页机制 558 20.5.3 IA-32e模式下的线性地址 559 20.6 分页编程实践 562 20.6.1 页目录和页目录指针表的获取 562 20.6.2 页表的获取 564 20.6.3 线性地址的结构 567 第21章 处理器权限级别切换 571 21.1 Ring0和Ring3权限级别 571 21.2 保护模式下的分页内存保护 572 21.3 分页内存不可执行保护 574 21.3.1 不可执行保护原理 574 21.3.2 不可执行保护的漏洞 575 21.3.3 上机实践 577 21.4 权限级别的切换 579 21.4.1 调用门及其漏洞 579 21.4.2 sysenter和sysexit指令 581 21.4.3 上机实践 583 第22章 IA-32体系结构中的中断 585 22.1 中断基础知识 585 22.1.1 中断描述符表 585 22.1.2 中断处理过程 587 22.1.3 64位模式下的中断处理机制 589 22.1.4 多核下的中断 589 22.2 Windows中断机制 593 22.3 中断编程实践 596 22.3.1 IDT Hook 596 22.3.2 巧用IDT Hook实现安全防护 598 第23章 Windows内核挂钩 601 23.1 系统服务描述符表挂钩 602 23.1.1 系统服务描述符表(SSDT) 602 23.1.2 系统服务描述符表挂钩的意图 603 23.1.3 寻找要挂钩的函数的地址 604 23.1.4 函数被挂钩的过程 605 23.1.5 具体实现的代码 606 23.2 函数导出表挂钩 608 23.2.1 内核函数的种类 608 23.2.2 挂钩IoCallDriver 610 23.2.3 对跳转地址进行修改 611 23.3 Windows 7系统下IofCallDriver的跟踪 612 23.4 Windows 7系统下内联挂钩 615 23.4.1 写入跳转指令并拷贝代码 615 23.4.2 实现中继函数 617 高 级 篇 第24章 Windows通知与回调 620 24.1 Windows的事件通知与回调 620 24.2 常用的事件通知 620 24.2.1 创建进程通知 621 24.2.2 创建线程通知 625 24.2.3 加载模块通知 626 24.2.4 注册表操作通知 629 24.3 Windows回调机制 636 24.3.1 回调对象 636 24.3.2 回调对象的创建 637 24.3.3 回调对象的注册 637 24.3.4 回调的通告 638 24.4 安全的死角,回调的应用 639 第25章 保护进程 640 25.1 内核对象简介 640 25.2 内核对象的结构 641 25.3 保护内核对象 642 25.3.1 处理对象的打开 643 25.3.2 处理句柄的复制 644 25.3.3 处理句柄的继承 646 25.4 进程的保护 652 25.4.1 保护原理 652 25.4.2 Vista以后的进程对象保护 654 25.4.3 进程的其他保护 655 附录A 如何使用本书的源码光盘 656 附录B 练习题 659
编写设备驱动程序》提供有关为面向字符的设备、面向块的设备、网络设备、SCSI目标和HBA设备以及USB设备开发SolarisolarisOperatingSystem,SolarisOS)驱动程序的信息。本书讨论了如何为符合SolarisOSDDI/DKI(DeviceDriver Interface/Driver-KernelInterface,设备驱动程序接口/驱动程序内核接口)的所有体系结构开发多线程可重入设备驱动程序。介绍了一种常用的驱动程序编写方法,该方法允许在编写驱动程序时忽略特定于平台的问题,如字节存储顺序(endianness)和数据排序等。 其他主题包括:强化Solaris驱动程序;电源管理;驱动程序自动配置;程控I/O;直接内存访问(DirectMemoryAccess,DMA);设备上下文管理;编译、安装和测试驱动程序;调试驱动程序以及将Solaris驱动程序移植到64位环境。 目录 前言........................................................................................................................................................29 第1部分 针对Solaris平台设计设备驱动程序..............................................................................................35 1 Solaris设备驱动程序概述 ................................................................................................................37 设备驱动程序基础知识.................................................................................................................... 37 什么是设备驱动程序? ............................................................................................................ 37 什么是设备驱动程序入口点? ............................................................................................... 38 设备驱动程序入口点 ........................................................................................................................ 38 通用于所有驱动程序的入口点 ............................................................................................... 39 用于块设备驱动程序的入口点 ............................................................................................... 41 用于字符设备驱动程序的入口点........................................................................................... 42 用于STREAMS设备驱动程序的入口点 ............................................................................... 43 用于内存映射设备的入口点 ................................................................................................... 44 网络设备驱动程序入口点 ........................................................................................................ 45 用于SCSIHBA驱动程序的入口点 ........................................................................................ 45 用于PC卡驱动程序的入口点 ................................................................................................. 46 设备驱动程序设计注意事项 ........................................................................................................... 46 DDI/DKI功能 ............................................................................................................................. 47 驱动程序上下文 ......................................................................................................................... 48 返回错误 ...................................................................................................................................... 49 动态内存分配 .............................................................................................................................. 49 热插拔 ........................................................................................................................................... 50 2 Solaris内核和设备树 .........................................................................................................................51 什么是内核? ..................................................................................................................................... 51 多线程执行环境 ......................................................................................................................... 53 3 虚拟内存 ...................................................................................................................................... 53 作为特殊文件的设备................................................................................................................. 53 DDI/DKI接口 ............................................................................................................................. 53 设备树概述.......................................................................................................................................... 54 设备树组件 .................................................................................................................................. 54 显示设备树 .................................................................................................................................. 56 将驱动程序绑定到设备 ............................................................................................................ 58 3 多线程 ...................................................................................................................................................61 锁定原语 .............................................................................................................................................. 61 驱动程序数据的存储类 ............................................................................................................ 61 互斥锁 ........................................................................................................................................... 62 读取器/写入器锁 ........................................................................................................................ 63 信号 ............................................................................................................................................... 63 线程同步 .............................................................................................................................................. 64 线程同步中的条件变量 ............................................................................................................ 64 cv_wait()和cv_timedwait()函数 ........................................................................................ 65 cv_wait_sig()函数 ................................................................................................................... 66 cv_timedwait_sig()函数 ........................................................................................................ 67 选择锁定方案 ..................................................................................................................................... 67 潜在的锁定缺点 ......................................................................................................................... 68 线程无法接收信号 ..................................................................................................................... 68 4 属性........................................................................................................................................................71 设备属性 .............................................................................................................................................. 71 设备属性名称 .............................................................................................................................. 72 创建和更新属性 ......................................................................................................................... 72 查找属性 ...................................................................................................................................... 72 prop_op()入口点 ....................................................................................................................... 74 5 管理事件和排队任务 .........................................................................................................................77 管理事件 .............................................................................................................................................. 77 事件介绍 ...................................................................................................................................... 77 使用ddi_log_sysevent()记录事件 ...................................................................................... 78 目录 编写设备驱动程序 • 2010年9月 4 定义事件特性 .............................................................................................................................. 80 排队任务 .............................................................................................................................................. 83 任务队列简介 .............................................................................................................................. 83 任务队列接口 .............................................................................................................................. 83 使用任务队列 .............................................................................................................................. 84 观察任务队列 .............................................................................................................................. 84 6 驱动程序自动配置 .............................................................................................................................87 驱动程序的装入和卸载.................................................................................................................... 87 驱动程序必需的数据结构 ............................................................................................................... 88 modlinkage结构 ......................................................................................................................... 88 modldrv结构 ................................................................................................................................ 89 dev_ops结构 ................................................................................................................................ 89 cb_ops结构 .................................................................................................................................. 90 可装入驱动程序接口 ........................................................................................................................ 91 _init()示例 ................................................................................................................................ 92 _fini()示例 ................................................................................................................................ 93 _info()示例 ................................................................................................................................ 93 设备配置概念 ..................................................................................................................................... 94 设备实例和实例编号................................................................................................................. 94 次要节点和次要设备号 ............................................................................................................ 95 probe()入口点 ........................................................................................................................... 95 attach()入口点 ......................................................................................................................... 97 detach()入口点 .......................................................................................................................102 getinfo()入口点 .....................................................................................................................103 使用设备ID ......................................................................................................................................105 注册设备ID ...............................................................................................................................105 注销设备ID ...............................................................................................................................106 7 设备访问:程控I/O..........................................................................................................................107 设备内存 ............................................................................................................................................107 管理设备和主机字节序之间的差别 ....................................................................................108 管理数据排序要求 ...................................................................................................................108 ddi_device_acc_attr结构 ....................................................................................................108 映射设备内存 ............................................................................................................................109 目录 5 映射设置示例 ............................................................................................................................109 设备访问函数 ...................................................................................................................................110 备用设备访问接口 ...................................................................................................................111 8 中断处理程序 ................................................................................................................................... 113 中断处理程序概述 ..........................................................................................................................113 设备中断 ............................................................................................................................................114 高级别中断 ................................................................................................................................114 传统中断 ....................................................................................................................................115 标准消息告知中断和扩展消息告知中断 ...........................................................................115 软件中断 ....................................................................................................................................116 DDI中断函数 ...................................................................................................................................117 中断功能函数 ............................................................................................................................117 中断初始化和销毁函数 ..........................................................................................................117 优先级管理函数 .......................................................................................................................118 软中断函数 ................................................................................................................................118 中断函数示例 ............................................................................................................................118 注册中断 ............................................................................................................................................119 注册传统中断 ............................................................................................................................119 注册MSI中断 ...........................................................................................................................122 中断资源管理 ...................................................................................................................................125 中断资源管理功能 ...................................................................................................................125 回调接口 ....................................................................................................................................126 中断请求接口 ............................................................................................................................128 中断资源管理实现样例 ..........................................................................................................130 中断处理程序功能 ..........................................................................................................................135 处理高级别中断 ...............................................................................................................................137 高级互斥锁 ................................................................................................................................137 高级别中断处理示例...............................................................................................................137 9 直接内存访问(DirectMemoryAccess,DMA) ..............................................................................141 DMA模型 ..........................................................................................................................................141 设备DMA的类型 ............................................................................................................................142 总线主控器DMA .....................................................................................................................142 第三方DMA ..............................................................................................................................142 目录 编写设备驱动程序 • 2010年9月 6 第一方DMA ..............................................................................................................................143 主机平台DMA的类型 ...................................................................................................................143 DMA软件组件:句柄、窗口和Cookie .....................................................................................143 DMA操作 ..........................................................................................................................................144 执行总线主控器DMA传送 ...................................................................................................144 执行第一方DMA传送 ............................................................................................................144 执行第三方DMA传送 ............................................................................................................145 DMA特性 ..................................................................................................................................145 管理DMA资源 ................................................................................................................................148 对象锁定 ....................................................................................................................................148 分配DMA句柄 .........................................................................................................................148 分配DMA资源 .........................................................................................................................149 确定最大突发流量大小 ..........................................................................................................151 分配专用DMA缓冲区 ............................................................................................................152 处理资源分配故障 ...................................................................................................................153 对DMA引擎进行编程 ............................................................................................................154 释放DMA资源 .........................................................................................................................155 释放DMA句柄 .........................................................................................................................156 取消DMA回调 .........................................................................................................................156 同步内存对象 ............................................................................................................................157 DMA窗口 ..........................................................................................................................................159 10 映射设备和内核内存 ...................................................................................................................... 163 内存映射概述 ...................................................................................................................................163 导出映射 ............................................................................................................................................163 segmap(9E)入口点 ....................................................................................................................163 devmap(9E)入口点 ....................................................................................................................165 将设备内存与用户映射相关联 ....................................................................................................166 将内核内存与用户映射相关联 ....................................................................................................168 为用户访问分配内核内存 ......................................................................................................168 将内核内存导出到应用程序 .................................................................................................170 释放为用户访问导出的内核内存.........................................................................................171 11 设备上下文管理 ............................................................................................................................... 173 设备上下文简介 ...............................................................................................................................173 目录 7 什么是设备上下文?...............................................................................................................173 上下文管理模型 .......................................................................................................................173 上下文管理操作 ...............................................................................................................................175 devmap_callback_ctl结构 ....................................................................................................175 用于设备上下文管理的入口点 .............................................................................................176 将用户映射与驱动程序通知关联.........................................................................................183 管理映射访问 ............................................................................................................................184 12 电源管理 ............................................................................................................................................ 187 电源管理框架 ...................................................................................................................................187 设备电源管理 ............................................................................................................................187 系统电源管理 ............................................................................................................................188 设备电源管理模型 ..........................................................................................................................188 电源管理组件 ............................................................................................................................189 电源管理状态 ............................................................................................................................189 电源级别 ....................................................................................................................................189 电源管理相关性 .......................................................................................................................191 设备的自动电源管理...............................................................................................................191 设备电源管理接口 ...................................................................................................................192 power()入口点 .........................................................................................................................193 系统电源管理模型 ..........................................................................................................................195 自动关闭阈值 ............................................................................................................................196 繁忙状态 ....................................................................................................................................196 硬件状态 ....................................................................................................................................196 系统的自动电源管理...............................................................................................................196 系统电源管理使用的入口点 .................................................................................................196 电源管理设备访问示例..................................................................................................................200 电源管理控制流程 ..........................................................................................................................201 电源管理接口的更改 ......................................................................................................................202 13 强化Solaris驱动程序 ......................................................................................................................205 Sun故障管理体系结构I/O故障服务 .........................................................................................205 什么是预测性自我修复? ......................................................................................................206 SolarisFaultManager ................................................................................................................206 错误处理 ....................................................................................................................................209 目录 编写设备驱动程序 • 2010年9月 8 诊断故障 ....................................................................................................................................222 事件注册表 ................................................................................................................................223 词汇表 .........................................................................................................................................223 资源 .............................................................................................................................................224 用于Solaris设备驱动程序的防御性编程方法 ..........................................................................224 使用单独的设备驱动程序实例 .............................................................................................225 独占使用DDI访问句柄 .........................................................................................................225 检测已损坏的数据 ...................................................................................................................225 DMA隔离 ..................................................................................................................................226 处理有问题的中断 ...................................................................................................................227 其他编程注意事项 ...................................................................................................................228 驱动程序强化测试工具..................................................................................................................229 故障注入 ....................................................................................................................................229 设置测试工具 ............................................................................................................................230 测试驱动程序 ............................................................................................................................231 使用脚本自动完成测试过程 .................................................................................................233 14 分层驱动程序接口(LayeredDriverInterface,LDI) ....................................................................237 LDI概述 .............................................................................................................................................237 内核接口 ............................................................................................................................................238 分层标识符-内核设备使用方 .............................................................................................238 分层驱动程序句柄-目标设备 .............................................................................................239 LDI内核接口示例 ....................................................................................................................242 用户接口 ............................................................................................................................................253 设备信息库接口 .......................................................................................................................253 列显系统配置命令接口 ..........................................................................................................254 设备用户命令接口 ...................................................................................................................257 第2部分 设计特定种类的设备驱动程序 .....................................................................................................259 15 字符设备驱动程序 .......................................................................................................................... 261 字符驱动程序结构概述..................................................................................................................261 字符设备自动配置 ..........................................................................................................................263 设备访问(字符驱动程序) .........................................................................................................264 目录 9 open()入口点(字符驱动程序) ........................................................................................264 close()入口点(字符驱动程序) ......................................................................................265 I/O请求处理 .....................................................................................................................................266 用户地址 ....................................................................................................................................266 向量化的I/O .............................................................................................................................266 同步I/O与异步I/O之间的差别 ..........................................................................................268 数据传输方法 ............................................................................................................................268 映射设备内存 ...................................................................................................................................274 对文件描述符执行多路复用I/O操作 ........................................................................................275 其他I/O控制 ....................................................................................................................................277 ioctl()入口点(字符驱动程序) ......................................................................................277 对有64位处理能力的设备驱动程序的I/O控制支持 .....................................................279 处理copyout()溢出 ................................................................................................................281 32位和64位数据结构宏................................................................................................................282 结构宏如何工作? ...................................................................................................................282 何时使用结构宏 .......................................................................................................................283 声明并初始化结构句柄 ..........................................................................................................283 结构句柄的操作 .......................................................................................................................283 其他操作 ....................................................................................................................................284 16 块设备驱动程序 ............................................................................................................................... 285 块驱动程序结构概述 ......................................................................................................................285 文件I/O ..............................................................................................................................................286 块设备自动配置 ...............................................................................................................................287 控制设备访问 ...................................................................................................................................288 open()入口点(块驱动程序) .............................................................................................288 close()入口点(块驱动程序)...........................................................................................290 strategy()入口点 ...................................................................................................................290 buf结构 ......................................................................................................................................291 同步数据传输(块驱动程序) ....................................................................................................292 异步数据传输(块驱动程序) ....................................................................................................296 检查是否有无效的buf请求 ..................................................................................................296 对请求进行排队 .......................................................................................................................296 开始第一个传输 .......................................................................................................................297 处理中断的设备 .......................................................................................................................298 目录 编写设备驱动程序 • 2010年9月 10 dump()和print()入口点 ..............................................................................................................299 dump()入口点(块驱动程序) .............................................................................................300 print()入口点(块驱动程序)...........................................................................................300 磁盘设备驱动程序 ..........................................................................................................................300 磁盘ioctl ..................................................................................................................................301 磁盘性能 ....................................................................................................................................301 17 SCSI目标驱动程序 ...........................................................................................................................303 目标驱动程序介绍 ..........................................................................................................................303 Sun公用SCSI体系结构概述 .........................................................................................................304 常规控制流程 ............................................................................................................................305 SCSA函数 ..................................................................................................................................305 硬件配置文件 ...................................................................................................................................306 声明和数据结构 ...............................................................................................................................307 scsi_device结构 .....................................................................................................................307 scsi_pkt结构(目标驱动程序) ........................................................................................308 SCSI目标驱动程序的自动配置 ....................................................................................................309 probe()入口点(SCSI目标驱动程序) .............................................................................310 attach()入口点(SCSI目标驱动程序) ...........................................................................311 detach()入口点(SCSI目标驱动程序) ...........................................................................314 getinfo()入口点(SCSI目标驱动程序).........................................................................314 资源分配 ............................................................................................................................................315 scsi_init_pkt()函数 .............................................................................................................315 scsi_sync_pkt()函数 .............................................................................................................316 scsi_destroy_pkt()函数 ......................................................................................................316 scsi_alloc_consistent_buf()函数 ...................................................................................316 scsi_free_consistent_buf()函数......................................................................................317 生成和传输命令 ...............................................................................................................................317 生成命令 ....................................................................................................................................317 设置目标功能 ............................................................................................................................318 传输命令 ....................................................................................................................................318 命令完成 ....................................................................................................................................319 重新使用包 ................................................................................................................................320 自动请求检测模式 ...................................................................................................................321 转储处理 ....................................................................................................................................322 目录 11 SCSI选项 ...........................................................................................................................................324 18 SCSI主机总线适配器驱动程序 .....................................................................................................327 主机总线适配器驱动程序介绍 ....................................................................................................327 SCSI接口 ...........................................................................................................................................328 SCSAHBA接口 ................................................................................................................................329 SCSAHBA入口点摘要 ...........................................................................................................329 SCSAHBA数据结构 ................................................................................................................330 按目标实例的数据 ...................................................................................................................335 传输结构克隆 ............................................................................................................................336 SCSAHBA函数 .........................................................................................................................337 HBA驱动程序的相关性和配置问题 ...........................................................................................338 声明和结构 ................................................................................................................................338 模块初始化入口点 ...................................................................................................................339 自动配置入口点 .......................................................................................................................341 SCSAHBA驱动程序入口点 ..........................................................................................................344 目标驱动程序实例初始化 ......................................................................................................345 资源分配 ....................................................................................................................................347 命令传输 ....................................................................................................................................356 功能管理 ....................................................................................................................................362 中止和重置管理 .......................................................................................................................366 动态重新配置 ............................................................................................................................368 SCSIHBA驱动程序特定问题 .......................................................................................................369 安装HBA驱动程序 .................................................................................................................369 HBA配置属性 ...........................................................................................................................370 x86目标驱动程序配置属性 ...................................................................................................371 排队支持 ............................................................................................................................................372 19 网络设备驱动程序 .......................................................................................................................... 373 GLDv3网络设备驱动程序框架 ....................................................................................................373 GLDv3MAC注册 .....................................................................................................................373 GLDv3功能 ...............................................................................................................................377 GLDv3数据路径 .......................................................................................................................380 GLDv3状态更改通知 ..............................................................................................................382 GLDv3网络统计信息 ..............................................................................................................382 目录 编写设备驱动程序 • 2010年9月 12 GLDv3属性 ...............................................................................................................................383 GLDv3接口汇总 .......................................................................................................................384 GLDv2网络设备驱动程序框架 ....................................................................................................386 GLDv2设备支持 .......................................................................................................................387 GLDv2DLPI提供者 .................................................................................................................388 GLDv2DLPI原语 .....................................................................................................................389 GLDv2I/O控制函数 ................................................................................................................390 GLDv2驱动程序需求 ..............................................................................................................391 GLDv2网络统计信息 ..............................................................................................................392 GLDv2声明和数据结构..........................................................................................................395 GLDv2函数参数 .......................................................................................................................399 GLDv2入口点 ...........................................................................................................................400 GLDv2返回值 ...........................................................................................................................403 GLDv2服务例程 .......................................................................................................................403 20 USB驱动程序.....................................................................................................................................407 Solaris环境中的USB .......................................................................................................................407 USBA2.0框架 ............................................................................................................................407 USB客户机驱动程序 ...............................................................................................................408 绑定客户机驱动程序 ......................................................................................................................410 USB设备如何显示在系统中 .................................................................................................410 USB设备和Solaris设备树 ......................................................................................................410 兼容设备名称 ............................................................................................................................410 具有多个接口的设备...............................................................................................................412 检查设备驱动程序绑定 ..........................................................................................................413 基本设备访问 ...................................................................................................................................413 连接客户机驱动程序之前 ......................................................................................................413 描述符树 ....................................................................................................................................413 注册驱动程序以获取设备访问权限 ....................................................................................415 设备通信 ............................................................................................................................................416 USB端点.....................................................................................................................................416 缺省管道 ....................................................................................................................................417 管道状态 ....................................................................................................................................417 打开管道 ....................................................................................................................................417 关闭管道 ....................................................................................................................................418 目录 13 数据传输 ....................................................................................................................................418 刷新管道 ....................................................................................................................................424 设备状态管理 ...................................................................................................................................424 热插拔USB设备.......................................................................................................................425 电源管理 ....................................................................................................................................427 序列化 .........................................................................................................................................431 实用程序函数 ...................................................................................................................................431 设备配置工具 ............................................................................................................................431 其他实用程序函数 ...................................................................................................................433 USB设备驱动程序样例 ..................................................................................................................434 第3部分 生成设备驱动程序 ...........................................................................................................................435 21 编译、装入、打包和测试驱动程序............................................................................................ 437 驱动程序开发摘要 ..........................................................................................................................437 驱动程序代码布局 ..........................................................................................................................438 头文件 .........................................................................................................................................438 源文件 .........................................................................................................................................439 配置文件 ....................................................................................................................................439 准备安装驱动程序 ..........................................................................................................................440 编译和链接驱动程序...............................................................................................................440 模块相关性 ................................................................................................................................441 编写硬件配置文件 ...................................................................................................................442 安装、更新和删除驱动程序 .........................................................................................................442 将驱动程序复制到模块目录 .................................................................................................442 使用add_drv安装驱动程序...................................................................................................443 更新驱动程序信息 ...................................................................................................................444 删除驱动程序 ............................................................................................................................444 装入和卸载驱动程序 ......................................................................................................................444 驱动程序打包 ...................................................................................................................................445 软件包后安装 ............................................................................................................................445 软件包预删除 ............................................................................................................................446 驱动程序测试条件 ..........................................................................................................................447 配置测试 ....................................................................................................................................447 功能测试 ....................................................................................................................................447 目录 编写设备驱动程序 • 2010年9月 14 错误处理 ....................................................................................................................................447 测试装入和卸载 .......................................................................................................................448 压力、性能和互操作性测试 .................................................................................................448 DDI/DKI兼容性测试 ..............................................................................................................449 安装和打包测试 .......................................................................................................................449 测试特定类型驱动程序 ..........................................................................................................449 22 调试、测试和调优设备驱动程序 ................................................................................................ 451 测试驱动程序 ...................................................................................................................................451 启用Deadman功能以避免硬挂起 .......................................................................................451 使用串行连接进行测试 ..........................................................................................................452 设置测试模块 ............................................................................................................................454 避免测试系统中发生数据丢失 .............................................................................................456 恢复设备目录 ............................................................................................................................458 调试工具 ............................................................................................................................................459 事后调试 ....................................................................................................................................460 使用kmdb内核调试程序 .........................................................................................................460 使用mdb模块调试程序 ...........................................................................................................463 使用kmdb和mdb执行的有用调试任务 ...............................................................................464 调优驱动程序 ...................................................................................................................................471 内核统计信息 ............................................................................................................................471 用于动态检测过程的DTrace.................................................................................................476 23 推荐的编码方法 ............................................................................................................................... 477 调试准备方法 ...................................................................................................................................477 使用唯一前缀来避免内核符号冲突 ....................................................................................477 使用cmn_err()记录驱动程序活动......................................................................................478 使用ASSERT()捕捉无效假设 ................................................................................................478 使用mutex_owned()验证和记录锁定要求 .........................................................................478 使用条件编译在开销较大的调试功能之间切换 ..............................................................479 将变量声明为可变变量..................................................................................................................480 可维护性 ............................................................................................................................................481 定期运行状况检查 ...................................................................................................................481
第1章 内核上机指导 2 1.1 下载和使用WDK 2 1.1.1 下载并安装WDK 2 1.1.2 编写第一个C文件 4 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机中运行 8 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows XP调试执行 9 1.3.3 设置Vista调试执行 10 1.3.4 设置VMware的管道虚拟串口 11 1.3.5 设置Windows内核符号表 12 1.3.6 实战调试first 13 第2章 内核编程环境及其特殊性 16 2.1 内核编程的环境 16 2.1.1 隔离的应用程序 16 2.1.2 共享的内核空间 17 2.1.3 无处不在的内核模块 18 2.2 数据类型 19 2.2.1 基本数据类型 19 2.2.2 返回状态 19 2.2.3 字符串 20 2.3 重要的数据结构 21 2.3.1 驱动对象 21 2.3.2 设备对象 22 2.3.3 请求 24 2.4 函数调用 25 2.4.1 查阅帮助 25 2.4.2 帮助中有的几类函数 26 2.4.3 帮助中没有的函数 28 2.5 Windows的驱动开发模型 29 2.6 WDK编程中的特殊点 30 2.6.1 内核编程的主要调用源 30 2.6.2 函数的多线程安全性 30 2.6.3 代码的中断级 32 2.6.4 WDK中出现的特殊代码 32 第3章 字符串与链表 35 3.1 字符串操作 35 3.1.1 使用字符串结构 35 3.1.2 字符串的初始化 36 3.1.3 字符串的拷贝 37 3.1.4 字符串的连接 38 3.1.5 字符串的打印 38 3.2 内存与链表 40 3.2.1 内存的分配与释放 40 3.2.2 使用LIST_ENTRY 41 3.2.3 使用长长整型数据 43 3.3 自旋锁 44 3.3.1 使用自旋锁 44 3.3.2 在双向链表中使用自旋锁 45 3.3.3 使用队列自旋锁提高性能 46 第4章 文件、注册表、线程 47 4.1 文件操作 47 4.1.1 使用OBJECT_ATTRIBUTES 47 4.1.2 打开关闭文件 48 4.1.3 文件读/写操作 51 4.2 注册表操作 53 4.2.1 注册表键的打开 53 4.2.2 注册表键值的读 55 4.2.3 注册表键值的写 57 4.3 时间与定时器 58 4.3.1 获得当前“滴答”数 58 4.3.2 获得当前系统时间 58 4.3.3 使用定时器 59 4.4 线程与事件 62 4.4.1 使用系统线程 62 4.4.2 在线程中睡眠 63 4.4.3 使用同步事件 64 第5章 应用与内核通信 67 5.1 内核方面的编程 68 5.1.1 生成控制设备 68 5.1.2 控制设备的名字和符号链接 70 5.1.3 控制设备的删除 71 5.1.4 分发函数 72 5.1.5 请求的处理 73 5.2 应用方面的编程 74 5.2.1 基本的功能需求 74 5.2.2 在应用程序中打开关闭设备 75 5.2.3 设备控制请求 75 5.2.4 内核中的对应处理 77 5.2.5 结合测试的效果 79 5.3 阻塞、等待与安全设计 80 5.3.1 驱动主动通知应用 80 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位系统新增机制 88 6.1.1 WOW64子系统 88 6.1.2 PatchGuard技术 91 6.1.3 64位驱动的编译、安装与运行 91 6.2 编程差异 92 6.2.1 汇编嵌入变化 92 6.2.2 预处理与条件编译 93 6.2.3 数据结构调整 93 开 发 篇 第7章 串口的过滤 96 7.1 过滤的概念 96 7.1.1 设备绑定的内核API之一 97 7.1.2 设备绑定的内核API之二 98 7.1.3 生成过滤设备并绑定 98 7.1.4 从名字获得设备对象 100 7.1.5 绑定所有串口 101 7.2 获得实际数据 102 7.2.1 请求的区分 102 7.2.2 请求的结局 103 7.2.3 写请求的数据 104 7.3 完整的代码 105 7.3.1 完整的分发函数 105 7.3.2 如何动态卸载 106 7.3.3 代码的编译与运行 107 第8章 键盘的过滤 109 8.1 技术原理 110 8.1.1 预备知识 110 8.1.2 Windows中从击键到内核 110 8.1.3 键盘硬件原理 112 8.2 键盘过滤的框架 112 8.2.1 找到所有的键盘设备 112 8.2.2 应用设备扩展 115 8.2.3 键盘过滤模块的DriverEntry 117 8.2.4 键盘过滤模块的动态卸载 117 8.3 键盘过滤的请求处理 119 8.3.1 通常的处理 119 8.3.2 PNP的处理 120 8.3.3 读的处理 121 8.3.4 读完成的处理 122 8.4 从请求中打印出按键信息 123 8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 123 8.4.2 从KEYBOARD_INPUT_DATA中得到键 124 8.4.3 从MakeCode到实际字符 124 8.5 Hook分发函数 126 8.5.1 获得类驱动对象 126 8.5.2 修改类驱动的分发函数指针 127 8.5.3 类驱动之下的端口驱动 128 8.5.4 端口驱动和类驱动之间的协作机制 129 8.5.5 找到关键的回调函数的条件 129 8.5.6 定义常数和数据结构 130 8.5.7 打开两种键盘端口驱动寻找设备 131 8.5.8 搜索在KbdClass类驱动中的地址 133 8.6 Hook键盘中断反过滤 135 8.6.1 中断:IRQ和INT 136 8.6.2 如何修改IDT 136 8.6.3 替换IDT中的跳转地址 137 8.6.4 QQ的PS/2反过滤措施 139 8.7 直接用端口操作键盘 139 8.7.1 读取键盘数据和命令端口 139 8.7.2 p2cUserFilter的最终实现 140 第9章 磁盘的虚拟 143 9.1 虚拟的磁盘 143 9.2 一个具体的例子 143 9.3 入口函数 144 9.3.1 入口函数的定义 144 9.3.2 Ramdisk驱动的入口函数 145 9.4 EvtDriverDeviceAdd函数 146 9.4.1 EvtDriverDeviceAdd的定义 146 9.4.2 局部变量的声明 146 9.4.3 磁盘设备创建 147 9.4.4 如何处理发往设备的请求 148 9.4.5 用户配置的初始化 149 9.4.6 链接给应用程序 151 9.4.7 小结 152 9.5 FAT12/16磁盘卷初始化 152 9.5.1 磁盘卷结构简介 152 9.5.2 Ramdisk对磁盘的初始化 154 9.6 驱动中的请求处理 160 9.6.1 请求的处理 160 9.6.2 读/写请求 160 9.6.3 DeviceIoControl请求 162 9.7 Ramdisk的编译和安装 164 9.7.1 编译 164 9.7.2 安装 164 9.7.3 对安装的深入探究 165 第10章 磁盘的过滤 167 10.1 磁盘过滤驱动的概念 167 10.1.1 设备过滤和类过滤 167 10.1.2 磁盘设备和磁盘卷设备过滤驱动 167 10.1.3 注册表和磁盘卷设备过滤驱动 168 10.2 具有还原功能的磁盘卷过滤驱动 168 10.2.1 简介 168 10.2.2 基本思想 169 10.3 驱动分析 169 10.3.1 DriverEntry函数 169 10.3.2 AddDevice函数 170 10.3.3 PnP请求的处理 174 10.3.4 Power请求的处理 178 10.3.5 DeviceIoControl请求的处理 178 10.3.6 bitmap的作用和分析 182 10.3.7 boot驱动完成回调函数和稀疏文件 187 10.3.8 读/写请求的处理 190 第11章 文件系统的过滤与监控 199 11.1 文件系统的设备对象 200 11.1.1 控制设备与卷设备 200 11.1.2 生成自己的一个控制设备 201 11.2 文件系统的分发函数 202 11.2.1 普通的分发函数 202 11.2.2 文件过滤的快速IO分发函数 203 11.2.3 快速IO分发函数的一个实现 205 11.2.4 快速IO分发函数逐个简介 206 11.3 设备的绑定前期工作 207 11.3.1 动态地选择绑定函数 207 11.3.2 注册文件系统变动回调 208 11.3.3 文件系统变动回调的一个实现 209 11.3.4 文件系统识别器 211 11.4 文件系统控制设备的绑定 212 11.4.1 生成文件系统控制设备的过滤设备 212 11.4.2 绑定文件系统控制设备 213 11.4.3 利用文件系统控制请求 215 11.5 文件系统卷设备的绑定 217 11.5.1 从IRP中获得VPB指针 217 11.5.2 设置完成函数并等待IRP完成 218 11.5.3 卷挂载IRP完成后的工作 221 11.5.4 完成函数的相应实现 223 11.5.5 绑定卷的实现 224 11.6 读/写操作的过滤 226 11.6.1 设置一个读处理函数 226 11.6.2 设备对象的区分处理 227 11.6.3 解析读请求中的文件信息 228 11.6.4 读请求的完成 230 11.7 其他操作的过滤 234 11.7.1 文件对象的生存周期 234 11.7.2 文件的打开关闭 235 11.7.3 文件的删除 237 11.8 路径过滤的实现 238 11.8.1 取得文件路径的三种情况 238 11.8.2 打开成功后获取路径 238 11.8.3 在其他时刻获得文件路径 240 11.8.4 在打开请求完成之前获得路径名 240 11.8.5 把短名转换为长名 242 11.9 把sfilter编译成静态库 243 11.9.1 如何方便地使用sfilter 243 11.9.2 初始化回调、卸载回调和绑定回调 244 11.9.3 绑定与回调 245 11.9.4 插入请求回调 246 11.9.5 如何利用sfilter.lib 249 第12章 文件系统透明加密 252 12.1 文件透明加密的应用 252 12.1.1 防止企业信息泄密 252 12.1.2 文件透明加密防止企业信息泄密 253 12.1.3 文件透明加密软件的例子 253 12.2 区分进程 254 12.2.1 机密进程与普通进程 254 12.2.2 找到进程名字的位置 255 12.2.3 得到当前进程的名字 256 12.3 内存映射与文件缓冲 257 12.3.1 记事本的内存映射文件 257 12.3.2 Windows的文件缓冲 258 12.3.3 文件缓冲:明文还是密文的选择 259 12.3.4 清除文件缓冲 260 12.4 加密标识 263 12.4.1 保存在文件外、文件头还是文件尾 263 12.4.2 隐藏文件头的大小 264 12.4.3 隐藏文件头的设置偏移 266 12.4.4 隐藏文件头的读/写偏移 267 12.5 文件加密表 267 12.5.1 何时进行加密操作 267 12.5.2 文件控制块与文件对象 268 12.5.3 文件加密表的数据结构与初始化 269 12.5.4 文件加密表的操作:查询 270 12.5.5 文件加密表的操作:添加 271 12.5.6 文件加密表的操作:删除 272 12.6 文件打开处理 273 12.6.1 直接发送IRP进行查询与设置操作 274 12.6.2 直接发送IRP进行读/写操作 276 12.6.3 文件的非重入打开 277 12.6.4 文件的打开预处理 280 12.7 读/写加密和解密 285 12.7.1 在读取时进行解密 285 12.7.2 分配与释放MDL 286 12.7.3 写请求加密 287 12.8 crypt_file的组装 289 12.8.1 crypt_file的初始化 289 12.8.2 crypt_file的IRP预处理 290 12.8.3 crypt_file的IRP后处理 293 第13章 文件系统微过滤驱动 297 13.1 文件系统微过滤驱动简介 297 13.1.1 文件系统微过滤驱动的由来 297 13.1.2 Minifilter的优点与不足 298 13.2 Minifilter的编程框架 298 13.2.1 微文件系统过滤的注册 299 13.2.2 微过滤器的数据结构 300 13.2.3 卸载回调函数 303 13.2.4 预操作回调函数 303 13.2.5 后操作回调函数 306 13.2.6 其他回调函数 307 13.3 Minifilter如何与应用程序通信 309 13.3.1 建立通信端口的方法 310 13.3.2 在用户态通过DLL使用通信端口的范例 311 13.4 Minifilter的安装与加载 314 13.4.1 安装Minifilter的INF文件 314 13.4.2 启动安装完成的Minifilter 316 第14章 网络传输层过滤 317 14.1 TDI概要 317 14.1.1 为何选择TDI 317 14.1.2 从socket到Windows内核 318 14.1.3 TDI过滤的代码例子 319 14.2 TDI的过滤框架 319 14.2.1 绑定TDI的设备 319 14.2.2 唯一的分发函数 320 14.2.3 过滤框架的实现 322 14.2.4 主要过滤的请求类型 323 14.3 生成请求:获取地址 324 14.3.1 过滤生成请求 324 14.3.2 准备解析IP地址与端口 326 14.3.3 获取生成的IP地址和端口 327 14.3.4 连接终端的生成与相关信息的保存 329 14.4 控制请求 330 14.4.1 TDI_ASSOCIATE_ADDRESS的过滤 330 14.4.2 TDI_CONNECT的过滤 332 14.4.3 其他的次功能号 333 14.4.4 设置事件的过滤 334 14.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 336 14.4.6 直接获取发送函数的过滤 337 14.4.7 清理请求的过滤 339 14.5 本书例子tdifw.lib的应用 341 14.5.1 tdifw库的回调接口 341 14.5.2 tdifw库的使用例子 342 第15章 Windows过滤平台 345 15.1 WFP简介 345 15.2 WFP框架 345 15.3 基本对象模型 347 15.3.1 过滤引擎 347 15.3.2 垫片 347 15.3.3 呼出接口 347 15.3.4 分层 348 15.3.5 子层 349 15.3.6 过滤器 350 15.3.7 呼出接口回调函数 354 15.4 WFP操作 359 15.4.1 呼出接口的注册与卸载 360 15.4.2 呼出接口的添加与移除 360 15.4.3 子层的添加与移除 361 15.4.4 过滤器的添加 362 15.5 WFP过滤例子 362 第16章 NDIS协议驱动 370 16.1 以太网包和网络驱动架构 370 16.1.1 以太网包和协议驱动 370 16.1.2 NDIS网络驱动 371 16.2 协议驱动的DriverEntry 372 16.2.1 生成控制设备 372 16.2.2 注册协议 374 16.3 协议与网卡的绑定 375 16.3.1 协议与网卡的绑定概念 375 16.3.2 绑定回调处理的实现 376 16.3.3 协议绑定网卡的API 378 16.3.4 解决绑定竞争问题 379 16.3.5 分配接收和发送的包池与缓冲池 380 16.3.6 OID请求的发送和请求完成回调 381 16.3.7 ndisprotCreateBinding的最终实现 385 16.4 绑定的解除 390 16.4.1 解除绑定使用的API 390 16.4.2 ndisprotShutdownBinding的实现 392 16.5 在用户态操作协议驱动 395 16.5.1 协议的收包与发包 395 16.5.2 在用户态编程打开设备 396 16.5.3 用DeviceIoControl发送控制请求 397 16.5.4 用WriteFile发送数据包 399 16.5.5 用ReadFile发送数据包 400 16.6 在内核态完成功能的实现 402 16.6.1 请求的分发与实现 402 16.6.2 等待设备绑定完成与指定设备名 402 16.6.3 指派设备的完成 403 16.6.4 处理读请求 406 16.6.5 处理写请求 408 16.7 协议驱动的接收回调 412 16.7.1 和接收包有关的回调函数 412 16.7.2 ReceiveHandler的实现 413 16.7.3 TransferDataCompleteHandler的实现 417 16.7.4 ReceivePacketHandler的实现 418 16.7.5 接收数据包的入队 420 16.7.6 接收数据包的出队和读请求的完成 422 第17章 NDIS小端口驱动 427 17.1 小端口驱动的应用与概述 427 17.1.1 小端口驱动的应用 427 17.1.2 小端口驱动示例 428 17.1.3 小端口驱动的运作与编程概述 429 17.2 小端口驱动的初始化 429 17.2.1 小端口驱动的DriverEntry 429 17.2.2 小端口驱动的适配器结构 431 17.2.3 配置信息的读取 433 17.2.4 设置小端口适配器上下文 433 17.2.5 MPInitialize的实现 434 17.2.6 MPHalt的实现 437 17.3 打开ndisprot设备 438 17.3.1 IO目标 438 17.3.2 给IO目标发送DeviceIoControl请求 439 17.3.3 打开ndisprot接口并完成配置设备 441 17.4 使用ndisprot发送包 443 17.4.1 小端口驱动的发包接口 443 17.4.2 发送控制块(TCB) 444 17.4.3 遍历包组并填写TCB 446 17.4.4 写请求的构建与发送 449 17.5 使用ndisprot接收包 451 17.5.1 提交数据包的内核API 451 17.5.2 从接收控制块(RCB)提交包 452 17.5.3 对ndisprot读请求的完成函数 454 17.5.4 读请求的发送 456 17.5.5 用于读包的WDF工作任务 457 17.5.6 ndisedge读工作任务的生成与入列 459 17.6 其他的特征回调函数的实现 461 17.6.1 包的归还 461 17.6.2 OID查询处理的直接完成 462 17.6.3 OID设置处理 465 第18章 NDIS中间层驱动 467 18.1 NDIS中间层驱动概述 467 18.1.1 Windows网络架构总结 467 18.1.2 NDIS中间层驱动简介 468 18.1.3 NDIS中间层驱动的应用 469 18.1.4 NDIS包描述符结构深究 470 18.2 中间层驱动的入口与绑定 473 18.2.1 中间层驱动的入口函数 473 18.2.2 动态绑定NIC设备 474 18.2.3 小端口初始化(MpInitialize) 475 18.3 中间层驱动发送数据包 477 18.3.1 发送数据包原理 477 18.3.2 包描述符“重利用” 478 18.3.3 包描述符“重申请” 481 18.3.4 发送数据包的异步完成 482 18.4 中间层驱动接收数据包 484 18.4.1 接收数据包概述 484 18.4.2 用PtReceive接收数据包 485 18.4.3 用PtReceivePacket接收 490 18.4.4 对包进行过滤 491 18.5 中间层驱动程序查询和设置 494 18.5.1 查询请求的处理 494 18.5.2 设置请求的处理 496 18.6 NDIS句柄 498 18.6.1 不可见的结构指针 498 18.6.2 常见的NDIS句柄 499 18.6.3 NDIS句柄误用问题 500 18.6.4 一种解决方案 502 18.7 生成普通控制设备 503 18.7.1 在中间层驱动中添加普通设备 503 18.7.2 使用传统方法来生成控制设备 505 第19章 IA-32汇编基础 511 19.1 x86内存、寄存器与堆栈 511 19.1.1 _asm关键字 511 19.1.2 x86中的mov指令 512 19.1.3 x86中的寄存器与内存 512 19.1.4 赋值语句的实现 513 19.2 x86中函数的实现 514 19.2.1 一个函数的例子 514 19.2.2 堆栈的介绍 515 19.2.3 寄存器的备份和恢复 516 19.2.4 内部变量与返回值 518 19.3 x86中函数的调用与返回 521 19.3.1 函数的调用指令call 521 19.3.2 通过堆栈传递参数 521 19.3.3 从函数返回 523 19.3.4 三种常见的调用协议 524 19.4 从32位汇编到64位汇编 526 19.4.1 Intel 64与IA-32体系架构简介 526 19.4.2 64位指令与32位指令 526 19.4.3 通用寄存器 527 19.5 64位下的函数实现 528 19.5.1 函数概览 528 19.5.2 32位参数的传递 529 19.5.3 64位参数与返回值 530 19.5.4 栈空间的开辟与恢复 531 第20章 IA-32体系中的内存地址 534 20.1 内存的虚拟地址 534 20.1.1 C语言中的内存地址 534 20.1.2 虚拟地址的构成 535 20.1.3 段的选择 536 20.2 全局描述符表和段描述符 538 20.2.1 全局描述符表 538 20.2.2 段类型 539 20.2.3 段寄存器与段选择子 540 20.2.4 64位模式下的段 541 20.3 分段编程实践 542 20.3.1 系统表寄存器的结构 542 20.3.2 在汇编语言中获取全局描述表的位置 543 20.3.3 调试范例:sgdt指令的错误使用 545 20.3.4 在64位下获得全局描述符表 547 20.4 线性地址基础 549 20.4.1 分页控制机制 550 20.4.2 线性地址的转换 551 20.4.3 混合页面大小 552 20.4.4 32位物理地址的页目录和页表项 552 20.5 各种特殊分页方式 555 20.5.1 PAE分页方式 555 20.5.2 PSE-36分页机制 558 20.5.3 IA-32e模式下的线性地址 559 20.6 分页编程实践 562 20.6.1 页目录和页目录指针表的获取 562 20.6.2 页表的获取 564 20.6.3 线性地址的结构 567 第21章 处理器权限级别切换 571 21.1 Ring0和Ring3权限级别 571 21.2 保护模式下的分页内存保护 572 21.3 分页内存不可执行保护 574 21.3.1 不可执行保护原理 574 21.3.2 不可执行保护的漏洞 575 21.3.3 上机实践 577 21.4 权限级别的切换 579 21.4.1 调用门及其漏洞 579 21.4.2 sysenter和sysexit指令 581 21.4.3 上机实践 583 第22章 IA-32体系结构中的中断 585 22.1 中断基础知识 585 22.1.1 中断描述符表 585 22.1.2 中断处理过程 587 22.1.3 64位模式下的中断处理机制 589 22.1.4 多核下的中断 589 22.2 Windows中断机制 593 22.3 中断编程实践 596 22.3.1 IDT Hook 596 22.3.2 巧用IDT Hook实现安全防护 598 第23章 Windows内核挂钩 601 23.1 系统服务描述符表挂钩 602 23.1.1 系统服务描述符表(SSDT) 602 23.1.2 系统服务描述符表挂钩的意图 603 23.1.3 寻找要挂钩的函数的地址 604 23.1.4 函数被挂钩的过程 605 23.1.5 具体实现的代码 606 23.2 函数导出表挂钩 608 23.2.1 内核函数的种类 608 23.2.2 挂钩IoCallDriver 610 23.2.3 对跳转地址进行修改 611 23.3 Windows 7系统下IofCallDriver的跟踪 612 23.4 Windows 7系统下内联挂钩 615 23.4.1 写入跳转指令并拷贝代码 615 23.4.2 实现中继函数 617 高 级 篇 第24章 Windows通知与回调 620 24.1 Windows的事件通知与回调 620 24.2 常用的事件通知 620 24.2.1 创建进程通知 621 24.2.2 创建线程通知 625 24.2.3 加载模块通知 626 24.2.4 注册表操作通知 629 24.3 Windows回调机制 636 24.3.1 回调对象 636 24.3.2 回调对象的创建 637 24.3.3 回调对象的注册 637 24.3.4 回调的通告 638 24.4 安全的死角,回调的应用 639 第25章 保护进程 640 25.1 内核对象简介 640 25.2 内核对象的结构 641 25.3 保护内核对象 642 25.3.1 处理对象的打开 643 25.3.2 处理句柄的复制 644 25.3.3 处理句柄的继承 646 25.4 进程的保护 652 25.4.1 保护原理 652 25.4.2 Vista以后的进程对象保护 654 25.4.3 进程的其他保护 655 附录A 如何使用本书的源码光盘 656 附录B 练习题 659
1 建bat文件自动执行复制,删除命令。 例1:以下是复制cd.dll文件至windows\system32的bat文件内容: copy cd.dll %windir%\system32 例2:下面一行是卸载windows\system32目录中的cd.dll,即把上面复制的文件删除: del %windir%\system32\cd.dll 例3:删除download文件夹中的文件,例子如下: del C:\DOWNLOAD\*.* [注意]:这里的del命令只能删文件,不能删文件夹。要删除文件夹得用rd命令,如下: rd Filemon 这里filemon文件夹和该bat文件在同一目录下,就省去具体路径了。但rd只能删除空文件夹. 要删除文件夹及其里面的所有子目录和文件,用rd命令带/s /q参数, /s参数表示删除该文件夹及其下面的子目录和文件 /q参数表示,不需要确认 范例如下: rd 123 /s /q 2 创建文件夹 例:在E:\My documents下面一次创建3个新文件夹:Newfolder1,Newfolder2,Newfolder3 @echo off md "E:\My documents\Newfolder1" md "E:\My documents\Newfolder2" md "E:\My documents\Newfolder3" 3 执行程序,打开文件 例1:执行C盘下的WinWord.exe程序 start C:\WinWord.exe 例2:用某个程序打开某个文件,如用TheWorld.exe打开一个htm文件 start d:\TheWorld\TheWorld.EXE C:\我有一个恋爱.htm [注意]:不论是程序或文件路径中含有空格,都必须用引号括起来: start d:\TheWorld\TheWorld.EXE "e:\My documents\我有一个恋爱.htm" 所有程序中的引号不能是全角的,必须用半角的格式,所以输入引号前最好关闭汉字输入系统 XCOPY 还有众多的功能, 是加参数来完成的。上面的/s /e 参数的作用分别是把子目录和空目录都复制过去,一些使用举例和参数说明如下: 1、如只是单纯地复制 E:\ 盘上所有文件到 D:\ 盘上,就输入“ xcopy e:\*.* d: /s /h "就行啦!如果在复制过程中,你不要他复制文件啦!那就按键盘热键“Ctrl " +"Pause /break" 二个热键 来中断复制。 2、如果想把E:\ 盘上所有文件复制到D:\盘上,分为今天复制一点,明天再接着复制一些,后天再接着复制一些。或者是某种原因上次没有复制完成,今天想接着复制。(这种情况是经常在复制文件中出现的)那可怎么办才好呢? 那就输入“ xcopy e:\*.* d: /s /h /d /y ”就行啦。他能查出那些文件是已经复制过去啦,那些文件还没有复制过去的。 3、当然我们也会碰到这种情况,一些文件我们已经修改过啦!网上面又有最新版本的啦。原来备份的那份文件我们要及时更新啦。那怎么才能同步更新呢?当然我们可以把最新的好份文件复制过去,这也是一种解决办法。 如果修改的文件有很多的,自己到时候也记不清楚那份文件是更新过的。这么多的原来备份的那份文件都要更新,都要复制过去,可不是件省力气的活,而且容易出错和一些文件被忘记啦! 那和上面一样也同样输入" xcopy e:\*.* d: /s /h /d /y "就行啦! 4、还有一种情况我们经常也碰到的,因为复制某个文件出错或者这个文件在使用中,而停止了复制工作,(比如,复制C 盘上的 windows xp )我们这时候想跳过某个出错的文件和某个正在使用中文件而继续复制其他文件。 在多加入一个参数" /c "就是 " xcopy e:\*.* d: /s /h /d /c /y "就行啦! 5、有时候我们想XCOPY 变为自动复制,并且复制完成后关闭电脑,可以建立一个批处理文件,新建文本文档,更名为XCOPY.BAT 当然扩展名原来是TXT 格式的要更名为BAT 在这个 XCOPY.BAT 中输入 xcopy e:\*.* d: /s /h /c /y shutdown -s 然后双击xcopy.bat 运行它,你这时候可以出去玩啦。电脑会自己复制备份完成文件然后自动关闭电脑。 XCOPY source [destination] 参数(如 /s /e) source 指定要复制的文件。 destination 指定新文件的位置和/或名称。 /A 只复制有存档属姓集的文件, 但不改变属姓。 /M 只复制有存档属姓集的文件, 并关闭存档属姓。 /D:m-d-y 复制在指定日期或指定日期以后改变的文件。 如果没有提供日期,只复制那些源时间 比目标时间新的文件。 /EXCLUDE:file1[+file2][+file3]... 指定含有字符串的文件列表。如果有任何 字符串与要被复制的文件的绝对路径 相符,那个文件将不会得到复制。 例如,指定如 \obj\ 或 .obj 的字符串会排除 目录 obj 下面的所有文件或带有 .obj 扩展名的文件。 /P 创建每个目标文件前提示。 /S 复制目录和子目录,除了空的。 /E 复制目录和子目录,包括空的。 与 /S /E 相同。可以用来修改 /T。 /V 验证每个新文件。 /W 提示您在复制前按键。 /C 即使有错误,也继续复制。 /I 如果目标不存在,又在复制一个以上的文件, 则假定目标一定是一个目录。 /Q 复制时不显示文件名。 /F 复制时显示完整的源和目标文件名。 /L 显示要复制的文件。 /G 允许将没有经过加密的文件复制到 不支持加密的目标。 /H 也复制隐藏和系统文件。 /R 改写只读文件。 /T 创建目录结构,但不复制文件。不 包括空目录或子目录。/T /E 包括 空目录和子目录。 /U 只复制已经存在于目标中的文件。 /K 复制属姓。一般的 Xcopy 会重设只读属姓。 /N 用生成的短名复制。 /O 复制文件所有权和 ACL 信息。 /X 复制文件审核设置(隐含 /O)。 /Y 禁止提示以确认改写一个 现存目标文件。 /-Y 导致提示以确认改写一个 现存目标文件。 /Z 用重新启动模式复制网络文件。 Xcopy 复制文件和目录,包括子目录。 语法 xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:mm-dd-yyyy]] [/s [/e]] [/t] [/k] [/r] [/h] [{/a|/m}] [/n] [/o] [/x] [/exclude:file1[+[file2]][+[file3]] [{/y|/-y}] [/z] 参数 Source 必需的。指定要复制的文件的位置和名称。该参数必须包含驱动器或路径。 Destination 指定要复制的文件的目标。该参数可以包含驱动器盘符和冒号、目录名、文件名或者它们的组合。 /w 在开始复制文件之前将显示以下消息并等待您的响应: Press any key to begin copying file(s) /p 提示您确认是否要创建每个目标文件。 /c 忽略错误。 /v 在写入目标文件时验证每个文件,以确保目标文件与源文件完全相同。 /q 禁止显示 xcopy 消息。 /f 复制时显示源文件名和目标文件名。 /l 显示要复制的文件列表。 /g 创建解密的目标文件。 /d[:mm-dd-yyyy] 只复制那些在指定日期或指定日期之后更改过的源文件。如果不包括 mm-dd-yyyy 值,xcopy 会复制比现有 Destination 文件新的所有 Source 文件。该命令行选项使您可以更新更改过的文件。 /u 只从 source 复制 destination 中已有的文件。 /i 如果 Source 是一个目录或包含通配符,而 Destination 不存在,xcopy 会假定 destination 指定目录名并创建一个新目录。然后,xcopy 会将所有指定文件复制到新目录中。默认情况下,xcopy 将提示您指定 destination 是文件还是目录。 /s 复制非空的目录和子目录。如果省略 /s,xcopy 将在一个目录中工作。 /e 复制所有子目录,包括空目录。同时使用 /e、/s 和 /t 命令行选项。 /t 只复制子目录结构(即目录树),不复制文件。要复制空目录,必须包含 /e 命令行选项。 /k 复制文件,如果源文件具有只读属姓,则在目标文件中保留该属姓。默认情况下,xcopy 会删除只读属姓。 /r 复制只读文件。 /h 复制具有隐藏和系统文件属姓的文件。默认情况下,xcopy 不复制隐藏或系统文件。 /a 只复制那些具有存档文件属姓设置的源文件。/a 不修改源文件的存档文件属姓。有关如何通过使用 attrib 来设置存档文件属姓的信息,请参阅“”。 /m 复制具有存档文件属姓设置的源文件。与 /a 不同,/m 关闭在源中指定的文件的存档文件属姓。有关如何通过使用 attrib 来设置存档文件属姓的信息,请参阅“”。 /n 使用 NTFS 短文件或目录名创建副本。将文件或目录从 NTFS 卷复制到 FAT 卷或者当目标文件系统需要 FAT 文件系统命名约定(即 8.3 个字符)时,需要 /n。目标文件系统可以是 FAT 或 NTFS。 /o 复制文件所有权与自由选择的访问控制列表 (DACL) 信息。 /x 复制文件审核设置和系统访问控制列表 (SACL) 信息(包含 /o)。 /exclude:filename1[+[filename2]][+[filename3]] 指定包含字符串的文件列表。 /y 禁止提示您确认要覆盖现存的目标文件。 /-y 提示您确认要覆盖现有目标文件。 /z 在可重启模式中通过网络复制。 /? 在命令提示符显示帮助。 注释 使用 /v XOX 使用 /exclude 列出每个文件的单独行中的每个字符串。如果列出的任何字符串与要复制的文件的绝对路径的任何部分匹配,就从复制进程排除该文件。例如,如果指定字符串 "\Obj\",则会排除 Obj 目录下的所有文件。如果指定字符串 ".obj",则排除具有 .obj 扩展名的所有文件。 使用 /z 如果在复制过程中丢失连接(例如,如果用于连接的服务器脱机),复制过程将在重新建立连接后恢复。/z 也显示每个文件完成的复制操作的百分比。 在 COPYCMD 环境变量中使用 /y 可在 COPYCMD 环境变量中使用 /y。在命令行上使用 /-y 可以覆盖该命令。默认情况下,会提示您覆盖,除非您从批处理脚本内运行 copy。 复制加密的文件 将加密文件复制到不支持 EFS 的卷会导致错误。应首先解密文件或将文件复制到支持 EFS 的卷中。 附属文件 要附加文件,请指定单个目标文件,多个源文件(使用通配符或文件 1 + 文件 2 + 文件 3 格式)。 Destination 的默认值 如果省略 Destination,xcopy 命令将文件复制到当前目录。 指定 Destination 是文件还是目录 如果 Destination 不包含现有目录且不以反斜杠 (\) 结尾,会出现下列消息: Does destination specify a file name or directory name on the target (F = file, D = directory)? 如果要将一个或多个文件复制到一个文件,请按 F。如果要将一个或多个文件复制到一个目录,请按 D。 使用 /i 命令行选项可抑制显示该消息,从而导致 xcopy 认定在源是多个文件或一个目录的情况下,目标是一个目录。 使用 xcopy 命令设置 Destination 文件的存档属姓 xcopy 命令创建具有存档属姓设置的文件,无论源文件中是否设定了此属姓。有关文件属姓和 attrib 的详细信息,请参阅“”。 比较 xcopy 和 diskcopy 如果磁盘的子目录中包含文件,要将其复制到具有不同格式的磁盘中,请使用 xcopy 命令,而不要使用 diskcopy。因为 diskcopy 命令是一个磁道接一个磁道地复制磁盘,所以需要源磁盘和目标磁盘的格式必须相同。xcopy 命令没有该要求。通常情况下请使用 xcopy,除非您需要完整的磁盘图像副本。 xcopy 的退出码 要处理 xcopy 返回的退出码,请在批处理程序的 if 命令行上使用 errorlevel 参数。有关使用“if”处理退出码的批处理程序的范例,请参阅“”。下表列出每一个退出码和说明。 退出码 说明 0 文件复制没有错误。 1 没有找到要复制的文件。 2 用户按 CTRL+C 终止了 xcopy。 4 出现了初始化错误。没有足够的内存或磁盘空间,或命令行上输入了无效的驱动器名称或语法。 5 出现了磁盘写入错误。 范例 要从驱动器 A 将所有文件和子目录(包括所有空的子目录)复制到驱动器 B,请键入: xcopy a:b:/s /e 要包含上一示例中的任何系统或隐藏文件,请按如下所示添加 /h 命令行选项: xcopy a:b:/s /e /h 要使用 \Rawdata 目录中 1993 年 12 月 29 日后更改的文件更新 \Reports 目录中的文件,请键入: xcopy \rawdata \reports /d:12-29-1993 要更新上例中 \Reports 中存在的所有文件,而不考虑日期,请键入: xcopy \rawdata \reports /u 如果只想获得前一个命令要复制的文件列表,而不复制文件,请键入: xcopy \rawdata \reports /d:12-29-1993 /l > xcopy.out 文件 Xcopy.out 列出了要复制的所有文件。 要将 \Customer 目录和所有子目录复制到网络驱动器 H: 上的目录 \\Public\Address,保留只读属姓,并在 H: 上创建新文件时对您做出提示,请键入: xcopy \customer h:\public\address /s /e /k /p 要发出上一个命令,确保在 \Address 目录不存在时 xcopy 会创建该目录,同时应抑制显示创建新目录时要显示的消息,请按如下所示添加 /i 命令行选项: xcopy \customer h:\public\address /s /e /k /p /i 可以创建批处理程序执行 xcopy 操作,并且使用 if 批处理命令在发生错误时处理退出码。例如,以下的批处理程序使用可替换的 xcopy 源和目标参数: @echo off rem COPYIT.BAT transfers all files in all subdirectories of rem the source drive or directory (%1) to the destination rem drive or directory (%2) xcopy %1 %2 /s /e if errorlevel 4 goto lowmemory if errorlevel 2 goto abort if errorlevel 0 goto exit :lowmemory echo Insufficient memory to copy files or echo invalid drive or command-line syntax. goto exit :abort echo You pressed CTRL+C to end the copy operation. goto exit :exit 要使用该批处理程序将 C:\Prgmcode 目录和其子目录中的所有文件复制到驱动器 B 中,请键入: copyit c:\prgmcode b: 该命令解释程序将用 C:\Prgmcode 替换 %1 与 B:。对于 %2,然后使用 xcopy 与 /e 和 /s 命令行选项。如果 xcopy 遇到错误,批处理程序将读取退出码并转到相应 IF ERRORLEVEL 语句中指示的标签,然后显示相应的消息并退出批处理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值