驱动之路_添加派遣函数
.h
#include <ntddk.h> #define INITCODE code_seg("INIT") #define PAGECODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘*/ #pragma INITCODE /*指的代码运行后 就从内存释放掉*/ NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject) { NTSTATUS status; PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/ //创建设备名称 UNICODE_STRING devName; UNICODE_STRING symLinkName; // RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为 "\\Device\\yjxDDK_Device"*/ //创建设备 status = IoCreateDevice( pDriverObject,\ 0,\ &devName,\ FILE_DEVICE_UNKNOWN,\ 0, TRUE,\ &pDevObj); if (!NT_SUCCESS(status)) { if (status==STATUS_INSUFFICIENT_RESOURCES) { KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES")); } if (status==STATUS_OBJECT_NAME_EXISTS ) { KdPrint(("指定对象名存在")); } if (status==STATUS_OBJECT_NAME_COLLISION) { KdPrint(("//对象名有冲突")); } KdPrint(("设备创建失败...++++++++")); return status; } KdPrint(("设备创建成功...++++++++")); pDevObj->Flags |= DO_BUFFERED_IO; //创建符号链接 RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888"); status = IoCreateSymbolicLink( &symLinkName,&devName ); if (!NT_SUCCESS(status)) /*status等于0*/ { IoDeleteDevice( pDevObj ); return status; } return STATUS_SUCCESS; } VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject); //前置说明 卸载例程 NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp );//派遣函数
.c
//_stdcall #include "mini_ddk.h" #pragma INITCODE NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS { KdPrint(("驱动成功被加载...OK++++++++")); //注册派遣函数 //pDriverObject 这个是驱动对象,后面的是注册派遣函数 pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 CreateMyDevice(pDriverObject);//创建相应的设备 pDriverObject->DriverUnload=DDK_Unload; return (1); } //#pragma code_seg("PAGE") #pragma PAGECODE VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT pDev;//用来取得要删除设备对象 UNICODE_STRING symLinkName; // pDev=pDriverObject->DeviceObject; IoDeleteDevice(pDev); //删除设备 //取符号链接名字 RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888"); //删除符号链接 IoDeleteSymbolicLink(&symLinkName); KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf //取得要删除设备对象 //删掉所有设备 DbgPrint("卸载成功"); } #pragma PAGECODE NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )//这个是派遣回调函数 { //对相应的IPR进行处理 pIrp->IoStatus.Information=0;//设置操作的字节数为0,这里无实际意义 设置实际返回的大小 pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功 IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP KdPrint(("离开派遣函数\n"));//调试信息 return STATUS_SUCCESS; //返回成功 }

浙公网安备 33010602011771号