分层驱动将IRP分解成多个IRP

来源:互联网 发布:网络连接器主要 编辑:程序博客网 时间:2024/05/01 23:07

EXE部分

#include <stdio.h>#include <Windows.h>#include <WinIoCtl.h>#include "Ioctl.h"int main (void){char linkname[]="\\\\.\\HelloDDKB";HANDLE hDevice = CreateFileA(linkname,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hDevice == INVALID_HANDLE_VALUE){printf("Win32 error code: %d\n",GetLastError());return 1;}DWORD dwRead=0;const int BUFFER_LENGTH=1024*2;UCHAR buffer[BUFFER_LENGTH]={0};//如果读IRP没有被完成,ReadFile一直都不会退出ReadFile(hDevice,buffer,BUFFER_LENGTH,&dwRead,NULL);printf("Readfile返回%d\n",GetLastError());for (int i=0;i<(int)dwRead;i++){printf("%2x",buffer[i]);}printf("%\n");CloseHandle(hDevice);getchar();getchar();return 0;}


 

 

 

SYS部分

A驱动部分代码

#pragma once#include <ntddk.h>#define CountArray(Array)  (sizeof(Array)/sizeof(Array[0]))typedef struct _DEVICE_EXTENSION{PDEVICE_OBJECTpDevice;//设备对象UNICODE_STRINGustrDeviceName;//设备名称UNICODE_STRINGustrSymLinkName;//符号名称}DEVICE_EXTENSION,*PDEVICE_EXTENSION;#ifdef __cplusplusextern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);#endifvoid HelloUnload(IN PDRIVER_OBJECT DriverObject);//卸载函数NTSTATUS CreateDevice(PDRIVER_OBJECT PDevObj);//创建设备NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);//派遣函数NTSTATUS HelloDDKControl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);//IRP_MJ_DIRECTORY_CONTROLNTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);NTSTATUS HelloDDKCreate(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);NTSTATUS HelloDDKClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);


 

