IRP 笔记

#include <ntddk.h>
#include <stdio.h>
#include <stdlib.h>
#include "helloworld.h"




NTSTATUS DriverEntry(PDRIVER_OBJECT pDriObj, PUNICODE_STRING theRegisterPath)
{
	int i = 0;
	UNICODE_STRING uDevice;
	UNICODE_STRING uW32Dev;
	PDEVICE_OBJECT pDevObj  = NULL;

	NTSTATUS status;

	DbgPrint(TEXT("Driver hello world"));
	pDriObj->DriverUnload = DriverUnload;

	//RtlInitUnicodeString(&pDriObj->DriverName, L"EmptyDriver1.w7");
	
	RtlInitUnicodeString(&uDevice, L"\\Device\\EmptyDevice");
	RtlInitUnicodeString(&uW32Dev, L"\\DosDevices\\EmptyW32Dev");

	for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
	{
		pDriObj->MajorFunction[i] = IrpHandle;
	}

	pDriObj->MajorFunction[IRP_MJ_CREATE]			= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]   = IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_READ]				= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_SCSI]				= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_CLEANUP]			= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_CLOSE]			= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_WRITE]			= IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_SET_INFORMATION]  = IrpDispatchRoutin;
	pDriObj->MajorFunction[IRP_MJ_QUERY_INFORMATION]= IrpDispatchRoutin;

	pDriObj->DriverStartIo = NULL;
	pDriObj->DriverUnload = DriverUnload;

	status = IoCreateDevice(pDriObj,     //DriverObject
							0,     //DeviceExtensionSize
							&uDevice,                                 //DeviceName
							FILE_DEVICE_UNKNOWN,             //DeviceType
							0,                                    //DeviceCharacteristics
							FALSE,                                //Exclusive
							&pDevObj); 
							
	KdPrint(("%d", status));

	if(!NT_SUCCESS(status))
	{
		return status;
	}
	if(!pDevObj)
	{
		return STATUS_UNEXPECTED_IO_ERROR;
	}
	pDevObj->Flags |= DO_DIRECT_IO;

	status = IoCreateSymbolicLink(&uW32Dev, &uDevice);

	pDevObj->Flags &= ~DO_DEVICE_INITIALIZING; 

 	return STATUS_SUCCESS;
} 

NTSTATUS IrpDispatchRoutin(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
	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                      "
			"IRP_MJ_MAXIMUM_FUNCTION         "
	};

	PIO_STACK_LOCATION pIoStack = IoGetCurrentIrpStackLocation(pIrp);

	if(pIoStack->MajorFunction >= ARRAYSIZE(irpName))
	{
		KdPrint(("UnKnow Irp"));
	}

	else
	{
		KdPrint(("Irp MajorFunction : %s\n", irpName[pIoStack->MajorFunction]) );
	}


	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;

	IoCompleteRequest(pIrp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;
}
NTSTATUS IrpHandle(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
	
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	//设置irp操作了多少字节
	pIrp->IoStatus.Information = 0;

	//处理IRP
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;
}

void DriverUnload(PDRIVER_OBJECT pDrvObj)
{
	UNICODE_STRING uW32Dev;
	
	RtlInitUnicodeString(&uW32Dev, L"\\DosDevices\\EmptyW32Dev");

	DbgPrint(TEXT("deleting symbollink\n"));
	IoDeleteSymbolicLink(&uW32Dev);
	
	DbgPrint(TEXT("deleting device\n"));
	IoDeleteDevice(pDrvObj->DeviceObject);
	
}

  




 void DriverUnload(IN PDRIVER_OBJECT);
 NTSTATUS IrpDispatchRoutin(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS IrpHandle(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);

  

# $Id$
TARGETNAME=EmptyDriver1
TARGETPATH=obj
TARGETTYPE=DRIVER

# Create browse info
#BROWSER_INFO=1
#BROWSERFILE=<some path>

# Additional defines for the C/C++ preprocessor
C_DEFINES=$(C_DEFINES)

SOURCES=HelloWorld.c

  

posted on 2013-03-25 21:03  All IN  阅读(295)  评论(0)    收藏  举报

导航