Windows驱动学习第一步,第一个Windows驱动

前段时间工作需要做了一段防外挂的工作,虽说是防外挂,但是只能从ring3来做,ring0的是一点也不知道,公司倒是请来了一个做Windows驱动的,但是他对ring3也是不懂,我俩就配合做一些事情,但是明显感觉到我们彼此对对方的技术不熟悉,导致走了很多弯路,不过倒是让我对安全越来越感兴趣了。做C++也有些年头了,但是到现在为止总感觉到了一个瓶颈期,安全这个方向倒也是一个选择,所以选择学习Windows驱动试试看,虽说网上说写hello world挺简单的,但是我倒是折腾了好久,从装编译器,到装虚拟机,再到解决驱动签名问题,再到第一个驱动蓝屏等等,算是踩过了所有人都没有踩过得坑吧。刚刚第一个驱动才算是正式的通过了,记录下,算是自己几个教训吧。贴代码(遇到的所有问题都是在win7 64下):

#include <ntddk.h>

void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
DbgPrint("daoming: Our deiver is unloading...\r\n");
UNICODE_STRING usSymName;


RtlInitUnicodeString(&usSymName, L"\\??\\FlirstLink");


if (pDriverObject->DeviceObject != NULL)
{
IoDeleteSymbolicLink(&usSymName);
IoDeleteDevice(pDriverObject->DeviceObject);
KdPrint(("delete device success."));
}
}


NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT PDeviceObject;
UNICODE_STRING usDevName;
RtlInitUnicodeString(&usDevName, L"\\Device\\FirstDevice");
NTSTATUS Status = IoCreateDevice(pDriverObject, 0, &usDevName, FILE_DEVICE_UNKNOWN, 0, TRUE, &PDeviceObject);
if (!NT_SUCCESS(Status))
{
return Status;
}
pDriverObject->Flags |= DO_BUFFERED_IO;
UNICODE_STRING usSymName;
RtlInitUnicodeString(&usSymName, L"\\??\\FlirstLink");
Status = IoCreateSymbolicLink(&usSymName, &usSymName);
if (!NT_SUCCESS(Status))
{
IoDeleteDevice(PDeviceObject);
return Status;
}
return STATUS_SUCCESS;
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
DbgPrint("daoming: Hello...\r\n");
NTSTATUS Status = CreateDevice(pDriverObject);
if (!NT_SUCCESS(Status))
{
DbgPrint("创建设备失败");
}
else
{
DbgPrint("创建设备成功");
KdPrint(("%wZ", pRegistryPath));
}

pDriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;


//犯的错误
//1,没有卸载相关驱动设备,导致蓝屏。
//2,卸载符号链接名错误,导致蓝屏

//3,不知道为什么IoCreateDevice给删掉了,导致蓝屏(粗心导致)

//至于驱动签名问题有两种解决方案

//1,关闭强制驱动签名验证,这个百度一下,很多例子

//2,下载dseo,做一个测试签名,也能加载驱动

猜你喜欢

转载自blog.csdn.net/longzhilanyuan/article/details/79646853