NTSTATUS PnpQueryCapabilitiesHandler( IN PDEVICE_EXTENSION pdx, IN PIRP Irp) { NTSTATUS status = ForwardAndWait( pdx, Irp); if( NT_SUCCESS(status)) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); PDEVICE_CAPABILITIES deviceCapabilities; deviceCapabilities = IrpStack->Parameters.DeviceCapabilities.Capabilities; for(int ds=PowerSystemWorking;ds<PowerSystemMaximum;ds++) KdPrint(("Capabilities from bus: DeviceState[%d]=%d", ds, deviceCapabilities->DeviceState[ds])); DEVICE_POWER_STATE dps; SetMostPoweredState( PowerSystemWorking, PowerDeviceD0); SetMostPoweredState( PowerSystemSleeping1, PowerDeviceD3); SetMostPoweredState( PowerSystemSleeping2, PowerDeviceD3); SetMostPoweredState( PowerSystemSleeping3, PowerDeviceD3); SetMostPoweredState( PowerSystemHibernate, PowerDeviceD3); SetMostPoweredState( PowerSystemShutdown, PowerDeviceD3); //重点就是这句话了 deviceCapabilities->Removable=TRUE; for(ds=PowerSystemWorking;ds<PowerSystemMaximum;ds++) KdPrint(("Capabilities now: DeviceState[%d]=%d", ds, deviceCapabilities->DeviceState[ds])); } return CompleteIrp( Irp, status, Irp->IoStatus.Information); }
NTSTATUS HandleStartDevice(PDEVICE_EXTENSION pdx, PIRP Irp) { PAGED_CODE(); KdPrint(("Enter HandleStartDevice\n")); //转发IRP并等待返回 NTSTATUS status = ForwardAndWait(pdx,Irp); if (!NT_SUCCESS(status)) { Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } //得到当前堆栈 PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); //从当前堆栈得到翻译信息 PCM_PARTIAL_RESOURCE_LIST translated; if (stack->Parameters.StartDevice.AllocatedResourcesTranslated) translated = &stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList; else translated = NULL; KdPrint(("Init the PCI card!\n")); InitMyPCI(pdx,translated); //完成IRP Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); KdPrint(("Leave HandleStartDevice\n")); return status; }
NTSTATUS NTAPI FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status; PIO_STACK_LOCATION Stack = NULL; PCM_PARTIAL_RESOURCE_LIST raw; PCM_PARTIAL_RESOURCE_LIST translated; ULONG_PTR Information = 0; Stack = IoGetCurrentIrpStackLocation(Irp); switch(Stack->MinorFunction) { case IRP_MN_START_DEVICE: { DPRINT1("Ehci: START_DEVICE\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Status = ForwardAndWait(DeviceObject, Irp); raw = &Stack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList; translated = &Stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList; Status = StartDevice(DeviceObject, raw, translated); break; } case IRP_MN_QUERY_DEVICE_RELATIONS: { DPRINT1("Ehci: IRP_MN_QUERY_DEVICE_RELATIONS\n"); switch(Stack->Parameters.QueryDeviceRelations.Type) { case BusRelations: { PDEVICE_RELATIONS DeviceRelations = NULL; DPRINT1("Ehci: BusRelations\n"); Status = FdoQueryBusRelations(DeviceObject, &DeviceRelations); Information = (ULONG_PTR)DeviceRelations; break; } default: { DPRINT1("Ehci: Unknown query device relations type\n"); Status = STATUS_NOT_IMPLEMENTED; break; } } break; } case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: { DPRINT1("Ehci: IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); return ForwardIrpAndForget(DeviceObject, Irp); break; } case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: { DPRINT1("Ehci: IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); } case IRP_MN_QUERY_INTERFACE: { DPRINT1("Ehci: IRP_MN_QUERY_INTERFACE\n"); Status = STATUS_SUCCESS; Information = 0; Status = ForwardIrpAndForget(DeviceObject, Irp); return Status; break; } default: { DPRINT1("Ehci: IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction); return ForwardIrpAndForget(DeviceObject, Irp); } } Irp->IoStatus.Information = Information; Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; }