下面来分析PCIIDE和PCIIDEX驱动程序,这两个都是PCI的IDE总线驱动程序。
先从PCIIDE的入口函数开始,具体实现代码如下:
#001 NTSTATUS NTAPI
#002 DriverEntry(
#003 IN PDRIVER_OBJECT DriverObject,
#004 IN PUNICODE_STRING RegistryPath)
#005 {
#006 NTSTATUS Status;
#007
在这个驱动程序入口函数,主要调用PCIIDEX的函数PciIdeXInitialize来初始化。其函数PciIdeGetControllerProperties是获取IDE控制器的属性。
#008 Status = PciIdeXInitialize(
#009 DriverObject,
#010 RegistryPath,
#011 PciIdeGetControllerProperties,
#012 0);
#013
#014 return Status;
#015 }
#016
10.3.2 PciIdeXInitialize函数
PciIdeXInitialize函数主要用来创建PCIIDEX驱动程序对象,并且设置相应添加设备函数和即插即用函数。
#001 NTSTATUS NTAPI
#002 PciIdeXInitialize(
#003 IN PDRIVER_OBJECT DriverObject,
#004 IN PUNICODE_STRING RegistryPath,
#005 IN PCONTROLLER_PROPERTIES HwGetControllerProperties,
#006 IN ULONG ExtensionSize)
#007 {
#008 ULONG i;
#009 PPCIIDEX_DRIVER_EXTENSION DriverExtension;
#010 NTSTATUS Status;
#011
#012 DPRINT("PciIdeXInitialize(%p '%wZ' %p 0x%lx)/n",
#013 DriverObject, RegistryPath, HwGetControllerProperties, ExtensionSize);
#014
创建PCIIDE扩展的驱动程序对象。
#015 Status = IoAllocateDriverObjectExtension(
#016 DriverObject,
#017 DriverObject,
#018 sizeof(PCIIDEX_DRIVER_EXTENSION),
#019 (PVOID*)&DriverExtension);
如果创建不成功返回出错。
#020 if (!NT_SUCCESS(Status))
#021 return Status;
清空驱动程序扩展对象。
#022 RtlZeroMemory(DriverExtension, sizeof(PCIIDEX_DRIVER_EXTENSION));
保存控制器的扩展大小。
#023 DriverExtension->MiniControllerExtensionSize = ExtensionSize;
保存获取控制器属性的函数。
#024 DriverExtension->HwGetControllerProperties = HwGetControllerProperties;
#025
设置添加PCIIDEX设备的函数。
#026 DriverObject->DriverExtension->AddDevice = PciIdeXAddDevice;
#027
清空所有消息处理函数。
#028 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
#029 DriverObject->MajorFunction[i] = PciIdeXForwardOrIgnore;
设置即插即用处理函数。
#030 DriverObject->MajorFunction[IRP_MJ_PNP] = PciIdeXPnpDispatch;
#031
#032 return STATUS_SUCCESS;
#033 }