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
13 IN POOL_TYPE PoolType
,
14 IN SIZE_T NumberOfBytes
)
16 PVOID Item
= ExAllocatePoolWithTag(PoolType
, NumberOfBytes
, TAG_HDA
);
20 RtlZeroMemory(Item
, NumberOfBytes
);
33 HDA_SyncForwardIrpCompletionRoutine(
34 IN PDEVICE_OBJECT DeviceObject
,
38 if (Irp
->PendingReturned
)
40 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
42 return STATUS_MORE_PROCESSING_REQUIRED
;
48 IN PDEVICE_OBJECT DeviceObject
,
54 /* Initialize event */
55 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
57 /* Copy irp stack location */
58 IoCopyCurrentIrpStackLocationToNext(Irp
);
60 /* Set completion routine */
61 IoSetCompletionRoutine(Irp
,
62 HDA_SyncForwardIrpCompletionRoutine
,
69 Status
= IoCallDriver(DeviceObject
, Irp
);
71 /* Check if pending */
72 if (Status
== STATUS_PENDING
)
74 /* Wait for the request to finish */
75 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
77 /* Copy status code */
78 Status
= Irp
->IoStatus
.Status
;
88 IN PDEVICE_OBJECT DeviceObject
,
91 NTSTATUS Status
= STATUS_NOT_SUPPORTED
;
92 PIO_STACK_LOCATION IoStack
;
93 PDEVICE_RELATIONS DeviceRelation
;
94 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
95 //PHDA_PDO_DEVICE_EXTENSION ChildDeviceExtension;
97 FDODeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
98 //ChildDeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
100 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
101 if (FDODeviceExtension
->IsFDO
)
103 if (IoStack
->MinorFunction
== IRP_MN_START_DEVICE
)
105 Status
= HDA_FDOStartDevice(DeviceObject
, Irp
);
107 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_RELATIONS
)
109 /* handle bus device relations */
110 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== BusRelations
)
112 Status
= HDA_FDOQueryBusRelations(DeviceObject
, Irp
);
116 Status
= Irp
->IoStatus
.Status
;
121 /* get default status */
122 Status
= Irp
->IoStatus
.Status
;
127 if (IoStack
->MinorFunction
== IRP_MN_START_DEVICE
)
130 Status
= STATUS_SUCCESS
;
132 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_BUS_INFORMATION
)
134 /* query bus information */
135 Status
= HDA_PDOQueryBusInformation(Irp
);
137 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_PNP_DEVICE_STATE
)
139 /* query pnp state */
140 Status
= HDA_PDOQueryBusDevicePnpState(Irp
);
142 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_RELATIONS
)
144 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
)
146 /* handle target device relations */
147 ASSERT(IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
);
148 ASSERT(Irp
->IoStatus
.Information
== 0);
150 /* allocate device relation */
151 DeviceRelation
= (PDEVICE_RELATIONS
)AllocateItem(PagedPool
, sizeof(DEVICE_RELATIONS
));
154 DeviceRelation
->Count
= 1;
155 DeviceRelation
->Objects
[0] = DeviceObject
;
158 ObReferenceObject(DeviceObject
);
161 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelation
;
164 Status
= STATUS_SUCCESS
;
169 Status
= STATUS_INSUFFICIENT_RESOURCES
;
173 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_CAPABILITIES
)
175 /* query capabilities */
176 Status
= HDA_PDOQueryBusDeviceCapabilities(Irp
);
178 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCE_REQUIREMENTS
)
181 Status
= STATUS_SUCCESS
;
183 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCES
)
186 Status
= STATUS_SUCCESS
;
188 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_ID
)
190 Status
= HDA_PDOQueryId(DeviceObject
, Irp
);
192 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_DEVICE_TEXT
)
194 Status
= HDA_PDOHandleQueryDeviceText(Irp
);
196 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_INTERFACE
)
198 Status
= HDA_PDOHandleQueryInterface(DeviceObject
, Irp
);
202 /* get default status */
203 Status
= Irp
->IoStatus
.Status
;
207 Irp
->IoStatus
.Status
= Status
;
208 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
215 //PDRIVER_ADD_DEVICE HDA_AddDevice;
220 IN PDRIVER_OBJECT DriverObject
,
221 IN PDEVICE_OBJECT PhysicalDeviceObject
)
223 PDEVICE_OBJECT DeviceObject
;
224 PHDA_FDO_DEVICE_EXTENSION DeviceExtension
;
227 /* create device object */
228 Status
= IoCreateDevice(DriverObject
, sizeof(HDA_FDO_DEVICE_EXTENSION
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &DeviceObject
);
229 if (!NT_SUCCESS(Status
))
235 /* get device extension*/
236 DeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
238 /* init device extension*/
239 DeviceExtension
->IsFDO
= TRUE
;
240 DeviceExtension
->LowerDevice
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
241 RtlZeroMemory(DeviceExtension
->Codecs
, sizeof(PHDA_CODEC_ENTRY
) * (HDA_MAX_CODECS
+ 1));
243 /* set device flags */
244 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
253 IN PDRIVER_OBJECT DriverObject
,
254 IN PUNICODE_STRING RegistryPathName
)
256 DriverObject
->DriverExtension
->AddDevice
= HDA_AddDevice
;
257 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = HDA_Pnp
;
259 return STATUS_SUCCESS
;