驱动程序层次结构、PIRP结构、IO_STACK_LOCATION结构

一、驱动程序层次结构

 

在《Windows驱动开发详解》的第四章简单介绍了一下驱动程序的层次结构,但介绍得不清不楚,反复看了几遍,仍然是一分清楚,九分糊涂。为此,花了几个小时来查阅相关资料,最后分别参考《Windows驱动开发详解》和《Windows操作系统原理第2版》,才算有了个初步的认识。

 

要想详细解释驱动程序的层次结构,以我现在的水平可能还没那个能力,但或许能通过文字的形式让自己多一分认识。

 

1.再看DriverEntry和HelloDDKDispatchRoutine函数

要想理解驱动程序的层次结构,还得再来看看第一个驱动程序的大致流程。我们知道,驱动程序的入口函数是DriverEntry,而在DriverEntry函数中,对DRIVER_OBJECT结构体进行了初始化。其中MajorFunction成员是用来设置IRP对应的派遣函数,这样使用该驱动程序进行不同的I/O请求时,就会相应相应的派遣函数。下面是DriverEntry函数中对MajorFunction成员的初始化设置:

 

pDriverObject->MajorFunction[IRP_MJ_CREATE] = ( PDRIVER_DISPATCH ) HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = ( PDRIVER_DISPATCH ) HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = ( PDRIVER_DISPATCH ) HelloDDKDispatchRoutine;
pDriverO

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法提供完整的驱动程序代码,但是我可以为您提供一个简单的驱动程序示例,供您参考。 示例代码如下: ```c #include <ntddk.h> // 驱动程序入口函数 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); // 初始化驱动程序对象 DriverObject->DriverUnload = Example_Unload; // 注册设备对象 UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName, L"\\Device\\ExampleDevice"); PDEVICE_OBJECT DeviceObject = NULL; NTSTATUS Status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject); if (!NT_SUCCESS(Status)) { return Status; } // 注册设备对象处理函数 DriverObject->MajorFunction[IRP_MJ_CREATE] = Example_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Example_Close; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Example_IoControl; // 设置设备对象的标志 DeviceObject->Flags |= DO_DIRECT_IO; DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; } // 设备对象创建处理函数 NTSTATUS Example_Create(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { UNREFERENCED_PARAMETER(DeviceObject); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } // 设备对象关闭处理函数 NTSTATUS Example_Close(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { UNREFERENCED_PARAMETER(DeviceObject); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } // 设备对象IO控制处理函数 NTSTATUS Example_IoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { UNREFERENCED_PARAMETER(DeviceObject); PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; switch (ControlCode) { case IOCTL_EXAMPLE_SET_DATA: // 处理设置数据的操作 break; case IOCTL_EXAMPLE_GET_DATA: // 处理获取数据的操作 break; default: Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_DEVICE_REQUEST; } Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } // 驱动程序卸载处理函数 VOID Example_Unload(IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName, L"\\Device\\ExampleDevice"); // 删除设备对象 IoDeleteDevice(DriverObject->DeviceObject); // 卸载驱动程序 DriverObject->DriverUnload = NULL; } ``` 该示例驱动程序是一个基本的设备驱动程序,包含设备对象创建、关闭、IO控制等处理函数。您可以根据实际需要进行修改和添加。请注意,驱动程序开发需要熟悉Windows内核编程,同时需要小心谨慎,以避免对系统产生负面影响。建议您参考相关的教材或者网上的资源,以帮助您完成驱动程序的编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值