#include"ntddk.h"
#define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,FILE_ANY_ACCESS)
#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,FILE_ANY_ACCESS)
void xiezai1(PDRIVER_OBJECT qudongduixiang1)
{
UNICODE_STRING fuhaolianjieming1;
RtlInitUnicodeString(&fuhaolianjieming1, L"\\??\\shebeiduixiangfuhaolianjieming1");
KdPrint(("222222222222222222222222222\n"));
IoDeleteSymbolicLink(&fuhaolianjieming1);//删除符号连接
KdPrint(("符号连接名删除成功\n"));
IoDeleteDevice(qudongduixiang1->DeviceObject);//删除设备
KdPrint(("设备对象删除成功\n"));
}
NTSTATUS chuangjianshebei1(PDRIVER_OBJECT qudongduixiang1)
{
NTSTATUS zhuangtai1;//状态
UNICODE_STRING shebeiming1;//设备名
UNICODE_STRING fuhaolianjieming1;//符号连接名
PDEVICE_OBJECT shebeiduixiang;//设备对象 (输出的)
RtlInitUnicodeString(&shebeiming1, L"\\Device\\shebeiduixiangming1");//用winobj工具找的到
RtlInitUnicodeString(&fuhaolianjieming1, L"\\??\\shebeiduixiangfuhaolianjieming1");
zhuangtai1 = IoCreateDevice(qudongduixiang1, 0, &shebeiming1, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, TRUE, &shebeiduixiang);//创建设备
if (NT_SUCCESS(zhuangtai1))
{
KdPrint(("设备对象创建成功\n"));
}
shebeiduixiang->Flags |= DO_BUFFERED_IO;//给设备对象赋值
zhuangtai1 = IoCreateSymbolicLink(&fuhaolianjieming1, &shebeiming1);//创建符号连接
if (NT_SUCCESS(zhuangtai1))
{
KdPrint(("符号连接创建成功\n"));
}
return zhuangtai1;
}
NTSTATUS chuangjianlicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)//必须这种格式 pirp是很重要的东西 请求包的意思_inout_ io管理器和驱动驱动程序互相传递的数据包 动态记录驱动信息 和io 管理器信息 io管理器在调用历程的时候
//用户层在创建历程的时候 调用进入内核 内核就生成IRP对象 IRP对象就负责请求的信息 比如请求是什么请求或者我们请求的标志 我们的请求是属于(下发)哪个设备的 我们请求携带的用户层传来的一些信息
//比如用户层传来的缓冲区内存 具体的读信息 具体的写信息 只是用于在io管理器和驱动程序互相传递的一个数据包 会变的在io管理器是这样的 传给驱动程序 我们驱动程序可以对它进行操作
{
pirp->IoStatus.Status = STATUS_SUCCESS;//pirp的io完成状态 io传递已经成功了
pirp->IoStatus.Information = 0;//驱动程序操作应用程序提供的缓冲区的字节数
IoCompleteRequest(pirp, IO_NO_INCREMENT); //设置irp已经完成不用传给其它东西了 irp不需要再设备栈上滚动了 不需要流动了
KdPrint(("创建设备历程\n"));
return STATUS_SUCCESS;//什么事都没做
}
NTSTATUS guanbilicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)
{
NTSTATUS zhuangtai1;
zhuangtai1 = STATUS_SUCCESS;
KdPrint(("关闭驱动中的设备的历程成功\n"));
pirp->IoStatus.Status = STATUS_SUCCESS;//pirp的io完成状态 io传递已经成功了
pirp->IoStatus.Information = 0;//驱动程序操作应用程序提供的缓冲区的字节数
IoCompleteRequest(pirp, IO_NO_INCREMENT); //设置irp已经完成不用传给其它东西了 irp不需要再设备栈上滚动了 不需要流动了
return zhuangtai1;
}
NTSTATUS dulicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)
{
KdPrint(("读历程\n"));
return STATUS_SUCCESS;
}
NTSTATUS xielicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)
{
KdPrint(("写历程\n"));
return STATUS_SUCCESS;
}
NTSTATUS ddk_DispatchRoutine_CONTROL(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)
{
ULONG info;
//得到当前栈指针
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);
KdPrint(("Enter myDriver_DeviceIOControl\n"));
NTSTATUS status = STATUS_SUCCESS;
//得到输入缓冲区大小
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
//得到输出缓冲区大小
ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
//得到IOCTL码
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
switch (code)
{
case add_code:
{
int a, b;
KdPrint(("add_code 1111111111111111111\n"));
//缓冲区方式IOCTL
//获取缓冲区数据 a,b
int * InputBuffer = (int*)pirp->AssociatedIrp.SystemBuffer;
_asm
{
mov eax, InputBuffer
mov ebx, [eax]
mov a, ebx
mov ebx, [eax + 4]
mov b, ebx
}
KdPrint(("a=%d,b=%d \n", a, b));
a = a + b;
//C、驱动层返回数据至用户层
//操作输出缓冲区
int* OutputBuffer = (int*)pirp->AssociatedIrp.SystemBuffer;
_asm
{
mov eax, a
mov ebx, OutputBuffer
mov[ebx], eax //bufferet=a+b
}
KdPrint(("a+b=%d \n", a));
//设置实际操作输出缓冲区长度
info = 4;
break;
}
}
//对相应的IPR进行处理
pirp->IoStatus.Information = info;//设置操作的字节数为0,这里无实际意义
pirp->IoStatus.Status = STATUS_SUCCESS;//返回成功
IoCompleteRequest(pirp, IO_NO_INCREMENT);//指示完成此IRP
KdPrint(("离开派遣函数\n"));//调试信息
return STATUS_SUCCESS; //返回成功
}
NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang1, PUNICODE_STRING zhucebiao1)
{
KdPrint(("11111111111111111111111111111\n"));
KdPrint(("注册表路径 %wZ\n", zhucebiao1));//%wZ打印字符串
chuangjianshebei1(qudongduixiang1);
qudongduixiang1->MajorFunction[IRP_MJ_CREATE] = chuangjianlicheng; // 创建设备历程 返回必须是NTSTATUS 必须设定2个参数 用户层有28种不同的请求 比如对设备的读 写 查询 打开 关闭 等等 IRP_MJ_CREATE打开设备的请求
//应用程序发来请求提交给IO管理器 io管理器设备对象对应驱动程序 有没有 这几个请求 如果提供就调用这几个请求 没有提供用默认历程 返回失败信息 给应用程序
qudongduixiang1->MajorFunction[IRP_MJ_READ] = dulicheng; //通用函数 具体请求我们编写的驱动程序要做的事情了
qudongduixiang1->MajorFunction[IRP_MJ_WRITE] = xielicheng;
qudongduixiang1->MajorFunction[IRP_MJ_CLOSE] = guanbilicheng;
qudongduixiang1->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
qudongduixiang1->DriverUnload = xiezai1;//卸载历程
return STATUS_SUCCESS;
}