//--------------------------------------------------------------------------- // // Module: util.h // // Description: // // //@@BEGIN_MSINTERNAL // Development Team: // Mike McLaughlin // // History: Date Author Comment // //@@END_MSINTERNAL //--------------------------------------------------------------------------- // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Constants and Macros //--------------------------------------------------------------------------- #define INTERNAL_WILDCARD ((PKSIDENTIFIER)-1) #define STATUS_DEAD_END ((NTSTATUS)-1) #define POOLTAG_SYSA 0x41535953 // 'SYSA' //--------------------------------------------------------------------------- // Global Data //--------------------------------------------------------------------------- extern "C" KMUTEX gMutex; #ifdef DEBUG extern ULONG ulDebugFlags; extern ULONG ulDebugNumber; #endif //--------------------------------------------------------------------------- // Data structures //--------------------------------------------------------------------------- typedef struct dataranges { KSMULTIPLE_ITEM MultipleItem; KSDATARANGE aDataRanges[1]; } DATARANGES, *PDATARANGES; typedef struct identifiers { KSMULTIPLE_ITEM MultipleItem; KSIDENTIFIER aIdentifiers[1]; // Array of identifiers } IDENTIFIERS, *PIDENTIFIERS; typedef class CQueueWorkListData : public CObj { public: void * __cdecl operator new(size_t size) { return(ExAllocatePoolWithTag(NonPagedPool, size, POOLTAG_SYSA)); }; void __cdecl operator delete(void *p) { ExFreePool(p); }; CQueueWorkListData( NTSTATUS (*Function)(PVOID Reference1, PVOID Reference2), PVOID Reference1, PVOID Reference2 ); NTSTATUS QueueAsyncList( ); static VOID AsyncWorker( IN OUT PVOID pReference ); private: LIST_ENTRY leNext; NTSTATUS (*Function)(PVOID, PVOID); PVOID Reference1; PVOID Reference2; DefineSignature(0x444c5751); // QWLD } QUEUE_WORK_LIST_DATA, *PQUEUE_WORK_LIST_DATA; //--------------------------------------------------------------------------- typedef NTSTATUS (*UTIL_PFN)(PVOID, PVOID); //--------------------------------------------------------------------------- // Inline helper functions //--------------------------------------------------------------------------- __inline int IsEqualGUID(const GUID *lpguid1, const GUID *lpguid2) { return !memcmp(lpguid1, lpguid2, sizeof(GUID)); } __inline VOID GrabMutex() { ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); #ifdef DEBUG LARGE_INTEGER li = {0, 600000000}; NTSTATUS Status; while(Status = KeWaitForMutexObject( &gMutex, Executive, KernelMode, FALSE, &li) == STATUS_TIMEOUT) { dprintf("SYSAUDIO: possible deadlock - thread %08x\n", KeGetCurrentThread()); } #else KeWaitForMutexObject(&gMutex, Executive, KernelMode, FALSE, NULL); #endif } __inline VOID ReleaseMutex() { ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); KeReleaseMutex(&gMutex, FALSE); } //--------------------------------------------------------------------------- // Local prototypes //--------------------------------------------------------------------------- extern "C" { NTSTATUS InitializeUtil( ); VOID UninitializeUtil( ); VOID UninitializeMemory( ); NTSTATUS DispatchInvalidDeviceRequest( IN PDEVICE_OBJECT pdo, IN PIRP pIrp ); BOOLEAN DispatchFastIoDeviceControlFailure( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ); BOOLEAN DispatchFastReadFailure( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ); #define DispatchFastWriteFailure DispatchFastReadFailure CompareDataRange( PKSDATARANGE pDataRange1, PKSDATARANGE pDataRange2 ); BOOL DataIntersectionRange( PKSDATARANGE pDataRange1, PKSDATARANGE pDataRange2, PKSDATARANGE pDataRangeIntersection ); BOOL DataIntersectionAudio( PKSDATARANGE_AUDIO pDataRangeAudio1, PKSDATARANGE_AUDIO pDataRangeAudio2, PKSDATARANGE_AUDIO pDataRangeAudioIntersection ); BOOL CompareDataRangeExact( PKSDATARANGE pDataRange1, PKSDATARANGE pDataRange2 ); BOOL CompareDataRangeGuids( PKSDATARANGE pDataRange1, PKSDATARANGE pDataRange2 ); BOOL CompareIdentifier( PKSIDENTIFIER pIdentifier1, PKSIDENTIFIER pIdentifier2 ); void ModifyPinConnect( PKSPIN_CONNECT pPinConnect, WORD nChannels ); NTSTATUS OpenDevice( IN PWSTR pwstrDevice, OUT PHANDLE pHandle ); NTSTATUS GetPinProperty( PFILE_OBJECT pFileObject, ULONG PropertyId, ULONG PinId, ULONG cbProperty, PVOID pProperty ); NTSTATUS PinConnectionProperty( PFILE_OBJECT pFileObject, ULONG ulPropertyId, ULONG ulFlags, ULONG cbProperty, PVOID pProperty ); NTSTATUS GetPinPropertyEx( PFILE_OBJECT pFileObject, ULONG PropertyId, ULONG PinId, PVOID *ppProperty ); NTSTATUS GetPinProperty2( PFILE_OBJECT pFileObject, ULONG ulPropertyId, ULONG ulPinId, ULONG cbInput, PVOID pInputData, PVOID *ppPropertyOutput ); NTSTATUS GetProperty( PFILE_OBJECT pFileObject, CONST GUID *pguidPropertySet, ULONG ulPropertyId, PVOID *ppPropertyOutput ); NTSTATUS QueueWorkList( IN NTSTATUS (*Function)(PVOID Reference1, PVOID Reference2), IN PVOID Reference1, IN PVOID Reference2 ); VOID GetDefaultOrder( ULONG fulType, PULONG pulOrder ); NTSTATUS SetKsFrameHolding( PFILE_OBJECT pFileObject ); //--------------------------------------------------------------------------- // Validation Routines PWAVEFORMATEX GetWaveFormatExFromKsDataFormat( PKSDATAFORMAT pDataFormat, PULONG pcbFormat ); //--------------------------------------------------------------------------- #ifdef DEBUG VOID DumpPinConnect( LONG Level, PKSPIN_CONNECT pPinConnect ); VOID DumpDataFormat( LONG Level, PKSDATAFORMAT pDataFormat ); VOID DumpWaveFormatEx( LONG Level, PSZ pszSpecifier, WAVEFORMATEX *pWaveFormatEx ); VOID DumpDataRange( LONG Level, PKSDATARANGE_AUDIO pDataRangeAudio ); PSZ DbgUnicode2Sz( PWSTR pwstr ); PSZ DbgIdentifier2Sz( PKSIDENTIFIER pIdentifier ); PSZ DbgGuid2Sz( GUID *pGuid ); //--------------------------------------------------------------------------- #endif // DEBUG } // extern "C" //--------------------------------------------------------------------------- // End of File: util.h //---------------------------------------------------------------------------