@H_301_3@PciIdeXFdoPnpDispatch函数主要处理@H_301_3@PCIIDE即插即用的消息处理。具体实现代码如下:@H_301_3@
@H_301_3@#001 NTSTATUS NTAPI
@H_301_3@#002 PciIdeXFdoPnpDispatch(
@H_301_3@#003 IN PDEVICE_OBJECT DeviceObject,
@H_301_3@#004 IN PIRP Irp)
@H_301_3@#005 {
@H_301_3@#006 ULONG MinorFunction;
@H_301_3@#007 PIO_STACK_LOCATION Stack;
@H_301_3@#008 ULONG_PTR Information = 0;
@H_301_3@#009 NTSTATUS Status;
@H_301_3@#010
@H_301_3@
@H_301_3@#011 Stack = IoGetCurrentIrpStackLocation(Irp);
@H_301_3@
@H_301_3@#012 MinorFunction = Stack->MinorFunction;
@H_301_3@#013
@H_301_3@#014 switch (MinorFunction)
@H_301_3@#015 {
@H_301_3@
启动设备。@H_301_3@
@H_301_3@#016 case IRP_MN_START_DEVICE: /* 0x00 */
@H_301_3@#017 {
@H_301_3@#018 DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE/n");
@H_301_3@#019 /* Call lower driver */
@H_301_3@#020 Status = ForwardIrpAndWait(DeviceObject,Irp);
@H_301_3@#021 if (NT_SUCCESS(Status))
@H_301_3@#022 Status = PciIdeXFdoStartDevice(DeviceObject,Irp);
@H_301_3@#023 break;
@H_301_3@#024 }
@H_301_3@
@H_301_3@#025 case IRP_MN_QUERY_DEVICE_RELATIONS: /* 0x07 */
@H_301_3@#026 {
@H_301_3@#027 switch (Stack->Parameters.QueryDeviceRelations.Type)
@H_301_3@#028 {
@H_301_3@#029 case BusRelations:
@H_301_3@#030 {
@H_301_3@#031 PDEVICE_RELATIONS DeviceRelations = NULL;
@H_301_3@#032 DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations/n");
@H_301_3@#033 Status = PciIdeXFdoQueryBusRelations(DeviceObject,&DeviceRelations);
@H_301_3@#034 Information = (ULONG_PTR)DeviceRelations;
@H_301_3@#035 break;
@H_301_3@#036 }
@H_301_3@#037 default:
@H_301_3@#038 {
@H_301_3@#039 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx/n",
@H_301_3@#040 Stack->Parameters.QueryDeviceRelations.Type);
@H_301_3@#041 Status = STATUS_NOT_IMPLEMENTED;
@H_301_3@#042 break;
@H_301_3@#043 }
@H_301_3@#044 }
@H_301_3@#045 break;
@H_301_3@#046 }
@H_301_3@
过滤分配的资源请求。@H_301_3@
@H_301_3@#047 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */
@H_301_3@#048 {
@H_301_3@#049 DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS/n");
@H_301_3@#050 return ForwardIrpAndForget(DeviceObject,Irp);
@H_301_3@#051 }
@H_301_3@#052 default:
@H_301_3@#053 {
@H_301_3@#054 DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx/n",MinorFunction);
@H_301_3@#055 return ForwardIrpAndForget(DeviceObject,Irp);
@H_301_3@#056 }
@H_301_3@#057 }
@H_301_3@#058
@H_301_3@
返回这个@H_301_3@IRP的状态,并标记这个@H_301_3@IRP完成。@H_301_3@
@H_301_3@#059 Irp->IoStatus.Information = Information;
@H_301_3@#060 Irp->IoStatus.Status = Status;
@H_301_3@#061 IoCompleteRequest(Irp,IO_NO_INCREMENT);
@H_301_3@#062 return Status;
@H_301_3@#063}