028_实战EXE和SYS通信-28课(缓冲模式)_sys_驱动源码

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值