灰狐驱动学习笔记系列文章汇总(PDF)正式发布
谢谢作者提供这么好的入门资料 如果重复或者作者觉得不当请版主删除文章作者:grayfox信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
作者博客:http://nokyo.blogbus.com/logs/33709004.html
注:文章首发灰狐的博客,后由原创作者友情提交到邪恶八进制信息安全团队论坛,转载请注明原始出处,并根据原创者要求附带此声明。
经过一周的忙活,《灰狐驱动学习笔记系列文章汇总(PDF)》终于编写完毕,现在于邪恶八进制社区正式首发,欢迎大家下载、评论、传播、挑错、批评等等等等。
本书大多内容均来自楚狂人的《Windows驱动编程基础教程》和张帆的《Windows驱动开发技术详解》,因此作者不敢擅自称为原创,这仅仅是本人的一点学习笔记,也可以把它看作是一个精简版的入门教程吧,更多内容请参考前面提到的那两本书。
本书原定14章,后来去掉了2章,现有内容12章,所有章节涉及到的工具或完整代码均在附录的“Src”目录中,代码工程均使用VC 6.0创建。
现有目录如下: 第一章 驱动开发环境的搭建
1.1 关于DDK
1.2 关于驱动程序的编译
1.3 驱动程序的运行
第二章 驱动程序的结构
2.1 驱动程序的头文件
2.2 驱动程序的入口点
2.3 创建设备例程
2.4 卸载驱动例程
2.5 派遣例程
第三章 编写第一个驱动程序
3.1 内核模式下的字符串操作
3.2 内核模式下各种开头函数的区别
3.3 第一个示例程序
第四章 在驱动中使用链表
4.1 内存的分配与释放
4.2 使用LIST_ENTRY
4.3 使用自旋锁
4.4 演示程序
第五章 在驱动中读写文件
5.1 使用OBJECT_ATTRIBUTES
5.2 创建、打开文件
5.3 读写文件操作
5.4 文件相关的其他操作
5.5 演示程序
第六章 在驱动中操作注册表
6.1 创建、打开注册表
6.2 读写注册表
6.3 枚举注册表
6.4 演示程序
第七章 在驱动中获取系统时间
7.1 获取启动毫秒数
7.2 获取系统时间
7.3 演示程序
第八章 在驱动中创建内核线程
8.1 创建内核线程
8.2 关于线程同步
8.3 演示程序
第九章 初探IRP
9.1 IRP的概念
9.2 IRP的处理
9.3 IRP派遣例程示例
第十章 编程加载驱动
10.1 有关NT式驱动的加载
10.2 服务编程加载驱动
第十一章 驱动程序与应用层的通信
11.1 使用WriteFile通信
11.2 使用DeviceIoControl通信
第十二章 HOOK SSDT的实现
[ 本帖最后由 寂寞的季节 于 2009-1-19 21:11 编辑 ]
关于《驱动学习笔记系列文章汇总》第11章的补充
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)文章作者:grayfox
作者主页:http://nokyo.blogbus.com
原始出处:http://nokyo.blogbus.com/logs/34018521.html
在我昨日发布的《驱动学习笔记系列文章汇总(PDF)》电子书中,第11.2节遗留了一个问题,那部分我没有给出使用DeviceIoControl通信的演示源码,因为我当时还没有成功,但我还是把完整程序放到了目录中,它还不够完善。
问题整天拖着不是办法,今天又认真阅读了下张帆的《Windows驱动开发技术详解》第7章的内容,并对它给出的示例程序多次调试,总算把这个通信过程给理解了,附件中我会把完整的源码打包,大家可以用它把电子书里面的“ Src\第11章\使用DeviceIoControl ”中的代码替换掉。
下面我们先来看看应用层程序的代码:#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
#include "..\Ioctls.h"
#define SYMBOL_LINK "\\\\.\\Test"
int main()
{
HANDLE hDevice = ::CreateFile(SYMBOL_LINK,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Failed to Open Device : %d\n", ::GetLastError());
return -1;
}
UCHAR InputBuffer;
UCHAR OutputBuffer;
DWORD dwOutput;
memset(InputBuffer, 0xAA, 10);
BOOL bRet = ::DeviceIoControl(hDevice, IOCTL_TEST, InputBuffer, 10, &OutputBuffer, 10, &dwOutput, NULL);
if (bRet)
{
printf("Output buffer:%d bytes\n",dwOutput);
for (int i=0;i<(int)dwOutput;i++)
{
printf("%02X ",OutputBuffer);
}
printf("\n");
}
CloseHandle(hDevice);
return 0;
}其中Ioctls.h这个头文件没有实质作用,它是为了在驱动程序和应用层程序之间共享IOCTL定义而设立的,内容很简单,如下所示:#ifndef IOCTLS_H
#define IOCTLS_H
#ifndef CTL_CODE
#pragma message("CTL_CODE undefined. Include winioctl.h or wdm.h")
#endif
#define IOCTL_TEST \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif最后我们再来看驱动程序,这里的xxxxDispatchDeviceControl函数需要作适当修改,如下所示:NTSTATUS
TestDispatchDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS Status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack;
ULONG inBufLength, outBufLength;
ULONG i = 0;
ULONG ioControlCode;
UCHAR *InputBuffer, *OutputBuffer;
irpStack = IoGetCurrentIrpStackLocation(Irp);
inBufLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outBufLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
if (ioControlCode == IOCTL_TEST)
{
KdPrint((" IOCTL_TEST : 0x%X", ioControlCode));
// 读取数据
InputBuffer = (UCHAR *)Irp->AssociatedIrp.SystemBuffer;
for (i = 0; i < inBufLength; i++)
{
KdPrint((" %X\n", InputBuffer));
}
// 写入数据
OutputBuffer = (UCHAR *)Irp->AssociatedIrp.SystemBuffer;
memset(OutputBuffer, 0xBB, outBufLength);
Irp->IoStatus.Information = outBufLength;
}
else
{
KdPrint((" Unknown IOCTL: 0x%X (%04X,%04X)", \
ioControlCode, DEVICE_TYPE_FROM_CTL_CODE(ioControlCode), IoGetFunctionCodeFromCtlCode(ioControlCode)));
Status = STATUS_INVALID_PARAMETER;
Irp->IoStatus.Information = 0;
}
// 完成IRP
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}完整工程下载链接
[ 本帖最后由 寂寞的季节 于 2009-1-19 21:01 编辑 ] 东西呢。楼主!
太急了,已下载,谢谢!
[ 本帖最后由 萧泪血 于 2009-1-19 20:55 编辑 ] 谢谢,学习中 编辑完毕 谢谢作者提供这么好的入门资料 如果重复请版主删除 感谢楼主分享,更感谢作者 谢谢你的分享,过年的时候正好学学,对于驱动我了解的还太少! 看样子作者想出书了。:rose 谢谢,学习下了 感觉很详细呢,谢谢楼主分享。 现在还看不懂,先下载收藏 SO WONDERFUL 强烈支持原创实例教程! 感谢作者,感谢楼主!! 收藏学习