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 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 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 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 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 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 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