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 switch (IoStack
->MinorFunction
)
102 case IRP_MN_START_DEVICE
:
103 Status
= HDA_FDOStartDevice(DeviceObject
, Irp
);
104 Irp
->IoStatus
.Status
= Status
;
105 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
107 case IRP_MN_QUERY_DEVICE_RELATIONS
:
108 /* handle bus device relations */
109 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== BusRelations
)
111 Status
= HDA_FDOQueryBusRelations(DeviceObject
, Irp
);
112 Irp
->IoStatus
.Status
= Status
;
113 if (!NT_SUCCESS(Status
))
115 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
122 IoSkipCurrentIrpStackLocation(Irp
);
123 return IoCallDriver(FDODeviceExtension
->LowerDevice
, Irp
);
128 _In_ PDEVICE_OBJECT DeviceObject
,
132 PIO_STACK_LOCATION IoStack
;
133 PDEVICE_RELATIONS DeviceRelation
;
135 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
137 switch (IoStack
->MinorFunction
)
139 case IRP_MN_START_DEVICE
:
141 Status
= STATUS_SUCCESS
;
143 case IRP_MN_QUERY_BUS_INFORMATION
:
144 /* query bus information */
145 Status
= HDA_PDOQueryBusInformation(Irp
);
147 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
148 /* query pnp state */
149 Status
= HDA_PDOQueryBusDevicePnpState(Irp
);
151 case IRP_MN_QUERY_DEVICE_RELATIONS
:
152 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
)
154 /* handle target device relations */
155 ASSERT(IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
);
156 ASSERT(Irp
->IoStatus
.Information
== 0);
158 /* allocate device relation */
159 DeviceRelation
= (PDEVICE_RELATIONS
)AllocateItem(PagedPool
, sizeof(DEVICE_RELATIONS
));
162 DeviceRelation
->Count
= 1;
163 DeviceRelation
->Objects
[0] = DeviceObject
;
166 ObReferenceObject(DeviceObject
);
169 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelation
;
172 Status
= STATUS_SUCCESS
;
177 Status
= STATUS_INSUFFICIENT_RESOURCES
;
181 case IRP_MN_QUERY_CAPABILITIES
:
182 /* query capabilities */
183 Status
= HDA_PDOQueryBusDeviceCapabilities(Irp
);
185 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
187 Status
= STATUS_SUCCESS
;
189 case IRP_MN_QUERY_RESOURCES
:
191 Status
= STATUS_SUCCESS
;
193 case IRP_MN_QUERY_ID
:
194 Status
= HDA_PDOQueryId(DeviceObject
, Irp
);
196 case IRP_MN_QUERY_DEVICE_TEXT
:
197 Status
= HDA_PDOHandleQueryDeviceText(Irp
);
199 case IRP_MN_QUERY_INTERFACE
:
200 Status
= HDA_PDOHandleQueryInterface(DeviceObject
, Irp
);
203 /* get default status */
204 Status
= Irp
->IoStatus
.Status
;
208 Irp
->IoStatus
.Status
= Status
;
209 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
217 _In_ PDEVICE_OBJECT DeviceObject
,
220 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
222 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
224 if (FDODeviceExtension
->IsFDO
)
226 return HDA_FdoPnp(DeviceObject
, Irp
);
230 return HDA_PdoPnp(DeviceObject
, Irp
);
238 _In_ PDRIVER_OBJECT DriverObject
,
239 _In_ PDEVICE_OBJECT PhysicalDeviceObject
)
241 PDEVICE_OBJECT DeviceObject
;
242 PHDA_FDO_DEVICE_EXTENSION DeviceExtension
;
245 /* create device object */
246 Status
= IoCreateDevice(DriverObject
, sizeof(HDA_FDO_DEVICE_EXTENSION
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &DeviceObject
);
247 if (!NT_SUCCESS(Status
))
253 /* get device extension*/
254 DeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
256 /* init device extension*/
257 DeviceExtension
->IsFDO
= TRUE
;
258 DeviceExtension
->LowerDevice
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
259 RtlZeroMemory(DeviceExtension
->Codecs
, sizeof(PHDA_CODEC_ENTRY
) * (HDA_MAX_CODECS
+ 1));
261 /* set device flags */
262 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
271 _In_ PDRIVER_OBJECT DriverObject
,
272 _In_ PUNICODE_STRING RegistryPathName
)
274 DriverObject
->DriverExtension
->AddDevice
= HDA_AddDevice
;
275 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = HDA_Pnp
;
277 return STATUS_SUCCESS
;