ReactOS 0.4.15-dev-5863-g1fe3ab7
hdaudbus.cpp
Go to the documentation of this file.
1/*
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
7*/
8#include "hdaudbus.h"
9
13DRIVER_ADD_DEVICE HDA_AddDevice;
14DRIVER_UNLOAD HDA_Unload;
15extern "C" DRIVER_INITIALIZE DriverEntry;
16
21{
23 if (!Item)
24 return Item;
25
27 return Item;
28}
29
30VOID
33{
35}
36
41{
43 PIO_STACK_LOCATION IoStack;
44 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
45 ULONG CodecIndex, AFGIndex;
46 PHDA_CODEC_ENTRY CodecEntry;
47 PHDA_PDO_DEVICE_EXTENSION ChildDeviceExtension;
48
49 FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
51
52 switch (IoStack->MinorFunction)
53 {
56 Irp->IoStatus.Status = Status;
58 return Status;
62 for (CodecIndex = 0; CodecIndex < HDA_MAX_CODECS; CodecIndex++)
63 {
64 CodecEntry = FDODeviceExtension->Codecs[CodecIndex];
65
67 for (AFGIndex = 0; AFGIndex < CodecEntry->AudioGroupCount; AFGIndex++)
68 {
69 ChildDeviceExtension = static_cast<PHDA_PDO_DEVICE_EXTENSION>(CodecEntry->AudioGroups[AFGIndex]->ChildPDO->DeviceExtension);
70 ChildDeviceExtension->ReportedMissing = TRUE;
71 }
72 }
73 Irp->IoStatus.Status = STATUS_SUCCESS;
74 break;
77 Irp->IoStatus.Status = STATUS_SUCCESS;
78 break;
80 /* handle bus device relations */
81 if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
82 {
84 Irp->IoStatus.Status = Status;
85 if (!NT_SUCCESS(Status))
86 {
88 return Status;
89 }
90 }
91 break;
92 }
93
95 return IoCallDriver(FDODeviceExtension->LowerDevice, Irp);
96}
97
102{
104 PIO_STACK_LOCATION IoStack;
105 PDEVICE_RELATIONS DeviceRelation;
106
108
109 switch (IoStack->MinorFunction)
110 {
112 /* no op for pdo */
114 break;
117 break;
121 break;
123 /* query bus information */
125 break;
127 /* query pnp state */
129 break;
131 if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
132 {
133 /* handle target device relations */
134 ASSERT(Irp->IoStatus.Information == 0);
135
136 /* allocate device relation */
137 DeviceRelation = (PDEVICE_RELATIONS)AllocateItem(PagedPool, sizeof(DEVICE_RELATIONS));
138 if (DeviceRelation)
139 {
140 DeviceRelation->Count = 1;
141 DeviceRelation->Objects[0] = DeviceObject;
142
143 /* reference self */
145
146 /* store result */
147 Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
148
149 /* done */
151 }
152 else
153 {
154 /* no memory */
156 }
157 }
158 else
159 {
160 Status = Irp->IoStatus.Status;
161 }
162 break;
164 /* query capabilities */
166 break;
168 /* no op */
170 break;
172 /* no op */
174 break;
175 case IRP_MN_QUERY_ID:
177 break;
180 break;
183 break;
184 default:
185 /* get default status */
186 Status = Irp->IoStatus.Status;
187 break;
188 }
189
190 Irp->IoStatus.Status = Status;
192
193 return Status;
194}
195
197NTAPI
201{
202 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
203
204 FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
205
206 if (FDODeviceExtension->IsFDO)
207 {
208 return HDA_FdoPnp(DeviceObject, Irp);
209 }
210 else
211 {
212 return HDA_PdoPnp(DeviceObject, Irp);
213 }
214}
215
217NTAPI
221{
223 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
224
225 FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
226
227 if (FDODeviceExtension->IsFDO)
228 {
230 return IoCallDriver(FDODeviceExtension->LowerDevice, Irp);
231 }
232 else
233 {
234 Status = Irp->IoStatus.Status;
236 return Status;
237 }
238}
239
241NTAPI
245{
247 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
248
249 FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
250
251 if (FDODeviceExtension->IsFDO)
252 {
255 return PoCallDriver(FDODeviceExtension->LowerDevice, Irp);
256 }
257 else
258 {
259 Status = Irp->IoStatus.Status;
262 return Status;
263 }
264}
265
267NTAPI
271{
273 PHDA_FDO_DEVICE_EXTENSION DeviceExtension;
275
276 /* create device object */
278 if (!NT_SUCCESS(Status))
279 {
280 /* failed */
281 return Status;
282 }
283
284 /* get device extension*/
285 DeviceExtension = (PHDA_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
286
287 /* init device extension*/
288 DeviceExtension->IsFDO = TRUE;
291 RtlZeroMemory(DeviceExtension->Codecs, sizeof(PHDA_CODEC_ENTRY) * (HDA_MAX_CODECS + 1));
292
293 /* set device flags */
295
296 return Status;
297}
298
299VOID
300NTAPI
303{
304}
305
306extern "C"
307{
309NTAPI
312 _In_ PUNICODE_STRING RegistryPathName)
313{
314 DriverObject->DriverUnload = HDA_Unload;
315 DriverObject->DriverExtension->AddDevice = HDA_AddDevice;
316 DriverObject->MajorFunction[IRP_MJ_POWER] = HDA_Power;
318 DriverObject->MajorFunction[IRP_MJ_PNP] = HDA_Pnp;
319
320 return STATUS_SUCCESS;
321}
322
323}
LONG NTSTATUS
Definition: precomp.h:26
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
NTSTATUS HDA_PDOHandleQueryInterface(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ULONG_PTR
Definition: config.h:101
#define HDA_MAX_AUDIO_GROUPS
Definition: driver.h:40
#define HDA_MAX_CODECS
Definition: driver.h:41
#define __drv_freesMem(kind)
Definition: driverspecs.h:272
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define PagedPool
Definition: env_spec_w32.h:308
NTSTATUS NTAPI HDA_FDOStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: fdo.cpp:578
NTSTATUS NTAPI HDA_FDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: fdo.cpp:692
NTSTATUS NTAPI HDA_FDOQueryBusRelations(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: fdo.cpp:760
Status
Definition: gdiplustypes.h:25
DRIVER_DISPATCH HDA_Pnp
Definition: hdaudbus.cpp:10
DRIVER_DISPATCH HDA_SystemControl
Definition: hdaudbus.cpp:11
DRIVER_ADD_DEVICE HDA_AddDevice
Definition: hdaudbus.cpp:13
DRIVER_INITIALIZE DriverEntry
Definition: hdaudbus.cpp:15
DRIVER_DISPATCH HDA_Power
Definition: hdaudbus.cpp:12
VOID FreeItem(__drv_freesMem(Mem) PVOID Item)
Definition: hdaudbus.cpp:31
NTSTATUS HDA_FdoPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: hdaudbus.cpp:38
PVOID AllocateItem(_In_ POOL_TYPE PoolType, _In_ SIZE_T NumberOfBytes)
Definition: hdaudbus.cpp:18
NTSTATUS HDA_PdoPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: hdaudbus.cpp:99
DRIVER_UNLOAD HDA_Unload
Definition: hdaudbus.cpp:14
IO_DPC_ROUTINE HDA_DpcForIsr
Definition: hdaudbus.h:122
NTSTATUS HDA_PDOHandleQueryDeviceText(IN PIRP Irp)
Definition: pdo.cpp:154
#define TAG_HDA
Definition: hdaudbus.h:11
NTSTATUS HDA_PDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject)
Definition: pdo.cpp:11
struct HDA_FDO_DEVICE_EXTENSION * PHDA_FDO_DEVICE_EXTENSION
NTSTATUS HDA_PDOQueryBusDeviceCapabilities(IN PIRP Irp)
Definition: pdo.cpp:199
NTSTATUS HDA_PDOQueryBusDevicePnpState(IN PIRP Irp)
Definition: pdo.cpp:227
NTSTATUS HDA_PDOQueryBusInformation(IN PIRP Irp)
Definition: pdo.cpp:33
NTSTATUS NTAPI HDA_PDOQueryId(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.cpp:62
#define ASSERT(a)
Definition: mode.c:44
#define _Inout_
Definition: ms_sal.h:378
#define _In_
Definition: ms_sal.h:308
DRIVER_DISPATCH(nfs41_FsdDispatch)
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:966
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
#define IoCompleteRequest
Definition: irp.c:1240
#define IoCallDriver
Definition: irp.c:1225
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:746
#define FILE_DEVICE_BUS_EXTENDER
Definition: winioctl.h:148
#define STATUS_SUCCESS
Definition: shellext.h:65
PDEVICE_OBJECT ChildPDO
Definition: hdaudbus.h:40
Definition: hdaudbus.h:46
PHDA_CODEC_AUDIO_GROUP AudioGroups[HDA_MAX_AUDIO_GROUPS]
Definition: hdaudbus.h:59
ULONG AudioGroupCount
Definition: hdaudbus.h:60
PDEVICE_OBJECT LowerDevice
Definition: hdaudbus.h:68
PHDA_CODEC_ENTRY Codecs[HDA_MAX_CODECS+1]
Definition: hdaudbus.h:82
PVOID DeviceExtension
Definition: env_spec_w32.h:418
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
FORCEINLINE VOID IoInitializeDpcRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIO_DPC_ROUTINE DpcRoutine)
Definition: iofuncs.h:2840
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
@ BusRelations
Definition: iotypes.h:2152
@ TargetDeviceRelation
Definition: iotypes.h:2156
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_QUERY_INTERFACE
#define IRP_MN_START_DEVICE
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_ID
#define IRP_MN_REMOVE_DEVICE
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define DO_POWER_PAGABLE
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_CAPABILITIES
#define IRP_MN_QUERY_RESOURCES
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MJ_POWER
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036
#define IRP_MN_QUERY_BUS_INFORMATION
#define IRP_MN_QUERY_REMOVE_DEVICE
#define ObReferenceObject
Definition: obfuncs.h:204