2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/hdaudbus/hdaudbus.cpp
5 * PURPOSE: HDA Driver Entry
6 * PROGRAMMER: Johannes Anderwald
10 DRIVER_DISPATCH HDA_Pnp
;
11 DRIVER_ADD_DEVICE HDA_AddDevice
;
12 extern "C" DRIVER_INITIALIZE DriverEntry
;
16 _In_ POOL_TYPE PoolType
,
17 _In_ SIZE_T NumberOfBytes
)
19 PVOID Item
= ExAllocatePoolWithTag(PoolType
, NumberOfBytes
, TAG_HDA
);
23 RtlZeroMemory(Item
, NumberOfBytes
);
29 __drv_freesMem(Mem
) PVOID Item
)
36 HDA_SyncForwardIrpCompletionRoutine(
37 IN PDEVICE_OBJECT DeviceObject
,
41 if (Irp
->PendingReturned
)
43 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
45 return STATUS_MORE_PROCESSING_REQUIRED
;
51 IN PDEVICE_OBJECT DeviceObject
,
57 /* Initialize event */
58 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
60 /* Copy irp stack location */
61 IoCopyCurrentIrpStackLocationToNext(Irp
);
63 /* Set completion routine */
64 IoSetCompletionRoutine(Irp
,
65 HDA_SyncForwardIrpCompletionRoutine
,
72 Status
= IoCallDriver(DeviceObject
, Irp
);
74 /* Check if pending */
75 if (Status
== STATUS_PENDING
)
77 /* Wait for the request to finish */
78 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
80 /* Copy status code */
81 Status
= Irp
->IoStatus
.Status
;
90 _In_ PDEVICE_OBJECT DeviceObject
,
94 PIO_STACK_LOCATION IoStack
;
95 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
97 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
98 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
100 if (IoStack
->MinorFunction
== IRP_MN_START_DEVICE
)
102 Status
= HDA_FDOStartDevice(DeviceObject
, Irp
);
104 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_RELATIONS
)
106 /* handle bus device relations */
107 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== BusRelations
)
109 Status
= HDA_FDOQueryBusRelations(DeviceObject
, Irp
);
113 Status
= Irp
->IoStatus
.Status
;
118 /* get default status */
119 Status
= Irp
->IoStatus
.Status
;
122 Irp
->IoStatus
.Status
= Status
;
123 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
130 _In_ PDEVICE_OBJECT DeviceObject
,
134 PIO_STACK_LOCATION IoStack
;
135 PDEVICE_RELATIONS DeviceRelation
;
137 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
139 if (IoStack
->MinorFunction
== IRP_MN_START_DEVICE
)
142 Status
= STATUS_SUCCESS
;
144 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_BUS_INFORMATION
)
146 /* query bus information */
147 Status
= HDA_PDOQueryBusInformation(Irp
);
149 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_PNP_DEVICE_STATE
)
151 /* query pnp state */
152 Status
= HDA_PDOQueryBusDevicePnpState(Irp
);
154 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_RELATIONS
)
156 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
)
158 /* handle target device relations */
159 ASSERT(IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
);
160 ASSERT(Irp
->IoStatus
.Information
== 0);
162 /* allocate device relation */
163 DeviceRelation
= (PDEVICE_RELATIONS
)AllocateItem(PagedPool
, sizeof(DEVICE_RELATIONS
));
166 DeviceRelation
->Count
= 1;
167 DeviceRelation
->Objects
[0] = DeviceObject
;
170 ObReferenceObject(DeviceObject
);
173 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelation
;
176 Status
= STATUS_SUCCESS
;
181 Status
= STATUS_INSUFFICIENT_RESOURCES
;
185 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_CAPABILITIES
)
187 /* query capabilities */
188 Status
= HDA_PDOQueryBusDeviceCapabilities(Irp
);
190 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCE_REQUIREMENTS
)
193 Status
= STATUS_SUCCESS
;
195 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCES
)
198 Status
= STATUS_SUCCESS
;
200 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_ID
)
202 Status
= HDA_PDOQueryId(DeviceObject
, Irp
);
204 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_TEXT
)
206 Status
= HDA_PDOHandleQueryDeviceText(Irp
);
208 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_INTERFACE
)
210 Status
= HDA_PDOHandleQueryInterface(DeviceObject
, Irp
);
214 /* get default status */
215 Status
= Irp
->IoStatus
.Status
;
218 Irp
->IoStatus
.Status
= Status
;
219 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
227 _In_ PDEVICE_OBJECT DeviceObject
,
230 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
232 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
234 if (FDODeviceExtension
->IsFDO
)
236 return HDA_FdoPnp(DeviceObject
, Irp
);
240 return HDA_PdoPnp(DeviceObject
, Irp
);
248 _In_ PDRIVER_OBJECT DriverObject
,
249 _In_ PDEVICE_OBJECT PhysicalDeviceObject
)
251 PDEVICE_OBJECT DeviceObject
;
252 PHDA_FDO_DEVICE_EXTENSION DeviceExtension
;
255 /* create device object */
256 Status
= IoCreateDevice(DriverObject
, sizeof(HDA_FDO_DEVICE_EXTENSION
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &DeviceObject
);
257 if (!NT_SUCCESS(Status
))
263 /* get device extension*/
264 DeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
266 /* init device extension*/
267 DeviceExtension
->IsFDO
= TRUE
;
268 DeviceExtension
->LowerDevice
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
269 RtlZeroMemory(DeviceExtension
->Codecs
, sizeof(PHDA_CODEC_ENTRY
) * (HDA_MAX_CODECS
+ 1));
271 /* set device flags */
272 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
281 _In_ PDRIVER_OBJECT DriverObject
,
282 _In_ PUNICODE_STRING RegistryPathName
)
284 DriverObject
->DriverExtension
->AddDevice
= HDA_AddDevice
;
285 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = HDA_Pnp
;
287 return STATUS_SUCCESS
;