#include "hello.h"#include "Ioctl.h"NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath){DbgPrint("Hello from!\n");DriverObject->DriverUnload = HelloUnload;for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++){DriverObject->MajorFunction[i]=HelloDDKDispatchRoutine;}DriverObject->MajorFunction[IRP_MJ_READ]=HelloDDKRead;DriverObject->MajorFunction[IRP_MJ_CREATE]=HelloDDKCreate;DriverObject->MajorFunction[IRP_MJ_CLOSE]=HelloDDKClose;#if DBG_asm int 3#endif//创建设备CreateDevice(DriverObject);return STATUS_SUCCESS;}//卸载函数void HelloUnload(IN PDRIVER_OBJECT DriverObject){#if DBG_asm int 3#endifDbgPrint("Goodbye from!\n");PDEVICE_OBJECT pNextObj=NULL;pNextObj=DriverObject->DeviceObject;while (pNextObj){PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;//删除符号连接IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName);//删除设备IoDeleteDevice(pDevExt->pDevice);pNextObj=pNextObj->NextDevice;}KdPrint(("DriverA:Leave A DriverUnload\n"));}NTSTATUS HelloDDKControl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){#if DBG_asm int 3#endifNTSTATUS status=STATUS_SUCCESS;//获取当前堆栈PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);//获取输入参数大小ULONG cbin=stack->Parameters.DeviceIoControl.InputBufferLength;//获取输出参数大小ULONG cbout=stack->Parameters.DeviceIoControl.OutputBufferLength;//得到IOCTL控制码ULONG code=stack->Parameters.DeviceIoControl.IoControlCode;//获取设备扩展PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;//从用户模式传进来的微秒数ULONG ulMircoSeconds=*(PULONG)pIrp->AssociatedIrp.SystemBuffer;switch (code){case IOCTL_WAIT_METHOD1:{}break;default:status=STATUS_INVALID_VARIANT;}//设置IRP的完成状态pIrp->IoStatus.Status=status;pIrp->IoStatus.Information=0;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return status;}NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){#if DBG_asm int 3#endifNTSTATUS status=STATUS_SUCCESS;PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);ULONG totalLength=0;PVOID virtualAddress=NULL;if (!pIrp->MdlAddress){status=STATUS_UNSUCCESSFUL;totalLength=0;goto HelloDDKRead_EXIT;}virtualAddress=MmGetMdlVirtualAddress(pIrp->MdlAddress);totalLength=MmGetMdlByteCount(pIrp->MdlAddress);if (virtualAddress){RtlFillMemory(virtualAddress,totalLength,0XFF);}HelloDDKRead_EXIT://完成IRPpIrp->IoStatus.Status=status;pIrp->IoStatus.Information=totalLength;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return status;}NTSTATUS HelloDDKCreate(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){DbgPrint("DriverA:Enter A HelloDDKCreate\n");//完成IRPpIrp->IoStatus.Status=STATUS_SUCCESS;pIrp->IoStatus.Information=0;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return STATUS_SUCCESS;}NTSTATUS HelloDDKClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){DbgPrint("DriverA:Enter A HelloDDKClose\n");//完成IRPpIrp->IoStatus.Status=STATUS_SUCCESS;pIrp->IoStatus.Information=0;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return STATUS_SUCCESS;}//创建设备NTSTATUS CreateDevice(PDRIVER_OBJECT pDriver_Object){//定义变量NTSTATUS status=STATUS_SUCCESS;PDEVICE_OBJECT pDevObj=NULL;PDEVICE_EXTENSION pDevExt=NULL;//初始化字符串UNICODE_STRING devname;UNICODE_STRING symLinkName;RtlInitUnicodeString(&devname,L"\\device\\MyDDKDeviceA");RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDKA");//创建设备status =IoCreateDevice(pDriver_Object,sizeof(DEVICE_EXTENSION),&devname,FILE_DEVICE_UNKNOWN,NULL,TRUE,&pDevObj);if (!NT_SUCCESS(status)){DbgPrint("创建设备失败\n");return status;}pDevObj->Flags |= DO_DIRECT_IO;;pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice=pDevObj;pDevExt->ustrDeviceName=devname;pDevExt->ustrSymLinkName=symLinkName;//创建符号连接status =IoCreateSymbolicLink(&symLinkName,&devname) ;if (!NT_SUCCESS(status)) {DbgPrint("创建符号连接失败\n");IoDeleteDevice(pDevObj);return status;}return STATUS_SUCCESS;}//派遣函数NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP){//#if DBG//_asm int 3//#endifPIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrP);//建立一个字符串数组与IRP类型对应起来static char* irpname[] = {"IRP_MJ_CREATE","IRP_MJ_CREATE_NAMED_PIPE","IRP_MJ_CLOSE","IRP_MJ_READ","IRP_MJ_WRITE","IRP_MJ_QUERY_INFORMATION","IRP_MJ_SET_INFORMATION","IRP_MJ_QUERY_EA","IRP_MJ_SET_EA","IRP_MJ_FLUSH_BUFFERS","IRP_MJ_QUERY_VOLUME_INFORMATION","IRP_MJ_SET_VOLUME_INFORMATION","IRP_MJ_DIRECTORY_CONTROL","IRP_MJ_FILE_SYSTEM_CONTROL","IRP_MJ_DEVICE_CONTROL","IRP_MJ_INTERNAL_DEVICE_CONTROL","IRP_MJ_SHUTDOWN","IRP_MJ_LOCK_CONTROL","IRP_MJ_CLEANUP","IRP_MJ_CREATE_MAILSLOT","IRP_MJ_QUERY_SECURITY","IRP_MJ_SET_SECURITY","IRP_MJ_POWER","IRP_MJ_SYSTEM_CONTROL","IRP_MJ_DEVICE_CHANGE","IRP_MJ_QUERY_QUOTA","IRP_MJ_SET_QUOTA","IRP_MJ_PNP",};UCHAR type = stack->MajorFunction;if (type >= CountArray(irpname))KdPrint(("无效的IRP类型 %X\n", type));elseKdPrint(("%s\n", irpname[type]));pIrP->IoStatus.Status=STATUS_SUCCESS;//设置完成状态pIrP->IoStatus.Information=0;//设置操作字节为0IoCompleteRequest(pIrP,IO_NO_INCREMENT);//结束IRP派遣函数,第二个参数表示不增加优先级return STATUS_SUCCESS;}


 

 

 

B驱动部分代码

