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