Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / drivers / bus / isapnp / isapnp.c
1 /*
2 * PROJECT: ReactOS ISA PnP Bus driver
3 * FILE: isapnp.c
4 * PURPOSE: Driver entry
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
6 */
7 #include <isapnp.h>
8
9 #define NDEBUG
10 #include <debug.h>
11
12 static IO_COMPLETION_ROUTINE ForwardIrpCompletion;
13
14 static
15 NTSTATUS
16 NTAPI
17 ForwardIrpCompletion(
18 IN PDEVICE_OBJECT DeviceObject,
19 IN PIRP Irp,
20 IN PVOID Context)
21 {
22
23 UNREFERENCED_PARAMETER(DeviceObject);
24
25 if (Irp->PendingReturned)
26 KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
27
28 return STATUS_MORE_PROCESSING_REQUIRED;
29 }
30
31 NTSTATUS
32 NTAPI
33 IsaForwardIrpSynchronous(
34 IN PISAPNP_FDO_EXTENSION FdoExt,
35 IN PIRP Irp)
36 {
37 KEVENT Event;
38 NTSTATUS Status;
39
40 KeInitializeEvent(&Event, NotificationEvent, FALSE);
41 IoCopyCurrentIrpStackLocationToNext(Irp);
42
43 IoSetCompletionRoutine(Irp, ForwardIrpCompletion, &Event, TRUE, TRUE, TRUE);
44
45 Status = IoCallDriver(FdoExt->Ldo, Irp);
46 if (Status == STATUS_PENDING)
47 {
48 Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
49 if (NT_SUCCESS(Status))
50 Status = Irp->IoStatus.Status;
51 }
52
53 return Status;
54 }
55
56 static DRIVER_DISPATCH IsaCreateClose;
57
58 static
59 NTSTATUS
60 NTAPI
61 IsaCreateClose(
62 IN PDEVICE_OBJECT DeviceObject,
63 IN PIRP Irp)
64 {
65 Irp->IoStatus.Status = STATUS_SUCCESS;
66 Irp->IoStatus.Information = FILE_OPENED;
67
68 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
69
70 IoCompleteRequest(Irp, IO_NO_INCREMENT);
71
72 return STATUS_SUCCESS;
73 }
74
75 static DRIVER_DISPATCH IsaIoctl;
76
77 static
78 NTSTATUS
79 NTAPI
80 IsaIoctl(
81 IN PDEVICE_OBJECT DeviceObject,
82 IN PIRP Irp)
83 {
84 PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
85 NTSTATUS Status;
86
87 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
88
89 switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
90 {
91 default:
92 DPRINT1("Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
93 Status = STATUS_NOT_SUPPORTED;
94 break;
95 }
96
97 Irp->IoStatus.Status = Status;
98 IoCompleteRequest(Irp, IO_NO_INCREMENT);
99
100 return Status;
101 }
102
103 static DRIVER_DISPATCH IsaReadWrite;
104
105 static
106 NTSTATUS
107 NTAPI
108 IsaReadWrite(
109 IN PDEVICE_OBJECT DeviceObject,
110 IN PIRP Irp)
111 {
112 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
113
114 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
115 Irp->IoStatus.Information = 0;
116
117 IoCompleteRequest(Irp, IO_NO_INCREMENT);
118
119 return STATUS_NOT_SUPPORTED;
120 }
121
122 static
123 NTSTATUS
124 NTAPI
125 IsaAddDevice(
126 IN PDRIVER_OBJECT DriverObject,
127 IN PDEVICE_OBJECT PhysicalDeviceObject)
128 {
129 PDEVICE_OBJECT Fdo;
130 PISAPNP_FDO_EXTENSION FdoExt;
131 NTSTATUS Status;
132
133 DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject);
134
135 Status = IoCreateDevice(DriverObject,
136 sizeof(*FdoExt),
137 NULL,
138 FILE_DEVICE_BUS_EXTENDER,
139 FILE_DEVICE_SECURE_OPEN,
140 TRUE,
141 &Fdo);
142 if (!NT_SUCCESS(Status))
143 {
144 DPRINT1("Failed to create FDO (0x%x)\n", Status);
145 return Status;
146 }
147
148 FdoExt = Fdo->DeviceExtension;
149 RtlZeroMemory(FdoExt, sizeof(*FdoExt));
150
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);
157
158 InitializeListHead(&FdoExt->DeviceListHead);
159 KeInitializeSpinLock(&FdoExt->Lock);
160
161 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
162
163 return STATUS_SUCCESS;
164 }
165
166 static DRIVER_DISPATCH IsaPnp;
167
168 static
169 NTSTATUS
170 NTAPI
171 IsaPnp(
172 IN PDEVICE_OBJECT DeviceObject,
173 IN PIRP Irp)
174 {
175 PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
176 PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
177
178 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
179
180 if (DevExt->IsFdo)
181 {
182 return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt,
183 Irp,
184 IrpSp);
185 }
186 else
187 {
188 return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE)DevExt,
189 Irp,
190 IrpSp);
191 }
192 }
193
194 NTSTATUS
195 NTAPI
196 DriverEntry(
197 IN PDRIVER_OBJECT DriverObject,
198 IN PUNICODE_STRING RegistryPath)
199 {
200 DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath);
201
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;
209
210 return STATUS_SUCCESS;
211 }
212
213 /* EOF */