2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: Driver entry
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
13 static IO_COMPLETION_ROUTINE ForwardIrpCompletion
;
19 IN PDEVICE_OBJECT DeviceObject
,
24 UNREFERENCED_PARAMETER(DeviceObject
);
26 if (Irp
->PendingReturned
)
27 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
29 return STATUS_MORE_PROCESSING_REQUIRED
;
34 IsaForwardIrpSynchronous(
35 IN PISAPNP_FDO_EXTENSION FdoExt
,
41 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
42 IoCopyCurrentIrpStackLocationToNext(Irp
);
44 IoSetCompletionRoutine(Irp
, ForwardIrpCompletion
, &Event
, TRUE
, TRUE
, TRUE
);
46 Status
= IoCallDriver(FdoExt
->Ldo
, Irp
);
47 if (Status
== STATUS_PENDING
)
49 Status
= KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
50 if (NT_SUCCESS(Status
))
51 Status
= Irp
->IoStatus
.Status
;
57 static DRIVER_DISPATCH IsaCreateClose
;
63 IN PDEVICE_OBJECT DeviceObject
,
66 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
67 Irp
->IoStatus
.Information
= FILE_OPENED
;
69 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
71 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
73 return STATUS_SUCCESS
;
76 static DRIVER_DISPATCH IsaIoctl
;
82 IN PDEVICE_OBJECT DeviceObject
,
85 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
88 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
90 switch (IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
)
93 DPRINT1("Unknown ioctl code: %x\n", IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
);
94 Status
= STATUS_NOT_SUPPORTED
;
98 Irp
->IoStatus
.Status
= Status
;
99 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
104 static DRIVER_DISPATCH IsaReadWrite
;
110 IN PDEVICE_OBJECT DeviceObject
,
113 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
115 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
116 Irp
->IoStatus
.Information
= 0;
118 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
120 return STATUS_NOT_SUPPORTED
;
127 IN PDRIVER_OBJECT DriverObject
,
128 IN PDEVICE_OBJECT PhysicalDeviceObject
)
131 PISAPNP_FDO_EXTENSION FdoExt
;
134 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DriverObject
, PhysicalDeviceObject
);
136 Status
= IoCreateDevice(DriverObject
,
139 FILE_DEVICE_BUS_EXTENDER
,
140 FILE_DEVICE_SECURE_OPEN
,
143 if (!NT_SUCCESS(Status
))
145 DPRINT1("Failed to create FDO (0x%x)\n", Status
);
149 FdoExt
= Fdo
->DeviceExtension
;
150 RtlZeroMemory(FdoExt
, sizeof(*FdoExt
));
152 FdoExt
->Common
.Self
= Fdo
;
153 FdoExt
->Common
.IsFdo
= TRUE
;
154 FdoExt
->Common
.State
= dsStopped
;
155 FdoExt
->Pdo
= PhysicalDeviceObject
;
156 FdoExt
->Ldo
= IoAttachDeviceToDeviceStack(Fdo
,
157 PhysicalDeviceObject
);
159 InitializeListHead(&FdoExt
->DeviceListHead
);
160 KeInitializeSpinLock(&FdoExt
->Lock
);
162 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;
164 return STATUS_SUCCESS
;
167 static DRIVER_DISPATCH IsaPnp
;
173 IN PDEVICE_OBJECT DeviceObject
,
176 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
177 PISAPNP_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
179 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
183 return IsaFdoPnp((PISAPNP_FDO_EXTENSION
)DevExt
,
189 return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE
)DevExt
,
198 IN PDRIVER_OBJECT DriverObject
,
199 IN PUNICODE_STRING RegistryPath
)
201 DPRINT("%s(%p, %wZ)\n", __FUNCTION__
, DriverObject
, RegistryPath
);
203 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = IsaCreateClose
;
204 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = IsaCreateClose
;
205 DriverObject
->MajorFunction
[IRP_MJ_READ
] = IsaReadWrite
;
206 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = IsaReadWrite
;
207 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = IsaIoctl
;
208 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = IsaPnp
;
209 DriverObject
->DriverExtension
->AddDevice
= IsaAddDevice
;
211 return STATUS_SUCCESS
;