1 /* 2 ReactOS 3 Kernel Streaming API 4 5 by Andrew Greenwood 6 7 NOTES: 8 This is a basic stubbing of the Kernel Streaming API header. It is 9 very incomplete - a lot of the #defines are not set to any value at all. 10 11 Some of the structs/funcs may be incorrectly grouped. 12 13 GUIDs need to be defined properly. 14 15 AVStream functionality (XP and above, DirectX 8.0 and above) will NOT 16 implemented for a while. 17 18 Some example code for interaction from usermode: 19 DeviceIoControl( 20 FilterHandle, 21 IOCTL_KS_PROPERTY, 22 &Property, 23 sizeof(KSPROPERTY), 24 &SeekingCapabilities, 25 sizeof(KS_SEEKING_CAPABILITIES), 26 &BytesReturned, 27 &Overlapped); 28 */ 29 30 #ifndef _KS_ 31 #define _KS_ 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 #ifdef BUILDING_KS 38 #define KSDDKAPI 39 #else 40 #define KSDDKAPI //DECLSPEC_IMPORT /* TODO */ 41 #endif 42 43 44 #define KSFILTER_NODE ((ULONG)-1) 45 #define KSALL_NODES ((ULONG)-1) 46 47 #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" 48 #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" 49 #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" 50 #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" 51 #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" 52 #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" 53 54 #define KSDATAFORMAT_BIT_ATTRIBUTES 1 55 #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) 56 57 #if defined(_NTDDK_) 58 typedef PVOID PKSWORKER; 59 #endif 60 61 #ifndef SIZEOF_ARRAY 62 #define SIZEOF_ARRAY(a) (sizeof(a)/sizeof((a)[0])) 63 #endif 64 65 /* =============================================================== 66 GUID definition helpers 67 */ 68 69 #ifndef _NTRTL_ 70 71 #ifndef DEFINE_GUIDEX 72 #ifdef _MSC_VER 73 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name 74 #else 75 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name 76 #endif 77 #endif /* !DEFINE_GUIDEX */ 78 79 #ifndef STATICGUIDOF 80 #define STATICGUIDOF(guid) STATIC_##guid 81 #endif 82 83 #endif /* !_NTRTL_ */ 84 85 #if defined(__cplusplus) 86 87 #if _MSC_VER >= 1100 88 #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name 89 #define DEFINE_GUIDNAMED(name) __uuidof(struct name) 90 #else 91 #define DEFINE_GUIDSTRUCT(guid, name) \ 92 extern const DECLSPEC_SELECTANY GUID __uuid__##name={STATIC_##name}; 93 #define DEFINE_GUIDNAMED(name) __uuid__##name 94 #endif 95 96 #else /* __cplusplus */ 97 98 #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name) 99 #define DEFINE_GUIDNAMED(name) name 100 101 #endif /* __cplusplus */ 102 103 #define STATIC_GUID_NULL \ 104 0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 105 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL); 106 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) 107 108 #define STATIC_KSNAME_Filter\ 109 0x9b365890L, 0x165f, 0x11d0, {0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4} 110 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter); 111 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) 112 113 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ 114 0xd833f8f8L, 0x7894, 0x11d1, {0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02} 115 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED); 116 #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) 117 118 #define STATIC_KSDATAFORMAT_SUBTYPE_NONE \ 119 0xe436eb8eL, 0x524f, 0x11ce, {0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70} 120 DEFINE_GUIDSTRUCT("e436eb8e-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_NONE); 121 #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) 122 123 /* =============================================================== 124 I/O Control Codes 125 */ 126 127 #define IOCTL_KS_PROPERTY \ 128 CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS) 129 130 #define IOCTL_KS_ENABLE_EVENT \ 131 CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS) 132 133 #define IOCTL_KS_DISABLE_EVENT \ 134 CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS) 135 136 #define IOCTL_KS_METHOD \ 137 CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS) 138 139 #define IOCTL_KS_WRITE_STREAM \ 140 CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS) 141 142 #define IOCTL_KS_READ_STREAM \ 143 CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS) 144 145 #define IOCTL_KS_RESET_STATE \ 146 CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS) 147 148 /* =============================================================== 149 Categories 150 */ 151 152 #define STATIC_KSCATEGORY_BRIDGE \ 153 0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 154 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE); 155 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) 156 157 #define STATIC_KSCATEGORY_CAPTURE \ 158 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 159 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE); 160 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) 161 162 #define STATIC_KSCATEGORY_RENDER \ 163 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 164 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER); 165 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) 166 167 #define STATIC_KSCATEGORY_MIXER \ 168 0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 169 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER); 170 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) 171 172 #define STATIC_KSCATEGORY_SPLITTER \ 173 0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 174 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER); 175 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) 176 177 #define STATIC_KSCATEGORY_DATACOMPRESSOR \ 178 0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 179 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR); 180 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) 181 182 #define STATIC_KSCATEGORY_DATADECOMPRESSOR \ 183 0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 184 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR); 185 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) 186 187 #define STATIC_KSCATEGORY_DATATRANSFORM \ 188 0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 189 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM); 190 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) 191 192 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ 193 0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 194 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM); 195 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) 196 197 #define STATIC_KSCATEGORY_INTERFACETRANSFORM \ 198 0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 199 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM); 200 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) 201 202 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ 203 0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 204 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM); 205 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) 206 207 #define STATIC_KSCATEGORY_FILESYSTEM \ 208 0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 209 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM); 210 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) 211 212 #define STATIC_KSCATEGORY_CLOCK \ 213 0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 214 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK); 215 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) 216 217 #define STATIC_KSCATEGORY_PROXY \ 218 0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 219 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY); 220 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) 221 222 #define STATIC_KSCATEGORY_QUALITY \ 223 0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 224 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY); 225 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) 226 227 /* =============================================================== 228 Common 229 */ 230 231 typedef struct { 232 GUID Set; 233 ULONG Id; 234 ULONG Flags; 235 } KSIDENTIFIER, *PKSIDENTIFIER; 236 237 typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY; 238 typedef KSIDENTIFIER KSMETHOD, *PKSMETHOD; 239 typedef KSIDENTIFIER KSEVENT, *PKSEVENT; 240 241 typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE; 242 243 typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE; 244 typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM; 245 246 typedef union { 247 struct { 248 ULONG FormatSize; 249 ULONG Flags; 250 ULONG SampleSize; 251 ULONG Reserved; 252 GUID MajorFormat; 253 GUID SubFormat; 254 GUID Specifier; 255 }; 256 LONGLONG Alignment; 257 } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE; 258 259 typedef struct { 260 ULONG Size; 261 ULONG Flags; 262 GUID Attribute; 263 } KSATTRIBUTE, *PKSATTRIBUTE; 264 265 266 /* =============================================================== 267 Interface Sets - TODO 268 */ 269 270 #if 0 271 #define KSINTERFACESETID_Media 272 #define KSINTERFACE_STANDARD_STREAMING 273 #define KSINTERFACE_STANDARD_LOOPED_STREAMING 274 #define KSINTERFACE_STANDARD_CONTROL 275 #endif 276 277 #define STATIC_KSINTERFACESETID_Standard \ 278 0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 279 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard); 280 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) 281 282 typedef enum { 283 KSINTERFACE_STANDARD_STREAMING, 284 KSINTERFACE_STANDARD_LOOPED_STREAMING, 285 KSINTERFACE_STANDARD_CONTROL 286 } KSINTERFACE_STANDARD; 287 288 #define STATIC_KSINTERFACESETID_FileIo \ 289 0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 290 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo); 291 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) 292 293 /* =============================================================== 294 Mediums 295 */ 296 297 typedef enum { 298 KSINTERFACE_FILEIO_STREAMING 299 } KSINTERFACE_FILEIO; 300 301 #define KSMEDIUM_TYPE_ANYINSTANCE 0 302 303 #define STATIC_KSMEDIUMSETID_Standard \ 304 0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 305 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard); 306 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) 307 308 /* =============================================================== 309 Clock Properties/Methods/Events 310 */ 311 312 #define STATIC_KSPROPSETID_Clock \ 313 0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 314 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock); 315 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) 316 317 typedef enum { 318 KSPROPERTY_CLOCK_TIME, 319 KSPROPERTY_CLOCK_PHYSICALTIME, 320 KSPROPERTY_CLOCK_CORRELATEDTIME, 321 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, 322 KSPROPERTY_CLOCK_RESOLUTION, 323 KSPROPERTY_CLOCK_STATE, 324 #if defined(_NTDDK_) 325 KSPROPERTY_CLOCK_FUNCTIONTABLE 326 #endif // defined(_NTDDK_) 327 } KSPROPERTY_CLOCK; 328 329 #define STATIC_KSEVENTSETID_Clock \ 330 0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 331 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock); 332 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) 333 334 typedef enum { 335 KSEVENT_CLOCK_INTERVAL_MARK, 336 KSEVENT_CLOCK_POSITION_MARK 337 } KSEVENT_CLOCK_POSITION; 338 339 /* =============================================================== 340 Connection Properties/Methods/Events 341 */ 342 343 #define STATIC_KSPROPSETID_Connection \ 344 0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 345 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection); 346 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) 347 348 typedef enum { 349 KSPROPERTY_CONNECTION_STATE, 350 KSPROPERTY_CONNECTION_PRIORITY, 351 KSPROPERTY_CONNECTION_DATAFORMAT, 352 KSPROPERTY_CONNECTION_ALLOCATORFRAMING, 353 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, 354 KSPROPERTY_CONNECTION_ACQUIREORDERING, 355 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, 356 KSPROPERTY_CONNECTION_STARTAT 357 } KSPROPERTY_CONNECTION; 358 359 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\ 360 DEFINE_KSPROPERTY_ITEM(\ 361 KSPROPERTY_CONNECTION_STATE,\ 362 (GetHandler),\ 363 sizeof(KSPROPERTY),\ 364 sizeof(KSSTATE),\ 365 (SetHandler),\ 366 NULL, 0, NULL, NULL, 0) 367 368 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\ 369 DEFINE_KSPROPERTY_ITEM(\ 370 KSPROPERTY_CONNECTION_PRIORITY,\ 371 (GetHandler),\ 372 sizeof(KSPROPERTY),\ 373 sizeof(KSPRIORITY),\ 374 (SetHandler),\ 375 NULL, 0, NULL, NULL, 0) 376 377 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\ 378 DEFINE_KSPROPERTY_ITEM(\ 379 KSPROPERTY_CONNECTION_DATAFORMAT,\ 380 (GetHandler),\ 381 sizeof(KSPROPERTY),\ 382 0,\ 383 (SetHandler),\ 384 NULL, 0, NULL, NULL, 0) 385 386 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\ 387 DEFINE_KSPROPERTY_ITEM(\ 388 KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\ 389 (Handler),\ 390 sizeof(KSPROPERTY),\ 391 sizeof(KSALLOCATOR_FRAMING),\ 392 NULL, NULL, 0, NULL, NULL, 0) 393 394 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\ 395 DEFINE_KSPROPERTY_ITEM(\ 396 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ 397 (Handler),\ 398 sizeof(KSPROPERTY),\ 399 0,\ 400 NULL, NULL, 0, NULL, NULL, 0) 401 402 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\ 403 DEFINE_KSPROPERTY_ITEM(\ 404 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ 405 NULL,\ 406 sizeof(KSPROPERTY),\ 407 sizeof(KSDATAFORMAT),\ 408 (Handler),\ 409 NULL, 0, NULL, NULL, 0) 410 411 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\ 412 DEFINE_KSPROPERTY_ITEM(\ 413 KSPROPERTY_CONNECTION_ACQUIREORDERING,\ 414 (Handler),\ 415 sizeof(KSPROPERTY),\ 416 sizeof(int),\ 417 NULL, NULL, 0, NULL, NULL, 0) 418 419 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\ 420 DEFINE_KSPROPERTY_ITEM(\ 421 KSPROPERTY_CONNECTION_STARTAT,\ 422 NULL,\ 423 sizeof(KSPROPERTY),\ 424 sizeof(KSRELATIVEEVENT),\ 425 (Handler),\ 426 NULL, 0, NULL, NULL, 0) 427 428 typedef enum { 429 KSEVENT_CONNECTION_POSITIONUPDATE, 430 KSEVENT_CONNECTION_DATADISCONTINUITY, 431 KSEVENT_CONNECTION_TIMEDISCONTINUITY, 432 KSEVENT_CONNECTION_PRIORITY, 433 KSEVENT_CONNECTION_ENDOFSTREAM 434 } KSEVENT_CONNECTION; 435 436 /* =============================================================== 437 General 438 Properties/Methods/Events 439 */ 440 441 #define STATIC_KSPROPSETID_General\ 442 0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 443 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General); 444 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) 445 446 typedef enum { 447 KSPROPERTY_GENERAL_COMPONENTID 448 } KSPROPERTY_GENERAL; 449 450 /* =============================================================== 451 Graph Manager 452 Properties/Methods/Events 453 */ 454 455 #define KSPROPSETID_GM \ 456 0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D} 457 458 typedef enum { 459 KSPROPERTY_GM_GRAPHMANAGER, 460 KSPROPERTY_GM_TIMESTAMP_CLOCK, 461 KSPROPERTY_GM_RATEMATCH, 462 KSPROPERTY_GM_RENDERCLOCK 463 } KSPROPERTY_GM; 464 465 /* =============================================================== 466 Media Seeking 467 Properties/Methods/Events 468 */ 469 470 #define STATIC_KSPROPSETID_MediaSeeking\ 471 0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 472 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking); 473 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) 474 475 typedef enum { 476 KSPROPERTY_MEDIASEEKING_CAPABILITIES, 477 KSPROPERTY_MEDIASEEKING_FORMATS, 478 KSPROPERTY_MEDIASEEKING_TIMEFORMAT, 479 KSPROPERTY_MEDIASEEKING_POSITION, 480 KSPROPERTY_MEDIASEEKING_STOPPOSITION, 481 KSPROPERTY_MEDIASEEKING_POSITIONS, 482 KSPROPERTY_MEDIASEEKING_DURATION, 483 KSPROPERTY_MEDIASEEKING_AVAILABLE, 484 KSPROPERTY_MEDIASEEKING_PREROLL, 485 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT 486 } KSPROPERTY_MEDIASEEKING; 487 488 typedef enum { 489 KS_SEEKING_NoPositioning, 490 KS_SEEKING_AbsolutePositioning, 491 KS_SEEKING_RelativePositioning, 492 KS_SEEKING_IncrementalPositioning, 493 KS_SEEKING_PositioningBitsMask = 0x3, 494 KS_SEEKING_SeekToKeyFrame, 495 KS_SEEKING_ReturnTime = 0x8 496 } KS_SEEKING_FLAGS; 497 498 typedef enum { 499 KS_SEEKING_CanSeekAbsolute = 0x1, 500 KS_SEEKING_CanSeekForwards = 0x2, 501 KS_SEEKING_CanSeekBackwards = 0x4, 502 KS_SEEKING_CanGetCurrentPos = 0x8, 503 KS_SEEKING_CanGetStopPos = 0x10, 504 KS_SEEKING_CanGetDuration = 0x20, 505 KS_SEEKING_CanPlayBackwards = 0x40 506 } KS_SEEKING_CAPABILITIES; 507 508 typedef struct { 509 LONGLONG Current; 510 LONGLONG Stop; 511 KS_SEEKING_FLAGS CurrentFlags; 512 KS_SEEKING_FLAGS StopFlags; 513 } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; 514 515 typedef struct { 516 LONGLONG Earliest; 517 LONGLONG Latest; 518 } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; 519 520 typedef struct { 521 KSPROPERTY Property; 522 GUID SourceFormat; 523 GUID TargetFormat; 524 LONGLONG Time; 525 } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; 526 527 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\ 528 DEFINE_KSPROPERTY_ITEM(\ 529 KSPROPERTY_MEDIASEEKING_CAPABILITIES,\ 530 (Handler),\ 531 sizeof(KSPROPERTY),\ 532 sizeof(KS_SEEKING_CAPABILITIES),\ 533 NULL, NULL, 0, NULL, NULL, 0) 534 535 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\ 536 DEFINE_KSPROPERTY_ITEM(\ 537 KSPROPERTY_MEDIASEEKING_FORMATS,\ 538 (Handler),\ 539 sizeof(KSPROPERTY),\ 540 0,\ 541 NULL, NULL, 0, NULL, NULL, 0) 542 543 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\ 544 DEFINE_KSPROPERTY_ITEM(\ 545 KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\ 546 (GetHandler),\ 547 sizeof(KSPROPERTY),\ 548 sizeof(GUID),\ 549 (SetHandler),\ 550 NULL, 0, NULL, NULL, 0) 551 552 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\ 553 DEFINE_KSPROPERTY_ITEM(\ 554 KSPROPERTY_MEDIASEEKING_POSITION,\ 555 (Handler),\ 556 sizeof(KSPROPERTY),\ 557 sizeof(LONGLONG),\ 558 NULL, NULL, 0, NULL, NULL, 0) 559 560 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\ 561 DEFINE_KSPROPERTY_ITEM(\ 562 KSPROPERTY_MEDIASEEKING_STOPPOSITION,\ 563 (Handler),\ 564 sizeof(KSPROPERTY),\ 565 sizeof(LONGLONG),\ 566 NULL, NULL, 0, NULL, NULL, 0) 567 568 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\ 569 DEFINE_KSPROPERTY_ITEM(\ 570 KSPROPERTY_MEDIASEEKING_POSITIONS,\ 571 NULL,\ 572 sizeof(KSPROPERTY),\ 573 sizeof(KSPROPERTY_POSITIONS),\ 574 (Handler),\ 575 NULL, 0, NULL, NULL, 0) 576 577 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\ 578 DEFINE_KSPROPERTY_ITEM(\ 579 KSPROPERTY_MEDIASEEKING_DURATION,\ 580 (Handler),\ 581 sizeof(KSPROPERTY),\ 582 sizeof(LONGLONG),\ 583 NULL, NULL, 0, NULL, NULL, 0) 584 585 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\ 586 DEFINE_KSPROPERTY_ITEM(\ 587 KSPROPERTY_MEDIASEEKING_AVAILABLE,\ 588 (Handler),\ 589 sizeof(KSPROPERTY),\ 590 sizeof(KSPROPERTY_MEDIAAVAILABLE),\ 591 NULL, NULL, 0, NULL, NULL, 0) 592 593 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\ 594 DEFINE_KSPROPERTY_ITEM(\ 595 KSPROPERTY_MEDIASEEKING_PREROLL,\ 596 (Handler),\ 597 sizeof(KSPROPERTY),\ 598 sizeof(LONGLONG),\ 599 NULL, NULL, 0, NULL, NULL, 0) 600 601 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\ 602 DEFINE_KSPROPERTY_ITEM(\ 603 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\ 604 (Handler),\ 605 sizeof(KSP_TIMEFORMAT),\ 606 sizeof(LONGLONG),\ 607 NULL, NULL, 0, NULL, NULL, 0) 608 609 /* =============================================================== 610 Pin 611 Properties/Methods/Events 612 */ 613 614 #define STATIC_KSPROPSETID_Pin\ 615 0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00} 616 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin); 617 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) 618 619 #define STATIC_KSNAME_Pin\ 620 0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 621 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin); 622 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) 623 624 typedef enum { 625 KSPROPERTY_PIN_CINSTANCES, 626 KSPROPERTY_PIN_CTYPES, 627 KSPROPERTY_PIN_DATAFLOW, 628 KSPROPERTY_PIN_DATARANGES, 629 KSPROPERTY_PIN_DATAINTERSECTION, 630 KSPROPERTY_PIN_INTERFACES, 631 KSPROPERTY_PIN_MEDIUMS, 632 KSPROPERTY_PIN_COMMUNICATION, 633 KSPROPERTY_PIN_GLOBALCINSTANCES, 634 KSPROPERTY_PIN_NECESSARYINSTANCES, 635 KSPROPERTY_PIN_PHYSICALCONNECTION, 636 KSPROPERTY_PIN_CATEGORY, 637 KSPROPERTY_PIN_NAME, 638 KSPROPERTY_PIN_CONSTRAINEDDATARANGES, 639 KSPROPERTY_PIN_PROPOSEDATAFORMAT 640 } KSPROPERTY_PIN; 641 642 typedef struct { 643 KSPROPERTY Property; 644 ULONG PinId; 645 ULONG Reserved; 646 } KSP_PIN, *PKSP_PIN; 647 648 #define KSINSTANCE_INDETERMINATE ((ULONG)-1) 649 650 typedef struct { 651 ULONG PossibleCount; 652 ULONG CurrentCount; 653 } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES; 654 655 typedef struct { 656 ULONG Size; 657 ULONG Pin; 658 WCHAR SymbolicLinkName[1]; 659 } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION; 660 661 /* =============================================================== 662 Quality 663 Properties/Methods/Events 664 */ 665 666 #define KSPROPSETID_Quality \ 667 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 668 669 typedef enum { 670 KSPROPERTY_QUALITY_REPORT, 671 KSPROPERTY_QUALITY_ERROR 672 } KSPROPERTY_QUALITY; 673 674 /* =============================================================== 675 Stream 676 Properties/Methods/Events 677 */ 678 679 #define STATIC_KSPROPSETID_Stream\ 680 0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4} 681 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream); 682 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) 683 684 typedef enum { 685 KSPROPERTY_STREAM_ALLOCATOR, 686 KSPROPERTY_STREAM_QUALITY, 687 KSPROPERTY_STREAM_DEGRADATION, 688 KSPROPERTY_STREAM_MASTERCLOCK, 689 KSPROPERTY_STREAM_TIMEFORMAT, 690 KSPROPERTY_STREAM_PRESENTATIONTIME, 691 KSPROPERTY_STREAM_PRESENTATIONEXTENT, 692 KSPROPERTY_STREAM_FRAMETIME, 693 KSPROPERTY_STREAM_RATECAPABILITY, 694 KSPROPERTY_STREAM_RATE, 695 KSPROPERTY_STREAM_PIPE_ID 696 } KSPROPERTY_STREAM; 697 698 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\ 699 DEFINE_KSPROPERTY_ITEM(\ 700 KSPROPERTY_STREAM_ALLOCATOR,\ 701 (GetHandler),\ 702 sizeof(KSPROPERTY),\ 703 sizeof(HANDLE),\ 704 (SetHandler),\ 705 NULL, 0, NULL, NULL, 0) 706 707 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\ 708 DEFINE_KSPROPERTY_ITEM(\ 709 KSPROPERTY_STREAM_QUALITY,\ 710 (Handler),\ 711 sizeof(KSPROPERTY),\ 712 sizeof(KSQUALITY_MANAGER),\ 713 NULL, NULL, 0, NULL, NULL, 0) 714 715 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\ 716 DEFINE_KSPROPERTY_ITEM(\ 717 KSPROPERTY_STREAM_DEGRADATION,\ 718 (GetHandler),\ 719 sizeof(KSPROPERTY),\ 720 0,\ 721 (SetHandler),\ 722 NULL, 0, NULL, NULL, 0) 723 724 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\ 725 DEFINE_KSPROPERTY_ITEM(\ 726 KSPROPERTY_STREAM_MASTERCLOCK,\ 727 (GetHandler),\ 728 sizeof(KSPROPERTY),\ 729 sizeof(HANDLE),\ 730 (SetHandler),\ 731 NULL, 0, NULL, NULL, 0) 732 733 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\ 734 DEFINE_KSPROPERTY_ITEM(\ 735 KSPROPERTY_STREAM_TIMEFORMAT,\ 736 (Handler),\ 737 sizeof(KSPROPERTY),\ 738 sizeof(GUID),\ 739 NULL, NULL, 0, NULL, NULL, 0) 740 741 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\ 742 DEFINE_KSPROPERTY_ITEM(\ 743 KSPROPERTY_STREAM_PRESENTATIONTIME,\ 744 (GetHandler),\ 745 sizeof(KSPROPERTY),\ 746 sizeof(KSTIME),\ 747 (SetHandler),\ 748 NULL, 0, NULL, NULL, 0) 749 750 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\ 751 DEFINE_KSPROPERTY_ITEM(\ 752 KSPROPERTY_STREAM_PRESENTATIONEXTENT,\ 753 (Handler),\ 754 sizeof(KSPROPERTY),\ 755 sizeof(LONGLONG),\ 756 NULL, NULL, 0, NULL, NULL, 0) 757 758 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\ 759 DEFINE_KSPROPERTY_ITEM(\ 760 KSPROPERTY_STREAM_FRAMETIME,\ 761 (Handler),\ 762 sizeof(KSPROPERTY),\ 763 sizeof(KSFRAMETIME),\ 764 NULL, NULL, 0, NULL, NULL, 0) 765 766 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\ 767 DEFINE_KSPROPERTY_ITEM(\ 768 KSPROPERTY_STREAM_RATECAPABILITY,\ 769 (Handler),\ 770 sizeof(KSRATE_CAPABILITY),\ 771 sizeof(KSRATE),\ 772 NULL, NULL, 0, NULL, NULL, 0) 773 774 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\ 775 DEFINE_KSPROPERTY_ITEM(\ 776 KSPROPERTY_STREAM_RATE,\ 777 (GetHandler),\ 778 sizeof(KSPROPERTY),\ 779 sizeof(KSRATE),\ 780 (SetHandler),\ 781 NULL, 0, NULL, NULL, 0) 782 783 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\ 784 DEFINE_KSPROPERTY_ITEM(\ 785 KSPROPERTY_STREAM_PIPE_ID,\ 786 (GetHandler),\ 787 sizeof(KSPROPERTY),\ 788 sizeof(HANDLE),\ 789 (SetHandler),\ 790 NULL, 0, NULL, NULL, 0) 791 792 /* =============================================================== 793 StreamAllocator 794 Properties/Methods/Events 795 */ 796 797 #define STATIC_KSPROPSETID_StreamAllocator\ 798 0xcf6e4342L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4} 799 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator); 800 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) 801 802 typedef enum { 803 KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, 804 KSPROPERTY_STREAMALLOCATOR_STATUS 805 } KSPROPERTY_STREAMALLOCATOR; 806 807 #define KSMETHODSETID_StreamAllocator \ 808 0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4} 809 810 typedef enum { 811 KSMETHOD_STREAMALLOCATOR_ALLOC, 812 KSMETHOD_STREAMALLOCATOR_FREE 813 } KSMETHOD_STREAMALLOCATOR; 814 815 #define KSEVENTSETID_StreamAllocator 816 817 typedef enum { 818 KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, 819 KSEVENT_STREAMALLOCATOR_FREEFRAME 820 } KSEVENT_STREAMALLOCATOR; 821 822 /* =============================================================== 823 StreamInterface 824 Properties/Methods/Events 825 */ 826 827 #define KSPROPSETID_StreamInterface \ 828 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a 829 830 typedef enum { 831 KSPROPERTY_STREAMINTERFACE_HEADERSIZE 832 } KSPROPERTY_STREAMINTERFACE; 833 834 /* =============================================================== 835 Topology 836 Properties/Methods/Events 837 */ 838 839 #define STATIC_KSPROPSETID_Topology\ 840 0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 841 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology); 842 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) 843 844 typedef enum { 845 KSPROPERTY_TOPOLOGY_CATEGORIES, 846 KSPROPERTY_TOPOLOGY_NODES, 847 KSPROPERTY_TOPOLOGY_CONNECTIONS, 848 KSPROPERTY_TOPOLOGY_NAME 849 } KSPROPERTY_TOPOLOGY; 850 851 /* =============================================================== 852 Property Sets for audio drivers - TODO 853 */ 854 855 #define STATIC_KSPROPTYPESETID_General \ 856 0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00} 857 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General); 858 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) 859 860 /* 861 KSPROPERTY_AC3_ALTERNATE_AUDIO 862 KSPROPERTY_AC3_BIT_STREAM_MODE 863 KSPROPERTY_AC3_DIALOGUE_LEVEL 864 KSPROPERTY_AC3_DOWNMIX 865 KSPROPERTY_AC3_ERROR_CONCEALMENT 866 KSPROPERTY_AC3_LANGUAGE_CODE 867 KSPROPERTY_AC3_ROOM_TYPE 868 */ 869 870 #define KSPROPSETID_Acoustic_Echo_Cancel 871 /* 872 KSPROPERTY_AEC_MODE 873 KSPROPERTY_AEC_NOISE_FILL_ENABLE 874 KSPROPERTY_AEC_STATUS 875 */ 876 877 /* 878 KSPROPERTY_AUDIO_3D_INTERFACE 879 KSPROPERTY_AUDIO_AGC 880 KSPROPERTY_AUDIO_ALGORITHM_INSTANCE 881 KSPROPERTY_AUDIO_BASS 882 KSPROPERTY_AUDIO_BASS_BOOST 883 KSPROPERTY_AUDIO_CHANNEL_CONFIG 884 KSPROPERTY_AUDIO_CHORUS_LEVEL 885 KSPROPERTY_AUDIO_COPY_PROTECTION 886 KSPROPERTY_AUDIO_CPU_RESOURCES 887 KSPROPERTY_AUDIO_DELAY 888 KSPROPERTY_AUDIO_DEMUX_DEST 889 KSPROPERTY_AUDIO_DEV_SPECIFIC 890 KSPROPERTY_AUDIO_DYNAMIC_RANGE 891 KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE 892 KSPROPERTY_AUDIO_EQ_BANDS 893 KSPROPERTY_AUDIO_EQ_LEVEL 894 KSPROPERTY_AUDIO_FILTER_STATE 895 KSPROPERTY_AUDIO_LATENCY 896 KSPROPERTY_AUDIO_LOUDNESS 897 KSPROPERTY_AUDIO_MANUFACTURE_GUID 898 KSPROPERTY_AUDIO_MID 899 KSPROPERTY_AUDIO_MIX_LEVEL_CAPS 900 KSPROPERTY_AUDIO_MIX_LEVEL_TABLE 901 KSPROPERTY_AUDIO_MUTE 902 KSPROPERTY_AUDIO_MUX_SOURCE 903 KSPROPERTY_AUDIO_NUM_EQ_BANDS 904 KSPROPERTY_AUDIO_PEAKMETER 905 KSPROPERTY_AUDIO_POSITION 906 KSPROPERTY_AUDIO_PREFERRED_STATUS 907 KSPROPERTY_AUDIO_PRODUCT_GUID 908 KSPROPERTY_AUDIO_QUALITY 909 KSPROPERTY_AUDIO_REVERB_LEVEL 910 KSPROPERTY_AUDIO_SAMPLING_RATE 911 KSPROPERTY_AUDIO_STEREO_ENHANCE 912 KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY 913 KSPROPERTY_AUDIO_SURROUND_ENCODE 914 KSPROPERTY_AUDIO_TREBLE 915 KSPROPERTY_AUDIO_VOLUMELEVEL 916 KSPROPERTY_AUDIO_WIDE_MODE 917 KSPROPERTY_AUDIO_WIDENESS 918 */ 919 920 #define KSPROPSETID_AudioGfx 921 /* 922 KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID 923 KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID 924 */ 925 926 #define KSPROPSETID_DirectSound3DBuffer 927 /* 928 KSPROPERTY_DIRECTSOUND3DBUFFER_ALL 929 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES 930 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION 931 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME 932 KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE 933 KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE 934 KSPROPERTY_DIRECTSOUND3DBUFFER_MODE 935 KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION 936 KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY 937 */ 938 939 #define KSPROPSETID_DirectSound3DListener 940 /* 941 KSPROPERTY_DIRECTSOUND3DLISTENER_ALL 942 KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION 943 KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH 944 KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR 945 KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR 946 KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION 947 KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION 948 KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR 949 KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY 950 */ 951 952 #define KSPROPSETID_Hrtf3d 953 /* 954 KSPROPERTY_HRTF3D_FILTER_FORMAT 955 KSPROPERTY_HRTF3D_INITIALIZE 956 KSPROPERTY_HRTF3D_PARAMS 957 */ 958 959 #define KSPROPSETID_Itd3d 960 /* 961 KSPROPERTY_ITD3D_PARAMS 962 */ 963 964 #define KSPROPSETID_TopologyNode 965 /* 966 KSPROPERTY_TOPOLOGYNODE_ENABLE 967 KSPROPERTY_TOPOLOGYNODE_RESET 968 */ 969 970 971 /* =============================================================== 972 Node Types 973 */ 974 /* 975 KSNODETYPE_3D_EFFECTS 976 KSNODETYPE_ACOUSTIC_ECHO_CANCEL 977 KSNODETYPE_ADC 978 KSNODETYPE_AGC 979 KSNODETYPE_CHORUS 980 KSNODETYPE_DAC 981 KSNODETYPE_DELAY 982 KSNODETYPE_DEMUX 983 KSNODETYPE_DEV_SPECIFIC 984 KSNODETYPE_DMSYNTH 985 KSNODETYPE_DMSYNTH_CAPS 986 KSNODETYPE_DRM_DESCRAMBLE 987 KSNODETYPE_EQUALIZER 988 KSNODETYPE_LOUDNESS 989 KSNODETYPE_MUTE 990 KSNODETYPE_MUX 991 KSNODETYPE_PEAKMETER 992 KSNODETYPE_PROLOGIC_DECODER 993 KSNODETYPE_PROLOGIC_ENCODER 994 KSNODETYPE_REVERB 995 KSNODETYPE_SRC 996 KSNODETYPE_STEREO_ENHANCE 997 KSNODETYPE_STEREO_WIDE 998 KSNODETYPE_SUM 999 KSNODETYPE_SUPERMIX 1000 KSNODETYPE_SWMIDI 1001 KSNODETYPE_SWSYNTH 1002 KSNODETYPE_SYNTHESIZER 1003 KSNODETYPE_TONE 1004 KSNODETYPE_VOLUME 1005 */ 1006 1007 typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER, KSOBJECT_BAG; 1008 1009 /* =============================================================== 1010 Method Types 1011 */ 1012 1013 #define KSMETHOD_TYPE_NONE 0x00000000 1014 #define KSMETHOD_TYPE_READ 0x00000001 1015 #define KSMETHOD_TYPE_WRITE 0x00000002 1016 #define KSMETHOD_TYPE_MODIFY 0x00000003 1017 #define KSMETHOD_TYPE_SOURCE 0x00000004 1018 #define KSMETHOD_TYPE_SEND 0x00000001 1019 #define KSMETHOD_TYPE_SETSUPPORT 0x00000100 1020 #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 1021 1022 /* =============================================================== 1023 Property Types 1024 */ 1025 1026 #define KSPROPERTY_TYPE_GET 0x00000001 1027 #define KSPROPERTY_TYPE_SET 0x00000002 1028 #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 1029 #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 1030 #define KSPROPERTY_TYPE_RELATIONS 0x00000400 1031 #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 1032 #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 1033 #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 1034 #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 1035 #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 1036 #define KSPROPERTY_TYPE_DEFAULT_VALUES 0x00010000 1037 1038 /* =============================================================== 1039 Topology Methods/Properties 1040 */ 1041 1042 #define KSMETHOD_TYPE_TOPOLOGY 0x10000000 1043 #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 1044 1045 /* 1046 #define DEFINE_KS_GUID(GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK) \ 1047 DEFINE_GUID(??, 0x#GA#L, 0xGB, 0xGC, 0xGD, 0xGE, 0xGF, 0xGG, 0xGH, 0xGI, 0xGJ, 0xGK) \ 1048 "GA-GB-GC-GDGE-GFGGGHGIGJGK" 1049 */ 1050 1051 /* =============================================================== 1052 KS Category GUIDs 1053 1054 BRIDGE - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1055 CAPTURE - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1056 RENDER - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1057 MIXER - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1058 SPLITTER - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1059 DATACOMPRESSOR - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1060 DATADECOMPRESSOR - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1061 DATATRANSFORM - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1062 COMMUNICATIONSTRANSFORM - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1063 INTERFACETRANSFORM - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1064 MEDIUMTRANSFORM - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1065 FILESYSTEM - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1066 CLOCK - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1067 PROXY - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1068 QUALITY - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1069 */ 1070 1071 /* =============================================================== 1072 KSNAME GUIDs (defined also as KSSTRING_Xxx L"{...}" 1073 1074 Filter - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 1075 Pin - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1076 Clock - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1077 Allocator - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1078 TopologyNode - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1079 */ 1080 1081 /* =============================================================== 1082 Interface GUIDs 1083 1084 Standard - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1085 FileIo - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1086 */ 1087 1088 /* =============================================================== 1089 Medium Type GUIDs 1090 1091 Standard - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1092 */ 1093 1094 /* =============================================================== 1095 Property Set GUIDs 1096 1097 General - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1098 StreamIo - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1099 MediaSeeking - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 1100 Topology - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1101 GM - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D 1102 Quality - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1103 Connection - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1104 */ 1105 1106 /* =============================================================== 1107 StreamAllocator Sets 1108 1109 Event set - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 1110 Method set - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 1111 Property set - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 1112 */ 1113 1114 /* =============================================================== 1115 StreamInterface Sets 1116 1117 Property set - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a 1118 */ 1119 1120 /* =============================================================== 1121 Clock Sets 1122 1123 Property set - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1124 Event sets - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 1125 */ 1126 1127 /* =============================================================== 1128 Connection Sets 1129 1130 Event set - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 1131 */ 1132 1133 /* =============================================================== 1134 Time Format GUIDs 1135 1136 KSTIME_FORMAT_NONE (null guid) 1137 FRAME - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 1138 BYTE - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 1139 SAMPLE - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 1140 FIELD - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 1141 MEDIA_TIME - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 1142 */ 1143 1144 /* =============================================================== 1145 Media Type GUIDs 1146 1147 NULL 1148 Stream - 1149 None - 1150 1151 TODO ... 1152 */ 1153 1154 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\ 1155 0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} 1156 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE); 1157 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) 1158 1159 /* =============================================================== 1160 KSMEMORY_TYPE_xxx 1161 1162 WILDCARD, DONT_CARE = NULL 1163 SYSTEM - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 1164 USER - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 1165 KERNEL_PAGED - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 1166 KERNEL_NONPAGED - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 1167 DEVICE_UNKNOWN - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 1168 */ 1169 1170 /* =============================================================== 1171 Enums 1172 (values have been checked) 1173 */ 1174 1175 #ifndef _MSC_VER 1176 1177 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\ 1178 MinProperty,\ 1179 MinData,\ 1180 SetHandler,\ 1181 Values, RelationsCount, Relations, SupportHandler,\ 1182 SerializedSize)\ 1183 {\ 1184 PropertyId, {(PFNKSHANDLER)GetHandler}, MinProperty, MinData,\ 1185 {(PFNKSHANDLER)SetHandler},\ 1186 (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\ 1187 (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\ 1188 } 1189 1190 #else 1191 1192 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\ 1193 MinProperty,\ 1194 MinData,\ 1195 SetHandler,\ 1196 Values, RelationsCount, Relations, SupportHandler,\ 1197 SerializedSize)\ 1198 {\ 1199 PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\ 1200 (PFNKSHANDLER)SetHandler,\ 1201 (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\ 1202 (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\ 1203 } 1204 1205 #endif 1206 1207 typedef enum { 1208 KsObjectTypeDevice, 1209 KsObjectTypeFilterFactory, 1210 KsObjectTypeFilter, 1211 KsObjectTypePin 1212 } KSOBJECTTYPE; 1213 1214 typedef enum { 1215 KSSTATE_STOP, 1216 KSSTATE_ACQUIRE, 1217 KSSTATE_PAUSE, 1218 KSSTATE_RUN 1219 } KSSTATE, *PKSSTATE; 1220 1221 typedef enum { 1222 KSTARGET_STATE_DISABLED, 1223 KSTARGET_STATE_ENABLED 1224 } KSTARGET_STATE; 1225 1226 typedef enum { 1227 KSRESET_BEGIN, 1228 KSRESET_END 1229 } KSRESET; 1230 1231 typedef enum { 1232 KSEVENTS_NONE, 1233 KSEVENTS_SPINLOCK, 1234 KSEVENTS_MUTEX, 1235 KSEVENTS_FMUTEX, 1236 KSEVENTS_FMUTEXUNSAFE, 1237 KSEVENTS_INTERRUPT, 1238 KSEVENTS_ERESOURCE 1239 } KSEVENTS_LOCKTYPE; 1240 1241 typedef enum { 1242 KSDEGRADE_STANDARD_SIMPLE, 1243 KSDEGRADE_STANDARD_QUALITY, 1244 KSDEGRADE_STANDARD_COMPUTATION, 1245 KSDEGRADE_STANDARD_SKIP 1246 } KSDEGRADE_STANDARD; 1247 1248 typedef enum { 1249 KSPIN_DATAFLOW_IN = 1, 1250 KSPIN_DATAFLOW_OUT 1251 } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW; 1252 1253 typedef enum { 1254 KSPIN_COMMUNICATION_NONE, 1255 KSPIN_COMMUNICATION_SINK, 1256 KSPIN_COMMUNICATION_SOURCE, 1257 KSPIN_COMMUNICATION_BOTH, 1258 KSPIN_COMMUNICATION_BRIDGE 1259 } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION; 1260 1261 typedef enum { 1262 KsListEntryTail, 1263 KsListEntryHead 1264 } KSLIST_ENTRY_LOCATION; 1265 1266 typedef enum { 1267 KsStackCopyToNewLocation, 1268 KsStackReuseCurrentLocation, 1269 KsStackUseNewLocation 1270 } KSSTACK_USE; 1271 1272 typedef enum { 1273 KsAcquireOnly, 1274 KsAcquireAndRemove, 1275 KsAcquireOnlySingleItem, 1276 KsAcquireAndRemoveOnlySingleItem 1277 } KSIRP_REMOVAL_OPERATION; 1278 1279 typedef enum { 1280 KsInvokeOnSuccess = 1, 1281 KsInvokeOnError = 2, 1282 KsInvokeOnCancel = 4 1283 } KSCOMPLETION_INVOCATION; 1284 1285 #if defined(_NTDDK_) && !defined(__wtypes_h__) 1286 enum VARENUM { 1287 VT_EMPTY = 0, 1288 VT_NULL = 1, 1289 VT_I2 = 2, 1290 VT_I4 = 3, 1291 VT_R4 = 4, 1292 VT_R8 = 5, 1293 VT_CY = 6, 1294 VT_DATE = 7, 1295 VT_BSTR = 8, 1296 VT_DISPATCH = 9, 1297 VT_ERROR = 10, 1298 VT_BOOL = 11, 1299 VT_VARIANT = 12, 1300 VT_UNKNOWN = 13, 1301 VT_DECIMAL = 14, 1302 VT_I1 = 16, 1303 VT_UI1 = 17, 1304 VT_UI2 = 18, 1305 VT_UI4 = 19, 1306 VT_I8 = 20, 1307 VT_UI8 = 21, 1308 VT_INT = 22, 1309 VT_UINT = 23, 1310 VT_VOID = 24, 1311 VT_HRESULT = 25, 1312 VT_PTR = 26, 1313 VT_SAFEARRAY = 27, 1314 VT_CARRAY = 28, 1315 VT_USERDEFINED = 29, 1316 VT_LPSTR = 30, 1317 VT_LPWSTR = 31, 1318 VT_FILETIME = 64, 1319 VT_BLOB = 65, 1320 VT_STREAM = 66, 1321 VT_STORAGE = 67, 1322 VT_STREAMED_OBJECT = 68, 1323 VT_STORED_OBJECT = 69, 1324 VT_BLOB_OBJECT = 70, 1325 VT_CF = 71, 1326 VT_CLSID = 72, 1327 VT_VECTOR = 0x1000, 1328 VT_ARRAY = 0x2000, 1329 VT_BYREF = 0x4000, 1330 VT_RESERVED = 0x8000, 1331 VT_ILLEGAL = 0xffff, 1332 VT_ILLEGALMASKED = 0xfff, 1333 VT_TYPEMASK = 0xfff 1334 }; 1335 #endif 1336 1337 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL 1338 #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL 1339 1340 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL 1341 #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL 1342 1343 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL 1344 #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL 1345 1346 /* =============================================================== 1347 Framing 1348 */ 1349 1350 typedef struct { 1351 ULONG MinFrameSize; 1352 ULONG MaxFrameSize; 1353 ULONG Stepping; 1354 } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE; 1355 1356 typedef struct { 1357 KS_FRAMING_RANGE Range; 1358 ULONG InPlaceWeight; 1359 ULONG NotInPlaceWeight; 1360 } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED; 1361 1362 typedef struct { 1363 GUID MemoryType; 1364 GUID BusType; 1365 ULONG MemoryFlags; 1366 ULONG BusFlags; 1367 ULONG Flags; 1368 ULONG Frames; 1369 ULONG FileAlignment; 1370 ULONG MemoryTypeWeight; 1371 KS_FRAMING_RANGE PhysicalRange; 1372 KS_FRAMING_RANGE_WEIGHTED FramingRange; 1373 } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM; 1374 1375 typedef struct { 1376 ULONG RatioNumerator; 1377 ULONG RatioDenominator; 1378 ULONG RatioConstantMargin; 1379 } KS_COMPRESSION, *PKS_COMPRESSION; 1380 1381 /* =============================================================== 1382 Priorities 1383 */ 1384 1385 #define KSPRIORITY_LOW 0x00000001 1386 #define KSPRIORITY_NORMAL 0x40000000 1387 #define KSPRIORITY_HIGH 0x80000000 1388 #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF 1389 1390 typedef struct { 1391 ULONG PriorityClass; 1392 ULONG PrioritySubClass; 1393 } KSPRIORITY, *PKSPRIORITY; 1394 1395 /* =============================================================== 1396 Dispatch Table 1397 http://www.osronline.com/DDKx/stream/ks-struct_494j.htm 1398 */ 1399 1400 #if defined(_NTDDK_) 1401 1402 typedef struct { 1403 PDRIVER_DISPATCH DeviceIoControl; 1404 PDRIVER_DISPATCH Read; 1405 PDRIVER_DISPATCH Write; 1406 PDRIVER_DISPATCH Flush; 1407 PDRIVER_DISPATCH Close; 1408 PDRIVER_DISPATCH QuerySecurity; 1409 PDRIVER_DISPATCH SetSecurity; 1410 PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; 1411 PFAST_IO_READ FastRead; 1412 PFAST_IO_WRITE FastWrite; 1413 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; 1414 1415 #define KSCREATE_ITEM_IRP_STORAGE(Irp) (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0]) 1416 #define KSEVENT_SET_IRP_STORAGE(Irp) (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) 1417 #define KSEVENT_ITEM_IRP_STORAGE(Irp) (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) 1418 #define KSEVENT_ENTRY_IRP_STORAGE(Irp) (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0]) 1419 #define KSMETHOD_SET_IRP_STORAGE(Irp) (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) 1420 #define KSMETHOD_ITEM_IRP_STORAGE(Irp) (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) 1421 #define KSMETHOD_TYPE_IRP_STORAGE(Irp) (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2])) 1422 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1]) 1423 #define KSPROPERTY_SET_IRP_STORAGE(Irp) (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0]) 1424 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3]) 1425 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2]) 1426 1427 _IRQL_requires_max_(PASSIVE_LEVEL) 1428 typedef VOID 1429 (NTAPI *PFNREFERENCEDEVICEOBJECT)( 1430 _In_ PVOID Context); 1431 1432 _IRQL_requires_max_(PASSIVE_LEVEL) 1433 typedef VOID 1434 (NTAPI *PFNDEREFERENCEDEVICEOBJECT)( 1435 _In_ PVOID Context); 1436 1437 _IRQL_requires_max_(PASSIVE_LEVEL) 1438 typedef NTSTATUS 1439 (NTAPI *PFNQUERYREFERENCESTRING)( 1440 _In_ PVOID Context, 1441 _Inout_ PWCHAR *String); 1442 1443 typedef struct { 1444 INTERFACE Interface; 1445 PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; 1446 PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; 1447 PFNQUERYREFERENCESTRING QueryReferenceString; 1448 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; 1449 1450 typedef struct { 1451 KDPC Dpc; 1452 ULONG ReferenceCount; 1453 KSPIN_LOCK AccessLock; 1454 } KSDPC_ITEM, *PKSDPC_ITEM; 1455 1456 typedef struct { 1457 KSDPC_ITEM DpcItem; 1458 LIST_ENTRY BufferList; 1459 } KSBUFFER_ITEM, *PKSBUFFER_ITEM; 1460 1461 #endif /* _NTDDK_ */ 1462 1463 typedef struct { 1464 GUID Manufacturer; 1465 GUID Product; 1466 GUID Component; 1467 GUID Name; 1468 ULONG Version; 1469 ULONG Revision; 1470 } KSCOMPONENTID, *PKSCOMPONENTID; 1471 1472 #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\ 1473 DEFINE_KSPROPERTY_ITEM(\ 1474 KSPROPERTY_GENERAL_COMPONENTID,\ 1475 (Handler),\ 1476 sizeof(KSPROPERTY),\ 1477 sizeof(KSCOMPONENTID),\ 1478 NULL, NULL, 0, NULL, NULL, 0) 1479 1480 /* =============================================================== 1481 Properties 1482 */ 1483 1484 typedef struct { 1485 GUID PropertySet; 1486 ULONG Count; 1487 } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR; 1488 1489 typedef struct { 1490 KSIDENTIFIER PropTypeSet; 1491 ULONG Id; 1492 ULONG PropertyLength; 1493 } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL; 1494 1495 typedef union { 1496 struct { 1497 LONG SignedMinimum; 1498 LONG SignedMaximum; 1499 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) 1500 } _SIGNED; 1501 #else 1502 }; 1503 #endif 1504 struct { 1505 ULONG UnsignedMinimum; 1506 ULONG UnsignedMaximum; 1507 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) 1508 } _UNSIGNED; 1509 #else 1510 }; 1511 #endif 1512 } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG; 1513 1514 typedef union { 1515 struct { 1516 LONGLONG SignedMinimum; 1517 LONGLONG SignedMaximum; 1518 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) 1519 } _SIGNED64; 1520 #else 1521 }; 1522 #endif 1523 struct { 1524 #if defined(_NTDDK_) 1525 ULONGLONG UnsignedMinimum; 1526 ULONGLONG UnsignedMaximum; 1527 #else 1528 DWORDLONG UnsignedMinimum; 1529 DWORDLONG UnsignedMaximum; 1530 #endif 1531 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ ) 1532 } _UNSIGNED64; 1533 #else 1534 }; 1535 #endif 1536 } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG; 1537 1538 typedef struct { 1539 ULONG AccessFlags; 1540 ULONG DescriptionSize; 1541 KSIDENTIFIER PropTypeSet; 1542 ULONG MembersListCount; 1543 ULONG Reserved; 1544 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION; 1545 1546 typedef struct { 1547 ULONG MembersFlags; 1548 ULONG MembersSize; 1549 ULONG MembersCount; 1550 ULONG Flags; 1551 } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER; 1552 1553 typedef struct { 1554 KSPROPERTY_MEMBERSHEADER MembersHeader; 1555 const VOID *Members; 1556 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; 1557 1558 #define KSPROPERTY_MEMBER_RANGES 0x00000001 1559 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 1560 #define KSPROPERTY_MEMBER_VALUES 0x00000003 1561 1562 #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 1563 #if (NTDDI_VERSION >= NTDDI_WINXP) 1564 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002 1565 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004 1566 #endif 1567 1568 typedef struct { 1569 KSIDENTIFIER PropTypeSet; 1570 ULONG MembersListCount; 1571 _Field_size_(MembersListCount) const KSPROPERTY_MEMBERSLIST *MembersList; 1572 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; 1573 1574 #if defined(_NTDDK_) 1575 1576 _IRQL_requires_max_(PASSIVE_LEVEL) 1577 typedef NTSTATUS 1578 (NTAPI *PFNKSCONTEXT_DISPATCH)( 1579 _In_ PVOID Context, 1580 _In_ PIRP Irp); 1581 1582 _IRQL_requires_max_(PASSIVE_LEVEL) 1583 typedef NTSTATUS 1584 (NTAPI *PFNKSHANDLER)( 1585 _In_ PIRP Irp, 1586 _In_ PKSIDENTIFIER Request, 1587 _Inout_ PVOID Data); 1588 1589 typedef struct { 1590 ULONG PropertyId; 1591 union { 1592 PFNKSHANDLER GetPropertyHandler; 1593 BOOLEAN GetSupported; 1594 }; 1595 ULONG MinProperty; 1596 ULONG MinData; 1597 union { 1598 PFNKSHANDLER SetPropertyHandler; 1599 BOOLEAN SetSupported; 1600 }; 1601 const KSPROPERTY_VALUES *Values; 1602 ULONG RelationsCount; 1603 _Field_size_(RelationsCount) const KSPROPERTY *Relations; 1604 PFNKSHANDLER SupportHandler; 1605 ULONG SerializedSize; 1606 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; 1607 1608 _IRQL_requires_max_(PASSIVE_LEVEL) 1609 typedef BOOLEAN 1610 (NTAPI *PFNKSFASTHANDLER)( 1611 _In_ PFILE_OBJECT FileObject, 1612 _In_reads_bytes_(RequestLength) PKSIDENTIFIER Request, 1613 _In_ ULONG RequestLength, 1614 _Inout_updates_bytes_(DataLength) PVOID Data, 1615 _In_ ULONG DataLength, 1616 _Out_ PIO_STATUS_BLOCK IoStatus); 1617 1618 typedef struct { 1619 ULONG PropertyId; 1620 union { 1621 PFNKSFASTHANDLER GetPropertyHandler; 1622 BOOLEAN GetSupported; 1623 }; 1624 union { 1625 PFNKSFASTHANDLER SetPropertyHandler; 1626 BOOLEAN SetSupported; 1627 }; 1628 ULONG Reserved; 1629 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; 1630 1631 typedef struct { 1632 const GUID *Set; 1633 ULONG PropertiesCount; 1634 _Field_size_(PropertiesCount) const KSPROPERTY_ITEM *PropertyItem; 1635 ULONG FastIoCount; 1636 const KSFASTPROPERTY_ITEM *FastIoTable; 1637 } KSPROPERTY_SET, *PKSPROPERTY_SET; 1638 1639 #endif /* _NTDDK_ */ 1640 1641 typedef struct { 1642 ULONG SteppingDelta; 1643 ULONG Reserved; 1644 KSPROPERTY_BOUNDS_LONG Bounds; 1645 } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG; 1646 1647 typedef struct { 1648 #if defined(_NTDDK_) 1649 ULONGLONG SteppingDelta; 1650 #else 1651 DWORDLONG SteppingDelta; 1652 #endif 1653 KSPROPERTY_BOUNDS_LONGLONG Bounds; 1654 } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG; 1655 1656 /* =============================================================== 1657 Allocator Framing 1658 */ 1659 1660 typedef struct { 1661 union { 1662 ULONG OptionsFlags; 1663 ULONG RequirementsFlags; 1664 }; 1665 #if defined(_NTDDK_) 1666 POOL_TYPE PoolType; 1667 #else 1668 ULONG PoolType; 1669 #endif 1670 ULONG Frames; 1671 ULONG FrameSize; 1672 ULONG FileAlignment; 1673 ULONG Reserved; 1674 } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING; 1675 1676 typedef struct { 1677 ULONG CountItems; 1678 ULONG PinFlags; 1679 KS_COMPRESSION OutputCompression; 1680 ULONG PinWeight; 1681 KS_FRAMING_ITEM FramingItem[1]; 1682 } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX; 1683 1684 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 1685 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 1686 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 1687 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 1688 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 1689 1690 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 1691 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 1692 #define KSALLOCATOR_OPTIONF_VALID 0x00000003 1693 1694 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 1695 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 1696 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 1697 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 1698 1699 /* =============================================================== 1700 Quality 1701 */ 1702 1703 typedef struct { 1704 PVOID Context; 1705 ULONG Proportion; 1706 LONGLONG DeltaTime; 1707 } KSQUALITY, *PKSQUALITY; 1708 1709 typedef struct { 1710 HANDLE QualityManager; 1711 PVOID Context; 1712 } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER; 1713 1714 typedef struct { 1715 LONGLONG PresentationStart; 1716 LONGLONG Duration; 1717 KSPIN_INTERFACE Interface; 1718 LONG Rate; 1719 ULONG Flags; 1720 } KSRATE, *PKSRATE; 1721 1722 typedef struct { 1723 KSPROPERTY Property; 1724 KSRATE Rate; 1725 } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY; 1726 1727 typedef struct { 1728 LONGLONG Granularity; 1729 LONGLONG Error; 1730 } KSRESOLUTION, *PKSRESOLUTION; 1731 1732 typedef struct { 1733 ULONG NotificationType; 1734 union { 1735 struct { 1736 HANDLE Event; 1737 ULONG_PTR Reserved[2]; 1738 } EventHandle; 1739 struct { 1740 HANDLE Semaphore; 1741 ULONG Reserved; 1742 LONG Adjustment; 1743 } SemaphoreHandle; 1744 #if defined(_NTDDK_) 1745 struct { 1746 PVOID Event; 1747 KPRIORITY Increment; 1748 ULONG_PTR Reserved; 1749 } EventObject; 1750 struct { 1751 PVOID Semaphore; 1752 KPRIORITY Increment; 1753 LONG Adjustment; 1754 } SemaphoreObject; 1755 struct { 1756 PKDPC Dpc; 1757 ULONG ReferenceCount; 1758 ULONG_PTR Reserved; 1759 } Dpc; 1760 struct { 1761 PWORK_QUEUE_ITEM WorkQueueItem; 1762 WORK_QUEUE_TYPE WorkQueueType; 1763 ULONG_PTR Reserved; 1764 } WorkItem; 1765 struct { 1766 PWORK_QUEUE_ITEM WorkQueueItem; 1767 PKSWORKER KsWorkerObject; 1768 ULONG_PTR Reserved; 1769 } KsWorkItem; 1770 #endif 1771 struct { 1772 PVOID Unused; 1773 LONG_PTR Alignment[2]; 1774 } Alignment; 1775 }; 1776 } KSEVENTDATA, *PKSEVENTDATA; 1777 1778 #define KSEVENTF_EVENT_HANDLE 0x00000001 1779 #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 1780 #if defined(_NTDDK_) 1781 #define KSEVENTF_EVENT_OBJECT 0x00000004 1782 #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 1783 #define KSEVENTF_DPC 0x00000010 1784 #define KSEVENTF_WORKITEM 0x00000020 1785 #define KSEVENTF_KSWORKITEM 0x00000080 1786 #endif 1787 1788 1789 #define KSEVENT_TYPE_ENABLE 0x00000001 1790 #define KSEVENT_TYPE_ONESHOT 0x00000002 1791 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 1792 #define KSEVENT_TYPE_SETSUPPORT 0x00000100 1793 #define KSEVENT_TYPE_BASICSUPPORT 0x00000200 1794 #define KSEVENT_TYPE_QUERYBUFFER 0x00000400 1795 1796 #define KSEVENT_TYPE_TOPOLOGY 0x10000000 1797 1798 typedef struct { 1799 ULONG Size; 1800 ULONG Flags; 1801 union { 1802 HANDLE ObjectHandle; 1803 PVOID ObjectPointer; 1804 }; 1805 PVOID Reserved; 1806 KSEVENT Event; 1807 KSEVENTDATA EventData; 1808 } KSRELATIVEEVENT, *PKSRELATIVEEVENT; 1809 1810 #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 1811 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 1812 1813 /* =============================================================== 1814 Timing 1815 */ 1816 1817 typedef struct { 1818 KSEVENTDATA EventData; 1819 LONGLONG MarkTime; 1820 } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; 1821 1822 typedef struct { 1823 KSEVENTDATA EventData; 1824 LONGLONG TimeBase; 1825 LONGLONG Interval; 1826 } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; 1827 1828 typedef struct { 1829 LONGLONG TimeBase; 1830 LONGLONG Interval; 1831 } KSINTERVAL, *PKSINTERVAL; 1832 1833 typedef struct { 1834 LONGLONG Time; 1835 ULONG Numerator; 1836 ULONG Denominator; 1837 } KSTIME, *PKSTIME; 1838 1839 typedef struct { 1840 LONGLONG Time; 1841 LONGLONG SystemTime; 1842 } KSCORRELATED_TIME, *PKSCORRELATED_TIME; 1843 1844 typedef struct { 1845 LONGLONG Duration; 1846 ULONG FrameFlags; 1847 ULONG Reserved; 1848 } KSFRAMETIME, *PKSFRAMETIME; 1849 1850 /* =============================================================== 1851 Clocks 1852 */ 1853 1854 typedef PVOID PKSDEFAULTCLOCK; 1855 1856 typedef struct { 1857 ULONG CreateFlags; 1858 } KSCLOCK_CREATE, *PKSCLOCK_CREATE; 1859 1860 #if defined(_NTDDK_) 1861 1862 _IRQL_requires_max_(PASSIVE_LEVEL) 1863 typedef LONGLONG 1864 (FASTCALL *PFNKSCLOCK_GETTIME)( 1865 _In_ PFILE_OBJECT FileObject); 1866 1867 _IRQL_requires_max_(PASSIVE_LEVEL) 1868 typedef LONGLONG 1869 (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)( 1870 _In_ PFILE_OBJECT FileObject, 1871 _Out_ PLONGLONG SystemTime); 1872 1873 typedef struct { 1874 PFNKSCLOCK_GETTIME GetTime; 1875 PFNKSCLOCK_GETTIME GetPhysicalTime; 1876 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; 1877 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; 1878 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; 1879 1880 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\ 1881 DEFINE_KSPROPERTY_ITEM(\ 1882 KSPROPERTY_CLOCK_TIME,\ 1883 (Handler),\ 1884 sizeof(KSPROPERTY),\ 1885 sizeof(LONGLONG),\ 1886 NULL, NULL, 0, NULL, NULL, 0) 1887 1888 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\ 1889 DEFINE_KSPROPERTY_ITEM(\ 1890 KSPROPERTY_CLOCK_PHYSICALTIME,\ 1891 (Handler),\ 1892 sizeof(KSPROPERTY),\ 1893 sizeof(LONGLONG),\ 1894 NULL, NULL, 0, NULL, NULL, 0) 1895 1896 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\ 1897 DEFINE_KSPROPERTY_ITEM(\ 1898 KSPROPERTY_CLOCK_CORRELATEDTIME,\ 1899 (Handler),\ 1900 sizeof(KSPROPERTY),\ 1901 sizeof(KSCORRELATED_TIME),\ 1902 NULL, NULL, 0, NULL, NULL, 0) 1903 1904 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\ 1905 DEFINE_KSPROPERTY_ITEM(\ 1906 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ 1907 (Handler),\ 1908 sizeof(KSPROPERTY),\ 1909 sizeof(KSCORRELATED_TIME),\ 1910 NULL, NULL, 0, NULL, NULL, 0) 1911 1912 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\ 1913 DEFINE_KSPROPERTY_ITEM(\ 1914 KSPROPERTY_CLOCK_RESOLUTION,\ 1915 (Handler),\ 1916 sizeof(KSPROPERTY),\ 1917 sizeof(KSRESOLUTION),\ 1918 NULL, NULL, 0, NULL, NULL, 0) 1919 1920 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\ 1921 DEFINE_KSPROPERTY_ITEM(\ 1922 KSPROPERTY_CLOCK_STATE,\ 1923 (Handler),\ 1924 sizeof(KSPROPERTY),\ 1925 sizeof(KSSTATE),\ 1926 NULL, NULL, 0, NULL, NULL, 0) 1927 1928 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\ 1929 DEFINE_KSPROPERTY_ITEM(\ 1930 KSPROPERTY_CLOCK_FUNCTIONTABLE,\ 1931 (Handler),\ 1932 sizeof(KSPROPERTY),\ 1933 sizeof(KSCLOCK_FUNCTIONTABLE),\ 1934 NULL, NULL, 0, NULL, NULL, 0) 1935 1936 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\ 1937 PropTime, PropPhysicalTime,\ 1938 PropCorrelatedTime, PropCorrelatedPhysicalTime,\ 1939 PropResolution, PropState, PropFunctionTable)\ 1940 DEFINE_KSPROPERTY_TABLE(ClockSet) {\ 1941 DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\ 1942 DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\ 1943 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ 1944 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ 1945 DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\ 1946 DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\ 1947 DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\ 1948 } 1949 1950 /* =============================================================== 1951 Objects ??? SORT ME! 1952 */ 1953 1954 #define KSCREATE_ITEM_SECURITYCHANGED 0x1 1955 #define KSCREATE_ITEM_WILDCARD 0x2 1956 #define KSCREATE_ITEM_NOPARAMETERS 0x4 1957 #define KSCREATE_ITEM_FREEONSTOP 0x8 1958 1959 typedef struct { 1960 PDRIVER_DISPATCH Create; 1961 PVOID Context; 1962 UNICODE_STRING ObjectClass; 1963 PSECURITY_DESCRIPTOR SecurityDescriptor; 1964 ULONG Flags; 1965 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; 1966 1967 typedef struct { 1968 ULONG CreateItemsCount; 1969 _Field_size_(CreateItemsCount) PKSOBJECT_CREATE_ITEM CreateItemsList; 1970 } KSOBJECT_CREATE, *PKSOBJECT_CREATE; 1971 1972 typedef VOID 1973 (NTAPI *PFNKSITEMFREECALLBACK)( 1974 _In_ PKSOBJECT_CREATE_ITEM CreateItem); 1975 1976 #endif /* _NTDDK_ */ 1977 1978 typedef struct { 1979 ULONG Size; 1980 ULONG Count; 1981 } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM; 1982 1983 typedef struct { 1984 KSEVENT Event; 1985 PKSEVENTDATA EventData; 1986 PVOID Reserved; 1987 } KSQUERYBUFFER, *PKSQUERYBUFFER; 1988 1989 typedef struct { 1990 PVOID Context; 1991 ULONG Status; 1992 } KSERROR, *PKSERROR; 1993 1994 /* =============================================================== 1995 Methods 1996 */ 1997 1998 #if defined(_NTDDK_) 1999 2000 typedef struct { 2001 ULONG MethodId; 2002 union { 2003 PFNKSHANDLER MethodHandler; 2004 BOOLEAN MethodSupported; 2005 }; 2006 ULONG MinMethod; 2007 ULONG MinData; 2008 PFNKSHANDLER SupportHandler; 2009 ULONG Flags; 2010 } KSMETHOD_ITEM, *PKSMETHOD_ITEM; 2011 2012 #ifndef _MSC_VER 2013 2014 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\ 2015 MethodHandler,\ 2016 MinMethod, MinData, SupportHandler)\ 2017 {\ 2018 MethodId, {(PFNKSHANDLER)MethodHandler}, MinMethod, MinData,\ 2019 SupportHandler, Flags\ 2020 } 2021 2022 #else 2023 2024 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\ 2025 MethodHandler,\ 2026 MinMethod, MinData, SupportHandler)\ 2027 {\ 2028 MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\ 2029 SupportHandler, Flags\ 2030 } 2031 2032 #endif 2033 2034 typedef struct { 2035 ULONG MethodId; 2036 union { 2037 PFNKSFASTHANDLER MethodHandler; 2038 BOOLEAN MethodSupported; 2039 }; 2040 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; 2041 2042 #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\ 2043 {\ 2044 MethodId, (PFNKSFASTHANDLER)MethodHandler\ 2045 } 2046 2047 typedef struct { 2048 const GUID *Set; 2049 ULONG MethodsCount; 2050 _Field_size_(MethodsCount) const KSMETHOD_ITEM *MethodItem; 2051 ULONG FastIoCount; 2052 _Field_size_(FastIoCount) const KSFASTMETHOD_ITEM *FastIoTable; 2053 } KSMETHOD_SET, *PKSMETHOD_SET; 2054 2055 #define DEFINE_KSMETHOD_SET(Set,\ 2056 MethodsCount,\ 2057 MethodItem,\ 2058 FastIoCount,\ 2059 FastIoTable)\ 2060 {\ 2061 Set,\ 2062 MethodsCount,\ 2063 MethodItem,\ 2064 FastIoCount,\ 2065 FastIoTable\ 2066 } 2067 2068 #endif /* _NTDDK_ */ 2069 2070 /* =============================================================== 2071 Nodes 2072 */ 2073 2074 typedef struct { 2075 KSPROPERTY Property; 2076 ULONG NodeId; 2077 ULONG Reserved; 2078 } KSP_NODE, *PKSP_NODE; 2079 2080 typedef struct { 2081 KSMETHOD Method; 2082 ULONG NodeID; 2083 ULONG Reserved; 2084 } KSM_NODE, *PKSM_NODE; 2085 2086 typedef struct { 2087 KSEVENT Event; 2088 ULONG NodeId; 2089 ULONG Reserved; 2090 } KSE_NODE, *PKSE_NODE; 2091 2092 typedef struct { 2093 ULONG CreateFlags; 2094 ULONG Node; 2095 } KSNODE_CREATE, *PKSNODE_CREATE; 2096 2097 /* =============================================================== 2098 Events 2099 */ 2100 2101 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY; 2102 2103 #if defined(_NTDDK_) 2104 2105 typedef NTSTATUS 2106 (NTAPI *PFNKSADDEVENT)( 2107 _In_ PIRP Irp, 2108 _In_ PKSEVENTDATA EventData, 2109 _In_ struct _KSEVENT_ENTRY *EventEntry); 2110 2111 typedef VOID 2112 (NTAPI *PFNKSREMOVEEVENT)( 2113 _In_ PFILE_OBJECT FileObject, 2114 _In_ struct _KSEVENT_ENTRY *EventEntry); 2115 2116 typedef struct { 2117 ULONG EventId; 2118 ULONG DataInput; 2119 ULONG ExtraEntryData; 2120 PFNKSADDEVENT AddHandler; 2121 PFNKSREMOVEEVENT RemoveHandler; 2122 PFNKSHANDLER SupportHandler; 2123 } KSEVENT_ITEM, *PKSEVENT_ITEM; 2124 2125 typedef struct { 2126 const GUID *Set; 2127 ULONG EventsCount; 2128 _Field_size_(EventsCount) const KSEVENT_ITEM *EventItem; 2129 } KSEVENT_SET, *PKSEVENT_SET; 2130 2131 struct _KSEVENT_ENTRY { 2132 LIST_ENTRY ListEntry; 2133 PVOID Object; 2134 union { 2135 PKSDPC_ITEM DpcItem; 2136 PKSBUFFER_ITEM BufferItem; 2137 }; 2138 PKSEVENTDATA EventData; 2139 ULONG NotificationType; 2140 const KSEVENT_SET *EventSet; 2141 const KSEVENT_ITEM *EventItem; 2142 PFILE_OBJECT FileObject; 2143 ULONG SemaphoreAdjustment; 2144 ULONG Reserved; 2145 ULONG Flags; 2146 }; 2147 2148 #endif /* _NTDDK_ */ 2149 2150 /* =============================================================== 2151 Pins 2152 */ 2153 2154 #if defined(_NTDDK_) 2155 2156 typedef struct _KSPIN KSPIN, *PKSPIN; 2157 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER; 2158 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; 2159 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING; 2160 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN; 2161 2162 #define IOCTL_KS_HANDSHAKE \ 2163 CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) 2164 2165 typedef struct { 2166 GUID ProtocolId; 2167 PVOID Argument1; 2168 PVOID Argument2; 2169 } KSHANDSHAKE, *PKSHANDSHAKE; 2170 2171 _IRQL_requires_max_(PASSIVE_LEVEL) 2172 typedef NTSTATUS 2173 (NTAPI *PFNKSPINHANDSHAKE)( 2174 _In_ PKSPIN Pin, 2175 _In_ PKSHANDSHAKE In, 2176 _In_ PKSHANDSHAKE Out); 2177 2178 _IRQL_requires_max_(PASSIVE_LEVEL) 2179 typedef void 2180 (NTAPI *PFNKSPINPOWER)( 2181 _In_ PKSPIN Pin, 2182 _In_ DEVICE_POWER_STATE State); 2183 2184 typedef void 2185 (NTAPI *PFNKSPINFRAMERETURN)( 2186 _In_ PKSPIN Pin, 2187 _In_reads_bytes_opt_(Size) PVOID Data, 2188 _In_opt_ ULONG Size, 2189 _In_opt_ PMDL Mdl, 2190 _In_opt_ PVOID Context, 2191 _In_ NTSTATUS Status); 2192 2193 _IRQL_requires_max_(DISPATCH_LEVEL) 2194 typedef void 2195 (NTAPI *PFNKSPINIRPCOMPLETION)( 2196 _In_ PKSPIN Pin, 2197 _In_ PIRP Irp); 2198 2199 _IRQL_requires_max_(PASSIVE_LEVEL) 2200 typedef NTSTATUS 2201 (NTAPI *PFNKSPINIRP)( 2202 _In_ PKSPIN Pin, 2203 _In_ PIRP Irp); 2204 2205 typedef NTSTATUS 2206 (NTAPI *PFNKSPIN)( 2207 _In_ PKSPIN Pin); 2208 2209 _IRQL_requires_max_(PASSIVE_LEVEL) 2210 typedef void 2211 (NTAPI *PFNKSPINVOID)( 2212 _In_ PKSPIN Pin); 2213 2214 _IRQL_requires_max_(DISPATCH_LEVEL) 2215 typedef void 2216 (NTAPI *PFNKSSTREAMPOINTER)( 2217 _In_ PKSSTREAM_POINTER StreamPointer); 2218 2219 typedef struct { 2220 ULONG Count; 2221 _Field_size_(Count) PKSATTRIBUTE *Attributes; 2222 } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST; 2223 2224 _IRQL_requires_max_(PASSIVE_LEVEL) 2225 typedef NTSTATUS 2226 (NTAPI *PFNKSPINSETDATAFORMAT)( 2227 _In_ PKSPIN Pin, 2228 _In_opt_ PKSDATAFORMAT OldFormat, 2229 _In_opt_ PKSMULTIPLE_ITEM OldAttributeList, 2230 _In_ const KSDATARANGE* DataRange, 2231 _In_opt_ const KSATTRIBUTE_LIST* AttributeRange); 2232 2233 _IRQL_requires_max_(PASSIVE_LEVEL) 2234 typedef NTSTATUS 2235 (NTAPI *PFNKSPINSETDEVICESTATE)( 2236 _In_ PKSPIN Pin, 2237 _In_ KSSTATE ToState, 2238 _In_ KSSTATE FromState); 2239 2240 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; 2241 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; 2242 2243 typedef struct { 2244 PFNKSPINIRP Create; 2245 PFNKSPINIRP Close; 2246 PFNKSPIN Process; 2247 PFNKSPINVOID Reset; 2248 PFNKSPINSETDATAFORMAT SetDataFormat; 2249 PFNKSPINSETDEVICESTATE SetDeviceState; 2250 PFNKSPIN Connect; 2251 PFNKSPINVOID Disconnect; 2252 const KSCLOCK_DISPATCH* Clock; 2253 const KSALLOCATOR_DISPATCH* Allocator; 2254 } KSPIN_DISPATCH, *PKSPIN_DISPATCH; 2255 2256 _IRQL_requires_max_(DISPATCH_LEVEL) 2257 typedef BOOLEAN 2258 (NTAPI *PFNKSPINSETTIMER)( 2259 _In_ PKSPIN Pin, 2260 _In_ PKTIMER Timer, 2261 _In_ LARGE_INTEGER DueTime, 2262 _In_ PKDPC Dpc); 2263 2264 _IRQL_requires_max_(DISPATCH_LEVEL) 2265 typedef BOOLEAN 2266 (NTAPI *PFNKSPINCANCELTIMER)( 2267 _In_ PKSPIN Pin, 2268 _In_ PKTIMER Timer); 2269 2270 _IRQL_requires_max_(DISPATCH_LEVEL) 2271 typedef LONGLONG 2272 (FASTCALL *PFNKSPINCORRELATEDTIME)( 2273 _In_ PKSPIN Pin, 2274 _Out_ PLONGLONG SystemTime); 2275 2276 _IRQL_requires_max_(DISPATCH_LEVEL) 2277 typedef void 2278 (NTAPI *PFNKSPINRESOLUTION)( 2279 _In_ PKSPIN Pin, 2280 _Out_ PKSRESOLUTION Resolution); 2281 2282 struct _KSCLOCK_DISPATCH { 2283 PFNKSPINSETTIMER SetTimer; 2284 PFNKSPINCANCELTIMER CancelTimer; 2285 PFNKSPINCORRELATEDTIME CorrelatedTime; 2286 PFNKSPINRESOLUTION Resolution; 2287 }; 2288 2289 _IRQL_requires_max_(PASSIVE_LEVEL) 2290 typedef NTSTATUS 2291 (NTAPI *PFNKSPININITIALIZEALLOCATOR)( 2292 _In_ PKSPIN Pin, 2293 _In_ PKSALLOCATOR_FRAMING AllocatorFraming, 2294 _Out_ PVOID *Context); 2295 2296 typedef PVOID 2297 (NTAPI *PFNKSDELETEALLOCATOR)( 2298 _In_ PVOID Context); 2299 2300 typedef PVOID 2301 (NTAPI *PFNKSDEFAULTALLOCATE)( 2302 _In_ PVOID Context); 2303 2304 typedef PVOID 2305 (NTAPI *PFNKSDEFAULTFREE)( 2306 _In_ PVOID Context, 2307 _In_ PVOID Buffer); 2308 2309 struct _KSALLOCATOR_DISPATCH { 2310 PFNKSPININITIALIZEALLOCATOR InitializeAllocator; 2311 PFNKSDELETEALLOCATOR DeleteAllocator; 2312 PFNKSDEFAULTALLOCATE Allocate; 2313 PFNKSDEFAULTFREE Free; 2314 }; 2315 2316 typedef struct KSAUTOMATION_TABLE_ { 2317 ULONG PropertySetsCount; 2318 ULONG PropertyItemSize; 2319 _Field_size_bytes_(PropertySetsCount * PropertyItemSize) const KSPROPERTY_SET *PropertySets; 2320 ULONG MethodSetsCount; 2321 ULONG MethodItemSize; 2322 _Field_size_bytes_(MethodSetsCount * MethodItemSize) const KSMETHOD_SET *MethodSets; 2323 ULONG EventSetsCount; 2324 ULONG EventItemSize; 2325 _Field_size_bytes_(EventSetsCount * EventItemSize) const KSEVENT_SET *EventSets; 2326 #if !defined(_WIN64) 2327 PVOID Alignment; 2328 #endif 2329 } KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE; 2330 2331 typedef struct { 2332 ULONG InterfacesCount; 2333 _Field_size_(InterfacesCount) const KSPIN_INTERFACE *Interfaces; 2334 ULONG MediumsCount; 2335 _Field_size_(MediumsCount) const KSPIN_MEDIUM *Mediums; 2336 ULONG DataRangesCount; 2337 _Field_size_(DataRangesCount) const PKSDATARANGE *DataRanges; 2338 KSPIN_DATAFLOW DataFlow; 2339 KSPIN_COMMUNICATION Communication; 2340 const GUID *Category; 2341 const GUID *Name; 2342 union { 2343 LONGLONG Reserved; 2344 struct { 2345 ULONG ConstrainedDataRangesCount; 2346 _Field_size_(ConstrainedDataRangesCount) PKSDATARANGE *ConstrainedDataRanges; 2347 }; 2348 }; 2349 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; 2350 2351 _Must_inspect_result_ 2352 _IRQL_requires_max_(PASSIVE_LEVEL) 2353 typedef NTSTATUS 2354 (NTAPI *PFNKSINTERSECTHANDLER)( 2355 _In_ PIRP Irp, 2356 _In_ PKSP_PIN Pin, 2357 _In_ PKSDATARANGE DataRange, 2358 _Out_opt_ PVOID Data); 2359 2360 _Must_inspect_result_ 2361 _IRQL_requires_max_(PASSIVE_LEVEL) 2362 typedef NTSTATUS 2363 (NTAPI *PFNKSINTERSECTHANDLEREX)( 2364 _In_ PVOID Context, 2365 _In_ PIRP Irp, 2366 _In_ PKSP_PIN Pin, 2367 _In_ PKSDATARANGE DataRange, 2368 _In_ PKSDATARANGE MatchingDataRange, 2369 _In_ ULONG DataBufferSize, 2370 _Out_writes_bytes_to_opt_(DataBufferSize, *DataSize) PVOID Data, 2371 _Out_ PULONG DataSize); 2372 2373 typedef struct { 2374 const KSPIN_DISPATCH* Dispatch; 2375 const KSAUTOMATION_TABLE* AutomationTable; 2376 KSPIN_DESCRIPTOR PinDescriptor; 2377 ULONG Flags; 2378 ULONG InstancesPossible; 2379 ULONG InstancesNecessary; 2380 const KSALLOCATOR_FRAMING_EX* AllocatorFraming; 2381 PFNKSINTERSECTHANDLEREX IntersectHandler; 2382 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; 2383 2384 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 2385 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 2386 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 2387 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008 2388 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) 2389 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000 2390 #endif 2391 2392 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 2393 #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING 2394 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 2395 2396 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 2397 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 2398 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 2399 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 2400 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 2401 2402 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 2403 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 2404 2405 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 2406 #define KSPIN_FLAG_SPLITTER 0x00020000 2407 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 2408 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 2409 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000 2410 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 2411 2412 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) 2413 2414 #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 2415 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000 2416 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000 2417 #if (NTDDI_VERSION >= NTDDI_WINXPSP2) 2418 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000 2419 #endif 2420 2421 struct _KSPIN { 2422 const KSPIN_DESCRIPTOR_EX *Descriptor; 2423 KSOBJECT_BAG Bag; 2424 PVOID Context; 2425 ULONG Id; 2426 KSPIN_COMMUNICATION Communication; 2427 BOOLEAN ConnectionIsExternal; 2428 KSPIN_INTERFACE ConnectionInterface; 2429 KSPIN_MEDIUM ConnectionMedium; 2430 KSPRIORITY ConnectionPriority; 2431 PKSDATAFORMAT ConnectionFormat; 2432 PKSMULTIPLE_ITEM AttributeList; 2433 ULONG StreamHeaderSize; 2434 KSPIN_DATAFLOW DataFlow; 2435 KSSTATE DeviceState; 2436 KSRESET ResetState; 2437 KSSTATE ClientState; 2438 }; 2439 2440 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\ 2441 DEFINE_KSPROPERTY_ITEM(\ 2442 KSPROPERTY_PIN_CINSTANCES,\ 2443 (Handler),\ 2444 sizeof(KSP_PIN),\ 2445 sizeof(KSPIN_CINSTANCES),\ 2446 NULL, NULL, 0, NULL, NULL, 0) 2447 2448 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\ 2449 DEFINE_KSPROPERTY_ITEM(\ 2450 KSPROPERTY_PIN_CTYPES,\ 2451 (Handler),\ 2452 sizeof(KSPROPERTY),\ 2453 sizeof(ULONG),\ 2454 NULL, NULL, 0, NULL, NULL, 0) 2455 2456 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\ 2457 DEFINE_KSPROPERTY_ITEM(\ 2458 KSPROPERTY_PIN_DATAFLOW,\ 2459 (Handler),\ 2460 sizeof(KSP_PIN),\ 2461 sizeof(KSPIN_DATAFLOW),\ 2462 NULL, NULL, 0, NULL, NULL, 0) 2463 2464 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\ 2465 DEFINE_KSPROPERTY_ITEM(\ 2466 KSPROPERTY_PIN_DATARANGES,\ 2467 (Handler),\ 2468 sizeof(KSP_PIN),\ 2469 0,\ 2470 NULL, NULL, 0, NULL, NULL, 0) 2471 2472 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\ 2473 DEFINE_KSPROPERTY_ITEM(\ 2474 KSPROPERTY_PIN_DATAINTERSECTION,\ 2475 (Handler),\ 2476 sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ 2477 0,\ 2478 NULL, NULL, 0, NULL, NULL, 0) 2479 2480 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\ 2481 DEFINE_KSPROPERTY_ITEM(\ 2482 KSPROPERTY_PIN_INTERFACES,\ 2483 (Handler),\ 2484 sizeof(KSP_PIN),\ 2485 0,\ 2486 NULL, NULL, 0, NULL, NULL, 0) 2487 2488 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\ 2489 DEFINE_KSPROPERTY_ITEM(\ 2490 KSPROPERTY_PIN_MEDIUMS,\ 2491 (Handler),\ 2492 sizeof(KSP_PIN),\ 2493 0,\ 2494 NULL, NULL, 0, NULL, NULL, 0) 2495 2496 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\ 2497 DEFINE_KSPROPERTY_ITEM(\ 2498 KSPROPERTY_PIN_COMMUNICATION,\ 2499 (Handler),\ 2500 sizeof(KSP_PIN),\ 2501 sizeof(KSPIN_COMMUNICATION),\ 2502 NULL, NULL, 0, NULL, NULL, 0) 2503 2504 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\ 2505 DEFINE_KSPROPERTY_ITEM(\ 2506 KSPROPERTY_PIN_GLOBALCINSTANCES,\ 2507 (Handler),\ 2508 sizeof(KSP_PIN),\ 2509 sizeof(KSPIN_CINSTANCES),\ 2510 NULL, NULL, 0, NULL, NULL, 0) 2511 2512 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\ 2513 DEFINE_KSPROPERTY_ITEM(\ 2514 KSPROPERTY_PIN_NECESSARYINSTANCES,\ 2515 (Handler),\ 2516 sizeof(KSP_PIN),\ 2517 sizeof(ULONG),\ 2518 NULL, NULL, 0, NULL, NULL, 0) 2519 2520 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\ 2521 DEFINE_KSPROPERTY_ITEM(\ 2522 KSPROPERTY_PIN_PHYSICALCONNECTION,\ 2523 (Handler),\ 2524 sizeof(KSP_PIN),\ 2525 0,\ 2526 NULL, NULL, 0, NULL, NULL, 0) 2527 2528 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\ 2529 DEFINE_KSPROPERTY_ITEM(\ 2530 KSPROPERTY_PIN_CATEGORY,\ 2531 (Handler),\ 2532 sizeof(KSP_PIN),\ 2533 sizeof(GUID),\ 2534 NULL, NULL, 0, NULL, NULL, 0) 2535 2536 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\ 2537 DEFINE_KSPROPERTY_ITEM(\ 2538 KSPROPERTY_PIN_NAME,\ 2539 (Handler),\ 2540 sizeof(KSP_PIN),\ 2541 0,\ 2542 NULL, NULL, 0, NULL, NULL, 0) 2543 2544 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\ 2545 DEFINE_KSPROPERTY_ITEM(\ 2546 KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\ 2547 (Handler),\ 2548 sizeof(KSP_PIN),\ 2549 0,\ 2550 NULL, NULL, 0, NULL, NULL, 0) 2551 2552 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\ 2553 DEFINE_KSPROPERTY_ITEM(\ 2554 KSPROPERTY_PIN_PROPOSEDATAFORMAT,\ 2555 NULL,\ 2556 sizeof(KSP_PIN),\ 2557 sizeof(KSDATAFORMAT),\ 2558 (Handler), NULL, 0, NULL, NULL, 0) 2559 2560 #define DEFINE_KSPROPERTY_PINSET(PinSet,\ 2561 PropGeneral, PropInstances, PropIntersection)\ 2562 DEFINE_KSPROPERTY_TABLE(PinSet) {\ 2563 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ 2564 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ 2565 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ 2566 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ 2567 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ 2568 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ 2569 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ 2570 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ 2571 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ 2572 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\ 2573 } 2574 2575 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\ 2576 PropGeneral, PropInstances, PropIntersection)\ 2577 DEFINE_KSPROPERTY_TABLE(PinSet) {\ 2578 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ 2579 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ 2580 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ 2581 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ 2582 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ 2583 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ 2584 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ 2585 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ 2586 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ 2587 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\ 2588 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\ 2589 } 2590 2591 typedef void 2592 (NTAPI *PFNKSFREE)( 2593 _In_ PVOID Data); 2594 2595 #define DEFINE_KSPROPERTY_TABLE(tablename) \ 2596 const KSPROPERTY_ITEM tablename[] = 2597 2598 #endif /* _NTDDK_ */ 2599 2600 typedef struct { 2601 KSPIN_INTERFACE Interface; 2602 KSPIN_MEDIUM Medium; 2603 ULONG PinId; 2604 HANDLE PinToHandle; 2605 KSPRIORITY Priority; 2606 } KSPIN_CONNECT, *PKSPIN_CONNECT; 2607 2608 /* =============================================================== 2609 Topology 2610 */ 2611 2612 typedef struct { 2613 ULONG FromNode; 2614 ULONG FromNodePin; 2615 ULONG ToNode; 2616 ULONG ToNodePin; 2617 } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION; 2618 2619 typedef struct { 2620 ULONG CategoriesCount; 2621 _Field_size_(CategoriesCount) const GUID *Categories; 2622 ULONG TopologyNodesCount; 2623 _Field_size_(TopologyNodesCount) const GUID *TopologyNodes; 2624 ULONG TopologyConnectionsCount; 2625 _Field_size_(TopologyConnectionsCount) const KSTOPOLOGY_CONNECTION *TopologyConnections; 2626 _Field_size_(TopologyNodesCount) const GUID *TopologyNodesNames; 2627 ULONG Reserved; 2628 } KSTOPOLOGY, *PKSTOPOLOGY; 2629 2630 2631 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\ 2632 DEFINE_KSPROPERTY_ITEM(\ 2633 KSPROPERTY_TOPOLOGY_CATEGORIES,\ 2634 (Handler),\ 2635 sizeof(KSPROPERTY),\ 2636 0,\ 2637 NULL, NULL, 0, NULL, NULL, 0) 2638 2639 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\ 2640 DEFINE_KSPROPERTY_ITEM(\ 2641 KSPROPERTY_TOPOLOGY_NODES,\ 2642 (Handler),\ 2643 sizeof(KSPROPERTY),\ 2644 0,\ 2645 NULL, NULL, 0, NULL, NULL, 0) 2646 2647 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\ 2648 DEFINE_KSPROPERTY_ITEM(\ 2649 KSPROPERTY_TOPOLOGY_CONNECTIONS,\ 2650 (Handler),\ 2651 sizeof(KSPROPERTY),\ 2652 0,\ 2653 NULL, NULL, 0, NULL, NULL, 0) 2654 2655 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ 2656 DEFINE_KSPROPERTY_ITEM(\ 2657 KSPROPERTY_TOPOLOGY_NAME,\ 2658 (Handler),\ 2659 sizeof(KSP_NODE),\ 2660 0,\ 2661 NULL, NULL, 0, NULL, NULL, 0) 2662 2663 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\ 2664 DEFINE_KSPROPERTY_TABLE(TopologySet) {\ 2665 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\ 2666 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\ 2667 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\ 2668 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\ 2669 } 2670 2671 /* =============================================================== 2672 ??? SORT ME 2673 */ 2674 2675 /* TODO */ 2676 typedef void* UNKNOWN; 2677 2678 typedef PVOID 2679 (NTAPI *PFNKSINITIALIZEALLOCATOR)( 2680 _In_ PVOID InitialContext, 2681 _In_ PKSALLOCATOR_FRAMING AllocatorFraming, 2682 _Outptr_ PVOID *Context); 2683 2684 #if defined(_NTDDK_) 2685 2686 _IRQL_requires_max_(PASSIVE_LEVEL) 2687 typedef NTSTATUS 2688 (NTAPI *PFNKSALLOCATOR)( 2689 _In_ PIRP Irp, 2690 _In_ ULONG BufferSize, 2691 _In_ BOOLEAN InputOperation); 2692 2693 _Must_inspect_result_ 2694 _IRQL_requires_max_(PASSIVE_LEVEL) 2695 typedef NTSTATUS 2696 (NTAPI *PFNKINTERSECTHANDLEREX)( 2697 _In_ PVOID Context, 2698 _In_ PIRP Irp, 2699 _In_ PKSP_PIN Pin, 2700 _In_ PKSDATARANGE DataRange, 2701 _In_ PKSDATARANGE MatchingDataRange, 2702 _In_ ULONG DataBufferSize, 2703 _Out_writes_bytes_to_opt_(DataBufferSize, *DataSize) PVOID Data, 2704 _Out_ PULONG DataSize); 2705 2706 typedef NTSTATUS 2707 (NTAPI *PFNALLOCATOR_ALLOCATEFRAME)( 2708 _In_ PFILE_OBJECT FileObject, 2709 _Outptr_ PVOID *Frame); 2710 2711 typedef VOID 2712 (NTAPI *PFNALLOCATOR_FREEFRAME)( 2713 _In_ PFILE_OBJECT FileObject, 2714 _In_ PVOID Frame); 2715 2716 typedef struct { 2717 PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; 2718 PFNALLOCATOR_FREEFRAME FreeFrame; 2719 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; 2720 2721 #endif /* _NTDDK_ */ 2722 2723 typedef struct { 2724 KSALLOCATOR_FRAMING Framing; 2725 ULONG AllocatedFrames; 2726 ULONG Reserved; 2727 } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS; 2728 2729 typedef struct { 2730 KSALLOCATOR_FRAMING_EX Framing; 2731 ULONG AllocatedFrames; 2732 ULONG Reserved; 2733 } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX; 2734 2735 typedef struct { 2736 ULONG Size; 2737 ULONG TypeSpecificFlags; 2738 KSTIME PresentationTime; 2739 LONGLONG Duration; 2740 ULONG FrameExtent; 2741 ULONG DataUsed; 2742 PVOID Data; 2743 ULONG OptionsFlags; 2744 #ifdef _WIN64 2745 ULONG Reserved; 2746 #endif 2747 } KSSTREAM_HEADER, *PKSSTREAM_HEADER; 2748 2749 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 2750 #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 2751 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 2752 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 2753 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 2754 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 2755 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 2756 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 2757 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 2758 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER 0x00000400 2759 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800 2760 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 2761 2762 /* =============================================================== 2763 XP / DX8 2764 */ 2765 2766 #if defined(_NTDDK_) 2767 2768 typedef struct _KSGATE KSGATE, *PKSGATE; 2769 2770 struct _KSGATE { 2771 LONG Count; 2772 PKSGATE NextGate; 2773 }; 2774 2775 #ifndef _NTOS_ 2776 2777 _IRQL_requires_max_(DISPATCH_LEVEL) 2778 KSDDKAPI 2779 PKSGATE 2780 NTAPI 2781 KsPinGetAndGate( 2782 _In_ PKSPIN Pin); 2783 2784 _IRQL_requires_max_(HIGH_LEVEL) 2785 static 2786 __inline 2787 void 2788 KsGateTurnInputOn( 2789 _In_opt_ PKSGATE Gate) 2790 { 2791 while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) 2792 { 2793 Gate = Gate->NextGate; 2794 } 2795 } 2796 2797 _IRQL_requires_max_(HIGH_LEVEL) 2798 static 2799 __inline 2800 void 2801 KsGateTurnInputOff( 2802 _In_opt_ PKSGATE Gate) 2803 { 2804 while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) 2805 { 2806 Gate = Gate->NextGate; 2807 } 2808 } 2809 2810 _IRQL_requires_max_(HIGH_LEVEL) 2811 static 2812 __inline 2813 BOOLEAN 2814 KsGateGetStateUnsafe( 2815 _In_ PKSGATE Gate) 2816 { 2817 ASSERT(Gate); 2818 return((BOOLEAN)(Gate->Count > 0)); 2819 } 2820 2821 _IRQL_requires_max_(HIGH_LEVEL) 2822 static 2823 __inline 2824 BOOLEAN 2825 KsGateCaptureThreshold( 2826 _In_ PKSGATE Gate) 2827 { 2828 BOOLEAN captured; 2829 2830 ASSERT(Gate); 2831 2832 captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1); 2833 2834 if (captured) 2835 { 2836 KsGateTurnInputOff(Gate->NextGate); 2837 } 2838 2839 return captured; 2840 } 2841 2842 _IRQL_requires_max_(HIGH_LEVEL) 2843 static 2844 __inline 2845 void 2846 KsGateInitialize( 2847 _In_ PKSGATE Gate, 2848 _In_ LONG InitialCount, 2849 _In_opt_ PKSGATE NextGate, 2850 _In_ BOOLEAN StateToPropagate) 2851 { 2852 ASSERT(Gate); 2853 Gate->Count = InitialCount; 2854 Gate->NextGate = NextGate; 2855 2856 if (NextGate) 2857 { 2858 if (InitialCount > 0) 2859 { 2860 if (StateToPropagate) 2861 { 2862 KsGateTurnInputOn(NextGate); 2863 } 2864 } 2865 else 2866 { 2867 if (!StateToPropagate) 2868 { 2869 KsGateTurnInputOff(NextGate); 2870 } 2871 } 2872 } 2873 } 2874 2875 _IRQL_requires_max_(HIGH_LEVEL) 2876 static 2877 __inline 2878 void 2879 KsGateInitializeAnd( 2880 _In_ PKSGATE AndGate, 2881 _In_opt_ PKSGATE NextOrGate) 2882 { 2883 KsGateInitialize(AndGate,1,NextOrGate,TRUE); 2884 } 2885 2886 _IRQL_requires_max_(HIGH_LEVEL) 2887 static 2888 __inline 2889 void 2890 KsGateInitializeOr( 2891 _In_ PKSGATE OrGate, 2892 _In_opt_ PKSGATE NextAndGate) 2893 { 2894 KsGateInitialize(OrGate,0,NextAndGate,FALSE); 2895 } 2896 2897 _IRQL_requires_max_(HIGH_LEVEL) 2898 static 2899 __inline 2900 void 2901 KsGateAddOnInputToAnd( 2902 _In_ PKSGATE AndGate) 2903 { 2904 UNREFERENCED_PARAMETER (AndGate); 2905 } 2906 2907 _IRQL_requires_max_(HIGH_LEVEL) 2908 static 2909 __inline 2910 void 2911 KsGateAddOffInputToAnd( 2912 _In_ PKSGATE AndGate) 2913 { 2914 KsGateTurnInputOff(AndGate); 2915 } 2916 2917 _IRQL_requires_max_(HIGH_LEVEL) 2918 static 2919 __inline 2920 void 2921 KsGateRemoveOnInputFromAnd( 2922 _In_ PKSGATE AndGate) 2923 { 2924 UNREFERENCED_PARAMETER (AndGate); 2925 } 2926 2927 _IRQL_requires_max_(HIGH_LEVEL) 2928 static 2929 __inline 2930 void 2931 KsGateRemoveOffInputFromAnd( 2932 _In_ PKSGATE AndGate) 2933 { 2934 KsGateTurnInputOn(AndGate); 2935 } 2936 2937 _IRQL_requires_max_(HIGH_LEVEL) 2938 static 2939 __inline 2940 void 2941 KsGateAddOnInputToOr( 2942 _In_ PKSGATE OrGate) 2943 { 2944 KsGateTurnInputOn(OrGate); 2945 } 2946 2947 _IRQL_requires_max_(HIGH_LEVEL) 2948 static 2949 __inline 2950 void 2951 KsGateAddOffInputToOr( 2952 _In_ PKSGATE OrGate) 2953 { 2954 UNREFERENCED_PARAMETER (OrGate); 2955 } 2956 2957 _IRQL_requires_max_(HIGH_LEVEL) 2958 static 2959 __inline 2960 void 2961 KsGateRemoveOnInputFromOr( 2962 _In_ PKSGATE OrGate) 2963 { 2964 KsGateTurnInputOff(OrGate); 2965 } 2966 2967 _IRQL_requires_max_(HIGH_LEVEL) 2968 static 2969 __inline 2970 void 2971 KsGateRemoveOffInputFromOr( 2972 _In_ PKSGATE OrGate) 2973 { 2974 UNREFERENCED_PARAMETER (OrGate); 2975 } 2976 2977 _IRQL_requires_max_(HIGH_LEVEL) 2978 static 2979 __inline 2980 void 2981 KsGateTerminateAnd( 2982 _In_ PKSGATE AndGate) 2983 { 2984 ASSERT(AndGate); 2985 if (KsGateGetStateUnsafe(AndGate)) 2986 { 2987 KsGateRemoveOnInputFromOr(AndGate->NextGate); 2988 } 2989 else 2990 { 2991 KsGateRemoveOffInputFromOr(AndGate->NextGate); 2992 } 2993 } 2994 2995 _IRQL_requires_max_(HIGH_LEVEL) 2996 static 2997 __inline 2998 void 2999 KsGateTerminateOr( 3000 _In_ PKSGATE OrGate) 3001 { 3002 ASSERT(OrGate); 3003 if (KsGateGetStateUnsafe(OrGate)) 3004 { 3005 KsGateRemoveOnInputFromAnd(OrGate->NextGate); 3006 } 3007 else 3008 { 3009 KsGateRemoveOffInputFromAnd(OrGate->NextGate); 3010 } 3011 } 3012 3013 #endif /* !_NTOS_ */ 3014 3015 struct _KSMAPPING { 3016 PHYSICAL_ADDRESS PhysicalAddress; 3017 ULONG ByteCount; 3018 ULONG Alignment; 3019 }; 3020 3021 #endif /* _NTDDK_ */ 3022 3023 typedef enum { 3024 KSSTREAM_POINTER_STATE_UNLOCKED = 0, 3025 KSSTREAM_POINTER_STATE_LOCKED 3026 } KSSTREAM_POINTER_STATE; 3027 3028 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; 3029 3030 struct _KSSTREAM_POINTER_OFFSET { 3031 #if defined(_NTDDK_) 3032 union { 3033 PUCHAR Data; 3034 PKSMAPPING Mappings; 3035 }; 3036 #else 3037 PUCHAR Data; 3038 #endif 3039 #if !defined(_WIN64) 3040 PVOID Alignment; 3041 #endif 3042 ULONG Count; 3043 ULONG Remaining; 3044 }; 3045 3046 #if defined(_NTDDK_) 3047 3048 struct _KSSTREAM_POINTER { 3049 PVOID Context; 3050 PKSPIN Pin; 3051 PKSSTREAM_HEADER StreamHeader; 3052 PKSSTREAM_POINTER_OFFSET Offset; 3053 KSSTREAM_POINTER_OFFSET OffsetIn; 3054 KSSTREAM_POINTER_OFFSET OffsetOut; 3055 }; 3056 3057 struct _KSPROCESSPIN { 3058 PKSPIN Pin; 3059 PKSSTREAM_POINTER StreamPointer; 3060 PKSPROCESSPIN InPlaceCounterpart; 3061 PKSPROCESSPIN DelegateBranch; 3062 PKSPROCESSPIN CopySource; 3063 _Field_size_bytes_(BytesAvailable) PVOID Data; 3064 ULONG BytesAvailable; 3065 ULONG BytesUsed; 3066 ULONG Flags; 3067 BOOLEAN Terminate; 3068 }; 3069 3070 struct _KSPROCESSPIN_INDEXENTRY { 3071 _Field_size_(Count) PKSPROCESSPIN *Pins; 3072 ULONG Count; 3073 }; 3074 3075 #endif /* _NTDDK_ */ 3076 3077 /* =============================================================== 3078 Device Dispatch 3079 */ 3080 3081 #if defined(_NTDDK_) 3082 3083 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; 3084 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE; 3085 typedef struct _KSFILTER KSFILTER, *PKSFILTER; 3086 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; 3087 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; 3088 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; 3089 3090 _IRQL_requires_max_(PASSIVE_LEVEL) 3091 typedef NTSTATUS 3092 (NTAPI *PFNKSDEVICECREATE)( 3093 _In_ PKSDEVICE Device); 3094 3095 _IRQL_requires_max_(PASSIVE_LEVEL) 3096 typedef NTSTATUS 3097 (NTAPI *PFNKSDEVICEPNPSTART)( 3098 _In_ PKSDEVICE Device, 3099 _In_ PIRP Irp, 3100 _In_opt_ PCM_RESOURCE_LIST TranslatedResourceList, 3101 _In_opt_ PCM_RESOURCE_LIST UntranslatedResourceList); 3102 3103 _IRQL_requires_max_(PASSIVE_LEVEL) 3104 typedef NTSTATUS 3105 (NTAPI *PFNKSDEVICE)( 3106 _In_ PKSDEVICE Device); 3107 3108 _IRQL_requires_max_(PASSIVE_LEVEL) 3109 typedef NTSTATUS 3110 (NTAPI *PFNKSDEVICEIRP)( 3111 _In_ PKSDEVICE Device, 3112 _In_ PIRP Irp); 3113 3114 _IRQL_requires_max_(PASSIVE_LEVEL) 3115 typedef VOID 3116 (NTAPI *PFNKSDEVICEIRPVOID)( 3117 _In_ PKSDEVICE Device, 3118 _In_ PIRP Irp); 3119 3120 _IRQL_requires_max_(PASSIVE_LEVEL) 3121 typedef NTSTATUS 3122 (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)( 3123 _In_ PKSDEVICE Device, 3124 _In_ PIRP Irp, 3125 _Inout_ PDEVICE_CAPABILITIES Capabilities); 3126 3127 _IRQL_requires_max_(PASSIVE_LEVEL) 3128 typedef NTSTATUS 3129 (NTAPI *PFNKSDEVICEQUERYPOWER)( 3130 _In_ PKSDEVICE Device, 3131 _In_ PIRP Irp, 3132 _In_ DEVICE_POWER_STATE DeviceTo, 3133 _In_ DEVICE_POWER_STATE DeviceFrom, 3134 _In_ SYSTEM_POWER_STATE SystemTo, 3135 _In_ SYSTEM_POWER_STATE SystemFrom, 3136 _In_ POWER_ACTION Action); 3137 3138 _IRQL_requires_max_(PASSIVE_LEVEL) 3139 typedef VOID 3140 (NTAPI *PFNKSDEVICESETPOWER)( 3141 _In_ PKSDEVICE Device, 3142 _In_ PIRP Irp, 3143 _In_ DEVICE_POWER_STATE To, 3144 _In_ DEVICE_POWER_STATE From); 3145 3146 typedef struct _KSDEVICE_DISPATCH { 3147 PFNKSDEVICECREATE Add; 3148 PFNKSDEVICEPNPSTART Start; 3149 PFNKSDEVICE PostStart; 3150 PFNKSDEVICEIRP QueryStop; 3151 PFNKSDEVICEIRPVOID CancelStop; 3152 PFNKSDEVICEIRPVOID Stop; 3153 PFNKSDEVICEIRP QueryRemove; 3154 PFNKSDEVICEIRPVOID CancelRemove; 3155 PFNKSDEVICEIRPVOID Remove; 3156 PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; 3157 PFNKSDEVICEIRPVOID SurpriseRemoval; 3158 PFNKSDEVICEQUERYPOWER QueryPower; 3159 PFNKSDEVICESETPOWER SetPower; 3160 PFNKSDEVICEIRP QueryInterface; 3161 } KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; 3162 3163 #if (NTDDI_VERSION >= NTDDI_LONGHORN) 3164 #define KSDEVICE_DESCRIPTOR_VERSION_2 (0x110) 3165 #define MIN_DEV_VER_FOR_FLAGS (0x110) 3166 #endif 3167 3168 struct _KSDEVICE { 3169 const KSDEVICE_DESCRIPTOR* Descriptor; 3170 KSOBJECT_BAG Bag; 3171 PVOID Context; 3172 PDEVICE_OBJECT FunctionalDeviceObject; 3173 PDEVICE_OBJECT PhysicalDeviceObject; 3174 PDEVICE_OBJECT NextDeviceObject; 3175 BOOLEAN Started; 3176 SYSTEM_POWER_STATE SystemPowerState; 3177 DEVICE_POWER_STATE DevicePowerState; 3178 }; 3179 3180 #endif /* _NTDDK_ */ 3181 3182 /* =============================================================== 3183 Filter Dispatch 3184 */ 3185 3186 #if defined(_NTDDK_) 3187 3188 struct _KSFILTER { 3189 const KSFILTER_DESCRIPTOR* Descriptor; 3190 KSOBJECT_BAG Bag; 3191 PVOID Context; 3192 }; 3193 3194 _IRQL_requires_max_(PASSIVE_LEVEL) 3195 typedef void 3196 (NTAPI *PFNKSFILTERPOWER)( 3197 _In_ PKSFILTER Filter, 3198 _In_ DEVICE_POWER_STATE State); 3199 3200 _IRQL_requires_max_(PASSIVE_LEVEL) 3201 typedef NTSTATUS 3202 (NTAPI *PFNKSFILTERIRP)( 3203 _In_ PKSFILTER Filter, 3204 _In_ PIRP Irp); 3205 3206 typedef NTSTATUS 3207 (NTAPI *PFNKSFILTERPROCESS)( 3208 _In_ PKSFILTER Filter, 3209 _In_ PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex); 3210 3211 _IRQL_requires_max_(PASSIVE_LEVEL) 3212 typedef NTSTATUS 3213 (NTAPI *PFNKSFILTERVOID)( 3214 _In_ PKSFILTER Filter); 3215 3216 struct _KSFILTER_DISPATCH { 3217 PFNKSFILTERIRP Create; 3218 PFNKSFILTERIRP Close; 3219 PFNKSFILTERPROCESS Process; 3220 PFNKSFILTERVOID Reset; 3221 }; 3222 3223 struct _KSNODE_DESCRIPTOR { 3224 const KSAUTOMATION_TABLE *AutomationTable; 3225 const GUID *Type; 3226 const GUID *Name; 3227 #if !defined(_WIN64) 3228 PVOID Alignment; 3229 #endif 3230 }; 3231 3232 struct _KSFILTER_DESCRIPTOR { 3233 const KSFILTER_DISPATCH *Dispatch; 3234 const KSAUTOMATION_TABLE *AutomationTable; 3235 ULONG Version; 3236 ULONG Flags; 3237 const GUID *ReferenceGuid; 3238 ULONG PinDescriptorsCount; 3239 ULONG PinDescriptorSize; 3240 _Field_size_bytes_(PinDescriptorsCount * PinDescriptorSize) const KSPIN_DESCRIPTOR_EX *PinDescriptors; 3241 ULONG CategoriesCount; 3242 _Field_size_(CategoriesCount) const GUID *Categories; 3243 ULONG NodeDescriptorsCount; 3244 ULONG NodeDescriptorSize; 3245 _Field_size_bytes_(NodeDescriptorsCount * NodeDescriptorSize) const KSNODE_DESCRIPTOR *NodeDescriptors; 3246 ULONG ConnectionsCount; 3247 _Field_size_(ConnectionsCount) const KSTOPOLOGY_CONNECTION *Connections; 3248 const KSCOMPONENTID *ComponentId; 3249 }; 3250 3251 #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) 3252 3253 struct _KSDEVICE_DESCRIPTOR { 3254 const KSDEVICE_DISPATCH *Dispatch; 3255 ULONG FilterDescriptorsCount; 3256 _Field_size_(FilterDescriptorsCount) const KSFILTER_DESCRIPTOR * const *FilterDescriptors; 3257 ULONG Version; 3258 ULONG Flags; 3259 }; 3260 3261 struct _KSFILTERFACTORY { 3262 const KSFILTER_DESCRIPTOR* FilterDescriptor; 3263 KSOBJECT_BAG Bag; 3264 PVOID Context; 3265 }; 3266 3267 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\ 3268 const KSFILTER_DESCRIPTOR descriptor = 3269 3270 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\ 3271 SIZEOF_ARRAY(table),\ 3272 sizeof(table[0]),\ 3273 table 3274 3275 #define DEFINE_KSFILTER_CATEGORIES(table)\ 3276 SIZEOF_ARRAY(table),\ 3277 table 3278 3279 #define DEFINE_KSFILTER_CATEGORY(category)\ 3280 1,\ 3281 &(category) 3282 3283 #define DEFINE_KSFILTER_CATEGORIES_NULL\ 3284 0,\ 3285 NULL 3286 3287 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\ 3288 SIZEOF_ARRAY(table),\ 3289 sizeof(table[0]),\ 3290 table 3291 3292 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\ 3293 0,\ 3294 sizeof(KSNODE_DESCRIPTOR),\ 3295 NULL 3296 3297 #define DEFINE_KSFILTER_CONNECTIONS(table)\ 3298 SIZEOF_ARRAY(table),\ 3299 table 3300 3301 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\ 3302 0,\ 3303 NULL 3304 3305 #endif /* _NTDDK_ */ 3306 3307 /* =============================================================== 3308 Minidriver Callbacks 3309 */ 3310 3311 #if defined(_NTDDK_) 3312 3313 typedef NTSTATUS 3314 (NTAPI *KStrMethodHandler)( 3315 IN PIRP Irp, 3316 IN PKSIDENTIFIER Request, 3317 IN OUT PVOID Data); 3318 3319 typedef NTSTATUS 3320 (NTAPI *KStrSupportHandler)( 3321 IN PIRP Irp, 3322 IN PKSIDENTIFIER Request, 3323 IN OUT PVOID Data); 3324 3325 #endif 3326 3327 /* =============================================================== 3328 Allocator Functions 3329 */ 3330 3331 #if defined(_NTDDK_) 3332 3333 _IRQL_requires_max_(PASSIVE_LEVEL) 3334 KSDDKAPI 3335 NTSTATUS 3336 NTAPI 3337 KsCreateAllocator( 3338 _In_ HANDLE ConnectionHandle, 3339 _In_ PKSALLOCATOR_FRAMING AllocatorFraming, 3340 _Out_ PHANDLE AllocatorHandle); 3341 3342 _IRQL_requires_max_(PASSIVE_LEVEL) 3343 KSDDKAPI 3344 NTSTATUS 3345 NTAPI 3346 KsCreateDefaultAllocator( 3347 _In_ PIRP Irp); 3348 3349 _IRQL_requires_max_(PASSIVE_LEVEL) 3350 KSDDKAPI 3351 NTSTATUS 3352 NTAPI 3353 KsValidateAllocatorCreateRequest( 3354 _In_ PIRP Irp, 3355 _Out_ PKSALLOCATOR_FRAMING *AllocatorFraming); 3356 3357 _IRQL_requires_max_(PASSIVE_LEVEL) 3358 KSDDKAPI 3359 NTSTATUS 3360 NTAPI 3361 KsCreateDefaultAllocatorEx( 3362 _In_ PIRP Irp, 3363 _In_opt_ PVOID InitializeContext, 3364 _In_opt_ PFNKSDEFAULTALLOCATE DefaultAllocate, 3365 _In_opt_ PFNKSDEFAULTFREE DefaultFree, 3366 _In_opt_ PFNKSINITIALIZEALLOCATOR InitializeAllocator, 3367 _In_opt_ PFNKSDELETEALLOCATOR DeleteAllocator); 3368 3369 _IRQL_requires_max_(PASSIVE_LEVEL) 3370 KSDDKAPI 3371 NTSTATUS 3372 NTAPI 3373 KsValidateAllocatorFramingEx( 3374 _In_ PKSALLOCATOR_FRAMING_EX Framing, 3375 _In_ ULONG BufferSize, 3376 _In_ const KSALLOCATOR_FRAMING_EX *PinFraming); 3377 3378 #endif /* _NTDDK_ */ 3379 3380 /* =============================================================== 3381 Clock Functions 3382 */ 3383 3384 #if defined(_NTDDK_) 3385 3386 _IRQL_requires_max_(DISPATCH_LEVEL) 3387 typedef BOOLEAN 3388 (NTAPI *PFNKSSETTIMER)( 3389 _In_ PVOID Context, 3390 _In_ PKTIMER Timer, 3391 _In_ LARGE_INTEGER DueTime, 3392 _In_ PKDPC Dpc); 3393 3394 _IRQL_requires_max_(DISPATCH_LEVEL) 3395 typedef BOOLEAN 3396 (NTAPI *PFNKSCANCELTIMER)( 3397 _In_ PVOID Context, 3398 _In_ PKTIMER Timer); 3399 3400 typedef LONGLONG 3401 (FASTCALL *PFNKSCORRELATEDTIME)( 3402 _In_ PVOID Context, 3403 _Out_ PLONGLONG SystemTime); 3404 3405 _IRQL_requires_max_(PASSIVE_LEVEL) 3406 KSDDKAPI 3407 NTSTATUS 3408 NTAPI 3409 KsCreateClock( 3410 _In_ HANDLE ConnectionHandle, 3411 _In_ PKSCLOCK_CREATE ClockCreate, 3412 _Out_ PHANDLE ClockHandle); 3413 3414 _IRQL_requires_max_(PASSIVE_LEVEL) 3415 KSDDKAPI 3416 NTSTATUS 3417 NTAPI 3418 KsCreateDefaultClock( 3419 _In_ PIRP Irp, 3420 _In_ PKSDEFAULTCLOCK DefaultClock); 3421 3422 _IRQL_requires_max_(PASSIVE_LEVEL) 3423 KSDDKAPI 3424 NTSTATUS 3425 NTAPI 3426 KsAllocateDefaultClock( 3427 _Out_ PKSDEFAULTCLOCK *DefaultClock); 3428 3429 _IRQL_requires_max_(PASSIVE_LEVEL) 3430 KSDDKAPI 3431 NTSTATUS 3432 NTAPI 3433 KsAllocateDefaultClockEx( 3434 _Out_ PKSDEFAULTCLOCK *DefaultClock, 3435 _In_opt_ PVOID Context, 3436 _In_opt_ PFNKSSETTIMER SetTimer, 3437 _In_opt_ PFNKSCANCELTIMER CancelTimer, 3438 _In_opt_ PFNKSCORRELATEDTIME CorrelatedTime, 3439 _In_opt_ const KSRESOLUTION *Resolution, 3440 _In_ ULONG Flags); 3441 3442 _IRQL_requires_max_(PASSIVE_LEVEL) 3443 KSDDKAPI 3444 VOID 3445 NTAPI 3446 KsFreeDefaultClock( 3447 _In_ PKSDEFAULTCLOCK DefaultClock); 3448 3449 _IRQL_requires_max_(PASSIVE_LEVEL) 3450 KSDDKAPI 3451 NTSTATUS 3452 NTAPI 3453 KsValidateClockCreateRequest( 3454 _In_ PIRP Irp, 3455 _Outptr_ PKSCLOCK_CREATE *ClockCreate); 3456 3457 _IRQL_requires_max_(DISPATCH_LEVEL) 3458 KSDDKAPI 3459 KSSTATE 3460 NTAPI 3461 KsGetDefaultClockState( 3462 _In_ PKSDEFAULTCLOCK DefaultClock); 3463 3464 _IRQL_requires_max_(DISPATCH_LEVEL) 3465 KSDDKAPI 3466 VOID 3467 NTAPI 3468 KsSetDefaultClockState( 3469 _In_ PKSDEFAULTCLOCK DefaultClock, 3470 _In_ KSSTATE State); 3471 3472 _IRQL_requires_max_(DISPATCH_LEVEL) 3473 KSDDKAPI 3474 LONGLONG 3475 NTAPI 3476 KsGetDefaultClockTime( 3477 _In_ PKSDEFAULTCLOCK DefaultClock); 3478 3479 _IRQL_requires_max_(DISPATCH_LEVEL) 3480 KSDDKAPI 3481 VOID 3482 NTAPI 3483 KsSetDefaultClockTime( 3484 _In_ PKSDEFAULTCLOCK DefaultClock, 3485 _In_ LONGLONG Time); 3486 3487 #endif /* _NTDDK_ */ 3488 3489 /* =============================================================== 3490 Method Functions 3491 */ 3492 3493 /* Method sets - TODO: Make into macros! */ 3494 #if defined(_NTDDK_) 3495 3496 #if 0 3497 3498 VOID 3499 KSMETHOD_SET_IRP_STORAGE( 3500 IN IRP Irp); 3501 3502 VOID 3503 KSMETHOD_ITEM_IRP_STORAGE( 3504 IN IRP Irp); 3505 3506 VOID 3507 KSMETHOD_TYPE_IRP_STORAGE( 3508 IN IRP Irp); 3509 3510 #endif 3511 3512 _IRQL_requires_max_(PASSIVE_LEVEL) 3513 KSDDKAPI 3514 NTSTATUS 3515 NTAPI 3516 KsMethodHandler( 3517 _In_ PIRP Irp, 3518 _In_ ULONG MethodSetsCount, 3519 _In_reads_(MethodSetsCount) const KSMETHOD_SET* MethodSet); 3520 3521 _IRQL_requires_max_(PASSIVE_LEVEL) 3522 KSDDKAPI 3523 NTSTATUS 3524 NTAPI 3525 KsMethodHandlerWithAllocator( 3526 _In_ PIRP Irp, 3527 _In_ ULONG MethodSetsCount, 3528 _In_reads_(MethodSetsCount) const KSMETHOD_SET* MethodSet, 3529 _In_opt_ PFNKSALLOCATOR Allocator, 3530 _In_opt_ ULONG MethodItemSize); 3531 3532 _IRQL_requires_max_(PASSIVE_LEVEL) 3533 KSDDKAPI 3534 BOOLEAN 3535 NTAPI 3536 KsFastMethodHandler( 3537 _In_ PFILE_OBJECT FileObject, 3538 _In_reads_bytes_(MethodLength) PKSMETHOD UNALIGNED Method, 3539 _In_ ULONG MethodLength, 3540 _Inout_updates_bytes_(DataLength) PVOID UNALIGNED Data, 3541 _In_ ULONG DataLength, 3542 _Out_ PIO_STATUS_BLOCK IoStatus, 3543 _In_ ULONG MethodSetsCount, 3544 _In_reads_(MethodSetsCount) const KSMETHOD_SET *MethodSet); 3545 3546 #endif /* _NTDDK_ */ 3547 3548 /* =============================================================== 3549 Property Functions 3550 */ 3551 3552 #if defined(_NTDDK_) 3553 3554 _IRQL_requires_max_(PASSIVE_LEVEL) 3555 KSDDKAPI 3556 NTSTATUS 3557 NTAPI 3558 KsPropertyHandler( 3559 _In_ PIRP Irp, 3560 _In_ ULONG PropertySetsCount, 3561 _In_reads_(PropertySetsCount) const KSPROPERTY_SET *PropertySet); 3562 3563 _IRQL_requires_max_(PASSIVE_LEVEL) 3564 KSDDKAPI 3565 NTSTATUS 3566 NTAPI 3567 KsPropertyHandlerWithAllocator( 3568 _In_ PIRP Irp, 3569 _In_ ULONG PropertySetsCount, 3570 _In_reads_(PropertySetsCount) const KSPROPERTY_SET* PropertySet, 3571 _In_opt_ PFNKSALLOCATOR Allocator, 3572 _In_opt_ ULONG PropertyItemSize); 3573 3574 _IRQL_requires_max_(PASSIVE_LEVEL) 3575 KSDDKAPI 3576 NTSTATUS 3577 NTAPI 3578 KsUnserializeObjectPropertiesFromRegistry( 3579 _In_ PFILE_OBJECT FileObject, 3580 _In_opt_ HANDLE ParentKey, 3581 _In_opt_ PUNICODE_STRING RegistryPath); 3582 3583 _IRQL_requires_max_(PASSIVE_LEVEL) 3584 KSDDKAPI 3585 BOOLEAN 3586 NTAPI 3587 KsFastPropertyHandler( 3588 _In_ PFILE_OBJECT FileObject, 3589 _In_reads_bytes_(PropertyLength) PKSPROPERTY UNALIGNED Property, 3590 _In_ ULONG PropertyLength, 3591 _In_reads_bytes_(DataLength) PVOID UNALIGNED Data, 3592 _In_ ULONG DataLength, 3593 _Out_ PIO_STATUS_BLOCK IoStatus, 3594 _In_ ULONG PropertySetsCount, 3595 _In_reads_(PropertySetsCount) const KSPROPERTY_SET *PropertySet); 3596 3597 #endif /* _NTDDK_ */ 3598 3599 /* =============================================================== 3600 Event Functions 3601 */ 3602 3603 #if defined(_NTDDK_) 3604 3605 #define KSPROBE_STREAMREAD 0x00000000 3606 #define KSPROBE_STREAMWRITE 0x00000001 3607 #define KSPROBE_ALLOCATEMDL 0x00000010 3608 #define KSPROBE_PROBEANDLOCK 0x00000020 3609 #define KSPROBE_SYSTEMADDRESS 0x00000040 3610 #define KSPROBE_MODIFY 0x00000200 3611 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) 3612 #define KSPROBE_ALLOWFORMATCHANGE 0x00000080 3613 3614 #define KSSTREAM_READ KSPROBE_STREAMREAD 3615 #define KSSTREAM_WRITE KSPROBE_STREAMWRITE 3616 #define KSSTREAM_PAGED_DATA 0x00000000 3617 #define KSSTREAM_NONPAGED_DATA 0x00000100 3618 #define KSSTREAM_SYNCHRONOUS 0x00001000 3619 #define KSSTREAM_FAILUREEXCEPTION 0x00002000 3620 3621 _IRQL_requires_max_(DISPATCH_LEVEL) 3622 typedef BOOLEAN 3623 (NTAPI *PFNKSGENERATEEVENTCALLBACK)( 3624 _In_ PVOID Context, 3625 _In_ PKSEVENT_ENTRY EventEntry); 3626 3627 KSDDKAPI 3628 NTSTATUS 3629 NTAPI 3630 KsGenerateEvent( 3631 _In_ PKSEVENT_ENTRY EntryEvent); 3632 3633 _IRQL_requires_max_(DISPATCH_LEVEL) 3634 KSDDKAPI 3635 void 3636 NTAPI 3637 KsGenerateEvents( 3638 _In_ PVOID Object, 3639 _In_opt_ const GUID *EventSet, 3640 _In_ ULONG EventId, 3641 _In_ ULONG DataSize, 3642 _In_reads_bytes_opt_(DataSize) PVOID Data, 3643 _In_opt_ PFNKSGENERATEEVENTCALLBACK CallBack, 3644 _In_opt_ PVOID CallBackContext); 3645 3646 _IRQL_requires_max_(PASSIVE_LEVEL) 3647 KSDDKAPI 3648 NTSTATUS 3649 NTAPI 3650 KsEnableEventWithAllocator( 3651 _In_ PIRP Irp, 3652 _In_ ULONG EventSetsCount, 3653 _In_reads_(EventSetsCount) const KSEVENT_SET* EventSet, 3654 _Inout_opt_ PLIST_ENTRY EventsList, 3655 _In_opt_ KSEVENTS_LOCKTYPE EventsFlags, 3656 _In_opt_ PVOID EventsLock, 3657 _In_opt_ PFNKSALLOCATOR Allocator, 3658 _In_opt_ ULONG EventItemSize); 3659 3660 KSDDKAPI 3661 NTSTATUS 3662 NTAPI 3663 KsGenerateDataEvent( 3664 _In_ PKSEVENT_ENTRY EventEntry, 3665 _In_ ULONG DataSize, 3666 _In_reads_bytes_(DataSize) PVOID Data); 3667 3668 _IRQL_requires_max_(PASSIVE_LEVEL) 3669 KSDDKAPI 3670 NTSTATUS 3671 NTAPI 3672 KsEnableEvent( 3673 _In_ PIRP Irp, 3674 _In_ ULONG EventSetsCount, 3675 _In_reads_(EventSetsCount) KSEVENT_SET *EventSet, 3676 _Inout_opt_ PLIST_ENTRY EventsList, 3677 _In_opt_ KSEVENTS_LOCKTYPE EventsFlags, 3678 _In_opt_ PVOID EventsLock); 3679 3680 _IRQL_requires_max_(PASSIVE_LEVEL) 3681 KSDDKAPI 3682 VOID 3683 NTAPI 3684 KsDiscardEvent( 3685 _In_ PKSEVENT_ENTRY EventEntry); 3686 3687 _IRQL_requires_max_(PASSIVE_LEVEL) 3688 KSDDKAPI 3689 NTSTATUS 3690 NTAPI 3691 KsDisableEvent( 3692 _In_ PIRP Irp, 3693 _Inout_ PLIST_ENTRY EventsList, 3694 _In_ KSEVENTS_LOCKTYPE EventsFlags, 3695 _In_ PVOID EventsLock); 3696 3697 _IRQL_requires_max_(PASSIVE_LEVEL) 3698 KSDDKAPI 3699 VOID 3700 NTAPI 3701 KsFreeEventList( 3702 _In_ PFILE_OBJECT FileObject, 3703 _Inout_ PLIST_ENTRY EventsList, 3704 _In_ KSEVENTS_LOCKTYPE EventsFlags, 3705 _In_ PVOID EventsLock); 3706 3707 /* =============================================================== 3708 Topology Functions 3709 */ 3710 3711 _IRQL_requires_max_(PASSIVE_LEVEL) 3712 KSDDKAPI 3713 NTSTATUS 3714 NTAPI 3715 KsValidateTopologyNodeCreateRequest( 3716 _In_ PIRP Irp, 3717 _In_ PKSTOPOLOGY Topology, 3718 _Out_ PKSNODE_CREATE *NodeCreate); 3719 3720 _IRQL_requires_max_(PASSIVE_LEVEL) 3721 KSDDKAPI 3722 NTSTATUS 3723 NTAPI 3724 KsCreateTopologyNode( 3725 _In_ HANDLE ParentHandle, 3726 _In_ PKSNODE_CREATE NodeCreate, 3727 _In_ ACCESS_MASK DesiredAccess, 3728 _Out_ PHANDLE NodeHandle); 3729 3730 _IRQL_requires_max_(PASSIVE_LEVEL) 3731 KSDDKAPI 3732 NTSTATUS 3733 NTAPI 3734 KsTopologyPropertyHandler( 3735 _In_ PIRP Irp, 3736 _In_ PKSPROPERTY Property, 3737 _Inout_ PVOID Data, 3738 _In_ const KSTOPOLOGY *Topology); 3739 3740 /* =============================================================== 3741 Connectivity Functions 3742 */ 3743 3744 _IRQL_requires_max_(PASSIVE_LEVEL) 3745 KSDDKAPI 3746 NTSTATUS 3747 NTAPI 3748 KsCreatePin( 3749 _In_ HANDLE FilterHandle, 3750 _In_ PKSPIN_CONNECT Connect, 3751 _In_ ACCESS_MASK DesiredAccess, 3752 _Out_ PHANDLE ConnectionHandle); 3753 3754 _IRQL_requires_max_(PASSIVE_LEVEL) 3755 KSDDKAPI 3756 NTSTATUS 3757 NTAPI 3758 KsValidateConnectRequest( 3759 _In_ PIRP Irp, 3760 _In_ ULONG DescriptorsCount, 3761 _In_reads_(DescriptorsCount) KSPIN_DESCRIPTOR *Descriptor, 3762 _Out_ PKSPIN_CONNECT *Connect); 3763 3764 _IRQL_requires_max_(PASSIVE_LEVEL) 3765 KSDDKAPI 3766 NTSTATUS 3767 NTAPI 3768 KsPinPropertyHandler( 3769 _In_ PIRP Irp, 3770 _In_ PKSPROPERTY Property, 3771 _Inout_ PVOID Data, 3772 _In_ ULONG DescriptorsCount, 3773 _In_reads_(DescriptorsCount) const KSPIN_DESCRIPTOR *Descriptor); 3774 3775 _Must_inspect_result_ 3776 _IRQL_requires_max_(PASSIVE_LEVEL) 3777 KSDDKAPI 3778 NTSTATUS 3779 NTAPI 3780 KsPinDataIntersection( 3781 _In_ PIRP Irp, 3782 _In_ PKSP_PIN Pin, 3783 _Out_opt_ PVOID Data, 3784 _In_ ULONG DescriptorsCount, 3785 _In_reads_(DescriptorsCount) const KSPIN_DESCRIPTOR *Descriptor, 3786 _In_ PFNKSINTERSECTHANDLER IntersectHandler); 3787 3788 _Must_inspect_result_ 3789 _IRQL_requires_max_(PASSIVE_LEVEL) 3790 KSDDKAPI 3791 NTSTATUS 3792 NTAPI 3793 KsPinDataIntersectionEx( 3794 _In_ PIRP Irp, 3795 _In_ PKSP_PIN Pin, 3796 _Out_ PVOID Data, 3797 _In_ ULONG DescriptorsCount, 3798 _In_reads_bytes_(DescriptorsCount * DescriptorSize) const KSPIN_DESCRIPTOR *Descriptor, 3799 _In_ ULONG DescriptorSize, 3800 _In_opt_ PFNKSINTERSECTHANDLEREX IntersectHandler, 3801 _In_opt_ PVOID HandlerContext); 3802 3803 _IRQL_requires_max_(PASSIVE_LEVEL) 3804 KSDDKAPI 3805 PKSFILTER 3806 NTAPI 3807 KsPinGetParentFilter( 3808 _In_ PKSPIN Pin); 3809 3810 _IRQL_requires_max_(PASSIVE_LEVEL) 3811 KSDDKAPI 3812 PKSPIN 3813 NTAPI 3814 KsPinGetNextSiblingPin( 3815 _In_ PKSPIN Pin); 3816 3817 _IRQL_requires_max_(DISPATCH_LEVEL) 3818 KSDDKAPI 3819 PKSSTREAM_POINTER 3820 NTAPI 3821 KsPinGetLeadingEdgeStreamPointer( 3822 _In_ PKSPIN Pin, 3823 _In_ KSSTREAM_POINTER_STATE State); 3824 3825 _IRQL_requires_max_(DISPATCH_LEVEL) 3826 KSDDKAPI 3827 NTSTATUS 3828 NTAPI 3829 KsStreamPointerSetStatusCode( 3830 _In_ PKSSTREAM_POINTER StreamPointer, 3831 _In_ NTSTATUS Status 3832 ); 3833 3834 _IRQL_requires_max_(DISPATCH_LEVEL) 3835 KSDDKAPI 3836 void 3837 NTAPI 3838 KsStreamPointerDelete( 3839 _In_ PKSSTREAM_POINTER StreamPointer 3840 ); 3841 3842 _IRQL_requires_max_(DISPATCH_LEVEL) 3843 KSDDKAPI 3844 NTSTATUS 3845 NTAPI 3846 KsStreamPointerClone( 3847 _In_ PKSSTREAM_POINTER StreamPointer, 3848 _In_opt_ PFNKSSTREAMPOINTER CancelCallback, 3849 _In_ ULONG ContextSize, 3850 _Out_ PKSSTREAM_POINTER* CloneStreamPointer 3851 ); 3852 3853 3854 /* Does this belong here? */ 3855 3856 _IRQL_requires_max_(PASSIVE_LEVEL) 3857 KSDDKAPI 3858 NTSTATUS 3859 NTAPI 3860 KsHandleSizedListQuery( 3861 _In_ PIRP Irp, 3862 _In_ ULONG DataItemsCount, 3863 _In_ ULONG DataItemSize, 3864 _In_reads_bytes_(DataItemsCount * DataItemSize) const VOID *DataItems); 3865 3866 /* =============================================================== 3867 IRP Helper Functions 3868 */ 3869 3870 _IRQL_requires_max_(DISPATCH_LEVEL) 3871 typedef NTSTATUS 3872 (NTAPI *PFNKSIRPLISTCALLBACK)( 3873 _In_ PIRP Irp, 3874 _In_ PVOID Context); 3875 3876 _IRQL_requires_max_(PASSIVE_LEVEL) 3877 KSDDKAPI 3878 NTSTATUS 3879 NTAPI 3880 KsAcquireResetValue( 3881 _In_ PIRP Irp, 3882 _Out_ KSRESET *ResetValue); 3883 3884 _IRQL_requires_max_(DISPATCH_LEVEL) 3885 KSDDKAPI 3886 VOID 3887 NTAPI 3888 KsAddIrpToCancelableQueue( 3889 _Inout_ PLIST_ENTRY QueueHead, 3890 _In_ PKSPIN_LOCK SpinLock, 3891 _In_ PIRP Irp, 3892 _In_ KSLIST_ENTRY_LOCATION ListLocation, 3893 _In_opt_ PDRIVER_CANCEL DriverCancel); 3894 3895 _IRQL_requires_max_(PASSIVE_LEVEL) 3896 KSDDKAPI 3897 NTSTATUS 3898 NTAPI 3899 KsAddObjectCreateItemToDeviceHeader( 3900 _In_ KSDEVICE_HEADER Header, 3901 _In_ PDRIVER_DISPATCH Create, 3902 _In_ PVOID Context, 3903 _In_ PWSTR ObjectClass, 3904 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor); 3905 3906 _IRQL_requires_max_(PASSIVE_LEVEL) 3907 KSDDKAPI 3908 NTSTATUS 3909 NTAPI 3910 KsAddObjectCreateItemToObjectHeader( 3911 _In_ KSOBJECT_HEADER Header, 3912 _In_ PDRIVER_DISPATCH Create, 3913 _In_ PVOID Context, 3914 _In_ PWSTR ObjectClass, 3915 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor); 3916 3917 _IRQL_requires_max_(APC_LEVEL) 3918 KSDDKAPI 3919 NTSTATUS 3920 NTAPI 3921 KsAllocateDeviceHeader( 3922 _Out_ KSDEVICE_HEADER *Header, 3923 _In_ ULONG ItemsCount, 3924 _In_reads_opt_(ItemsCount) PKSOBJECT_CREATE_ITEM ItemsList); 3925 3926 _IRQL_requires_max_(PASSIVE_LEVEL) 3927 KSDDKAPI 3928 NTSTATUS 3929 NTAPI 3930 KsAllocateExtraData( 3931 _Inout_ PIRP Irp, 3932 _In_ ULONG ExtraSize, 3933 _Out_ PVOID *ExtraBuffer); 3934 3935 _IRQL_requires_max_(PASSIVE_LEVEL) 3936 KSDDKAPI 3937 NTSTATUS 3938 NTAPI 3939 KsAllocateObjectCreateItem( 3940 _In_ KSDEVICE_HEADER Header, 3941 _In_ PKSOBJECT_CREATE_ITEM CreateItem, 3942 _In_ BOOLEAN AllocateEntry, 3943 _In_opt_ PFNKSITEMFREECALLBACK ItemFreeCallback); 3944 3945 _IRQL_requires_max_(APC_LEVEL) 3946 KSDDKAPI 3947 NTSTATUS 3948 NTAPI 3949 KsAllocateObjectHeader( 3950 _Out_ KSOBJECT_HEADER *Header, 3951 _In_ ULONG ItemsCount, 3952 _In_reads_opt_(ItemsCount) PKSOBJECT_CREATE_ITEM ItemsList, 3953 _In_ PIRP Irp, 3954 _In_ KSDISPATCH_TABLE *Table); 3955 3956 _IRQL_requires_max_(DISPATCH_LEVEL) 3957 KSDDKAPI 3958 VOID 3959 NTAPI 3960 KsCancelIo( 3961 _Inout_ PLIST_ENTRY QueueHead, 3962 _In_ PKSPIN_LOCK SpinLock); 3963 3964 _IRQL_requires_max_(DISPATCH_LEVEL) 3965 KSDDKAPI 3966 VOID 3967 NTAPI 3968 KsCancelRoutine( 3969 _In_ PDEVICE_OBJECT DeviceObject, 3970 _In_ PIRP Irp); 3971 3972 _IRQL_requires_max_(PASSIVE_LEVEL) 3973 KSDDKAPI 3974 NTSTATUS 3975 NTAPI 3976 KsDefaultDeviceIoCompletion( 3977 _In_ PDEVICE_OBJECT DeviceObject, 3978 _In_ PIRP Irp); 3979 3980 _IRQL_requires_max_(PASSIVE_LEVEL) 3981 KSDDKAPI 3982 BOOLEAN 3983 NTAPI 3984 KsDispatchFastIoDeviceControlFailure( 3985 _In_ PFILE_OBJECT FileObject, 3986 _In_ BOOLEAN Wait, 3987 _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, 3988 _In_ ULONG InputBufferLength, 3989 _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, 3990 _In_ ULONG OutputBufferLength, 3991 _In_ ULONG IoControlCode, 3992 _Out_ PIO_STATUS_BLOCK IoStatus, 3993 _In_ PDEVICE_OBJECT DeviceObject); /* always return false */ 3994 3995 _IRQL_requires_max_(PASSIVE_LEVEL) 3996 KSDDKAPI 3997 BOOLEAN 3998 NTAPI 3999 KsDispatchFastReadFailure( 4000 _In_ PFILE_OBJECT FileObject, 4001 _In_ PLARGE_INTEGER FileOffset, 4002 _In_ ULONG Length, 4003 _In_ BOOLEAN Wait, 4004 _In_ ULONG LockKey, 4005 _Out_ PVOID Buffer, 4006 _Out_ PIO_STATUS_BLOCK IoStatus, 4007 _In_ PDEVICE_OBJECT DeviceObject); /* always return false */ 4008 4009 /* This function does the same as the above */ 4010 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure 4011 4012 _IRQL_requires_max_(PASSIVE_LEVEL) 4013 KSDDKAPI 4014 NTSTATUS 4015 NTAPI 4016 KsDispatchInvalidDeviceRequest( 4017 _In_ PDEVICE_OBJECT DeviceObject, 4018 _In_ PIRP Irp); 4019 4020 _IRQL_requires_max_(PASSIVE_LEVEL) 4021 KSDDKAPI 4022 NTSTATUS 4023 NTAPI 4024 KsDispatchIrp( 4025 _In_ PDEVICE_OBJECT DeviceObject, 4026 _In_ PIRP Irp); 4027 4028 _IRQL_requires_max_(PASSIVE_LEVEL) 4029 KSDDKAPI 4030 NTSTATUS 4031 NTAPI 4032 KsDispatchSpecificMethod( 4033 _In_ PIRP Irp, 4034 _In_ PFNKSHANDLER Handler); 4035 4036 _IRQL_requires_max_(PASSIVE_LEVEL) 4037 KSDDKAPI 4038 NTSTATUS 4039 NTAPI 4040 KsDispatchSpecificProperty( 4041 _In_ PIRP Irp, 4042 _In_ PFNKSHANDLER Handler); 4043 4044 _IRQL_requires_max_(PASSIVE_LEVEL) 4045 KSDDKAPI 4046 NTSTATUS 4047 NTAPI 4048 KsForwardAndCatchIrp( 4049 _In_ PDEVICE_OBJECT DeviceObject, 4050 _In_ PIRP Irp, 4051 _In_ PFILE_OBJECT FileObject, 4052 _In_ KSSTACK_USE StackUse); 4053 4054 _IRQL_requires_max_(PASSIVE_LEVEL) 4055 KSDDKAPI 4056 NTSTATUS 4057 NTAPI 4058 KsForwardIrp( 4059 _In_ PIRP Irp, 4060 _In_ PFILE_OBJECT FileObject, 4061 _In_ BOOLEAN ReuseStackLocation); 4062 4063 _IRQL_requires_max_(APC_LEVEL) 4064 KSDDKAPI 4065 VOID 4066 NTAPI 4067 KsFreeDeviceHeader( 4068 _In_ KSDEVICE_HEADER Header); 4069 4070 _IRQL_requires_max_(APC_LEVEL) 4071 KSDDKAPI 4072 VOID 4073 NTAPI 4074 KsFreeObjectHeader( 4075 _In_ PVOID Header); 4076 4077 KSDDKAPI 4078 NTSTATUS 4079 NTAPI 4080 KsGetChildCreateParameter( 4081 _In_ PIRP Irp, 4082 _Out_ PVOID *CreateParameter); 4083 4084 _IRQL_requires_max_(DISPATCH_LEVEL) 4085 KSDDKAPI 4086 NTSTATUS 4087 NTAPI 4088 KsMoveIrpsOnCancelableQueue( 4089 _Inout_ PLIST_ENTRY SourceList, 4090 _In_ PKSPIN_LOCK SourceLock, 4091 _Inout_ PLIST_ENTRY DestinationList, 4092 _In_opt_ PKSPIN_LOCK DestinationLock, 4093 _In_ KSLIST_ENTRY_LOCATION ListLocation, 4094 _In_ PFNKSIRPLISTCALLBACK ListCallback, 4095 _In_ PVOID Context); 4096 4097 _IRQL_requires_max_(PASSIVE_LEVEL) 4098 KSDDKAPI 4099 NTSTATUS 4100 NTAPI 4101 KsProbeStreamIrp( 4102 _Inout_ PIRP Irp, 4103 _In_ ULONG ProbeFlags, 4104 _In_ ULONG HeaderSize); 4105 4106 _IRQL_requires_max_(PASSIVE_LEVEL) 4107 KSDDKAPI 4108 NTSTATUS 4109 NTAPI 4110 KsQueryInformationFile( 4111 _In_ PFILE_OBJECT FileObject, 4112 _Out_writes_bytes_(Length) PVOID FileInformation, 4113 _In_ ULONG Length, 4114 _In_ FILE_INFORMATION_CLASS FileInformationClass); 4115 4116 _IRQL_requires_max_(PASSIVE_LEVEL) 4117 KSDDKAPI 4118 ACCESS_MASK 4119 NTAPI 4120 KsQueryObjectAccessMask( 4121 _In_ KSOBJECT_HEADER Header); 4122 4123 _IRQL_requires_max_(PASSIVE_LEVEL) 4124 KSDDKAPI 4125 PKSOBJECT_CREATE_ITEM 4126 NTAPI 4127 KsQueryObjectCreateItem( 4128 _In_ KSOBJECT_HEADER Header); 4129 4130 _IRQL_requires_max_(PASSIVE_LEVEL) 4131 KSDDKAPI 4132 NTSTATUS 4133 NTAPI 4134 KsReadFile( 4135 _In_ PFILE_OBJECT FileObject, 4136 _In_opt_ PKEVENT Event, 4137 _In_opt_ PVOID PortContext, 4138 _Out_ PIO_STATUS_BLOCK IoStatusBlock, 4139 _Out_writes_bytes_(Length) PVOID Buffer, 4140 _In_ ULONG Length, 4141 _In_opt_ ULONG Key, 4142 _In_ KPROCESSOR_MODE RequestorMode); 4143 4144 _IRQL_requires_max_(DISPATCH_LEVEL) 4145 KSDDKAPI 4146 VOID 4147 NTAPI 4148 KsReleaseDevice( 4149 _In_ PKSDEVICE); 4150 4151 _IRQL_requires_max_(DISPATCH_LEVEL) 4152 KSDDKAPI 4153 VOID 4154 NTAPI 4155 KsReleaseIrpOnCancelableQueue( 4156 _In_ PIRP Irp, 4157 _In_opt_ PDRIVER_CANCEL DriverCancel); 4158 4159 _IRQL_requires_max_(DISPATCH_LEVEL) 4160 KSDDKAPI 4161 PIRP 4162 NTAPI 4163 KsRemoveIrpFromCancelableQueue( 4164 _Inout_ PLIST_ENTRY QueueHead, 4165 _In_ PKSPIN_LOCK SpinLock, 4166 _In_ KSLIST_ENTRY_LOCATION ListLocation, 4167 _In_ KSIRP_REMOVAL_OPERATION RemovalOperation); 4168 4169 _IRQL_requires_max_(DISPATCH_LEVEL) 4170 KSDDKAPI 4171 VOID 4172 NTAPI 4173 KsRemoveSpecificIrpFromCancelableQueue( 4174 _In_ PIRP Irp); 4175 4176 _IRQL_requires_max_(PASSIVE_LEVEL) 4177 KSDDKAPI 4178 NTSTATUS 4179 NTAPI 4180 KsSetInformationFile( 4181 _In_ PFILE_OBJECT FileObject, 4182 _In_reads_bytes_(Length) PVOID FileInformation, 4183 _In_ ULONG Length, 4184 _In_ FILE_INFORMATION_CLASS FileInformationClass); 4185 4186 _IRQL_requires_max_(PASSIVE_LEVEL) 4187 KSDDKAPI 4188 NTSTATUS 4189 NTAPI 4190 KsSetMajorFunctionHandler( 4191 _In_ PDRIVER_OBJECT DriverObject, 4192 _In_ ULONG MajorFunction); 4193 4194 _Check_return_ 4195 _IRQL_requires_max_(PASSIVE_LEVEL) 4196 KSDDKAPI 4197 NTSTATUS 4198 NTAPI 4199 KsStreamIo( 4200 _In_ PFILE_OBJECT FileObject, 4201 _In_opt_ PKEVENT Event, 4202 _In_opt_ PVOID PortContext, 4203 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine, 4204 _In_opt_ PVOID CompletionContext, 4205 _In_opt_ KSCOMPLETION_INVOCATION CompletionInvocationFlags, 4206 _Out_ PIO_STATUS_BLOCK IoStatusBlock, 4207 _Inout_updates_bytes_(Length) PVOID StreamHeaders, 4208 _In_ ULONG Length, 4209 _In_ ULONG Flags, 4210 _In_ KPROCESSOR_MODE RequestorMode); 4211 4212 _IRQL_requires_max_(DISPATCH_LEVEL) 4213 KSDDKAPI 4214 VOID 4215 NTAPI 4216 KsStreamPointerUnlock( 4217 _In_ PKSSTREAM_POINTER StreamPointer, 4218 _In_ BOOLEAN Eject); 4219 4220 _IRQL_requires_max_(DISPATCH_LEVEL) 4221 KSDDKAPI 4222 NTSTATUS 4223 NTAPI 4224 KsStreamPointerAdvanceOffsets( 4225 _In_ PKSSTREAM_POINTER StreamPointer, 4226 _In_ ULONG InUsed, 4227 _In_ ULONG OutUsed, 4228 _In_ BOOLEAN Eject); 4229 4230 _Check_return_ 4231 _IRQL_requires_max_(DISPATCH_LEVEL) 4232 KSDDKAPI 4233 NTSTATUS 4234 NTAPI 4235 KsStreamPointerAdvance( 4236 _In_ PKSSTREAM_POINTER StreamPointer); 4237 4238 _IRQL_requires_max_(DISPATCH_LEVEL) 4239 KSDDKAPI 4240 VOID 4241 NTAPI 4242 KsStreamPointerAdvanceOffsetsAndUnlock( 4243 _In_ PKSSTREAM_POINTER StreamPointer, 4244 _In_ ULONG InUsed, 4245 _In_ ULONG OutUsed, 4246 _In_ BOOLEAN Eject 4247 ); 4248 4249 4250 _IRQL_requires_max_(PASSIVE_LEVEL) 4251 KSDDKAPI 4252 NTSTATUS 4253 NTAPI 4254 KsWriteFile( 4255 _In_ PFILE_OBJECT FileObject, 4256 _In_opt_ PKEVENT Event, 4257 _In_opt_ PVOID PortContext, 4258 _Out_ PIO_STATUS_BLOCK IoStatusBlock, 4259 _In_reads_bytes_(Length) PVOID Buffer, 4260 _In_ ULONG Length, 4261 _In_opt_ ULONG Key, 4262 _In_ KPROCESSOR_MODE RequestorMode); 4263 4264 KSDDKAPI 4265 NTSTATUS 4266 NTAPI 4267 KsDefaultForwardIrp( 4268 _In_ PDEVICE_OBJECT DeviceObject, 4269 _In_ PIRP Irp); 4270 4271 /* =============================================================== 4272 Worker Management Functions 4273 */ 4274 4275 _IRQL_requires_max_(PASSIVE_LEVEL) 4276 KSDDKAPI 4277 NTSTATUS 4278 NTAPI 4279 KsRegisterWorker( 4280 _In_ WORK_QUEUE_TYPE WorkQueueType, 4281 _Out_ PKSWORKER* Worker); 4282 4283 _IRQL_requires_max_(PASSIVE_LEVEL) 4284 KSDDKAPI 4285 VOID 4286 NTAPI 4287 KsUnregisterWorker( 4288 _In_ PKSWORKER Worker); 4289 4290 _IRQL_requires_max_(PASSIVE_LEVEL) 4291 KSDDKAPI 4292 NTSTATUS 4293 NTAPI 4294 KsRegisterCountedWorker( 4295 _In_ WORK_QUEUE_TYPE WorkQueueType, 4296 _In_ PWORK_QUEUE_ITEM CountedWorkItem, 4297 _Out_ PKSWORKER *Worker); 4298 4299 _IRQL_requires_max_(PASSIVE_LEVEL) 4300 KSDDKAPI 4301 ULONG 4302 NTAPI 4303 KsDecrementCountedWorker( 4304 _In_ PKSWORKER Worker); 4305 4306 _IRQL_requires_max_(PASSIVE_LEVEL) 4307 KSDDKAPI 4308 ULONG 4309 NTAPI 4310 KsIncrementCountedWorker( 4311 _In_ PKSWORKER Worker); 4312 4313 _IRQL_requires_max_(DISPATCH_LEVEL) 4314 KSDDKAPI 4315 NTSTATUS 4316 NTAPI 4317 KsQueueWorkItem( 4318 _In_ PKSWORKER Worker, 4319 _In_ PWORK_QUEUE_ITEM WorkItem); 4320 4321 /* =============================================================== 4322 Resources / Images 4323 */ 4324 4325 _IRQL_requires_max_(PASSIVE_LEVEL) 4326 KSDDKAPI 4327 NTSTATUS 4328 NTAPI 4329 KsLoadResource( 4330 _In_ PVOID ImageBase, 4331 _In_ POOL_TYPE PoolType, 4332 _In_ ULONG_PTR ResourceName, 4333 _In_ ULONG ResourceType, 4334 _Outptr_result_bytebuffer_(*ResourceSize) PVOID *Resource, 4335 _Out_opt_ PULONG ResourceSize); 4336 4337 _IRQL_requires_max_(PASSIVE_LEVEL) 4338 KSDDKAPI 4339 NTSTATUS 4340 NTAPI 4341 KsGetImageNameAndResourceId( 4342 _In_ HANDLE RegKey, 4343 _Out_ PUNICODE_STRING ImageName, 4344 _Out_ PULONG_PTR ResourceId, 4345 _Out_ PULONG ValueType); 4346 4347 _IRQL_requires_max_(PASSIVE_LEVEL) 4348 KSDDKAPI 4349 NTSTATUS 4350 NTAPI 4351 KsMapModuleName( 4352 _In_ PDEVICE_OBJECT PhysicalDeviceObject, 4353 _In_ PUNICODE_STRING ModuleName, 4354 _Out_ PUNICODE_STRING ImageName, 4355 _Out_ PULONG_PTR ResourceId, 4356 _Out_ PULONG ValueType); 4357 4358 /* =============================================================== 4359 Misc. Helper Functions 4360 */ 4361 4362 _IRQL_requires_max_(PASSIVE_LEVEL) 4363 KSDDKAPI 4364 PVOID 4365 NTAPI 4366 KsGetNextSibling( 4367 _In_ PVOID Object); 4368 4369 _IRQL_requires_max_(PASSIVE_LEVEL) 4370 KSDDKAPI 4371 NTSTATUS 4372 NTAPI 4373 KsCacheMedium( 4374 _In_ PUNICODE_STRING SymbolicLink, 4375 _In_ PKSPIN_MEDIUM Medium, 4376 _In_ ULONG PinDirection); 4377 4378 KSDDKAPI 4379 NTSTATUS 4380 NTAPI 4381 KsDefaultDispatchPnp( 4382 _In_ PDEVICE_OBJECT DeviceObject, 4383 _In_ PIRP Irp); 4384 4385 _IRQL_requires_max_(PASSIVE_LEVEL) 4386 KSDDKAPI 4387 VOID 4388 NTAPI 4389 KsSetDevicePnpAndBaseObject( 4390 _In_ KSDEVICE_HEADER Header, 4391 _In_ PDEVICE_OBJECT PnpDeviceObject, 4392 _In_ PDEVICE_OBJECT BaseDevice); 4393 4394 KSDDKAPI 4395 NTSTATUS 4396 NTAPI 4397 KsDefaultDispatchPower( 4398 _In_ PDEVICE_OBJECT DeviceObject, 4399 _In_ PIRP Irp); 4400 4401 _IRQL_requires_max_(PASSIVE_LEVEL) 4402 KSDDKAPI 4403 VOID 4404 NTAPI 4405 KsSetPowerDispatch( 4406 _In_ KSOBJECT_HEADER Header, 4407 _In_opt_ PFNKSCONTEXT_DISPATCH PowerDispatch, 4408 _In_opt_ PVOID PowerContext); 4409 4410 _IRQL_requires_max_(PASSIVE_LEVEL) 4411 KSDDKAPI 4412 NTSTATUS 4413 NTAPI 4414 KsReferenceBusObject( 4415 _In_ KSDEVICE_HEADER Header); 4416 4417 _IRQL_requires_max_(PASSIVE_LEVEL) 4418 KSDDKAPI 4419 VOID 4420 NTAPI 4421 KsDereferenceBusObject( 4422 _In_ KSDEVICE_HEADER Header); 4423 4424 _IRQL_requires_max_(PASSIVE_LEVEL) 4425 KSDDKAPI 4426 NTSTATUS 4427 NTAPI 4428 KsFreeObjectCreateItem( 4429 _In_ KSDEVICE_HEADER Header, 4430 _In_ PUNICODE_STRING CreateItem); 4431 4432 _IRQL_requires_max_(PASSIVE_LEVEL) 4433 KSDDKAPI 4434 NTSTATUS 4435 NTAPI 4436 KsFreeObjectCreateItemsByContext( 4437 _In_ KSDEVICE_HEADER Header, 4438 _In_ PVOID Context); 4439 4440 _IRQL_requires_max_(PASSIVE_LEVEL) 4441 KSDDKAPI 4442 VOID 4443 NTAPI 4444 KsNullDriverUnload( 4445 _In_ PDRIVER_OBJECT DriverObject); 4446 4447 _IRQL_requires_max_(PASSIVE_LEVEL) 4448 KSDDKAPI 4449 PDEVICE_OBJECT 4450 NTAPI 4451 KsQueryDevicePnpObject( 4452 _In_ KSDEVICE_HEADER Header); 4453 4454 _IRQL_requires_max_(PASSIVE_LEVEL) 4455 KSDDKAPI 4456 VOID 4457 NTAPI 4458 KsRecalculateStackDepth( 4459 _In_ KSDEVICE_HEADER Header, 4460 _In_ BOOLEAN ReuseStackLocation); 4461 4462 _IRQL_requires_max_(PASSIVE_LEVEL) 4463 KSDDKAPI 4464 VOID 4465 NTAPI 4466 KsSetTargetDeviceObject( 4467 _In_ KSOBJECT_HEADER Header, 4468 _In_opt_ PDEVICE_OBJECT TargetDevice); 4469 4470 _IRQL_requires_max_(PASSIVE_LEVEL) 4471 KSDDKAPI 4472 VOID 4473 NTAPI 4474 KsSetTargetState( 4475 _In_ KSOBJECT_HEADER Header, 4476 _In_ KSTARGET_STATE TargetState); 4477 4478 _Must_inspect_result_ 4479 _IRQL_requires_max_(PASSIVE_LEVEL) 4480 KSDDKAPI 4481 NTSTATUS 4482 NTAPI 4483 KsSynchronousIoControlDevice( 4484 _In_ PFILE_OBJECT FileObject, 4485 _In_ KPROCESSOR_MODE RequestorMode, 4486 _In_ ULONG IoControl, 4487 _In_reads_bytes_(InSize) PVOID InBuffer, 4488 _In_ ULONG InSize, 4489 _Out_writes_bytes_to_(OutSize, *BytesReturned) PVOID OutBuffer, 4490 _In_ ULONG OutSize, 4491 _Out_ PULONG BytesReturned); 4492 4493 _IRQL_requires_max_(PASSIVE_LEVEL) 4494 KSDDKAPI 4495 PKSPIN 4496 NTAPI 4497 KsFilterGetFirstChildPin( 4498 _In_ PKSFILTER Filter, 4499 _In_ ULONG PinId); 4500 4501 _IRQL_requires_max_(PASSIVE_LEVEL) 4502 KSDDKAPI 4503 PFILE_OBJECT 4504 NTAPI 4505 KsPinGetConnectedPinFileObject( 4506 _In_ PKSPIN Pin); 4507 4508 #else /* _NTDDK_ */ 4509 4510 #if !defined( KS_NO_CREATE_FUNCTIONS ) 4511 4512 _IRQL_requires_max_(PASSIVE_LEVEL) 4513 KSDDKAPI 4514 DWORD 4515 WINAPI 4516 KsCreateAllocator( 4517 _In_ HANDLE ConnectionHandle, 4518 _In_ PKSALLOCATOR_FRAMING AllocatorFraming, 4519 _Out_ PHANDLE AllocatorHandle); 4520 4521 _IRQL_requires_max_(PASSIVE_LEVEL) 4522 KSDDKAPI 4523 DWORD 4524 NTAPI 4525 KsCreateClock( 4526 _In_ HANDLE ConnectionHandle, 4527 _In_ PKSCLOCK_CREATE ClockCreate, 4528 _Out_ PHANDLE ClockHandle); 4529 4530 _IRQL_requires_max_(PASSIVE_LEVEL) 4531 KSDDKAPI 4532 DWORD 4533 WINAPI 4534 KsCreatePin( 4535 _In_ HANDLE FilterHandle, 4536 _In_ PKSPIN_CONNECT Connect, 4537 _In_ ACCESS_MASK DesiredAccess, 4538 _Out_ PHANDLE ConnectionHandle); 4539 4540 _IRQL_requires_max_(PASSIVE_LEVEL) 4541 KSDDKAPI 4542 DWORD 4543 WINAPI 4544 KsCreateTopologyNode( 4545 _In_ HANDLE ParentHandle, 4546 _In_ PKSNODE_CREATE NodeCreate, 4547 _In_ ACCESS_MASK DesiredAccess, 4548 _Out_ PHANDLE NodeHandle); 4549 4550 #endif 4551 4552 #endif /* _NTDDK_ */ 4553 4554 /* =============================================================== 4555 AVStream Functions (XP / DirectX 8) 4556 NOT IMPLEMENTED YET 4557 http://www.osronline.com/ddkx/stream/avstream_5q9f.htm 4558 */ 4559 4560 #if defined(_NTDDK_) 4561 4562 _IRQL_requires_max_(PASSIVE_LEVEL) 4563 KSDDKAPI 4564 NTSTATUS 4565 NTAPI 4566 KsMergeAutomationTables( 4567 _Out_ PKSAUTOMATION_TABLE *AutomationTableAB, 4568 _In_opt_ PKSAUTOMATION_TABLE AutomationTableA, 4569 _In_opt_ PKSAUTOMATION_TABLE AutomationTableB, 4570 _In_opt_ KSOBJECT_BAG Bag); 4571 4572 _Must_inspect_result_ 4573 _IRQL_requires_max_(PASSIVE_LEVEL) 4574 KSDDKAPI 4575 NTSTATUS 4576 NTAPI 4577 KsInitializeDriver( 4578 _In_ PDRIVER_OBJECT DriverObject, 4579 _In_ PUNICODE_STRING RegistryPath, 4580 _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor); 4581 4582 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME 4583 4584 _IRQL_requires_max_(PASSIVE_LEVEL) 4585 KSDDKAPI 4586 NTSTATUS 4587 NTAPI 4588 KsInitializeDevice ( 4589 _In_ PDEVICE_OBJECT FunctionalDeviceObject, 4590 _In_ PDEVICE_OBJECT PhysicalDeviceObject, 4591 _In_ PDEVICE_OBJECT NextDeviceObject, 4592 _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor); 4593 4594 _IRQL_requires_max_(PASSIVE_LEVEL) 4595 typedef void 4596 (NTAPI *PFNKSFILTERFACTORYPOWER)( 4597 _In_ PKSFILTERFACTORY FilterFactory, 4598 _In_ DEVICE_POWER_STATE State); 4599 4600 _Must_inspect_result_ 4601 _IRQL_requires_max_(PASSIVE_LEVEL) 4602 KSDDKAPI 4603 NTSTATUS 4604 NTAPI 4605 _KsEdit( 4606 _In_ KSOBJECT_BAG ObjectBag, 4607 _Inout_ PVOID *PointerToPointerToItem, 4608 _In_ ULONG NewSize, 4609 _In_ ULONG OldSize, 4610 _In_ ULONG Tag); 4611 4612 _IRQL_requires_max_(PASSIVE_LEVEL) 4613 KSDDKAPI 4614 VOID 4615 NTAPI 4616 KsAcquireControl( 4617 _In_ PVOID Object); 4618 4619 _IRQL_requires_max_(PASSIVE_LEVEL) 4620 KSDDKAPI 4621 VOID 4622 NTAPI 4623 KsAcquireDevice( 4624 _In_ PKSDEVICE Device); 4625 4626 _IRQL_requires_max_(PASSIVE_LEVEL) 4627 KSDDKAPI 4628 NTSTATUS 4629 NTAPI 4630 KsAddDevice( 4631 _In_ PDRIVER_OBJECT DriverObject, 4632 _In_ PDEVICE_OBJECT PhysicalDeviceObject); 4633 4634 _IRQL_requires_max_(PASSIVE_LEVEL) 4635 KSDDKAPI 4636 VOID 4637 NTAPI 4638 KsAddEvent( 4639 _In_ PVOID Object, 4640 _In_ PKSEVENT_ENTRY EventEntry); 4641 4642 _Must_inspect_result_ 4643 _IRQL_requires_max_(PASSIVE_LEVEL) 4644 KSDDKAPI 4645 NTSTATUS 4646 NTAPI 4647 KsAddItemToObjectBag( 4648 _In_ KSOBJECT_BAG ObjectBag, 4649 _In_ __drv_aliasesMem PVOID Item, 4650 _In_opt_ PFNKSFREE Free); 4651 4652 _IRQL_requires_max_(PASSIVE_LEVEL) 4653 KSDDKAPI 4654 ULONG 4655 NTAPI 4656 KsRemoveItemFromObjectBag( 4657 _In_ KSOBJECT_BAG ObjectBag, 4658 _In_ PVOID Item, 4659 _In_ BOOLEAN Free); 4660 4661 _IRQL_requires_max_(PASSIVE_LEVEL) 4662 KSDDKAPI 4663 NTSTATUS 4664 NTAPI 4665 KsAllocateObjectBag( 4666 _In_ PKSDEVICE Device, 4667 _Out_ KSOBJECT_BAG *ObjectBag); 4668 4669 _IRQL_requires_max_(PASSIVE_LEVEL) 4670 KSDDKAPI 4671 VOID 4672 NTAPI 4673 KsFreeObjectBag( 4674 _In_ KSOBJECT_BAG ObjectBag); 4675 4676 _IRQL_requires_max_(DISPATCH_LEVEL) 4677 KSDDKAPI 4678 VOID 4679 NTAPI 4680 KsCompletePendingRequest( 4681 _In_ PIRP Irp); 4682 4683 _IRQL_requires_max_(PASSIVE_LEVEL) 4684 KSDDKAPI 4685 NTSTATUS 4686 NTAPI 4687 KsCopyObjectBagItems( 4688 _In_ KSOBJECT_BAG ObjectBagDestination, 4689 _In_ KSOBJECT_BAG ObjectBagSource); 4690 4691 _IRQL_requires_max_(PASSIVE_LEVEL) 4692 KSDDKAPI 4693 NTSTATUS 4694 NTAPI 4695 KsCreateDevice( 4696 _In_ PDRIVER_OBJECT DriverObject, 4697 _In_ PDEVICE_OBJECT PhysicalDeviceObject, 4698 _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor, 4699 _In_ ULONG ExtensionSize, 4700 _Out_opt_ PKSDEVICE *Device); 4701 4702 _Must_inspect_result_ 4703 _IRQL_requires_max_(PASSIVE_LEVEL) 4704 KSDDKAPI 4705 NTSTATUS 4706 NTAPI 4707 KsCreateFilterFactory( 4708 _In_ PDEVICE_OBJECT DeviceObject, 4709 _In_ const KSFILTER_DESCRIPTOR *Descriptor, 4710 _In_opt_ PWSTR RefString, 4711 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, 4712 _In_ ULONG CreateItemFlags, 4713 _In_opt_ PFNKSFILTERFACTORYPOWER SleepCallback, 4714 _In_opt_ PFNKSFILTERFACTORYPOWER WakeCallback, 4715 _Out_opt_ PKSFILTERFACTORY *FilterFactory); 4716 4717 _IRQL_requires_max_(PASSIVE_LEVEL) 4718 KSDDKAPI 4719 NTSTATUS 4720 NTAPI 4721 KsFilterFactorySetDeviceClassesState( 4722 _In_ PKSFILTERFACTORY FilterFactory, 4723 _In_ BOOLEAN NewState); 4724 4725 _Must_inspect_result_ 4726 _IRQL_requires_max_(PASSIVE_LEVEL) 4727 KSDDKAPI 4728 NTSTATUS 4729 NTAPI 4730 KsFilterFactoryUpdateCacheData( 4731 _In_ PKSFILTERFACTORY FilterFactory, 4732 _In_opt_ const KSFILTER_DESCRIPTOR *FilterDescriptor); 4733 4734 _IRQL_requires_max_(DISPATCH_LEVEL) 4735 KSDDKAPI 4736 PKSPIN 4737 NTAPI 4738 KsGetPinFromIrp( 4739 _In_ PIRP Irp); 4740 4741 _IRQL_requires_max_(DISPATCH_LEVEL) 4742 KSDDKAPI 4743 PKSFILTER 4744 NTAPI 4745 KsGetFilterFromIrp( 4746 _In_ PIRP Irp); 4747 4748 _IRQL_requires_max_(PASSIVE_LEVEL) 4749 KSDDKAPI 4750 NTSTATUS 4751 NTAPI 4752 KsDefaultAddEventHandler( 4753 _In_ PIRP Irp, 4754 _In_ PKSEVENTDATA EventData, 4755 _Inout_ PKSEVENT_ENTRY EventEntry); 4756 4757 _IRQL_requires_max_(PASSIVE_LEVEL) 4758 KSDDKAPI 4759 NTSTATUS 4760 NTAPI 4761 KsDispatchQuerySecurity( 4762 _In_ PDEVICE_OBJECT DeviceObject, 4763 _In_ PIRP Irp); 4764 4765 _IRQL_requires_max_(PASSIVE_LEVEL) 4766 KSDDKAPI 4767 NTSTATUS 4768 NTAPI 4769 KsDispatchSetSecurity( 4770 _In_ PDEVICE_OBJECT DeviceObject, 4771 _In_ PIRP Irp); 4772 4773 _IRQL_requires_max_(DISPATCH_LEVEL) 4774 KSDDKAPI 4775 VOID 4776 NTAPI 4777 KsPinAttemptProcessing( 4778 _In_ PKSPIN Pin, 4779 _In_ BOOLEAN Asynchronous); 4780 4781 _IRQL_requires_max_(PASSIVE_LEVEL) 4782 KSDDKAPI 4783 VOID 4784 NTAPI 4785 KsPinAcquireProcessingMutex( 4786 _In_ PKSPIN Pin); 4787 4788 _IRQL_requires_max_(PASSIVE_LEVEL) 4789 KSDDKAPI 4790 VOID 4791 NTAPI 4792 KsPinReleaseProcessingMutex( 4793 _In_ PKSPIN Pin); 4794 4795 _IRQL_requires_max_(PASSIVE_LEVEL) 4796 KSDDKAPI 4797 PVOID 4798 NTAPI 4799 KsGetParent( 4800 _In_ PVOID Object); 4801 4802 _IRQL_requires_max_(PASSIVE_LEVEL) 4803 static 4804 __inline 4805 PKSFILTERFACTORY 4806 KsFilterGetParentFilterFactory( 4807 _In_ PKSFILTER Filter) 4808 { 4809 return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); 4810 } 4811 4812 _IRQL_requires_max_(PASSIVE_LEVEL) 4813 static 4814 __inline 4815 PKSDEVICE 4816 KsFilterFactoryGetParentDevice( 4817 _In_ PKSFILTERFACTORY FilterFactory) 4818 { 4819 return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); 4820 } 4821 4822 #define KsDeleteFilterFactory(FilterFactory) \ 4823 KsFreeObjectCreateItemsByContext( \ 4824 *(KSDEVICE_HEADER *)( \ 4825 KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject-> \ 4826 DeviceExtension), \ 4827 FilterFactory) 4828 4829 _IRQL_requires_max_(PASSIVE_LEVEL) 4830 KSDDKAPI 4831 ULONG 4832 NTAPI 4833 KsDeviceGetBusData( 4834 _In_ PKSDEVICE Device, 4835 _In_ ULONG DataType, 4836 _In_reads_bytes_(Length) PVOID Buffer, 4837 _In_ ULONG Offset, 4838 _In_ ULONG Length); 4839 4840 _IRQL_requires_max_(PASSIVE_LEVEL) 4841 KSDDKAPI 4842 PVOID 4843 NTAPI 4844 KsGetFirstChild( 4845 _In_ PVOID Object); 4846 4847 _IRQL_requires_max_(PASSIVE_LEVEL) 4848 KSDDKAPI 4849 PKSFILTERFACTORY 4850 NTAPI 4851 KsDeviceGetFirstChildFilterFactory( 4852 _In_ PKSDEVICE Device); 4853 4854 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) 4855 4856 _IRQL_requires_max_(PASSIVE_LEVEL) 4857 KSDDKAPI 4858 PUNKNOWN 4859 NTAPI 4860 KsGetOuterUnknown( 4861 _In_ PVOID Object); 4862 4863 _IRQL_requires_max_(PASSIVE_LEVEL) 4864 static 4865 __inline 4866 PUNKNOWN 4867 KsDeviceGetOuterUnknown( 4868 _In_ PKSDEVICE Device) 4869 { 4870 return KsGetOuterUnknown((PVOID) Device); 4871 } 4872 4873 _IRQL_requires_max_(PASSIVE_LEVEL) 4874 KSDDKAPI 4875 PUNKNOWN 4876 NTAPI 4877 KsDeviceRegisterAggregatedClientUnknown( 4878 _In_ PKSDEVICE Device, 4879 _In_ PUNKNOWN ClientUnknown); 4880 4881 #endif 4882 4883 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) 4884 4885 typedef interface IKsReferenceClock* PIKSREFERENCECLOCK; 4886 4887 #undef INTERFACE 4888 #define INTERFACE IKsReferenceClock 4889 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) 4890 { 4891 DEFINE_ABSTRACT_UNKNOWN() // For C 4892 4893 STDMETHOD_(LONGLONG,GetTime)(THIS 4894 ) PURE; 4895 STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS 4896 ) PURE; 4897 STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ 4898 _Out_ PLONGLONG SystemTime 4899 ) PURE; 4900 STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ 4901 _Out_ PLONGLONG SystemTime 4902 ) PURE; 4903 STDMETHOD_(NTSTATUS, GetResolution)(THIS_ 4904 _Out_ PKSRESOLUTION Resolution 4905 ) PURE; 4906 STDMETHOD_(NTSTATUS, GetState)(THIS_ 4907 _Out_ PKSSTATE State 4908 ) PURE; 4909 }; 4910 4911 #undef INTERFACE 4912 #define INTERFACE IKsControl 4913 4914 DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); 4915 4916 DECLARE_INTERFACE_(IKsControl,IUnknown) 4917 { 4918 STDMETHOD_(NTSTATUS, QueryInterface)( THIS_ 4919 REFIID InterfaceId, 4920 PVOID* Interface)PURE; 4921 4922 STDMETHOD_(ULONG, AddRef)(THIS) PURE; 4923 4924 STDMETHOD_(ULONG, Release)(THIS) PURE; 4925 4926 STDMETHOD_(NTSTATUS, KsProperty)(THIS_ 4927 _In_reads_bytes_(PropertyLength) PKSPROPERTY Property, 4928 _In_ ULONG PropertyLength, 4929 _Inout_updates_bytes_(DataLength) PVOID PropertyData, 4930 _In_ ULONG DataLength, 4931 _Out_ ULONG *BytesReturned 4932 ) PURE; 4933 STDMETHOD_(NTSTATUS, KsMethod)(THIS_ 4934 _In_reads_bytes_(MethodLength) PKSMETHOD Method, 4935 _In_ ULONG MethodLength, 4936 _Inout_updates_bytes_(DataLength) PVOID MethodData, 4937 _In_ ULONG DataLength, 4938 _Out_ ULONG *BytesReturned 4939 ) PURE; 4940 STDMETHOD_(NTSTATUS, KsEvent)(THIS_ 4941 _In_reads_bytes_opt_(EventLength) PKSEVENT Event, 4942 _In_ ULONG EventLength, 4943 _Inout_updates_bytes_(DataLength) PVOID EventData, 4944 _In_ ULONG DataLength, 4945 _Out_ ULONG *BytesReturned 4946 ) PURE; 4947 }; 4948 4949 #undef INTERFACE 4950 typedef IKsControl* PIKSCONTROL; 4951 4952 #endif 4953 4954 _IRQL_requires_max_(PASSIVE_LEVEL) 4955 KSDDKAPI 4956 VOID 4957 NTAPI 4958 KsDeviceRegisterAdapterObject( 4959 _In_ PKSDEVICE Device, 4960 _In_ PADAPTER_OBJECT AdapterObject, 4961 _In_ ULONG MaxMappingByteCount, 4962 _In_ ULONG MappingTableStride); 4963 4964 _IRQL_requires_max_(PASSIVE_LEVEL) 4965 KSDDKAPI 4966 ULONG 4967 NTAPI 4968 KsDeviceSetBusData( 4969 _In_ PKSDEVICE Device, 4970 _In_ ULONG DataType, 4971 _In_reads_bytes_(Length) PVOID Buffer, 4972 _In_ ULONG Offset, 4973 _In_ ULONG Length); 4974 4975 _IRQL_requires_max_(PASSIVE_LEVEL) 4976 KSDDKAPI 4977 VOID 4978 NTAPI 4979 KsReleaseControl( 4980 _In_ PVOID Object); 4981 4982 #define KsDiscard(object, pointer) \ 4983 KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE) 4984 4985 #define KsFilterAcquireControl(Filter) \ 4986 KsAcquireControl((PVOID) Filter); 4987 4988 #define KsFilterReleaseControl(Filter) \ 4989 KsReleaseControl((PVOID) Filter); 4990 4991 #define KsFilterAddEvent(Filter, EventEntry) \ 4992 KsAddEvent(Filter,EventEntry); 4993 4994 _IRQL_requires_max_(PASSIVE_LEVEL) 4995 KSDDKAPI 4996 VOID 4997 NTAPI 4998 KsFilterAcquireProcessingMutex( 4999 _In_ PKSFILTER Filter); 5000 5001 _IRQL_requires_max_(PASSIVE_LEVEL) 5002 KSDDKAPI 5003 NTSTATUS 5004 NTAPI 5005 KsFilterAddTopologyConnections( 5006 _In_ PKSFILTER Filter, 5007 _In_ ULONG NewConnectionsCount, 5008 _In_reads_(NewConnectionsCount) const KSTOPOLOGY_CONNECTION *const NewTopologyConnections); 5009 5010 _IRQL_requires_max_(DISPATCH_LEVEL) 5011 KSDDKAPI 5012 VOID 5013 NTAPI 5014 KsFilterAttemptProcessing( 5015 _In_ PKSFILTER Filter, 5016 _In_ BOOLEAN Asynchronous); 5017 5018 _IRQL_requires_max_(PASSIVE_LEVEL) 5019 KSDDKAPI 5020 NTSTATUS 5021 NTAPI 5022 KsFilterCreateNode( 5023 _In_ PKSFILTER Filter, 5024 _In_ const KSNODE_DESCRIPTOR *const NodeDescriptor, 5025 _Out_ PULONG NodeID); 5026 5027 _IRQL_requires_max_(PASSIVE_LEVEL) 5028 KSDDKAPI 5029 NTSTATUS 5030 NTAPI 5031 KsFilterCreatePinFactory( 5032 _In_ PKSFILTER Filter, 5033 _In_ const KSPIN_DESCRIPTOR_EX *const PinDescriptor, 5034 _Out_ PULONG PinID); 5035 5036 _IRQL_requires_max_(PASSIVE_LEVEL) 5037 KSDDKAPI 5038 PKSDEVICE 5039 NTAPI 5040 KsGetDevice( 5041 _In_ PVOID Object); 5042 5043 _IRQL_requires_max_(PASSIVE_LEVEL) 5044 static 5045 __inline 5046 PKSDEVICE 5047 KsFilterFactoryGetDevice( 5048 _In_ PKSFILTERFACTORY FilterFactory) 5049 { 5050 return KsGetDevice((PVOID)FilterFactory); 5051 } 5052 5053 /* etc. */ 5054 #endif /* avstream */ 5055 5056 #ifdef __cplusplus 5057 } 5058 #endif 5059 5060 #endif /* _KS_ */ 5061