reactos操作系统实现(115)
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 function 0x%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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |