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_QUERY_DEVICE_RELATIONS
:
54 /* handle bus device relations */
55 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== BusRelations
)
57 Status
= HDA_FDOQueryBusRelations(DeviceObject
, Irp
);
58 Irp
->IoStatus
.Status
= Status
;
59 if (!NT_SUCCESS(Status
))
61 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
68 IoSkipCurrentIrpStackLocation(Irp
);
69 return IoCallDriver(FDODeviceExtension
->LowerDevice
, Irp
);
74 _In_ PDEVICE_OBJECT DeviceObject
,
78 PIO_STACK_LOCATION IoStack
;
79 PDEVICE_RELATIONS DeviceRelation
;
81 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
83 switch (IoStack
->MinorFunction
)
85 case IRP_MN_START_DEVICE
:
87 Status
= STATUS_SUCCESS
;
89 case IRP_MN_QUERY_BUS_INFORMATION
:
90 /* query bus information */
91 Status
= HDA_PDOQueryBusInformation(Irp
);
93 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
95 Status
= HDA_PDOQueryBusDevicePnpState(Irp
);
97 case IRP_MN_QUERY_DEVICE_RELATIONS
:
98 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
)
100 /* handle target device relations */
101 ASSERT(IoStack
->Parameters
.QueryDeviceRelations
.Type
== TargetDeviceRelation
);
102 ASSERT(Irp
->IoStatus
.Information
== 0);
104 /* allocate device relation */
105 DeviceRelation
= (PDEVICE_RELATIONS
)AllocateItem(PagedPool
, sizeof(DEVICE_RELATIONS
));
108 DeviceRelation
->Count
= 1;
109 DeviceRelation
->Objects
[0] = DeviceObject
;
112 ObReferenceObject(DeviceObject
);
115 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelation
;
118 Status
= STATUS_SUCCESS
;
123 Status
= STATUS_INSUFFICIENT_RESOURCES
;
127 case IRP_MN_QUERY_CAPABILITIES
:
128 /* query capabilities */
129 Status
= HDA_PDOQueryBusDeviceCapabilities(Irp
);
131 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
133 Status
= STATUS_SUCCESS
;
135 case IRP_MN_QUERY_RESOURCES
:
137 Status
= STATUS_SUCCESS
;
139 case IRP_MN_QUERY_ID
:
140 Status
= HDA_PDOQueryId(DeviceObject
, Irp
);
142 case IRP_MN_QUERY_DEVICE_TEXT
:
143 Status
= HDA_PDOHandleQueryDeviceText(Irp
);
145 case IRP_MN_QUERY_INTERFACE
:
146 Status
= HDA_PDOHandleQueryInterface(DeviceObject
, Irp
);
149 /* get default status */
150 Status
= Irp
->IoStatus
.Status
;
154 Irp
->IoStatus
.Status
= Status
;
155 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
163 _In_ PDEVICE_OBJECT DeviceObject
,
166 PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension
;
168 FDODeviceExtension
= static_cast<PHDA_FDO_DEVICE_EXTENSION
>(DeviceObject
->DeviceExtension
);
170 if (FDODeviceExtension
->IsFDO
)
172 return HDA_FdoPnp(DeviceObject
, Irp
);
176 return HDA_PdoPnp(DeviceObject
, Irp
);
184 _In_ PDRIVER_OBJECT DriverObject
,
185 _In_ PDEVICE_OBJECT PhysicalDeviceObject
)
187 PDEVICE_OBJECT DeviceObject
;
188 PHDA_FDO_DEVICE_EXTENSION DeviceExtension
;
191 /* create device object */
192 Status
= IoCreateDevice(DriverObject
, sizeof(HDA_FDO_DEVICE_EXTENSION
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &DeviceObject
);
193 if (!NT_SUCCESS(Status
))
199 /* get device extension*/
200 DeviceExtension
= (PHDA_FDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
202 /* init device extension*/
203 DeviceExtension
->IsFDO
= TRUE
;
204 DeviceExtension
->LowerDevice
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
205 RtlZeroMemory(DeviceExtension
->Codecs
, sizeof(PHDA_CODEC_ENTRY
) * (HDA_MAX_CODECS
+ 1));
207 /* set device flags */
208 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
217 _In_ PDRIVER_OBJECT DriverObject
,
218 _In_ PUNICODE_STRING RegistryPathName
)
220 DriverObject
->DriverExtension
->AddDevice
= HDA_AddDevice
;
221 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = HDA_Pnp
;
223 return STATUS_SUCCESS
;