// driver.c
#include <ntddk.h>
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT AttachDevice;
// ...
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// 卸载函数
VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("驱动卸载\n"));
UNREFERENCED_PARAMETER(pDriverObject);
}
// 派遣函数之Read-直接转发IRP
NTSTATUS DispatchRead_1(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
// 派遣函数之Read-直接完成IRP处理
NTSTATUS DispatchRead_2(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
// 派遣函数之Read-转发并设置完成例程
NTSTATUS DispatchRead_3(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
// 完成例程3-1
NTSTATUS CompletionRoutine3_1(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context);
// 完成例程3-2
NTSTATUS CompletionRoutine3_2(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context);
// 派遣函数之Read-挂起当前IRP
NTSTATUS DispatchRead_4(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
// 完成例程4
NTSTATUS CompletionRoutine4(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context);
// 派遣函数之Read-转发并等待
NTSTATUS DispatchRead_5(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
// 完成例程5
NTSTATUS CompletionRoutine5(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context);
// 入口函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("驱动加载\n"));
UNREFERENCED_PARAMETER(pRegistryPath);
pDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead_2;
pDriverObject->DriverUnload = DriverUnload;
return status;
}
// 派遣函数之Read-直接转发IRP
NTSTATUS DispatchRead_1(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
KdPrint(("直接转发IRP\n"));
IoSkipCurrentIrpStackLocation(pIrp);
return IoCallDriver(pDevExt->AttachDevice, pIrp);
}
// 派遣函数之Read-直接完成IRP处理
NTSTATUS DispatchRead_2(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
KdPrint(("直接完成IRP处理\n"));
UNREFERENCED_PARAMETER(pDeviceObject);
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
// 派遣函数之Read-转发并设置完成例程
NTSTATUS DispatchRead_3(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
KdPrint(("转发IPR并设置完成例程\n"));
IoCopyCurrentIrpStackLocationToNext(pIrp);
// IoSetCompletionRoutine(pIrp, CompletionRoutine3_1, NULL, TRUE, TRUE, TRUE);
IoSetCompletionRoutine(pIrp, CompletionRoutine3_2, NULL, TRUE, TRUE, TRUE);
return IoCallDriver(pDevExt->AttachDevice, pIrp);
}
// 完成例程3-1
NTSTATUS CompletionRoutine3_1(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context)
{
UNREFERENCED_PARAMETER(pDeviceObject);
UNREFERENCED_PARAMETER(Context);
if (pIrp->PendingReturned == TRUE)
{
IoMarkIrpPending(pIrp);
}
return STATUS_CONTINUE_COMPLETION;
}
// 完成例程3-2
NTSTATUS CompletionRoutine3_2(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context)
{
UNREFERENCED_PARAMETER(pDeviceObject);
UNREFERENCED_PARAMETER(Context);
if (pIrp->PendingReturned == TRUE)
{
IoMarkIrpPending(pIrp);
}
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_MORE_PROCESSING_REQUIRED;
}
// 派遣函数之Read-挂起当前IRP
NTSTATUS DispatchRead_4(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
KdPrint(("挂起当前IRP\n"));
IoCopyCurrentIrpStackLocationToNext(pIrp);
IoSetCompletionRoutine(pIrp, CompletionRoutine4, NULL, TRUE, TRUE, TRUE);
IoCallDriver(pDevExt->AttachDevice, pIrp);
return STATUS_PENDING;
}
// 完成例程4
NTSTATUS CompletionRoutine4(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context)
{
UNREFERENCED_PARAMETER(pDeviceObject);
UNREFERENCED_PARAMETER(pIrp);
UNREFERENCED_PARAMETER(Context);
// return STATUS_CONTINUE_COMPLETION;
return STATUS_MORE_PROCESSING_REQUIRED;
}
// 派遣函数之Read-转发并等待
NTSTATUS DispatchRead_5(PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
KEVENT Event = { 0 };
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
KdPrint(("转发并等待\n"));
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(pIrp);
IoSetCompletionRoutine(pIrp, CompletionRoutine5, &Event, TRUE, TRUE, TRUE);
status = IoCallDriver(pDevExt->AttachDevice, pIrp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
status = pIrp->IoStatus.Status;
}
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
// 完成例程5
NTSTATUS CompletionRoutine5(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context)
{
UNREFERENCED_PARAMETER(pDeviceObject);
UNREFERENCED_PARAMETER(pIrp);
UNREFERENCED_PARAMETER(Context);
if (pIrp->PendingReturned == TRUE)
{
KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
}
return STATUS_MORE_PROCESSING_REQUIRED;
}
处理IRP的几种方式
最新推荐文章于 2024-04-21 01:19:03 发布