21 ULONG TransferredCount = 0;
23 if (CodecTransfer[
i].
Input.IsValid) {
28 if (TransferredCount <
Count) {
31 SklHdAudBusPrint(DEBUG_LEVEL_VERBOSE, DBG_IOCTL,
"%s timeout (Count: %d, transferred %d)!\n", __func__,
Count, TransferredCount);
46 SklHdAudBusPrint(DEBUG_LEVEL_VERBOSE, DBG_IOCTL,
"%s called (Count: %d)!\n", __func__, workItemContext->
Count);
51 workItemContext->
Count,
65 SklHdAudBusPrint(DEBUG_LEVEL_VERBOSE, DBG_IOCTL,
"%s exit (Count: %d)!\n", __func__);
113 WDFWORKITEM workItem;
122 WdfWorkItemCreate(&workItemConfig, &attributes, &workItem);
125 workItemContext->
devData = devData;
130 WdfWorkItemEnqueue(workItem);
183 stream->PdoContext = devData;
185 stream->streamFormat = *StreamFormat;
235 stream->PdoContext = devData;
237 stream->streamFormat = *StreamFormat;
271 if (
stream->PdoContext != devData) {
282 stream->streamFormat = *StreamFormat;
310 if (
stream->PdoContext != devData) {
342 for (
ULONG i = 0;
i < NumberOfHandles;
i++) {
344 if (
stream->PdoContext != devData) {
399 if (
stream->PdoContext != devData) {
497 DeviceInformation->DriverVersion = 0x100;
498 DeviceInformation->IsStripingSupported =
TRUE;
523 if (FunctionGroupStartNode)
550 if (
stream->PdoContext != devData) {
570 if (NotificationCount == 2) {
571 halfSize = (
UINT32)RequestedBufferSize / 2;
573 allocSize = (
UINT32)RequestedBufferSize + allocOffset;
586 *AllocatedBufferSize = RequestedBufferSize;
587 *OffsetFromFirstPage = allocOffset;
588 *StreamId =
stream->streamTag;
600 while (halfSize > 0) {
602 SklHdAudBusPrint(DEBUG_LEVEL_ERROR, DBG_IOCTL,
"%s Too many BDL entries!\n", __func__);
609 if (halfSize <
chunk)
624 bdl->
ioc = (halfSize > 0) ? 0 : 1;
634 SklHdAudBusPrint(DEBUG_LEVEL_ERROR, DBG_IOCTL,
"%s Too many BDL entries!\n", __func__);
660 stream->numBlocks = numBlocks;
668 *FifoSize =
stream->fifoSize;
693 if (
stream->PdoContext != devData) {
733 SIZE_T OffsetFromFirstPage;
749 if (
stream->PdoContext != devData) {
769 if (
stream->PdoContext != devData) {
776 if (
stream->registeredEvents[
i])
799 if (
stream->PdoContext != devData) {
831 if (
stream->PdoContext != devData) {
838 if (
stream->registeredCallbacks[
i].InUse)
868 if (
stream->PdoContext != devData) {
875 if (
stream->registeredCallbacks[
i].InUse &&
912 if (
stream->PdoContext != devData) {
943 *StreamId =
stream->streamTag;
944 *FifoSize =
stream->fifoSize;
965 if (
stream->PdoContext != devData) {
1018 if (
stream->PdoContext != devData) {
1049 *DataBuffer =
stream->dmaBuf;
1060 busInterface.
Version = 0x0100;
1083 return busInterface;
1091 busInterface.
Version = 0x0100;
1116 return busInterface;
1124 busInterface.
Version = 0x0100;
1143 return busInterface;
1152 busInterface.
Version = 0x0100;
1172 return busInterface;
static DRIVER_NOTIFICATION_CALLBACK_ROUTINE NotificationCallback
struct _PDO_DEVICE_DATA * PPDO_DEVICE_DATA
#define InterlockedIncrement
#define InterlockedDecrement
#define MAX_UNSOLICIT_CALLBACKS
PVOID NTAPI MmAllocateContiguousMemory(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress)
VOID NTAPI MmFreeContiguousMemory(IN PVOID BaseAddress)
#define STATUS_INVALID_HANDLE
#define NT_SUCCESS(StatCode)
#define SklHdAudBusPrint(dbglevel, fmt,...)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeGetCurrentIrql()
VOID NTAPI KeClearEvent(IN PKEVENT Event)
struct _HDAC_STREAM * PHDAC_STREAM
static BOOLEAN NTAPI Isr(PKINTERRUPT Interrupt, PVOID ServiceContext)
GLenum const GLvoid * addr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define HDA_MAX_BDL_ENTRIES
NTSTATUS SendHDACmds(PFDO_CONTEXT fdoCtx, ULONG count, PHDAUDIO_CODEC_TRANSFER CodecTransfer)
void hdac_stream_stop(PHDAC_STREAM stream)
UINT16 hdac_format(PHDAC_STREAM stream)
void hdac_stream_reset(PHDAC_STREAM stream)
void hdac_stream_setup(PHDAC_STREAM stream)
void hdac_stream_start(PHDAC_STREAM stream)
HDAUDIO_BUS_INTERFACE_BDL HDA_BusInterfaceBDL(PVOID Context)
NTSTATUS NTAPI HDA_AllocateCaptureDmaEngine(_In_ PVOID _context, _In_ UCHAR CodecAddress, _In_ PHDAUDIO_STREAM_FORMAT StreamFormat, _Out_ PHANDLE Handle, _Out_ PHDAUDIO_CONVERTER_FORMAT ConverterFormat)
NTSTATUS NTAPI HDA_RegisterNotificationCallback(_In_ PVOID _context, _In_ HANDLE Handle, PDEVICE_OBJECT Fdo, PHDAUDIO_DMA_NOTIFICATION_CALLBACK NotificationCallback, PVOID CallbackContext)
NTSTATUS NTAPI HDA_AllocateContiguousDmaBuffer(_In_ PVOID _context, _In_ HANDLE Handle, _In_ ULONG RequestedBufferSize, _Out_ PVOID *DataBuffer, _Out_ PHDAUDIO_BUFFER_DESCRIPTOR *BdlBuffer)
NTSTATUS NTAPI HDA_UnregisterEventCallback(_In_ PVOID _context, _In_ UCHAR Tag)
NTSTATUS NTAPI HDA_AllocateRenderDmaEngine(_In_ PVOID _context, _In_ PHDAUDIO_STREAM_FORMAT StreamFormat, _In_ BOOLEAN Stripe, _Out_ PHANDLE Handle, _Out_ PHDAUDIO_CONVERTER_FORMAT ConverterFormat)
NTSTATUS NTAPI HDA_UnregisterNotificationEvent(_In_ PVOID _context, _In_ HANDLE Handle, _In_ PKEVENT NotificationEvent)
NTSTATUS NTAPI HDA_AllocateDmaBuffer(_In_ PVOID _context, _In_ HANDLE Handle, _In_ SIZE_T RequestedBufferSize, _Out_ PMDL *BufferMdl, _Out_ PSIZE_T AllocatedBufferSize, _Out_ PUCHAR StreamId, _Out_ PULONG FifoSize)
HDAUDIO_BUS_INTERFACE HDA_BusInterface(PVOID Context)
void NTAPI HDA_GetResourceInformation(_In_ PVOID _context, _Out_ PUCHAR CodecAddress, _Out_ PUCHAR FunctionGroupStartNode)
HDAUDIO_BUS_INTERFACE_V2 HDA_BusInterfaceV2(PVOID Context)
NTSTATUS HDA_WaitForTransfer(PFDO_CONTEXT fdoCtx, UINT16 codecAddr, _In_ ULONG Count, _Inout_updates_(Count) PHDAUDIO_CODEC_TRANSFER CodecTransfer)
NTSTATUS NTAPI HDA_AllocateDmaBufferWithNotification(_In_ PVOID _context, _In_ HANDLE Handle, _In_ ULONG NotificationCount, _In_ SIZE_T RequestedBufferSize, _Out_ PMDL *BufferMdl, _Out_ PSIZE_T AllocatedBufferSize, _Out_ PSIZE_T OffsetFromFirstPage, _Out_ PUCHAR StreamId, _Out_ PULONG FifoSize)
NTSTATUS NTAPI HDA_FreeDmaBufferWithNotification(_In_ PVOID _context, _In_ HANDLE Handle, _In_ PMDL BufferMdl, _In_ SIZE_T BufferSize)
NTSTATUS NTAPI HDA_SetDmaEngineState(_In_ PVOID _context, _In_ HDAUDIO_STREAM_STATE StreamState, _In_ ULONG NumberOfHandles, _In_reads_(NumberOfHandles) PHANDLE Handles)
NTSTATUS NTAPI HDA_SetupDmaEngineWithBdl(_In_ PVOID _context, _In_ HANDLE Handle, _In_ ULONG BufferLength, _In_ ULONG Lvi, _In_ PHDAUDIO_BDL_ISR Isr, _In_ PVOID Context, _Out_ PUCHAR StreamId, _Out_ PULONG FifoSize)
NTSTATUS NTAPI HDA_ChangeBandwidthAllocation(_In_ PVOID _context, _In_ HANDLE Handle, _In_ PHDAUDIO_STREAM_FORMAT StreamFormat, _Out_ PHDAUDIO_CONVERTER_FORMAT ConverterFormat)
NTSTATUS NTAPI HDA_UnregisterNotificationCallback(_In_ PVOID _context, _In_ HANDLE Handle, PHDAUDIO_DMA_NOTIFICATION_CALLBACK NotificationCallback, PVOID CallbackContext)
void NTAPI HDA_AsyncWait(WDFWORKITEM WorkItem)
NTSTATUS NTAPI HDA_RegisterNotificationEvent(_In_ PVOID _context, _In_ HANDLE Handle, _In_ PKEVENT NotificationEvent)
NTSTATUS NTAPI HDA_FreeDmaEngine(_In_ PVOID _context, _In_ HANDLE Handle)
HDAUDIO_BUS_INTERFACE_V3 HDA_BusInterfaceV3(PVOID Context)
NTSTATUS NTAPI HDA_GetDeviceInformation(_In_ PVOID _context, _Inout_ PHDAUDIO_DEVICE_INFORMATION DeviceInformation)
NTSTATUS NTAPI HDA_FreeDmaBuffer(_In_ PVOID _context, _In_ HANDLE Handle)
NTSTATUS NTAPI HDA_TransferCodecVerbs(_In_ PVOID _context, _In_ ULONG Count, _Inout_updates_(Count) PHDAUDIO_CODEC_TRANSFER CodecTransfer, _In_opt_ PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback, _In_opt_ PVOID Context)
NTSTATUS NTAPI HDA_GetLinkPositionRegister(_In_ PVOID _context, _In_ HANDLE Handle, _Out_ PULONG *Position)
VOID NTAPI HDA_GetWallClockRegister(_In_ PVOID _context, _Out_ PULONG *Wallclock)
NTSTATUS NTAPI HDA_RegisterEventCallback(_In_ PVOID _context, _In_ PHDAUDIO_UNSOLICITED_RESPONSE_CALLBACK Routine, _In_opt_ PVOID Context, _Out_ PUCHAR Tag)
NTSTATUS NTAPI HDA_FreeContiguousDmaBuffer(_In_ PVOID _context, _In_ HANDLE Handle)
struct _HDAUDIO_BUS_INTERFACE_BDL HDAUDIO_BUS_INTERFACE_BDL
VOID(NTAPI * PHDAUDIO_TRANSFER_COMPLETE_CALLBACK)(HDAUDIO_CODEC_TRANSFER *, PVOID)
struct _HDAUDIO_BUS_INTERFACE_V3 HDAUDIO_BUS_INTERFACE_V3
struct _HDAUDIO_BUS_INTERFACE_V2 HDAUDIO_BUS_INTERFACE_V2
enum _HDAUDIO_STREAM_STATE HDAUDIO_STREAM_STATE
struct _HDAUDIO_BUFFER_DESCRIPTOR * PHDAUDIO_BUFFER_DESCRIPTOR
struct _HDAUDIO_BUS_INTERFACE HDAUDIO_BUS_INTERFACE
void(NTAPI * PHDAUDIO_BDL_ISR)(_In_ VOID *Context, _In_ ULONG InterruptBitMask)
struct _HDAUDIO_DEVICE_INFORMATION_V2 * PHDAUDIO_DEVICE_INFORMATION_V2
VOID(NTAPI * PHDAUDIO_DMA_NOTIFICATION_CALLBACK)(PVOID Context, LARGE_INTEGER Progress)
VOID(NTAPI * PHDAUDIO_UNSOLICITED_RESPONSE_CALLBACK)(HDAUDIO_CODEC_RESPONSE, PVOID)
VOID NTAPI MmFreePagesFromMdl(IN PMDL Mdl)
PMDL NTAPI MmAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes)
#define _Inout_updates_(s)
#define UNREFERENCED_PARAMETER(P)
#define stream_write32(ctx, reg, data)
UINT8 FunctionGroupStartNode
PHDAUDIO_UNSOLICITED_RESPONSE_CALLBACK Routine
BOOLEAN GraphicsCodecConnected
LONG cmds[HDA_MAX_CODECS]
KEVENT xferEvent[HDA_MAX_CODECS]
PINTERFACE_REFERENCE InterfaceReference
PTRANSFER_CODEC_VERBS TransferCodecVerbs
PINTERFACE_DEREFERENCE InterfaceDereference
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback
PGET_RESOURCE_INFORMATION GetResourceInformation
PALLOCATE_CONTIGUOUS_DMA_BUFFER AllocateContiguousDmaBuffer
PGET_WALL_CLOCK_REGISTER GetWallClockRegister
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation
PGET_DEVICE_INFORMATION GetDeviceInformation
PSETUP_DMA_ENGINE_WITH_BDL SetupDmaEngineWithBdl
PFREE_DMA_ENGINE FreeDmaEngine
PSET_DMA_ENGINE_STATE SetDmaEngineState
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine
PFREE_CONTIGUOUS_DMA_BUFFER FreeContiguousDmaBuffer
PREGISTER_EVENT_CALLBACK RegisterEventCallback
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine
PALLOCATE_DMA_BUFFER_WITH_NOTIFICATION AllocateDmaBufferWithNotification
PFREE_DMA_ENGINE FreeDmaEngine
PINTERFACE_REFERENCE InterfaceReference
PGET_DEVICE_INFORMATION GetDeviceInformation
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation
PFREE_DMA_BUFFER FreeDmaBuffer
PUNREGISTER_NOTIFICATION_EVENT UnregisterNotificationEvent
PSET_DMA_ENGINE_STATE SetDmaEngineState
PREGISTER_EVENT_CALLBACK RegisterEventCallback
PREGISTER_NOTIFICATION_EVENT RegisterNotificationEvent
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback
PINTERFACE_DEREFERENCE InterfaceDereference
PTRANSFER_CODEC_VERBS TransferCodecVerbs
PGET_WALL_CLOCK_REGISTER GetWallClockRegister
PFREE_DMA_BUFFER_WITH_NOTIFICATION FreeDmaBufferWithNotification
PALLOCATE_DMA_BUFFER AllocateDmaBuffer
PGET_RESOURCE_INFORMATION GetResourceInformation
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine
PUNREGISTER_NOTIFICATION_CALLBACK UnregisterNotificationCallback
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation
PGET_RESOURCE_INFORMATION GetResourceInformation
PFREE_DMA_BUFFER FreeDmaBuffer
PGET_DEVICE_INFORMATION GetDeviceInformation
PINTERFACE_REFERENCE InterfaceReference
PUNREGISTER_NOTIFICATION_EVENT UnregisterNotificationEvent
PFREE_DMA_ENGINE FreeDmaEngine
PGET_WALL_CLOCK_REGISTER GetWallClockRegister
PREGISTER_NOTIFICATION_CALLBACK RegisterNotificationCallback
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback
PTRANSFER_CODEC_VERBS TransferCodecVerbs
PINTERFACE_DEREFERENCE InterfaceDereference
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister
PALLOCATE_DMA_BUFFER AllocateDmaBuffer
PFREE_DMA_BUFFER_WITH_NOTIFICATION FreeDmaBufferWithNotification
PSET_DMA_ENGINE_STATE SetDmaEngineState
PREGISTER_EVENT_CALLBACK RegisterEventCallback
PALLOCATE_DMA_BUFFER_WITH_NOTIFICATION AllocateDmaBufferWithNotification
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine
PREGISTER_NOTIFICATION_EVENT RegisterNotificationEvent
PALLOCATE_RENDER_DMA_ENGINE AllocateRenderDmaEngine
PUNREGISTER_EVENT_CALLBACK UnregisterEventCallback
PSET_DMA_ENGINE_STATE SetDmaEngineState
PTRANSFER_CODEC_VERBS TransferCodecVerbs
PGET_DEVICE_INFORMATION GetDeviceInformation
PREGISTER_EVENT_CALLBACK RegisterEventCallback
PINTERFACE_REFERENCE InterfaceReference
PALLOCATE_CAPTURE_DMA_ENGINE AllocateCaptureDmaEngine
PGET_WALL_CLOCK_REGISTER GetWallClockRegister
PFREE_DMA_ENGINE FreeDmaEngine
PCHANGE_BANDWIDTH_ALLOCATION ChangeBandwidthAllocation
PFREE_DMA_BUFFER FreeDmaBuffer
PGET_RESOURCE_INFORMATION GetResourceInformation
PALLOCATE_DMA_BUFFER AllocateDmaBuffer
PINTERFACE_DEREFERENCE InterfaceDereference
PGET_LINK_POSITION_REGISTER GetLinkPositionRegister
PHDAUDIO_TRANSFER_COMPLETE_CALLBACK Callback
PHDAUDIO_CODEC_TRANSFER CodecTransfer
CODEC_UNSOLICITED_CALLBACK unsolitCallbacks[MAX_UNSOLICIT_CALLBACKS]
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_PARAMETER
#define STATUS_IO_TIMEOUT
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
#define WdfDeviceStopIdle(Device, WaitForD0)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
#define WdfDeviceResumeIdle(Device)
_Must_inspect_result_ _In_ WDFDEVICE Fdo
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(_attributes, _contexttype)
FORCEINLINE VOID NTAPI WdfDeviceInterfaceReferenceNoOp(_In_ PVOID Context)
FORCEINLINE VOID NTAPI WdfDeviceInterfaceDereferenceNoOp(_In_ PVOID Context)
FORCEINLINE VOID WDF_WORKITEM_CONFIG_INIT(_Out_ PWDF_WORKITEM_CONFIG Config, _In_ PFN_WDF_WORKITEM EvtWorkItemFunc)
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
#define MmGetMdlPfnArray(_Mdl)