测试IRP 和Dispatchroutin

本文提供了一个NT驱动程序的开发实例,包括驱动程序的主要功能注册、设备创建、卸载处理及分发例程等核心代码。通过示例展示了如何响应不同类型的IRP请求,并给出了相应的测试函数和结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是NT驱动demo

#include "ntddk.h"
void MyUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObj);
NTSTATUS MyDispatchRoutin(PDEVICE_OBJECT pDevObj,PIRP pIrp);
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj,  
                       PUNICODE_STRING pRegPath)  
{  
   
    UNREFERENCED_PARAMETER(pDriverObj);  
    UNREFERENCED_PARAMETER(pRegPath);  
  
      
    DbgPrint("Enter DriverEntry");  
      
    //注册其他调用函数入口  
    pDriverObj->DriverUnload=MyUnload;  
    pDriverObj->MajorFunction[IRP_MJ_CREATE]=MyDispatchRoutin;  
    pDriverObj->MajorFunction[IRP_MJ_CLOSE]=MyDispatchRoutin;  
    pDriverObj->MajorFunction[IRP_MJ_WRITE]=MyDispatchRoutin;  
    pDriverObj->MajorFunction[IRP_MJ_READ]=MyDispatchRoutin;  
    //创建DO  
	NTSTATUS status=0;  
    status=CreateDevice(pDriverObj);  
    DbgPrint("Enter DriverEntry End");  
    return status;  
} 
typedef struct _DEVICE_EX
{
	PDEVICE_OBJECT pDev;
	UNICODE_STRING ustrDevName;  
    UNICODE_STRING ustrLinkName;  
}DEVICE_EX;
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObj)
{
	 UNREFERENCED_PARAMETER(pDriverObj);
	 UNICODE_STRING ustrDevName;
	 UNICODE_STRING ustrLinkName;
	 RtlInitUnicodeString(&ustrDevName,L"\\Device\\FUckFuck");
	 RtlInitUnicodeString(&ustrLinkName,L"\\DosDevices\\MyLinkDevice");

	 NTSTATUS status;
	 PDEVICE_OBJECT pDevObj;
	 status=IoCreateDevice(pDriverObj,
						   sizeof(DEVICE_EX),
						   &ustrDevName,
						   FILE_DEVICE_UNKNOWN,
						   NULL,true,
						   &pDevObj);
	 if(!NT_SUCCESS(status))
	 {
		 DbgPrint("IoCreateDevice failed");
		 return status;
	 }

	  //得到设备扩展  
	 DEVICE_EX* pDevEx;
     pDevEx=(DEVICE_EX*)pDevObj->DeviceExtension;  
	 pDevEx->pDev=pDevObj;
	 pDevEx->ustrDevName=ustrDevName;
	 pDevEx->ustrLinkName=ustrLinkName;


	 status=IoCreateSymbolicLink(&ustrLinkName,&ustrDevName);
	 if(!NT_SUCCESS(status))
	 {
		 DbgPrint("IoCreateSymbolicLink failed");
		 IoDeleteDevice(pDevObj);
		 return status;
	 }

	
	 return STATUS_SUCCESS;
}
void MyUnload(PDRIVER_OBJECT pDriverObj)
{
	
	 UNREFERENCED_PARAMETER(pDriverObj); 
	 DbgPrint("EnterDriverUnload");

	 PDEVICE_OBJECT pNextDev;
	 DEVICE_EX* pDevEx;
	 pNextDev=pDriverObj->DeviceObject;
	 while(pNextDev)
	 {
		 pDevEx=(DEVICE_EX*)pNextDev->DeviceExtension;
		 //删除符号链接
		 IoDeleteSymbolicLink(&pDevEx->ustrLinkName);
		 pNextDev=pNextDev->NextDevice;
		 IoDeleteDevice(pDevEx->pDev);
	 }
	
	 DbgPrint("LeaveDriverUnload");
	
}
NTSTATUS MyDispatchRoutin(PDEVICE_OBJECT pDevObj,PIRP pIrp)
{


	DbgPrint("EnterDriverDispatchRoutin");
	UNREFERENCED_PARAMETER(pDevObj);
	UNREFERENCED_PARAMETER(pIrp);
	//get io_stack
	PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);

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

	UCHAR type=stack->MajorFunction;
	if(type>=ARRAYSIZE(irpName))
		DbgPrint("no irpname");
	else
		DbgPrint("%s",irpName[type]);
	//设置IRP完成状态
	pIrp->IoStatus.Status=STATUS_SUCCESS;

	//设置IRP操作字节数
	pIrp->IoStatus.Information=0;

	//结束IRP请求
	IoCompleteRequest(pIrp,IO_NO_INCREMENT);
	DbgPrint("LeaveDriverDispatchRoutin");
	return STATUS_SUCCESS;
}

下面是测试函数

#include<windows.h>
int main()
{
	//会触发IRP_MJ_CREATE
	HANDLE hFile=CreateFile(L"\\\\.\\MyLinkDevice",
							GENERIC_READ|GENERIC_WRITE,
							0,
							NULL,
							OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL,
							0);
	if(hFile==INVALID_HANDLE_VALUE)
		MessageBox(0,L"failed",0,0);
	//关闭句柄会触发 IRP_MJ_CLEANUP IRP_MJ_CLOSE
	CloseHandle(hFile);
	return 0;
}


下面是测试的结构:


注意:

在驱动加载并开启服务后,再运行测试程序。否则测试程序会打开文件失败。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值