2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: Driver entry
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
16 IN PDEVICE_OBJECT DeviceObject
,
20 if (Irp
->PendingReturned
)
21 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
23 return STATUS_MORE_PROCESSING_REQUIRED
;
28 IsaForwardIrpSynchronous(
29 IN PISAPNP_FDO_EXTENSION FdoExt
,
35 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
36 IoCopyCurrentIrpStackLocationToNext(Irp
);
38 IoSetCompletionRoutine(Irp
, ForwardIrpCompletion
, &Event
, TRUE
, TRUE
, TRUE
);
40 Status
= IoCallDriver(FdoExt
->Ldo
, Irp
);
41 if (Status
== STATUS_PENDING
)
43 Status
= KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
44 if (NT_SUCCESS(Status
))
45 Status
= Irp
->IoStatus
.Status
;
56 IN PDEVICE_OBJECT DeviceObject
,
59 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
60 Irp
->IoStatus
.Information
= FILE_OPENED
;
62 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
64 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
66 return STATUS_SUCCESS
;
73 IN PDEVICE_OBJECT DeviceObject
,
76 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
79 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
81 switch (IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
)
84 DPRINT1("Unknown ioctl code: %x\n", IrpSp
->Parameters
.DeviceIoControl
.IoControlCode
);
85 Status
= STATUS_NOT_SUPPORTED
;
89 Irp
->IoStatus
.Status
= Status
;
90 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
99 IN PDEVICE_OBJECT DeviceObject
,
102 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
104 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
105 Irp
->IoStatus
.Information
= 0;
107 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
109 return STATUS_NOT_SUPPORTED
;
116 IN PDRIVER_OBJECT DriverObject
,
117 IN PDEVICE_OBJECT PhysicalDeviceObject
)
120 PISAPNP_FDO_EXTENSION FdoExt
;
123 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DriverObject
, PhysicalDeviceObject
);
125 Status
= IoCreateDevice(DriverObject
,
128 FILE_DEVICE_BUS_EXTENDER
,
129 FILE_DEVICE_SECURE_OPEN
,
132 if (!NT_SUCCESS(Status
))
134 DPRINT1("Failed to create FDO (0x%x)\n", Status
);
138 FdoExt
= Fdo
->DeviceExtension
;
139 RtlZeroMemory(FdoExt
, sizeof(*FdoExt
));
141 FdoExt
->Common
.Self
= Fdo
;
142 FdoExt
->Common
.IsFdo
= TRUE
;
143 FdoExt
->Common
.State
= dsStopped
;
144 FdoExt
->Pdo
= PhysicalDeviceObject
;
145 FdoExt
->Ldo
= IoAttachDeviceToDeviceStack(Fdo
,
146 PhysicalDeviceObject
);
148 InitializeListHead(&FdoExt
->DeviceListHead
);
149 KeInitializeSpinLock(&FdoExt
->Lock
);
151 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;
153 return STATUS_SUCCESS
;
160 IN PDEVICE_OBJECT DeviceObject
,
163 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
164 PISAPNP_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
166 DPRINT("%s(%p, %p)\n", __FUNCTION__
, DeviceObject
, Irp
);
170 return IsaFdoPnp((PISAPNP_FDO_EXTENSION
)DevExt
,
176 return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE
)DevExt
,
185 IN PDRIVER_OBJECT DriverObject
,
186 IN PUNICODE_STRING RegistryPath
)
188 DPRINT("%s(%p, %wZ)\n", __FUNCTION__
, DriverObject
, RegistryPath
);
190 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = IsaCreateClose
;
191 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = IsaCreateClose
;
192 DriverObject
->MajorFunction
[IRP_MJ_READ
] = IsaReadWrite
;
193 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = IsaReadWrite
;
194 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = IsaIoctl
;
195 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = IsaPnp
;
196 DriverObject
->DriverExtension
->AddDevice
= IsaAddDevice
;
198 return STATUS_SUCCESS
;