Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

360 lines
7.6 KiB

  1. //---------------------------------------------------------------------------
  2. //
  3. // Module: util.h
  4. //
  5. // Description:
  6. //
  7. //
  8. //@@BEGIN_MSINTERNAL
  9. // Development Team:
  10. // Mike McLaughlin
  11. //
  12. // History: Date Author Comment
  13. //
  14. //@@END_MSINTERNAL
  15. //---------------------------------------------------------------------------
  16. //
  17. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  18. // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  19. // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  20. // PURPOSE.
  21. //
  22. // Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved.
  23. //
  24. //---------------------------------------------------------------------------
  25. //---------------------------------------------------------------------------
  26. // Constants and Macros
  27. //---------------------------------------------------------------------------
  28. #define INTERNAL_WILDCARD ((PKSIDENTIFIER)-1)
  29. #define STATUS_DEAD_END ((NTSTATUS)-1)
  30. #define POOLTAG_SYSA 0x41535953 // 'SYSA'
  31. //---------------------------------------------------------------------------
  32. // Global Data
  33. //---------------------------------------------------------------------------
  34. extern "C" KMUTEX gMutex;
  35. #ifdef DEBUG
  36. extern ULONG ulDebugFlags;
  37. extern ULONG ulDebugNumber;
  38. #endif
  39. //---------------------------------------------------------------------------
  40. // Data structures
  41. //---------------------------------------------------------------------------
  42. typedef struct dataranges {
  43. KSMULTIPLE_ITEM MultipleItem;
  44. KSDATARANGE aDataRanges[1];
  45. } DATARANGES, *PDATARANGES;
  46. typedef struct identifiers {
  47. KSMULTIPLE_ITEM MultipleItem;
  48. KSIDENTIFIER aIdentifiers[1]; // Array of identifiers
  49. } IDENTIFIERS, *PIDENTIFIERS;
  50. typedef class CQueueWorkListData : public CObj
  51. {
  52. public:
  53. void * __cdecl operator new(size_t size)
  54. {
  55. return(ExAllocatePoolWithTag(NonPagedPool, size, POOLTAG_SYSA));
  56. };
  57. void __cdecl operator delete(void *p)
  58. {
  59. ExFreePool(p);
  60. };
  61. CQueueWorkListData(
  62. NTSTATUS (*Function)(PVOID Reference1, PVOID Reference2),
  63. PVOID Reference1,
  64. PVOID Reference2
  65. );
  66. NTSTATUS
  67. QueueAsyncList(
  68. );
  69. static VOID
  70. AsyncWorker(
  71. IN OUT PVOID pReference
  72. );
  73. private:
  74. LIST_ENTRY leNext;
  75. NTSTATUS (*Function)(PVOID, PVOID);
  76. PVOID Reference1;
  77. PVOID Reference2;
  78. DefineSignature(0x444c5751); // QWLD
  79. } QUEUE_WORK_LIST_DATA, *PQUEUE_WORK_LIST_DATA;
  80. //---------------------------------------------------------------------------
  81. typedef NTSTATUS (*UTIL_PFN)(PVOID, PVOID);
  82. //---------------------------------------------------------------------------
  83. // Inline helper functions
  84. //---------------------------------------------------------------------------
  85. __inline int IsEqualGUID(const GUID *lpguid1, const GUID *lpguid2)
  86. {
  87. return !memcmp(lpguid1, lpguid2, sizeof(GUID));
  88. }
  89. __inline VOID GrabMutex()
  90. {
  91. ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
  92. #ifdef DEBUG
  93. LARGE_INTEGER li = {0, 600000000};
  94. NTSTATUS Status;
  95. while(Status = KeWaitForMutexObject(
  96. &gMutex,
  97. Executive,
  98. KernelMode,
  99. FALSE,
  100. &li) == STATUS_TIMEOUT) {
  101. dprintf("SYSAUDIO: possible deadlock - thread %08x\n",
  102. KeGetCurrentThread());
  103. }
  104. #else
  105. KeWaitForMutexObject(&gMutex, Executive, KernelMode, FALSE, NULL);
  106. #endif
  107. }
  108. __inline VOID ReleaseMutex()
  109. {
  110. ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
  111. KeReleaseMutex(&gMutex, FALSE);
  112. }
  113. //---------------------------------------------------------------------------
  114. // Local prototypes
  115. //---------------------------------------------------------------------------
  116. extern "C" {
  117. NTSTATUS
  118. InitializeUtil(
  119. );
  120. VOID
  121. UninitializeUtil(
  122. );
  123. VOID
  124. UninitializeMemory(
  125. );
  126. NTSTATUS
  127. DispatchInvalidDeviceRequest(
  128. IN PDEVICE_OBJECT pdo,
  129. IN PIRP pIrp
  130. );
  131. BOOLEAN
  132. DispatchFastIoDeviceControlFailure(
  133. IN PFILE_OBJECT FileObject,
  134. IN BOOLEAN Wait,
  135. IN PVOID InputBuffer OPTIONAL,
  136. IN ULONG InputBufferLength,
  137. OUT PVOID OutputBuffer OPTIONAL,
  138. IN ULONG OutputBufferLength,
  139. IN ULONG IoControlCode,
  140. OUT PIO_STATUS_BLOCK IoStatus,
  141. IN PDEVICE_OBJECT DeviceObject
  142. );
  143. BOOLEAN
  144. DispatchFastReadFailure(
  145. IN PFILE_OBJECT FileObject,
  146. IN PLARGE_INTEGER FileOffset,
  147. IN ULONG Length,
  148. IN BOOLEAN Wait,
  149. IN ULONG LockKey,
  150. OUT PVOID Buffer,
  151. OUT PIO_STATUS_BLOCK IoStatus,
  152. IN PDEVICE_OBJECT DeviceObject
  153. );
  154. #define DispatchFastWriteFailure DispatchFastReadFailure
  155. CompareDataRange(
  156. PKSDATARANGE pDataRange1,
  157. PKSDATARANGE pDataRange2
  158. );
  159. BOOL
  160. DataIntersectionRange(
  161. PKSDATARANGE pDataRange1,
  162. PKSDATARANGE pDataRange2,
  163. PKSDATARANGE pDataRangeIntersection
  164. );
  165. BOOL
  166. DataIntersectionAudio(
  167. PKSDATARANGE_AUDIO pDataRangeAudio1,
  168. PKSDATARANGE_AUDIO pDataRangeAudio2,
  169. PKSDATARANGE_AUDIO pDataRangeAudioIntersection
  170. );
  171. BOOL
  172. CompareDataRangeExact(
  173. PKSDATARANGE pDataRange1,
  174. PKSDATARANGE pDataRange2
  175. );
  176. BOOL
  177. CompareDataRangeGuids(
  178. PKSDATARANGE pDataRange1,
  179. PKSDATARANGE pDataRange2
  180. );
  181. BOOL
  182. CompareIdentifier(
  183. PKSIDENTIFIER pIdentifier1,
  184. PKSIDENTIFIER pIdentifier2
  185. );
  186. void
  187. ModifyPinConnect(
  188. PKSPIN_CONNECT pPinConnect,
  189. WORD nChannels
  190. );
  191. NTSTATUS
  192. OpenDevice(
  193. IN PWSTR pwstrDevice,
  194. OUT PHANDLE pHandle
  195. );
  196. NTSTATUS
  197. GetPinProperty(
  198. PFILE_OBJECT pFileObject,
  199. ULONG PropertyId,
  200. ULONG PinId,
  201. ULONG cbProperty,
  202. PVOID pProperty
  203. );
  204. NTSTATUS
  205. PinConnectionProperty(
  206. PFILE_OBJECT pFileObject,
  207. ULONG ulPropertyId,
  208. ULONG ulFlags,
  209. ULONG cbProperty,
  210. PVOID pProperty
  211. );
  212. NTSTATUS
  213. GetPinPropertyEx(
  214. PFILE_OBJECT pFileObject,
  215. ULONG PropertyId,
  216. ULONG PinId,
  217. PVOID *ppProperty
  218. );
  219. NTSTATUS
  220. GetPinProperty2(
  221. PFILE_OBJECT pFileObject,
  222. ULONG ulPropertyId,
  223. ULONG ulPinId,
  224. ULONG cbInput,
  225. PVOID pInputData,
  226. PVOID *ppPropertyOutput
  227. );
  228. NTSTATUS
  229. GetProperty(
  230. PFILE_OBJECT pFileObject,
  231. CONST GUID *pguidPropertySet,
  232. ULONG ulPropertyId,
  233. PVOID *ppPropertyOutput
  234. );
  235. NTSTATUS
  236. QueueWorkList(
  237. IN NTSTATUS (*Function)(PVOID Reference1, PVOID Reference2),
  238. IN PVOID Reference1,
  239. IN PVOID Reference2
  240. );
  241. VOID
  242. GetDefaultOrder(
  243. ULONG fulType,
  244. PULONG pulOrder
  245. );
  246. NTSTATUS
  247. SetKsFrameHolding(
  248. PFILE_OBJECT pFileObject
  249. );
  250. //---------------------------------------------------------------------------
  251. // Validation Routines
  252. PWAVEFORMATEX
  253. GetWaveFormatExFromKsDataFormat(
  254. PKSDATAFORMAT pDataFormat,
  255. PULONG pcbFormat
  256. );
  257. //---------------------------------------------------------------------------
  258. #ifdef DEBUG
  259. VOID
  260. DumpPinConnect(
  261. LONG Level,
  262. PKSPIN_CONNECT pPinConnect
  263. );
  264. VOID
  265. DumpDataFormat(
  266. LONG Level,
  267. PKSDATAFORMAT pDataFormat
  268. );
  269. VOID
  270. DumpWaveFormatEx(
  271. LONG Level,
  272. PSZ pszSpecifier,
  273. WAVEFORMATEX *pWaveFormatEx
  274. );
  275. VOID
  276. DumpDataRange(
  277. LONG Level,
  278. PKSDATARANGE_AUDIO pDataRangeAudio
  279. );
  280. PSZ DbgUnicode2Sz(
  281. PWSTR pwstr
  282. );
  283. PSZ
  284. DbgIdentifier2Sz(
  285. PKSIDENTIFIER pIdentifier
  286. );
  287. PSZ
  288. DbgGuid2Sz(
  289. GUID *pGuid
  290. );
  291. //---------------------------------------------------------------------------
  292. #endif // DEBUG
  293. } // extern "C"
  294. //---------------------------------------------------------------------------
  295. // End of File: util.h
  296. //---------------------------------------------------------------------------