1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/hdaudbus/pdo.cpp
5 * PURPOSE: HDA Driver Entry
6 * PROGRAMMER: Johannes Anderwald
7 */
8 #include "hdaudbus.h"
9
10 NTSTATUS
HDA_PDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject)11 HDA_PDORemoveDevice(
12 _In_ PDEVICE_OBJECT DeviceObject)
13 {
14 PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
15
16 /* get device extension */
17 DeviceExtension = static_cast<PHDA_PDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
18 ASSERT(DeviceExtension->IsFDO == FALSE);
19
20 if (DeviceExtension->ReportedMissing)
21 {
22 if (DeviceExtension->AudioGroup != NULL)
23 {
24 DeviceExtension->AudioGroup->ChildPDO = NULL;
25 }
26 IoDeleteDevice(DeviceObject);
27 }
28
29 return STATUS_SUCCESS;
30 }
31
32 NTSTATUS
HDA_PDOQueryBusInformation(IN PIRP Irp)33 HDA_PDOQueryBusInformation(
34 IN PIRP Irp)
35 {
36 PPNP_BUS_INFORMATION BusInformation;
37
38 /* allocate bus information */
39 BusInformation = (PPNP_BUS_INFORMATION)AllocateItem(PagedPool, sizeof(PNP_BUS_INFORMATION));
40
41 if (!BusInformation)
42 {
43 /* no memory */
44 return STATUS_INSUFFICIENT_RESOURCES;
45 }
46
47 /* return info */
48 BusInformation->BusNumber = 0;
49 BusInformation->LegacyBusType = PCIBus;
50 RtlMoveMemory(&BusInformation->BusTypeGuid, &GUID_HDAUDIO_BUS_INTERFACE, sizeof(GUID));
51
52 /* store result */
53 Irp->IoStatus.Information = (ULONG_PTR)BusInformation;
54
55 /* done */
56 return STATUS_SUCCESS;
57 }
58
59
60 NTSTATUS
61 NTAPI
HDA_PDOQueryId(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)62 HDA_PDOQueryId(
63 IN PDEVICE_OBJECT DeviceObject,
64 IN PIRP Irp)
65 {
66 PIO_STACK_LOCATION IoStack;
67 WCHAR DeviceName[200];
68 PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
69 ULONG Length;
70 LPWSTR Device;
71 NTSTATUS Status;
72
73 /* get device extension */
74 DeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
75 ASSERT(DeviceExtension->IsFDO == FALSE);
76
77 /* get current irp stack location */
78 IoStack = IoGetCurrentIrpStackLocation(Irp);
79
80 if (IoStack->Parameters.QueryId.IdType == BusQueryInstanceID)
81 {
82 Status = RtlStringCbPrintfW(DeviceName,
83 sizeof(DeviceName),
84 L"%02x%02x",
85 DeviceExtension->Codec->Addr,
86 DeviceExtension->AudioGroup->NodeId);
87 NT_ASSERT(NT_SUCCESS(Status));
88 Length = wcslen(DeviceName) + 1;
89
90 /* allocate result buffer*/
91 Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
92 if (!Device)
93 return STATUS_INSUFFICIENT_RESOURCES;
94
95 Status = RtlStringCbCopyW(Device,
96 Length * sizeof(WCHAR),
97 DeviceName);
98 NT_ASSERT(NT_SUCCESS(Status));
99
100 DPRINT1("ID: %S\n", Device);
101 /* store result */
102 Irp->IoStatus.Information = (ULONG_PTR)Device;
103 return STATUS_SUCCESS;
104 }
105 else if (IoStack->Parameters.QueryId.IdType == BusQueryDeviceID ||
106 IoStack->Parameters.QueryId.IdType == BusQueryHardwareIDs)
107 {
108
109 /* calculate size */
110 swprintf(DeviceName, L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X&SUBSYS_%08X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId, DeviceExtension->Codec->VendorId << 16 | DeviceExtension->Codec->ProductId);
111 Length = wcslen(DeviceName) + 20;
112
113 /* allocate result buffer*/
114 Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
115 if (!Device)
116 return STATUS_INSUFFICIENT_RESOURCES;
117
118 wcscpy(Device, DeviceName);
119
120 DPRINT1("ID: %S\n", Device);
121 /* store result */
122 Irp->IoStatus.Information = (ULONG_PTR)Device;
123 return STATUS_SUCCESS;
124 }
125 else if (IoStack->Parameters.QueryId.IdType == BusQueryCompatibleIDs)
126 {
127 RtlZeroMemory(DeviceName, sizeof(DeviceName));
128 Length = swprintf(DeviceName, L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X&REV_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId, DeviceExtension->Codec->Major << 12 | DeviceExtension->Codec->Minor << 8 | DeviceExtension->Codec->Revision) + 1;
129 Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId) + 1;
130 Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X&VEN_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId) + 1;
131 Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X", DeviceExtension->AudioGroup->FunctionGroup) + 2;
132
133 /* allocate result buffer*/
134 Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
135 if (!Device)
136 return STATUS_INSUFFICIENT_RESOURCES;
137
138 RtlCopyMemory(Device, DeviceName, Length * sizeof(WCHAR));
139
140 DPRINT1("ID: %S\n", Device);
141 /* store result */
142 Irp->IoStatus.Information = (ULONG_PTR)Device;
143 return STATUS_SUCCESS;
144 }
145 else
146 {
147 DPRINT1("QueryID Type %x not implemented\n", IoStack->Parameters.QueryId.IdType);
148 return Irp->IoStatus.Status;
149 }
150 return STATUS_NOT_IMPLEMENTED;
151 }
152
153 NTSTATUS
HDA_PDOHandleQueryDeviceText(IN PIRP Irp)154 HDA_PDOHandleQueryDeviceText(
155 IN PIRP Irp)
156 {
157 PIO_STACK_LOCATION IoStack;
158 LPWSTR Buffer;
159 static WCHAR DeviceText[] = L"Audio Device on High Definition Audio Bus";
160
161 IoStack = IoGetCurrentIrpStackLocation(Irp);
162 if (IoStack->Parameters.QueryDeviceText.DeviceTextType == DeviceTextDescription)
163 {
164 DPRINT("HDA_PdoHandleQueryDeviceText DeviceTextDescription\n");
165
166 Buffer = (LPWSTR)AllocateItem(PagedPool, sizeof(DeviceText));
167 if (!Buffer)
168 {
169 Irp->IoStatus.Information = 0;
170 return STATUS_INSUFFICIENT_RESOURCES;
171 }
172
173 wcscpy(Buffer, DeviceText);
174
175 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
176 return STATUS_SUCCESS;
177 }
178 else
179 {
180 DPRINT("HDA_PdoHandleQueryDeviceText DeviceTextLocationInformation\n");
181
182 Buffer = (LPWSTR)AllocateItem(PagedPool, sizeof(DeviceText));
183 if (!Buffer)
184 {
185 Irp->IoStatus.Information = 0;
186 return STATUS_INSUFFICIENT_RESOURCES;
187 }
188
189 wcscpy(Buffer, DeviceText);
190
191 /* save result */
192 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
193 return STATUS_SUCCESS;
194 }
195
196 }
197
198 NTSTATUS
HDA_PDOQueryBusDeviceCapabilities(IN PIRP Irp)199 HDA_PDOQueryBusDeviceCapabilities(
200 IN PIRP Irp)
201 {
202 PDEVICE_CAPABILITIES Capabilities;
203 PIO_STACK_LOCATION IoStack;
204
205 /* get stack location */
206 IoStack = IoGetCurrentIrpStackLocation(Irp);
207
208 /* get capabilities */
209 Capabilities = IoStack->Parameters.DeviceCapabilities.Capabilities;
210
211 RtlZeroMemory(Capabilities, sizeof(DEVICE_CAPABILITIES));
212
213 /* setup capabilities */
214 Capabilities->UniqueID = TRUE;
215 Capabilities->SilentInstall = TRUE;
216 Capabilities->SurpriseRemovalOK = TRUE;
217 Capabilities->Address = 0;
218 Capabilities->UINumber = 0;
219 Capabilities->SystemWake = PowerSystemWorking; /* FIXME common device extension */
220 Capabilities->DeviceWake = PowerDeviceD0;
221
222 /* done */
223 return STATUS_SUCCESS;
224 }
225
226 NTSTATUS
HDA_PDOQueryBusDevicePnpState(IN PIRP Irp)227 HDA_PDOQueryBusDevicePnpState(
228 IN PIRP Irp)
229 {
230 /* set device flags */
231 Irp->IoStatus.Information = PNP_DEVICE_DONT_DISPLAY_IN_UI | PNP_DEVICE_NOT_DISABLEABLE;
232
233 /* done */
234 return STATUS_SUCCESS;
235 }
236
237