2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: Driver entry
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
12 static IO_COMPLETION_ROUTINE ForwardIrpCompletion
;
18 IN PDEVICE_OBJECT DeviceObject
,
23 UNREFERENCED_PARAMETER(DeviceObject
);
25 if (Irp
->PendingReturned
)
26 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
28 return STATUS_MORE_PROCESSING_REQUIRED
;
33 IsaForwardIrpSynchronous(
34 IN PISAPNP_FDO_EXTENSION FdoExt
,
40 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
41 IoCopyCurrentIrpStackLocationToNext(Irp
);
43 IoSetCompletionRoutine(Irp
, ForwardIrpCompletion
, &Event
, TRUE
, TRUE
, TRUE
);
45 Status
= IoCallDriver(FdoExt
->Ldo
, Irp
);
46 if (Status
== STATUS_PENDING
)
48 Status
= KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
49 if (NT_SUCCESS(Status
))
50 Status
= Irp
->IoStatus
.Status
;
56 static DRIVER_DISPATCH IsaCreateClose
;
62 IN PDEVICE_OBJECT DeviceObject
,
65 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
66 Irp
->IoStatus
.Information
= FILE_OPENED
;
68 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
70 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
72 return STATUS_SUCCESS
;
75 static DRIVER_DISPATCH IsaIoctl
;
81 IN PDEVICE_OBJECT DeviceObject
,
84 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
87 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
89 switch (IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
)
92 DPRINT1("Unknown ioctl code: %x\n", IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
);
93 Status
= STATUS_NOT_SUPPORTED
;
97 Irp
->IoStatus
.Status
= Status
;
98 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
103 static DRIVER_DISPATCH IsaReadWrite
;
109 IN PDEVICE_OBJECT DeviceObject
,
112 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
114 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
115 Irp
->IoStatus
.Information
= 0;
117 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
119 return STATUS_NOT_SUPPORTED
;
126 IN PDRIVER_OBJECT DriverObject
,
127 IN PDEVICE_OBJECT PhysicalDeviceObject
)
130 PISAPNP_FDO_EXTENSION FdoExt
;
133 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DriverObject
, PhysicalDeviceObject
);
135 Status
= IoCreateDevice(DriverObject
,
138 FILE_DEVICE_BUS_EXTENDER
,
139 FILE_DEVICE_SECURE_OPEN
,
142 if (!NT_SUCCESS(Status
))
144 DPRINT1("Failed to create FDO (0x%x)\n", Status
);
148 FdoExt
= Fdo
->DeviceExtension
;
149 RtlZeroMemory(FdoExt
, sizeof(*FdoExt
));
151 FdoExt
->Common
.Self
= Fdo
;
152 FdoExt
->Common
.IsFdo
= TRUE
;
153 FdoExt
->Common
.State
= dsStopped
;
154 FdoExt
->Pdo
= PhysicalDeviceObject
;
155 FdoExt
->Ldo
= IoAttachDeviceToDeviceStack(Fdo
,
156 PhysicalDeviceObject
);
158 InitializeListHead(&FdoExt
->DeviceListHead
);
159 KeInitializeSpinLock(&FdoExt
->Lock
);
161 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;
163 return STATUS_SUCCESS
;
166 static DRIVER_DISPATCH IsaPnp
;
172 IN PDEVICE_OBJECT DeviceObject
,
175 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
176 PISAPNP_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
178 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
182 return IsaFdoPnp((PISAPNP_FDO_EXTENSION
)DevExt
,
188 return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE
)DevExt
,
197 IN PDRIVER_OBJECT DriverObject
,
198 IN PUNICODE_STRING RegistryPath
)
200 DPRINT("%s(%p, %wZ)\n", __FUNCTION__
, DriverObject
, RegistryPath
);
202 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = IsaCreateClose
;
203 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = IsaCreateClose
;
204 DriverObject
->MajorFunction
[IRP_MJ_READ
] = IsaReadWrite
;
205 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = IsaReadWrite
;
206 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = IsaIoctl
;
207 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = IsaPnp
;
208 DriverObject
->DriverExtension
->AddDevice
= IsaAddDevice
;
210 return STATUS_SUCCESS
;