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 _In_ PDEVICE_OBJECT DeviceObject
,
40 PIO_STACK_LOCATION IoStack
;
41 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
43 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
44 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
46 switch (IoStack
->MinorFunction
)
48 case IRP_MN_START_DEVICE
:
49 Status
= HDA_FDOStartDevice(DeviceObject
, Irp
);
50 Irp
->IoStatus
.Status
= Status
;
51 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
53 case IRP_MN_REMOVE_DEVICE
:
54 return HDA_FDORemoveDevice(DeviceObject
, Irp
);
55 case IRP_MN_QUERY_REMOVE_DEVICE
:
56 case IRP_MN_CANCEL_REMOVE_DEVICE
:
57 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
59 case IRP_MN_QUERY_DEVICE_RELATIONS
:
60 /* handle bus device relations */
61 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== BusRelations
)
63 Status
= HDA_FDOQueryBusRelations(DeviceObject
, Irp
);
64 Irp
->IoStatus
.Status
= Status
;
65 if (!NT_SUCCESS(Status
))
67 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
74 IoSkipCurrentIrpStackLocation(Irp
);
75 return IoCallDriver(FDODeviceExtension
->LowerDevice
, Irp
);
80 _In_ PDEVICE_OBJECT DeviceObject
,
84 PIO_STACK_LOCATION IoStack
;
85 PDEVICE_RELATIONS DeviceRelation
;
87 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
89 switch (IoStack
->MinorFunction
)
91 case IRP_MN_START_DEVICE
:
93 Status
= STATUS_SUCCESS
;
95 case IRP_MN_QUERY_BUS_INFORMATION
:
96 /* query bus information */
97 Status
= HDA_PDOQueryBusInformation(Irp
);
99 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
100 /* query pnp state */
101 Status
= HDA_PDOQueryBusDevicePnpState(Irp
);
103 case IRP_MN_QUERY_DEVICE_RELATIONS
:
104 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
)
106 /* handle target device relations */
107 ASSERT(IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
);
108 ASSERT(Irp
->IoStatus
.Information
== 0);
110 /* allocate device relation */
111 DeviceRelation
= (PDEVICE_RELATIONS
)AllocateItem(PagedPool
, sizeof(DEVICE_RELATIONS
));
114 DeviceRelation
->Count
= 1;
115 DeviceRelation
->Objects
[0] = DeviceObject
;
118 ObReferenceObject(DeviceObject
);
121 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelation
;
124 Status
= STATUS_SUCCESS
;
129 Status
= STATUS_INSUFFICIENT_RESOURCES
;
133 case IRP_MN_QUERY_CAPABILITIES
:
134 /* query capabilities */
135 Status
= HDA_PDOQueryBusDeviceCapabilities(Irp
);
137 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
139 Status
= STATUS_SUCCESS
;
141 case IRP_MN_QUERY_RESOURCES
:
143 Status
= STATUS_SUCCESS
;
145 case IRP_MN_QUERY_ID
:
146 Status
= HDA_PDOQueryId(DeviceObject
, Irp
);
148 case IRP_MN_QUERY_DEVICE_TEXT
:
149 Status
= HDA_PDOHandleQueryDeviceText(Irp
);
151 case IRP_MN_QUERY_INTERFACE
:
152 Status
= HDA_PDOHandleQueryInterface(DeviceObject
, Irp
);
155 /* get default status */
156 Status
= Irp
->IoStatus
.Status
;
160 Irp
->IoStatus
.Status
= Status
;
161 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
169 _In_ PDEVICE_OBJECT DeviceObject
,
172 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
174 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
176 if (FDODeviceExtension
->IsFDO
)
178 return HDA_FdoPnp(DeviceObject
, Irp
);
182 return HDA_PdoPnp(DeviceObject
, Irp
);
190 _In_ PDRIVER_OBJECT DriverObject
,
191 _In_ PDEVICE_OBJECT PhysicalDeviceObject
)
193 PDEVICE_OBJECT DeviceObject
;
194 PHDA_FDO_DEVICE_EXTENSION DeviceExtension
;
197 /* create device object */
198 Status
= IoCreateDevice(DriverObject
, sizeof(HDA_FDO_DEVICE_EXTENSION
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &DeviceObject
);
199 if (!NT_SUCCESS(Status
))
205 /* get device extension*/
206 DeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
208 /* init device extension*/
209 DeviceExtension
->IsFDO
= TRUE
;
210 DeviceExtension
->LowerDevice
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
211 RtlZeroMemory(DeviceExtension
->Codecs
, sizeof(PHDA_CODEC_ENTRY
) * (HDA_MAX_CODECS
+ 1));
213 /* set device flags */
214 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
223 _In_ PDRIVER_OBJECT DriverObject
,
224 _In_ PUNICODE_STRING RegistryPathName
)
226 DriverObject
->DriverExtension
->AddDevice
= HDA_AddDevice
;
227 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = HDA_Pnp
;
229 return STATUS_SUCCESS
;