#pragma once#include <ntddk.h>#define CountArray(Array)  (sizeof(Array)/sizeof(Array[0]))const int MAX_PACKAGE_SIZE=1024;typedef struct _DEVICE_EXTENSION{PDEVICE_OBJECTpDevice;//设备对象UNICODE_STRINGustrDeviceName;//设备名称UNICODE_STRINGustrSymLinkName;//符号名称PDEVICE_OBJECTTargetDevice;}DEVICE_EXTENSION,*PDEVICE_EXTENSION;typedef struct _MyDriver_RW_CONTEXT{PMDLNewMdl;//新MDLPMDLPrveiousMdl;//旧MDLULONGLength;//剩下没有读取的字节ULONGNumxfer;//已经传送过的字节数ULONG_PTRVirtualAddress;//后续传送的虚拟地址PDEVICE_EXTENSIONDeviceExtension;//连接到设备扩展}MYDRIVER_RW_CONTEXT,*PMYDRIVER_RW_CONTEXT;#ifdef __cplusplusextern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);#endifvoid HelloUnload(IN PDRIVER_OBJECT DriverObject);//卸载函数NTSTATUS CreateDevice(PDRIVER_OBJECT PDevObj);//创建设备NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);//派遣函数NTSTATUS HelloDDKControl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);//IRP_MJ_DIRECTORY_CONTROLNTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);NTSTATUS HelloDDKCreate(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);NTSTATUS HelloDDKClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);


 

