2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: FDO-specific code
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
15 IN PISAPNP_FDO_EXTENSION FdoExt
,
17 IN PIO_STACK_LOCATION IrpSp
)
22 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
24 Status
= IsaHwDetectReadDataPort(FdoExt
);
25 if (!NT_SUCCESS(Status
))
27 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
31 FdoExt
->Common
.State
= dsStarted
;
33 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
35 return STATUS_SUCCESS
;
40 IsaFdoQueryDeviceRelations(
41 IN PISAPNP_FDO_EXTENSION FdoExt
,
43 IN PIO_STACK_LOCATION IrpSp
)
46 PLIST_ENTRY CurrentEntry
;
47 PISAPNP_LOGICAL_DEVICE IsaDevice
;
48 PDEVICE_RELATIONS DeviceRelations
;
52 if (IrpSp
->Parameters
.QueryDeviceRelations
.Type
!= BusRelations
)
53 return Irp
->IoStatus
.Status
;
55 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
57 Status
= IsaHwFillDeviceList(FdoExt
);
58 if (!NT_SUCCESS(Status
))
60 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
64 DeviceRelations
= ExAllocatePool(NonPagedPool
,
65 sizeof(DEVICE_RELATIONS
) + sizeof(DEVICE_OBJECT
) * (FdoExt
->DeviceCount
- 1));
68 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
69 return STATUS_INSUFFICIENT_RESOURCES
;
72 CurrentEntry
= FdoExt
->DeviceListHead
.Flink
;
73 while (CurrentEntry
!= &FdoExt
->DeviceListHead
)
75 IsaDevice
= CONTAINING_RECORD(CurrentEntry
, ISAPNP_LOGICAL_DEVICE
, ListEntry
);
77 DeviceRelations
->Objects
[i
++] = IsaDevice
->Common
.Self
;
79 ObReferenceObject(IsaDevice
->Common
.Self
);
81 CurrentEntry
= CurrentEntry
->Flink
;
84 DeviceRelations
->Count
= FdoExt
->DeviceCount
;
86 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
88 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelations
;
90 return STATUS_SUCCESS
;
96 IN PISAPNP_FDO_EXTENSION FdoExt
,
98 IN PIO_STACK_LOCATION IrpSp
)
100 NTSTATUS Status
= Irp
->IoStatus
.Status
;
102 switch (IrpSp
->MinorFunction
)
104 case IRP_MN_START_DEVICE
:
105 Status
= IsaForwardIrpSynchronous(FdoExt
, Irp
);
107 if (NT_SUCCESS(Status
))
108 Status
= IsaFdoStartDevice(FdoExt
, Irp
, IrpSp
);
110 Irp
->IoStatus
.Status
= Status
;
112 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
115 case IRP_MN_STOP_DEVICE
:
116 FdoExt
->Common
.State
= dsStopped
;
118 Status
= STATUS_SUCCESS
;
121 case IRP_MN_QUERY_DEVICE_RELATIONS
:
122 Status
= IsaFdoQueryDeviceRelations(FdoExt
, Irp
, IrpSp
);
124 Irp
->IoStatus
.Status
= Status
;
126 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
129 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
130 DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
134 DPRINT1("Unknown PnP code: %x\n", IrpSp
->MinorFunction
);
138 IoSkipCurrentIrpStackLocation(Irp
);
140 return IoCallDriver(FdoExt
->Ldo
, Irp
);