zl程序教程

您现在的位置是:首页 >  系统

当前栏目

reactos操作系统实现(113)

操作系统 实现 reactos 113
2023-09-14 09:10:38 时间

下面来分析PCIIDEPCIIDEX驱动程序,这两个都是PCIIDE总线驱动程序。

先从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  }