#include "hello.h"#include "Ioctl.h"NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath){DbgPrint("Hello from!\n");DriverObject->DriverUnload = HelloUnload;for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++){DriverObject->MajorFunction[i]=HelloDDKDispatchRoutine;}DriverObject->MajorFunction[IRP_MJ_READ]=HelloDDKRead;DriverObject->MajorFunction[IRP_MJ_CREATE]=HelloDDKCreate;DriverObject->MajorFunction[IRP_MJ_CLOSE]=HelloDDKClose;#if DBG_asm int 3#endifNTSTATUS status=STATUS_SUCCESS;UNICODE_STRING DeviceName;RtlInitUnicodeString(&DeviceName,L"\\Device\\MyDDKDeviceA");//寻找DriverA创建的设备对象PDEVICE_OBJECT DevObj=NULL;PFILE_OBJECTFileObject=NULL;status=IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&FileObject,&DevObj);if (!NT_SUCCESS(status)){return status;}//创建设备status=CreateDevice(DriverObject);if (!NT_SUCCESS(status)){ObDereferenceObject(FileObject);return status;}PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension;PDEVICE_OBJECT FilterDeviceObject=pdx->pDevice;//将自己的设备对象挂载在DriverA的设备对象上PDEVICE_OBJECT TargetDevice=IoAttachDeviceToDeviceStack(FilterDeviceObject,DevObj);//将底层设备对象记录下pdx->TargetDevice=TargetDevice;if (!TargetDevice){ObDereferenceObject(FileObject);IoDeleteDevice(FilterDeviceObject);return STATUS_INSUFFICIENT_RESOURCES;}FilterDeviceObject->DeviceType=TargetDevice->DeviceType;FilterDeviceObject->Characteristics=TargetDevice->Characteristics;FilterDeviceObject->Flags&=~DO_DEVICE_INITIALIZING;FilterDeviceObject->Flags|=(TargetDevice->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO));ObDereferenceObject(FileObject);return STATUS_SUCCESS;}//卸载函数void HelloUnload(IN PDRIVER_OBJECT DriverObject){#if DBG_asm int 3#endifDbgPrint("Goodbye from!\n");PDEVICE_OBJECT pNextObj=NULL;pNextObj=DriverObject->DeviceObject;while (pNextObj){PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;//删除符号连接IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName);//从设备栈中弹出设备IoDetachDevice(pDevExt->TargetDevice);//删除设备IoDeleteDevice(pDevExt->pDevice);pNextObj=pNextObj->NextDevice;}KdPrint(("DriverB:Leave B DriverUnload\n"));}NTSTATUS HelloDDKControl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){#if DBG_asm int 3#endifNTSTATUS status=STATUS_SUCCESS;//获取当前堆栈PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);//获取输入参数大小ULONG cbin=stack->Parameters.DeviceIoControl.InputBufferLength;//获取输出参数大小ULONG cbout=stack->Parameters.DeviceIoControl.OutputBufferLength;//得到IOCTL控制码ULONG code=stack->Parameters.DeviceIoControl.IoControlCode;//获取设备扩展PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;//从用户模式传进来的微秒数ULONG ulMircoSeconds=*(PULONG)pIrp->AssociatedIrp.SystemBuffer;switch (code){case IOCTL_WAIT_METHOD1:{}break;default:status=STATUS_INVALID_VARIANT;}//设置IRP的完成状态pIrp->IoStatus.Status=status;pIrp->IoStatus.Information=0;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return status;}NTSTATUS HelloDDKReadCompletion(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID ConText){#if DBG_asm int 3#endifPMYDRIVER_RW_CONTEXT rwConText=(PMYDRIVER_RW_CONTEXT)ConText;NTSTATUS status=Irp->IoStatus.Status;ULONG stageLength=0;if (rwConText && NT_SUCCESS(status)){//已经传送了多少字节rwConText->Numxfer+=Irp->IoStatus.Information;if (rwConText->Length){//设定下一阶段读取字节数if (rwConText->Length>MAX_PACKAGE_SIZE){stageLength=MAX_PACKAGE_SIZE;}else{stageLength=rwConText->Length;}//重新利用MDLMmPrepareMdlForReuse(rwConText->NewMdl);IoBuildPartialMdl(Irp->MdlAddress,rwConText->NewMdl,(PVOID)rwConText->VirtualAddress,stageLength);rwConText->VirtualAddress+=stageLength;rwConText->Length-=stageLength;IoCopyCurrentIrpStackLocationToNext(Irp);PIO_STACK_LOCATION nextStack=IoGetNextIrpStackLocation(Irp);nextStack->Parameters.Read.Length=stageLength;IoSetCompletionRoutine(Irp,HelloDDKReadCompletion,rwConText,TRUE,TRUE,TRUE);IoCallDriver(rwConText->DeviceExtension->TargetDevice,Irp);return STATUS_MORE_PROCESSING_REQUIRED;}else{//最后一次传输Irp->IoStatus.Information=rwConText->Numxfer;}}return STATUS_MORE_PROCESSING_REQUIRED;}NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){#if DBG_asm int 3#endifNTSTATUS status=STATUS_SUCCESS;PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);ULONG totalLength=0;ULONG stageLength=0;PMDL   mdl=NULL;PVOID  virtualAddress=NULL;PMYDRIVER_RW_CONTEXT rwConText=NULL;PIO_STACK_LOCATION nextStack=NULL;if (!pIrp->MdlAddress){status=STATUS_UNSUCCESSFUL;totalLength=0;goto HelloDDKRead_EXIT;}//获取MDL的虚拟地址virtualAddress=MmGetMdlVirtualAddress(pIrp->MdlAddress);//获取MDL的长度totalLength=MmGetMdlByteCount(pIrp->MdlAddress);//将总的传输,分成几个阶段,这里设定每次阶段的长度if (totalLength>MAX_PACKAGE_SIZE){stageLength=MAX_PACKAGE_SIZE;}else{stageLength=totalLength;}//创建新的MDLmdl=IoAllocateMdl((PVOID)virtualAddress,totalLength,FALSE,FALSE,NULL);if (mdl==NULL){status=STATUS_INSUFFICIENT_RESOURCES;goto HelloDDKRead_EXIT;}//将IRP的MDL做重新影射IoBuildPartialMdl(pIrp->MdlAddress,mdl,(PVOID)virtualAddress,stageLength);rwConText=(PMYDRIVER_RW_CONTEXT)ExAllocatePool(NonPagedPool,sizeof(MYDRIVER_RW_CONTEXT));rwConText->NewMdl=mdl;rwConText->PrveiousMdl=pIrp->MdlAddress;rwConText->Length=totalLength-stageLength; //还剩下多少没读取rwConText->Numxfer=0;rwConText->VirtualAddress=((ULONG_PTR)virtualAddress+stageLength);//下一阶段开始读取的地址rwConText->DeviceExtension=pDevExt;//拷贝到底层堆栈IoCopyCurrentIrpStackLocationToNext(pIrp);nextStack=IoGetNextIrpStackLocation(pIrp);//根据底层驱动的实现,底层驱动有可能读取这个数值,也有可能读取mdl的lengthnextStack->Parameters.Read.Length=stageLength;pIrp->MdlAddress=mdl;//设定完成例程IoSetCompletionRoutine(pIrp,(PIO_COMPLETION_ROUTINE)HelloDDKReadCompletion,rwConText,TRUE,TRUE,TRUE);IoCallDriver(pDevExt->TargetDevice,pIrp);#if DBG_asm int 3#endifpIrp->MdlAddress=rwConText->PrveiousMdl;IoFreeMdl(rwConText->NewMdl);HelloDDKRead_EXIT://完成IRPpIrp->IoStatus.Status=status;pIrp->IoStatus.Information=totalLength;IoCompleteRequest(pIrp,IO_NO_INCREMENT);return status;}NTSTATUS HelloDDKCreate(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){DbgPrint("DriverB:Enter B HelloDDKCreate\n");PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;IoSkipCurrentIrpStackLocation(pIrp);NTSTATUS status= IoCallDriver(pdx->TargetDevice,pIrp);return status;}NTSTATUS HelloDDKClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){DbgPrint("DriverB:Enter B HelloDDKClose\n");PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;IoSkipCurrentIrpStackLocation(pIrp);NTSTATUS status=IoCallDriver(pdx->TargetDevice,pIrp);return status;}//创建设备NTSTATUS CreateDevice(PDRIVER_OBJECT pDriver_Object){//定义变量NTSTATUS status=STATUS_SUCCESS;PDEVICE_OBJECT pDevObj=NULL;PDEVICE_EXTENSION pDevExt=NULL;//初始化字符串UNICODE_STRING devname;UNICODE_STRING symLinkName;RtlInitUnicodeString(&devname,L"\\device\\MyDDKDeviceB");RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDKB");//创建设备status =IoCreateDevice(pDriver_Object,sizeof(DEVICE_EXTENSION),&devname,FILE_DEVICE_UNKNOWN,NULL,TRUE,&pDevObj);if (!NT_SUCCESS(status)){DbgPrint("创建设备失败\n");return status;}pDevObj->Flags |= DO_DIRECT_IO;pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice=pDevObj;pDevExt->ustrDeviceName=devname;pDevExt->ustrSymLinkName=symLinkName;//创建符号连接status =IoCreateSymbolicLink(&symLinkName,&devname) ;if (!NT_SUCCESS(status)) {DbgPrint("创建符号连接失败\n");IoDeleteDevice(pDevObj);return status;}return STATUS_SUCCESS;}//派遣函数NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP){//#if DBG//_asm int 3//#endifPIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrP);//建立一个字符串数组与IRP类型对应起来static char* irpname[] = {"IRP_MJ_CREATE","IRP_MJ_CREATE_NAMED_PIPE","IRP_MJ_CLOSE","IRP_MJ_READ","IRP_MJ_WRITE","IRP_MJ_QUERY_INFORMATION","IRP_MJ_SET_INFORMATION","IRP_MJ_QUERY_EA","IRP_MJ_SET_EA","IRP_MJ_FLUSH_BUFFERS","IRP_MJ_QUERY_VOLUME_INFORMATION","IRP_MJ_SET_VOLUME_INFORMATION","IRP_MJ_DIRECTORY_CONTROL","IRP_MJ_FILE_SYSTEM_CONTROL","IRP_MJ_DEVICE_CONTROL","IRP_MJ_INTERNAL_DEVICE_CONTROL","IRP_MJ_SHUTDOWN","IRP_MJ_LOCK_CONTROL","IRP_MJ_CLEANUP","IRP_MJ_CREATE_MAILSLOT","IRP_MJ_QUERY_SECURITY","IRP_MJ_SET_SECURITY","IRP_MJ_POWER","IRP_MJ_SYSTEM_CONTROL","IRP_MJ_DEVICE_CHANGE","IRP_MJ_QUERY_QUOTA","IRP_MJ_SET_QUOTA","IRP_MJ_PNP",};UCHAR type = stack->MajorFunction;if (type >= CountArray(irpname))KdPrint(("无效的IRP类型 %X\n", type));elseKdPrint(("%s\n", irpname[type]));pIrP->IoStatus.Status=STATUS_SUCCESS;//设置完成状态pIrP->IoStatus.Information=0;//设置操作字节为0IoCompleteRequest(pIrP,IO_NO_INCREMENT);//结束IRP派遣函数,第二个参数表示不增加优先级return STATUS_SUCCESS;}


 

0 0
原创粉丝点击