reactos操作系统实现(115)

来源:互联网 发布:淘宝评价晒不了图片 编辑:程序博客网 时间:2024/04/30 04:18

PciIdeXFdoPnpDispatch函数主要处理PCIIDE即插即用的消息处理。具体实现代码如下:

#001  NTSTATUS NTAPI

#002  PciIdeXFdoPnpDispatch(

#003     IN PDEVICE_OBJECT DeviceObject,

#004     IN PIRP Irp)

#005  {

#006     ULONG MinorFunction;

#007     PIO_STACK_LOCATION Stack;

#008     ULONG_PTR Information = 0;

#009     NTSTATUS Status;

#010

 

获取当前栈位置。

#011     Stack = IoGetCurrentIrpStackLocation(Irp);

 

次功能码,用来选择那一种功能处理代码。

#012     MinorFunction = Stack->MinorFunction;

#013 

#014     switch (MinorFunction)

#015     {

 

启动设备。

#016         case IRP_MN_START_DEVICE: /* 0x00 */

#017         {

#018             DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE/n");

#019             /* Call lower driver */

#020             Status = ForwardIrpAndWait(DeviceObject, Irp);

#021             if (NT_SUCCESS(Status))

#022                 Status = PciIdeXFdoStartDevice(DeviceObject, Irp);

#023             break;

#024         }

 

查询总线有多少个物理设备。

#025         case IRP_MN_QUERY_DEVICE_RELATIONS: /* 0x07 */

#026         {

#027             switch (Stack->Parameters.QueryDeviceRelations.Type)

#028             {

#029                 case BusRelations:

#030                 {

#031                     PDEVICE_RELATIONS DeviceRelations = NULL;

#032                     DPRINT("IRP_MJ_PNP /IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations/n");

#033                     Status = PciIdeXFdoQueryBusRelations(DeviceObject,&DeviceRelations);

#034                     Information = (ULONG_PTR)DeviceRelations;

#035                     break;

#036                 }

#037                 default:

#038                 {

#039                     DPRINT1("IRP_MJ_PNP /IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx/n",

#040                         Stack->Parameters.QueryDeviceRelations.Type);

#041                     Status = STATUS_NOT_IMPLEMENTED;

#042                     break;

#043                 }

#044             }

#045             break;

#046         }

 

过滤分配的资源请求。

#047         case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */

#048         {

#049             DPRINT("IRP_MJ_PNP /IRP_MN_FILTER_RESOURCE_REQUIREMENTS/n");

#050             return ForwardIrpAndForget(DeviceObject, Irp);

#051         }

#052         default:

#053         {

#054             DPRINT1("IRP_MJ_PNP / Unknown minor function0x%lx/n", MinorFunction);

#055             return ForwardIrpAndForget(DeviceObject, Irp);

#056         }

#057     }

#058 

 

返回这个IRP的状态,并标记这个IRP完成。

#059     Irp->IoStatus.Information = Information;

#060     Irp->IoStatus.Status = Status;

#061     IoCompleteRequest(Irp, IO_NO_INCREMENT);

#062     return Status;

#063  }