ks.h (121734B) - Raw
1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6 #ifndef _KS_ 7 #define _KS_ 8 9 #ifdef __TCS__ 10 #define _KS_NO_ANONYMOUS_STRUCTURES_ 1 11 #endif 12 13 #ifdef _KS_NO_ANONYMOUS_STRUCTURES_ 14 #define _KS_ANON_STRUCT(X) struct X 15 #else 16 #define _KS_ANON_STRUCT(X) __C89_NAMELESS struct 17 #endif 18 19 #ifndef _NTRTL_ 20 #ifndef DEFINE_GUIDEX 21 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name 22 #endif 23 #ifndef STATICGUIDOF 24 #define STATICGUIDOF(guid) STATIC_##guid 25 #endif 26 #endif /* _NTRTL_ */ 27 28 #ifndef SIZEOF_ARRAY 29 #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0])) 30 #endif 31 32 #define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n) 33 #define DEFINE_GUIDNAMED(n) n 34 35 #define STATIC_GUID_NULL \ 36 0x00000000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 37 38 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000",GUID_NULL); 39 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) 40 41 #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS,0x000,METHOD_NEITHER,FILE_ANY_ACCESS) 42 #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x001,METHOD_NEITHER,FILE_ANY_ACCESS) 43 #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x002,METHOD_NEITHER,FILE_ANY_ACCESS) 44 #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS,0x003,METHOD_NEITHER,FILE_ANY_ACCESS) 45 #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS,0x004,METHOD_NEITHER,FILE_WRITE_ACCESS) 46 #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS,0x005,METHOD_NEITHER,FILE_READ_ACCESS) 47 #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS,0x006,METHOD_NEITHER,FILE_ANY_ACCESS) 48 49 typedef enum { 50 KSRESET_BEGIN, 51 KSRESET_END 52 } KSRESET; 53 54 typedef enum { 55 KSSTATE_STOP, 56 KSSTATE_ACQUIRE, 57 KSSTATE_PAUSE, 58 KSSTATE_RUN 59 } KSSTATE,*PKSSTATE; 60 61 #define KSPRIORITY_LOW 0x00000001 62 #define KSPRIORITY_NORMAL 0x40000000 63 #define KSPRIORITY_HIGH 0x80000000 64 #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF 65 66 typedef struct { 67 ULONG PriorityClass; 68 ULONG PrioritySubClass; 69 } KSPRIORITY,*PKSPRIORITY; 70 71 typedef struct { 72 __C89_NAMELESS union { 73 _KS_ANON_STRUCT(_IDENTIFIER) 74 { 75 GUID Set; 76 ULONG Id; 77 ULONG Flags; 78 }; 79 LONGLONG Alignment; 80 }; 81 } KSIDENTIFIER,*PKSIDENTIFIER; 82 83 typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT; 84 85 #define KSMETHOD_TYPE_NONE 0x00000000 86 #define KSMETHOD_TYPE_READ 0x00000001 87 #define KSMETHOD_TYPE_WRITE 0x00000002 88 #define KSMETHOD_TYPE_MODIFY 0x00000003 89 #define KSMETHOD_TYPE_SOURCE 0x00000004 90 91 #define KSMETHOD_TYPE_SEND 0x00000001 92 #define KSMETHOD_TYPE_SETSUPPORT 0x00000100 93 #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 94 95 #define KSMETHOD_TYPE_TOPOLOGY 0x10000000 96 97 #define KSPROPERTY_TYPE_GET 0x00000001 98 #define KSPROPERTY_TYPE_SET 0x00000002 99 #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 100 #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 101 #define KSPROPERTY_TYPE_RELATIONS 0x00000400 102 #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 103 #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 104 #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 105 #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 106 #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 107 #define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 108 109 #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 110 111 typedef struct { 112 KSPROPERTY Property; 113 ULONG NodeId; 114 ULONG Reserved; 115 } KSP_NODE,*PKSP_NODE; 116 117 typedef struct { 118 KSMETHOD Method; 119 ULONG NodeId; 120 ULONG Reserved; 121 } KSM_NODE,*PKSM_NODE; 122 123 typedef struct { 124 KSEVENT Event; 125 ULONG NodeId; 126 ULONG Reserved; 127 } KSE_NODE,*PKSE_NODE; 128 129 #define STATIC_KSPROPTYPESETID_General \ 130 0x97E99BA0,0xBDEA,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 131 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000",KSPROPTYPESETID_General); 132 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) 133 134 #if defined(_NTDDK_) 135 #include <psdk_inc/_varenum.h> 136 #endif 137 138 typedef struct { 139 ULONG Size; 140 ULONG Count; 141 } KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM; 142 143 typedef struct { 144 ULONG AccessFlags; 145 ULONG DescriptionSize; 146 KSIDENTIFIER PropTypeSet; 147 ULONG MembersListCount; 148 ULONG Reserved; 149 } KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION; 150 151 #define KSPROPERTY_MEMBER_RANGES 0x00000001 152 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 153 #define KSPROPERTY_MEMBER_VALUES 0x00000003 154 155 #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 156 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002 157 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004 158 159 typedef struct { 160 ULONG MembersFlags; 161 ULONG MembersSize; 162 ULONG MembersCount; 163 ULONG Flags; 164 } KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER; 165 166 typedef union { 167 _KS_ANON_STRUCT(_SIGNED) 168 { 169 LONG SignedMinimum; 170 LONG SignedMaximum; 171 }; 172 _KS_ANON_STRUCT(_UNSIGNED) 173 { 174 ULONG UnsignedMinimum; 175 ULONG UnsignedMaximum; 176 }; 177 } KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG; 178 179 typedef union { 180 _KS_ANON_STRUCT(_SIGNED64) 181 { 182 LONGLONG SignedMinimum; 183 LONGLONG SignedMaximum; 184 }; 185 _KS_ANON_STRUCT(_UNSIGNED64) 186 { 187 DWORDLONG UnsignedMinimum; 188 DWORDLONG UnsignedMaximum; 189 }; 190 } KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG; 191 192 typedef struct { 193 ULONG SteppingDelta; 194 ULONG Reserved; 195 KSPROPERTY_BOUNDS_LONG Bounds; 196 } KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG; 197 198 typedef struct { 199 DWORDLONG SteppingDelta; 200 KSPROPERTY_BOUNDS_LONGLONG Bounds; 201 } KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG; 202 203 #if defined(_NTDDK_) 204 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; 205 typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; 206 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE; 207 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; 208 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; 209 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; 210 typedef struct _KSFILTER KSFILTER, *PKSFILTER; 211 typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; 212 typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH; 213 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; 214 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; 215 typedef struct _KSPIN KSPIN, *PKSPIN; 216 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; 217 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; 218 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER; 219 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING; 220 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN; 221 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; 222 #endif /* _NTDDK_ */ 223 224 typedef PVOID PKSWORKER; 225 226 227 typedef struct { 228 ULONG NotificationType; 229 __C89_NAMELESS union { 230 struct { 231 HANDLE Event; 232 ULONG_PTR Reserved[2]; 233 } EventHandle; 234 struct { 235 HANDLE Semaphore; 236 ULONG Reserved; 237 LONG Adjustment; 238 } SemaphoreHandle; 239 #if defined(_NTDDK_) 240 struct { 241 PVOID Event; 242 KPRIORITY Increment; 243 ULONG_PTR Reserved; 244 } EventObject; 245 struct { 246 PVOID Semaphore; 247 KPRIORITY Increment; 248 LONG Adjustment; 249 } SemaphoreObject; 250 struct { 251 PKDPC Dpc; 252 ULONG ReferenceCount; 253 ULONG_PTR Reserved; 254 } Dpc; 255 struct { 256 PWORK_QUEUE_ITEM WorkQueueItem; 257 WORK_QUEUE_TYPE WorkQueueType; 258 ULONG_PTR Reserved; 259 } WorkItem; 260 struct { 261 PWORK_QUEUE_ITEM WorkQueueItem; 262 PKSWORKER KsWorkerObject; 263 ULONG_PTR Reserved; 264 } KsWorkItem; 265 #endif /* _NTDDK_ */ 266 struct { 267 PVOID Unused; 268 LONG_PTR Alignment[2]; 269 } Alignment; 270 }; 271 } KSEVENTDATA,*PKSEVENTDATA; 272 273 #define KSEVENTF_EVENT_HANDLE 0x00000001 274 #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 275 #if defined(_NTDDK_) 276 #define KSEVENTF_EVENT_OBJECT 0x00000004 277 #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 278 #define KSEVENTF_DPC 0x00000010 279 #define KSEVENTF_WORKITEM 0x00000020 280 #define KSEVENTF_KSWORKITEM 0x00000080 281 #endif /* _NTDDK_ */ 282 283 #define KSEVENT_TYPE_ENABLE 0x00000001 284 #define KSEVENT_TYPE_ONESHOT 0x00000002 285 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 286 #define KSEVENT_TYPE_SETSUPPORT 0x00000100 287 #define KSEVENT_TYPE_BASICSUPPORT 0x00000200 288 #define KSEVENT_TYPE_QUERYBUFFER 0x00000400 289 290 #define KSEVENT_TYPE_TOPOLOGY 0x10000000 291 292 typedef struct { 293 KSEVENT Event; 294 PKSEVENTDATA EventData; 295 PVOID Reserved; 296 } KSQUERYBUFFER,*PKSQUERYBUFFER; 297 298 typedef struct { 299 ULONG Size; 300 ULONG Flags; 301 __C89_NAMELESS union { 302 HANDLE ObjectHandle; 303 PVOID ObjectPointer; 304 }; 305 PVOID Reserved; 306 KSEVENT Event; 307 KSEVENTDATA EventData; 308 } KSRELATIVEEVENT; 309 310 #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 311 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 312 313 typedef struct { 314 KSEVENTDATA EventData; 315 LONGLONG MarkTime; 316 } KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK; 317 318 typedef struct { 319 KSEVENTDATA EventData; 320 LONGLONG TimeBase; 321 LONGLONG Interval; 322 } KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL; 323 324 typedef struct { 325 LONGLONG TimeBase; 326 LONGLONG Interval; 327 } KSINTERVAL,*PKSINTERVAL; 328 329 #define STATIC_KSPROPSETID_General \ 330 0x1464EDA5,0x6A8F,0x11D1,0x9A,0xA7,0x00,0xA0,0xC9,0x22,0x31,0x96 331 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General); 332 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) 333 334 typedef enum { 335 KSPROPERTY_GENERAL_COMPONENTID 336 } KSPROPERTY_GENERAL; 337 338 typedef struct { 339 GUID Manufacturer; 340 GUID Product; 341 GUID Component; 342 GUID Name; 343 ULONG Version; 344 ULONG Revision; 345 } KSCOMPONENTID,*PKSCOMPONENTID; 346 347 #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler) \ 348 DEFINE_KSPROPERTY_ITEM( \ 349 KSPROPERTY_GENERAL_COMPONENTID, \ 350 (Handler), \ 351 sizeof(KSPROPERTY), \ 352 sizeof(KSCOMPONENTID), \ 353 NULL, NULL, 0, NULL, NULL, 0) 354 355 #define STATIC_KSMETHODSETID_StreamIo \ 356 0x65D003CA,0x1523,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 357 DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo); 358 #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo) 359 360 typedef enum { 361 KSMETHOD_STREAMIO_READ, 362 KSMETHOD_STREAMIO_WRITE 363 } KSMETHOD_STREAMIO; 364 365 #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler) \ 366 DEFINE_KSMETHOD_ITEM( \ 367 KSMETHOD_STREAMIO_READ, \ 368 KSMETHOD_TYPE_WRITE, \ 369 (Handler), \ 370 sizeof(KSMETHOD), \ 371 0, \ 372 NULL) 373 374 #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler) \ 375 DEFINE_KSMETHOD_ITEM( \ 376 KSMETHOD_STREAMIO_WRITE, \ 377 KSMETHOD_TYPE_READ, \ 378 (Handler), \ 379 sizeof(KSMETHOD), \ 380 0, \ 381 NULL) 382 383 #define STATIC_KSPROPSETID_MediaSeeking \ 384 0xEE904F0C,0xD09B,0x11D0,0xAB,0xE9,0x00,0xA0,0xC9,0x22,0x31,0x96 385 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking); 386 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) 387 388 typedef enum { 389 KSPROPERTY_MEDIASEEKING_CAPABILITIES, 390 KSPROPERTY_MEDIASEEKING_FORMATS, 391 KSPROPERTY_MEDIASEEKING_TIMEFORMAT, 392 KSPROPERTY_MEDIASEEKING_POSITION, 393 KSPROPERTY_MEDIASEEKING_STOPPOSITION, 394 KSPROPERTY_MEDIASEEKING_POSITIONS, 395 KSPROPERTY_MEDIASEEKING_DURATION, 396 KSPROPERTY_MEDIASEEKING_AVAILABLE, 397 KSPROPERTY_MEDIASEEKING_PREROLL, 398 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT 399 } KSPROPERTY_MEDIASEEKING; 400 401 typedef enum { 402 KS_SEEKING_NoPositioning, 403 KS_SEEKING_AbsolutePositioning, 404 KS_SEEKING_RelativePositioning, 405 KS_SEEKING_IncrementalPositioning, 406 KS_SEEKING_PositioningBitsMask = 0x3, 407 KS_SEEKING_SeekToKeyFrame, 408 KS_SEEKING_ReturnTime = 0x8 409 } KS_SEEKING_FLAGS; 410 411 typedef enum { 412 KS_SEEKING_CanSeekAbsolute = 0x1, 413 KS_SEEKING_CanSeekForwards = 0x2, 414 KS_SEEKING_CanSeekBackwards = 0x4, 415 KS_SEEKING_CanGetCurrentPos = 0x8, 416 KS_SEEKING_CanGetStopPos = 0x10, 417 KS_SEEKING_CanGetDuration = 0x20, 418 KS_SEEKING_CanPlayBackwards = 0x40 419 } KS_SEEKING_CAPABILITIES; 420 421 typedef struct { 422 LONGLONG Current; 423 LONGLONG Stop; 424 KS_SEEKING_FLAGS CurrentFlags; 425 KS_SEEKING_FLAGS StopFlags; 426 } KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS; 427 428 typedef struct { 429 LONGLONG Earliest; 430 LONGLONG Latest; 431 } KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE; 432 433 typedef struct { 434 KSPROPERTY Property; 435 GUID SourceFormat; 436 GUID TargetFormat; 437 LONGLONG Time; 438 } KSP_TIMEFORMAT,*PKSP_TIMEFORMAT; 439 440 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler) \ 441 DEFINE_KSPROPERTY_ITEM( \ 442 KSPROPERTY_MEDIASEEKING_CAPABILITIES, \ 443 (Handler), \ 444 sizeof(KSPROPERTY), \ 445 sizeof(KS_SEEKING_CAPABILITIES), \ 446 NULL, NULL, 0, NULL, NULL, 0) 447 448 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler) \ 449 DEFINE_KSPROPERTY_ITEM( \ 450 KSPROPERTY_MEDIASEEKING_FORMATS, \ 451 (Handler), \ 452 sizeof(KSPROPERTY), \ 453 0, \ 454 NULL, NULL, 0, NULL, NULL, 0) 455 456 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler,SetHandler) \ 457 DEFINE_KSPROPERTY_ITEM( \ 458 KSPROPERTY_MEDIASEEKING_TIMEFORMAT, \ 459 (GetHandler), \ 460 sizeof(KSPROPERTY), \ 461 sizeof(GUID), \ 462 (SetHandler), \ 463 NULL, 0, NULL, NULL, 0) 464 465 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler) \ 466 DEFINE_KSPROPERTY_ITEM( \ 467 KSPROPERTY_MEDIASEEKING_POSITION, \ 468 (Handler), \ 469 sizeof(KSPROPERTY), \ 470 sizeof(LONGLONG), \ 471 NULL, NULL, 0, NULL, NULL, 0) 472 473 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler) \ 474 DEFINE_KSPROPERTY_ITEM( \ 475 KSPROPERTY_MEDIASEEKING_STOPPOSITION, \ 476 (Handler), \ 477 sizeof(KSPROPERTY), \ 478 sizeof(LONGLONG), \ 479 NULL, NULL, 0, NULL, NULL, 0) 480 481 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler) \ 482 DEFINE_KSPROPERTY_ITEM( \ 483 KSPROPERTY_MEDIASEEKING_POSITIONS, \ 484 NULL, \ 485 sizeof(KSPROPERTY), \ 486 sizeof(KSPROPERTY_POSITIONS), \ 487 (Handler), \ 488 NULL, 0, NULL, NULL, 0) 489 490 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler) \ 491 DEFINE_KSPROPERTY_ITEM( \ 492 KSPROPERTY_MEDIASEEKING_DURATION, \ 493 (Handler), \ 494 sizeof(KSPROPERTY), \ 495 sizeof(LONGLONG), \ 496 NULL, NULL, 0, NULL, NULL, 0) 497 498 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler) \ 499 DEFINE_KSPROPERTY_ITEM( \ 500 KSPROPERTY_MEDIASEEKING_AVAILABLE, \ 501 (Handler), \ 502 sizeof(KSPROPERTY), \ 503 sizeof(KSPROPERTY_MEDIAAVAILABLE), \ 504 NULL, NULL, 0, NULL, NULL, 0) 505 506 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler) \ 507 DEFINE_KSPROPERTY_ITEM( \ 508 KSPROPERTY_MEDIASEEKING_PREROLL, \ 509 (Handler), \ 510 sizeof(KSPROPERTY), \ 511 sizeof(LONGLONG), \ 512 NULL, NULL, 0, NULL, NULL, 0) 513 514 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler) \ 515 DEFINE_KSPROPERTY_ITEM( \ 516 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT, \ 517 (Handler), \ 518 sizeof(KSP_TIMEFORMAT), \ 519 sizeof(LONGLONG), \ 520 NULL, NULL, 0, NULL, NULL, 0) 521 522 #define STATIC_KSPROPSETID_Topology \ 523 0x720D4AC0,0x7533,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 524 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology); 525 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) 526 527 typedef enum { 528 KSPROPERTY_TOPOLOGY_CATEGORIES, 529 KSPROPERTY_TOPOLOGY_NODES, 530 KSPROPERTY_TOPOLOGY_CONNECTIONS, 531 KSPROPERTY_TOPOLOGY_NAME 532 } KSPROPERTY_TOPOLOGY; 533 534 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler) \ 535 DEFINE_KSPROPERTY_ITEM( \ 536 KSPROPERTY_TOPOLOGY_CATEGORIES, \ 537 (Handler), \ 538 sizeof(KSPROPERTY), \ 539 0, \ 540 NULL, NULL, 0,NULL, NULL, 0) 541 542 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler) \ 543 DEFINE_KSPROPERTY_ITEM( \ 544 KSPROPERTY_TOPOLOGY_NODES, \ 545 (Handler), \ 546 sizeof(KSPROPERTY), \ 547 0, \ 548 NULL, NULL, 0, NULL, NULL, 0) 549 550 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler) \ 551 DEFINE_KSPROPERTY_ITEM( \ 552 KSPROPERTY_TOPOLOGY_CONNECTIONS, \ 553 (Handler), \ 554 sizeof(KSPROPERTY), \ 555 0, \ 556 NULL, NULL, 0, NULL, NULL, 0) 557 558 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ 559 DEFINE_KSPROPERTY_ITEM( \ 560 KSPROPERTY_TOPOLOGY_NAME, \ 561 (Handler), \ 562 sizeof(KSP_NODE), \ 563 0, \ 564 NULL, NULL, 0, NULL, NULL, 0) 565 566 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet,Handler) \ 567 DEFINE_KSPROPERTY_TABLE(TopologySet) { \ 568 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler), \ 569 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler), \ 570 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler), \ 571 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ 572 } 573 574 #define STATIC_KSCATEGORY_BRIDGE \ 575 0x085AFF00,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 576 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000",KSCATEGORY_BRIDGE); 577 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) 578 579 #define STATIC_KSCATEGORY_CAPTURE \ 580 0x65E8773D,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 581 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_CAPTURE); 582 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) 583 584 #define STATIC_KSCATEGORY_CLOCK \ 585 0x53172480,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 586 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSCATEGORY_CLOCK); 587 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) 588 589 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ 590 0xCF1DDA2C,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 591 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_COMMUNICATIONSTRANSFORM); 592 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) 593 594 #define STATIC_KSCATEGORY_DATACOMPRESSOR \ 595 0x1E84C900,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 596 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATACOMPRESSOR); 597 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) 598 599 #define STATIC_KSCATEGORY_DATADECOMPRESSOR \ 600 0x2721AE20,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 601 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATADECOMPRESSOR); 602 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) 603 604 #define STATIC_KSCATEGORY_DATATRANSFORM \ 605 0x2EB07EA0,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 606 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATATRANSFORM); 607 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) 608 609 #define STATIC_KSCATEGORY_FILESYSTEM \ 610 0x760FED5E,0x9357,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 611 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196",KSCATEGORY_FILESYSTEM); 612 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) 613 614 #define STATIC_KSCATEGORY_INTERFACETRANSFORM \ 615 0xCF1DDA2D,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 616 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_INTERFACETRANSFORM); 617 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) 618 619 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ 620 0xCF1DDA2E,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 621 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_MEDIUMTRANSFORM); 622 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) 623 624 #define STATIC_KSCATEGORY_MIXER \ 625 0xAD809C00,0x7B88,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 626 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000",KSCATEGORY_MIXER); 627 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) 628 629 #define STATIC_KSCATEGORY_PROXY \ 630 0x97EBAACA,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 631 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_PROXY); 632 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) 633 634 #define STATIC_KSCATEGORY_QUALITY \ 635 0x97EBAACB,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 636 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_QUALITY); 637 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) 638 639 #define STATIC_KSCATEGORY_RENDER \ 640 0x65E8773E,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 641 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_RENDER); 642 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) 643 644 #define STATIC_KSCATEGORY_SPLITTER \ 645 0x0A4252A0,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 646 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_SPLITTER); 647 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) 648 649 #define STATIC_KSCATEGORY_VIDEO_CAMERA \ 650 0xE5323777,0xF976,0x4F5B,0x9B,0x55,0xB9,0x46,0x99,0xC4,0x6E,0x44 651 DEFINE_GUIDSTRUCT("E5323777-F976-4F5B-9B55-B94699C46E44",KSCATEGORY_VIDEO_CAMERA); 652 #define KSCATEGORY_VIDEO_CAMERA DEFINE_GUIDNAMED(KSCATEGORY_VIDEO_CAMERA) 653 654 typedef struct { 655 ULONG FromNode; 656 ULONG FromNodePin; 657 ULONG ToNode; 658 ULONG ToNodePin; 659 } KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION; 660 661 typedef struct { 662 ULONG CategoriesCount; 663 const GUID *Categories; 664 ULONG TopologyNodesCount; 665 const GUID *TopologyNodes; 666 ULONG TopologyConnectionsCount; 667 const KSTOPOLOGY_CONNECTION *TopologyConnections; 668 const GUID *TopologyNodesNames; 669 ULONG Reserved; 670 } KSTOPOLOGY,*PKSTOPOLOGY; 671 672 #define KSFILTER_NODE ((ULONG)-1) 673 #define KSALL_NODES ((ULONG)-1) 674 675 typedef struct { 676 ULONG CreateFlags; 677 ULONG Node; 678 } KSNODE_CREATE,*PKSNODE_CREATE; 679 680 #define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL 681 #define KSTIME_FORMAT_NONE GUID_NULL 682 683 #define STATIC_KSTIME_FORMAT_FRAME \ 684 0x7b785570,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 685 DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FRAME); 686 #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME) 687 688 #define STATIC_KSTIME_FORMAT_BYTE \ 689 0x7b785571,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 690 DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_BYTE); 691 #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE) 692 693 #define STATIC_KSTIME_FORMAT_SAMPLE \ 694 0x7b785572,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 695 DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_SAMPLE); 696 #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE) 697 698 #define STATIC_KSTIME_FORMAT_FIELD \ 699 0x7b785573,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 700 DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FIELD); 701 #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD) 702 703 #define STATIC_KSTIME_FORMAT_MEDIA_TIME \ 704 0x7b785574,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 705 DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME); 706 #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME) 707 708 typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE; 709 710 #define STATIC_KSINTERFACESETID_Standard \ 711 0x1A8766A0,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 712 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard); 713 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) 714 715 typedef enum { 716 KSINTERFACE_STANDARD_STREAMING, 717 KSINTERFACE_STANDARD_LOOPED_STREAMING, 718 KSINTERFACE_STANDARD_CONTROL 719 } KSINTERFACE_STANDARD; 720 721 #define STATIC_KSINTERFACESETID_FileIo \ 722 0x8C6F932C,0xE771,0x11D0,0xB8,0xFF,0x00,0xA0,0xC9,0x22,0x31,0x96 723 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo); 724 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) 725 726 typedef enum { 727 KSINTERFACE_FILEIO_STREAMING 728 } KSINTERFACE_FILEIO; 729 730 #define KSMEDIUM_TYPE_ANYINSTANCE 0 731 732 #define STATIC_KSMEDIUMSETID_Standard \ 733 0x4747B320,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 734 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000",KSMEDIUMSETID_Standard); 735 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) 736 737 #define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE 738 739 #define STATIC_KSPROPSETID_Pin \ 740 0x8C134960,0x51AD,0x11CF,0x87,0x8A,0x94,0xF8,0x01,0xC1,0x00,0x00 741 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin); 742 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) 743 744 typedef enum { 745 KSPROPERTY_PIN_CINSTANCES, 746 KSPROPERTY_PIN_CTYPES, 747 KSPROPERTY_PIN_DATAFLOW, 748 KSPROPERTY_PIN_DATARANGES, 749 KSPROPERTY_PIN_DATAINTERSECTION, 750 KSPROPERTY_PIN_INTERFACES, 751 KSPROPERTY_PIN_MEDIUMS, 752 KSPROPERTY_PIN_COMMUNICATION, 753 KSPROPERTY_PIN_GLOBALCINSTANCES, 754 KSPROPERTY_PIN_NECESSARYINSTANCES, 755 KSPROPERTY_PIN_PHYSICALCONNECTION, 756 KSPROPERTY_PIN_CATEGORY, 757 KSPROPERTY_PIN_NAME, 758 KSPROPERTY_PIN_CONSTRAINEDDATARANGES, 759 KSPROPERTY_PIN_PROPOSEDATAFORMAT 760 } KSPROPERTY_PIN; 761 762 typedef struct { 763 KSPROPERTY Property; 764 ULONG PinId; 765 ULONG Reserved; 766 } KSP_PIN,*PKSP_PIN; 767 768 #define KSINSTANCE_INDETERMINATE ((ULONG)-1) 769 770 typedef struct { 771 ULONG PossibleCount; 772 ULONG CurrentCount; 773 } KSPIN_CINSTANCES,*PKSPIN_CINSTANCES; 774 775 typedef enum { 776 KSPIN_DATAFLOW_IN = 1, 777 KSPIN_DATAFLOW_OUT 778 } KSPIN_DATAFLOW,*PKSPIN_DATAFLOW; 779 780 #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0 781 #define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION) 782 #define KSDATAFORMAT_BIT_ATTRIBUTES 1 783 #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) 784 785 #define KSDATARANGE_BIT_ATTRIBUTES 1 786 #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES) 787 #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2 788 #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES) 789 790 typedef union { 791 __C89_NAMELESS struct { 792 ULONG FormatSize; 793 ULONG Flags; 794 ULONG SampleSize; 795 ULONG Reserved; 796 GUID MajorFormat; 797 GUID SubFormat; 798 GUID Specifier; 799 }; 800 LONGLONG Alignment; 801 } KSDATAFORMAT,*PKSDATAFORMAT,KSDATARANGE,*PKSDATARANGE; 802 803 #define KSATTRIBUTE_REQUIRED 0x00000001 804 805 typedef struct { 806 ULONG Size; 807 ULONG Flags; 808 GUID Attribute; 809 } KSATTRIBUTE,*PKSATTRIBUTE; 810 811 #if defined(_NTDDK_) 812 typedef struct { 813 ULONG Count; 814 PKSATTRIBUTE *Attributes; 815 } KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST; 816 #endif /* _NTDDK_ */ 817 818 typedef enum { 819 KSPIN_COMMUNICATION_NONE, 820 KSPIN_COMMUNICATION_SINK, 821 KSPIN_COMMUNICATION_SOURCE, 822 KSPIN_COMMUNICATION_BOTH, 823 KSPIN_COMMUNICATION_BRIDGE 824 } KSPIN_COMMUNICATION,*PKSPIN_COMMUNICATION; 825 826 typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM; 827 828 typedef struct { 829 KSPIN_INTERFACE Interface; 830 KSPIN_MEDIUM Medium; 831 ULONG PinId; 832 HANDLE PinToHandle; 833 KSPRIORITY Priority; 834 } KSPIN_CONNECT,*PKSPIN_CONNECT; 835 836 typedef struct { 837 ULONG Size; 838 ULONG Pin; 839 WCHAR SymbolicLinkName[1]; 840 } KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION; 841 842 #if defined(_NTDDK_) 843 typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin, 844 PKSDATARANGE DataRange, 845 PVOID Data); 846 typedef NTSTATUS (*PFNKSINTERSECTHANDLEREX)(PVOID Context, PIRP Irp, 847 PKSP_PIN Pin, 848 PKSDATARANGE DataRange, 849 PKSDATARANGE MatchingDataRange, 850 ULONG DataBufferSize, 851 PVOID Data, 852 PULONG DataSize); 853 #endif /* _NTDDK_ */ 854 855 #define DEFINE_KSPIN_INTERFACE_TABLE(tablename) \ 856 const KSPIN_INTERFACE tablename[] = 857 858 #define DEFINE_KSPIN_INTERFACE_ITEM(guid,_interFace) \ 859 { \ 860 STATICGUIDOF(guid), \ 861 (_interFace), \ 862 0 \ 863 } 864 865 #define DEFINE_KSPIN_MEDIUM_TABLE(tablename) \ 866 const KSPIN_MEDIUM tablename[] = 867 868 #define DEFINE_KSPIN_MEDIUM_ITEM(guid,medium) \ 869 DEFINE_KSPIN_INTERFACE_ITEM(guid,medium) 870 871 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler) \ 872 DEFINE_KSPROPERTY_ITEM( \ 873 KSPROPERTY_PIN_CINSTANCES, \ 874 (Handler), \ 875 sizeof(KSP_PIN), \ 876 sizeof(KSPIN_CINSTANCES), \ 877 NULL, NULL, 0, NULL, NULL, 0) 878 879 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler) \ 880 DEFINE_KSPROPERTY_ITEM( \ 881 KSPROPERTY_PIN_CTYPES, \ 882 (Handler), \ 883 sizeof(KSPROPERTY), \ 884 sizeof(ULONG), \ 885 NULL, NULL, 0, NULL, NULL, 0) 886 887 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler) \ 888 DEFINE_KSPROPERTY_ITEM( \ 889 KSPROPERTY_PIN_DATAFLOW, \ 890 (Handler), \ 891 sizeof(KSP_PIN), \ 892 sizeof(KSPIN_DATAFLOW), \ 893 NULL, NULL, 0, NULL, NULL, 0) 894 895 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler) \ 896 DEFINE_KSPROPERTY_ITEM( \ 897 KSPROPERTY_PIN_DATARANGES, \ 898 (Handler), \ 899 sizeof(KSP_PIN), \ 900 0, \ 901 NULL, NULL, 0, NULL, NULL, 0) 902 903 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler) \ 904 DEFINE_KSPROPERTY_ITEM( \ 905 KSPROPERTY_PIN_DATAINTERSECTION, \ 906 (Handler), \ 907 sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ 908 0, \ 909 NULL, NULL, 0, NULL, NULL, 0) 910 911 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler) \ 912 DEFINE_KSPROPERTY_ITEM( \ 913 KSPROPERTY_PIN_INTERFACES, \ 914 (Handler), \ 915 sizeof(KSP_PIN), \ 916 0, \ 917 NULL, NULL, 0, NULL, NULL, 0) 918 919 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler) \ 920 DEFINE_KSPROPERTY_ITEM( \ 921 KSPROPERTY_PIN_MEDIUMS, \ 922 (Handler), \ 923 sizeof(KSP_PIN), \ 924 0, \ 925 NULL, NULL, 0, NULL, NULL, 0) 926 927 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler) \ 928 DEFINE_KSPROPERTY_ITEM( \ 929 KSPROPERTY_PIN_COMMUNICATION, \ 930 (Handler), \ 931 sizeof(KSP_PIN), \ 932 sizeof(KSPIN_COMMUNICATION), \ 933 NULL, NULL, 0, NULL, NULL, 0) 934 935 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler) \ 936 DEFINE_KSPROPERTY_ITEM( \ 937 KSPROPERTY_PIN_GLOBALCINSTANCES, \ 938 (Handler), \ 939 sizeof(KSP_PIN), \ 940 sizeof(KSPIN_CINSTANCES), \ 941 NULL, NULL, 0, NULL, NULL, 0) 942 943 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler) \ 944 DEFINE_KSPROPERTY_ITEM( \ 945 KSPROPERTY_PIN_NECESSARYINSTANCES, \ 946 (Handler), \ 947 sizeof(KSP_PIN), \ 948 sizeof(ULONG), \ 949 NULL, NULL, 0, NULL, NULL, 0) 950 951 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler) \ 952 DEFINE_KSPROPERTY_ITEM( \ 953 KSPROPERTY_PIN_PHYSICALCONNECTION, \ 954 (Handler), \ 955 sizeof(KSP_PIN), \ 956 0, \ 957 NULL, NULL, 0, NULL, NULL, 0) 958 959 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler) \ 960 DEFINE_KSPROPERTY_ITEM( \ 961 KSPROPERTY_PIN_CATEGORY, \ 962 (Handler), \ 963 sizeof(KSP_PIN), \ 964 sizeof(GUID), \ 965 NULL, NULL, 0, NULL, NULL, 0) 966 967 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler) \ 968 DEFINE_KSPROPERTY_ITEM( \ 969 KSPROPERTY_PIN_NAME, \ 970 (Handler), \ 971 sizeof(KSP_PIN), \ 972 0, \ 973 NULL, NULL, 0, NULL, NULL, 0) 974 975 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler) \ 976 DEFINE_KSPROPERTY_ITEM( \ 977 KSPROPERTY_PIN_CONSTRAINEDDATARANGES, \ 978 (Handler), \ 979 sizeof(KSP_PIN), \ 980 0, \ 981 NULL, NULL, 0, NULL, NULL, 0) 982 983 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler) \ 984 DEFINE_KSPROPERTY_ITEM( \ 985 KSPROPERTY_PIN_PROPOSEDATAFORMAT, \ 986 NULL, \ 987 sizeof(KSP_PIN), \ 988 sizeof(KSDATAFORMAT), \ 989 (Handler), NULL, 0, NULL, NULL, 0) 990 991 #define DEFINE_KSPROPERTY_PINSET(PinSet,PropGeneral,PropInstances,PropIntersection) \ 992 DEFINE_KSPROPERTY_TABLE(PinSet) { \ 993 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ 994 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ 995 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ 996 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ 997 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ 998 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ 999 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ 1000 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ 1001 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ 1002 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral) \ 1003 } 1004 1005 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,PropGeneral,PropInstances,PropIntersection) \ 1006 DEFINE_KSPROPERTY_TABLE(PinSet) { \ 1007 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ 1008 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ 1009 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ 1010 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ 1011 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ 1012 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ 1013 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ 1014 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ 1015 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ 1016 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral), \ 1017 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral) \ 1018 } 1019 1020 #define STATIC_KSNAME_Filter \ 1021 0x9b365890,0x165f,0x11d0,0xa1,0x95,0x00,0x20,0xaf,0xd1,0x56,0xe4 1022 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4",KSNAME_Filter); 1023 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) 1024 1025 #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" 1026 1027 #define STATIC_KSNAME_Pin \ 1028 0x146F1A80,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1029 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000",KSNAME_Pin); 1030 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) 1031 1032 #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" 1033 1034 #define STATIC_KSNAME_Clock \ 1035 0x53172480,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1036 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSNAME_Clock); 1037 #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock) 1038 1039 #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" 1040 1041 #define STATIC_KSNAME_Allocator \ 1042 0x642F5D00,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1043 DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000",KSNAME_Allocator); 1044 #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator) 1045 1046 #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" 1047 1048 #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" 1049 1050 #define STATIC_KSNAME_TopologyNode \ 1051 0x0621061A,0xEE75,0x11D0,0xB9,0x15,0x00,0xA0,0xC9,0x22,0x31,0x96 1052 DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196",KSNAME_TopologyNode); 1053 #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode) 1054 1055 #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" 1056 1057 #if defined(_NTDDK_) 1058 typedef struct { 1059 ULONG InterfacesCount; 1060 const KSPIN_INTERFACE *Interfaces; 1061 ULONG MediumsCount; 1062 const KSPIN_MEDIUM *Mediums; 1063 ULONG DataRangesCount; 1064 const PKSDATARANGE *DataRanges; 1065 KSPIN_DATAFLOW DataFlow; 1066 KSPIN_COMMUNICATION Communication; 1067 const GUID *Category; 1068 const GUID *Name; 1069 __C89_NAMELESS union { 1070 LONGLONG Reserved; 1071 __C89_NAMELESS struct { 1072 ULONG ConstrainedDataRangesCount; 1073 PKSDATARANGE *ConstrainedDataRanges; 1074 }; 1075 }; 1076 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; 1077 typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR; 1078 1079 #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename) \ 1080 const KSPIN_DESCRIPTOR tablename[] = 1081 1082 #define DEFINE_KSPIN_DESCRIPTOR_ITEM(InterfacesCount,Interfaces,MediumsCount, Mediums,DataRangesCount,DataRanges,DataFlow,Communication)\ 1083 { \ 1084 InterfacesCount, Interfaces, MediumsCount, Mediums, \ 1085 DataRangesCount, DataRanges, DataFlow, Communication, \ 1086 NULL, NULL, 0 \ 1087 } 1088 1089 #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(InterfacesCount,Interfaces,MediumsCount,Mediums,DataRangesCount,DataRanges,DataFlow,Communication,Category,Name)\ 1090 { \ 1091 InterfacesCount, Interfaces, MediumsCount, Mediums, \ 1092 DataRangesCount, DataRanges, DataFlow, Communication, \ 1093 Category, Name, 0 \ 1094 } 1095 #endif /* _NTDDK_ */ 1096 1097 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL 1098 #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL 1099 1100 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL 1101 #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL 1102 1103 #define STATIC_KSDATAFORMAT_TYPE_STREAM \ 1104 0xE436EB83,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 1105 DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_TYPE_STREAM); 1106 #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM) 1107 1108 #define STATIC_KSDATAFORMAT_SUBTYPE_NONE \ 1109 0xE436EB8E,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 1110 DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_SUBTYPE_NONE); 1111 #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) 1112 1113 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL 1114 #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL 1115 1116 #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME \ 1117 0xAA797B40,0xE974,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1118 DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SPECIFIER_FILENAME); 1119 #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME) 1120 1121 #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE \ 1122 0x65E8773C,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 1123 DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196",KSDATAFORMAT_SPECIFIER_FILEHANDLE); 1124 #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE) 1125 1126 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE \ 1127 0x0F6417D6,0xC318,0x11D0,0xA4,0x3F,0x00,0xA0,0xC9,0x22,0x31,0x96 1128 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196",KSDATAFORMAT_SPECIFIER_NONE); 1129 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) 1130 1131 #define STATIC_KSPROPSETID_Quality \ 1132 0xD16AD380,0xAC1A,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1133 DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality); 1134 #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality) 1135 1136 typedef enum { 1137 KSPROPERTY_QUALITY_REPORT, 1138 KSPROPERTY_QUALITY_ERROR 1139 } KSPROPERTY_QUALITY; 1140 1141 #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler,SetHandler) \ 1142 DEFINE_KSPROPERTY_ITEM( \ 1143 KSPROPERTY_QUALITY_REPORT, \ 1144 (GetHandler), \ 1145 sizeof(KSPROPERTY), \ 1146 sizeof(KSQUALITY), \ 1147 (SetHandler), \ 1148 NULL, 0, NULL, NULL, 0) 1149 1150 #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler,SetHandler) \ 1151 DEFINE_KSPROPERTY_ITEM( \ 1152 KSPROPERTY_QUALITY_ERROR, \ 1153 (GetHandler), \ 1154 sizeof(KSPROPERTY), \ 1155 sizeof(KSERROR), \ 1156 (SetHandler), \ 1157 NULL, 0, NULL, NULL, 0) 1158 1159 #define STATIC_KSPROPSETID_Connection \ 1160 0x1D58C920,0xAC9B,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1161 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection); 1162 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) 1163 1164 typedef enum { 1165 KSPROPERTY_CONNECTION_STATE, 1166 KSPROPERTY_CONNECTION_PRIORITY, 1167 KSPROPERTY_CONNECTION_DATAFORMAT, 1168 KSPROPERTY_CONNECTION_ALLOCATORFRAMING, 1169 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, 1170 KSPROPERTY_CONNECTION_ACQUIREORDERING, 1171 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, 1172 KSPROPERTY_CONNECTION_STARTAT 1173 } KSPROPERTY_CONNECTION; 1174 1175 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler,SetHandler) \ 1176 DEFINE_KSPROPERTY_ITEM( \ 1177 KSPROPERTY_CONNECTION_STATE, \ 1178 (GetHandler), \ 1179 sizeof(KSPROPERTY), \ 1180 sizeof(KSSTATE), \ 1181 (SetHandler), \ 1182 NULL, 0, NULL, NULL, 0) 1183 1184 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler,SetHandler) \ 1185 DEFINE_KSPROPERTY_ITEM( \ 1186 KSPROPERTY_CONNECTION_PRIORITY, \ 1187 (GetHandler), \ 1188 sizeof(KSPROPERTY), \ 1189 sizeof(KSPRIORITY), \ 1190 (SetHandler), \ 1191 NULL, 0, NULL, NULL, 0) 1192 1193 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler,SetHandler)\ 1194 DEFINE_KSPROPERTY_ITEM( \ 1195 KSPROPERTY_CONNECTION_DATAFORMAT, \ 1196 (GetHandler), \ 1197 sizeof(KSPROPERTY), \ 1198 0, \ 1199 (SetHandler), \ 1200 NULL, 0, NULL, NULL, 0) 1201 1202 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler) \ 1203 DEFINE_KSPROPERTY_ITEM( \ 1204 KSPROPERTY_CONNECTION_ALLOCATORFRAMING, \ 1205 (Handler), \ 1206 sizeof(KSPROPERTY), \ 1207 sizeof(KSALLOCATOR_FRAMING), \ 1208 NULL, NULL, 0, NULL, NULL, 0) 1209 1210 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler) \ 1211 DEFINE_KSPROPERTY_ITEM( \ 1212 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ 1213 (Handler), \ 1214 sizeof(KSPROPERTY), \ 1215 0, \ 1216 NULL, NULL, 0, NULL, NULL, 0) 1217 1218 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler) \ 1219 DEFINE_KSPROPERTY_ITEM( \ 1220 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ 1221 NULL, \ 1222 sizeof(KSPROPERTY), \ 1223 sizeof(KSDATAFORMAT), \ 1224 (Handler), \ 1225 NULL, 0, NULL, NULL, 0) 1226 1227 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler) \ 1228 DEFINE_KSPROPERTY_ITEM( \ 1229 KSPROPERTY_CONNECTION_ACQUIREORDERING, \ 1230 (Handler), \ 1231 sizeof(KSPROPERTY), \ 1232 sizeof(int), \ 1233 NULL, NULL, 0, NULL, NULL, 0) 1234 1235 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler) \ 1236 DEFINE_KSPROPERTY_ITEM( \ 1237 KSPROPERTY_CONNECTION_STARTAT, \ 1238 NULL, \ 1239 sizeof(KSPROPERTY), \ 1240 sizeof(KSRELATIVEEVENT), \ 1241 (Handler), \ 1242 NULL, 0, NULL, NULL, 0) 1243 1244 #define STATIC_KSPROPSETID_MemoryTransport \ 1245 0xA3D1C5D,0x5243,0x4819,0x9E,0xD0,0xAE,0xE8,0x4,0x4C,0xEE,0x2B 1246 DEFINE_GUIDSTRUCT("0A3D1C5D-5243-4819-9ED0-AEE8044CEE2B", KSPROPSETID_MemoryTransport); 1247 #define KSPROPSETID_MemoryTransport DEFINE_GUIDNAMED(KSPROPSETID_MemoryTransport) 1248 1249 enum { 1250 KSPROPERTY_MEMORY_TRANSPORT = 1 1251 }; 1252 1253 #define DEFINE_KSPROPERTY_ITEM_MEMORY_TRANSPORT(SetHandler) \ 1254 DEFINE_KSPROPERTY_ITEM( \ 1255 KSPROPERTY_MEMORY_TRANSPORT, \ 1256 NULL, \ 1257 sizeof(KSPROPERTY), \ 1258 sizeof(WINBOOL), \ 1259 (SetHandler), NULL,0,NULL,NULL,0) 1260 1261 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 1262 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 1263 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 1264 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 1265 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 1266 1267 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 1268 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 1269 #define KSALLOCATOR_OPTIONF_VALID 0x00000003 1270 1271 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 1272 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 1273 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 1274 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 1275 #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100 1276 #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200 1277 #define KSALLOCATOR_FLAG_CYCLE 0x00000400 1278 #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800 1279 #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000 1280 #define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000 1281 1282 typedef struct { 1283 __C89_NAMELESS union { 1284 ULONG OptionsFlags; 1285 ULONG RequirementsFlags; 1286 }; 1287 #if defined(_NTDDK_) 1288 POOL_TYPE PoolType; 1289 #else 1290 ULONG PoolType; 1291 #endif /* _NTDDK_ */ 1292 ULONG Frames; 1293 ULONG FrameSize; 1294 ULONG FileAlignment; 1295 ULONG Reserved; 1296 } KSALLOCATOR_FRAMING,*PKSALLOCATOR_FRAMING; 1297 1298 #if defined(_NTDDK_) 1299 typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context); 1300 typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer); 1301 typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext, 1302 PKSALLOCATOR_FRAMING AllocatorFraming, 1303 PVOID* Context); 1304 typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context); 1305 #endif /* _NTDDK_ */ 1306 1307 typedef struct { 1308 ULONG MinFrameSize; 1309 ULONG MaxFrameSize; 1310 ULONG Stepping; 1311 } KS_FRAMING_RANGE,*PKS_FRAMING_RANGE; 1312 1313 typedef struct { 1314 KS_FRAMING_RANGE Range; 1315 ULONG InPlaceWeight; 1316 ULONG NotInPlaceWeight; 1317 } KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED; 1318 1319 typedef struct { 1320 ULONG RatioNumerator; 1321 ULONG RatioDenominator; 1322 ULONG RatioConstantMargin; 1323 } KS_COMPRESSION,*PKS_COMPRESSION; 1324 1325 typedef struct { 1326 GUID MemoryType; 1327 GUID BusType; 1328 ULONG MemoryFlags; 1329 ULONG BusFlags; 1330 ULONG Flags; 1331 ULONG Frames; 1332 ULONG FileAlignment; 1333 ULONG MemoryTypeWeight; 1334 KS_FRAMING_RANGE PhysicalRange; 1335 KS_FRAMING_RANGE_WEIGHTED FramingRange; 1336 } KS_FRAMING_ITEM,*PKS_FRAMING_ITEM; 1337 1338 typedef struct { 1339 ULONG CountItems; 1340 ULONG PinFlags; 1341 KS_COMPRESSION OutputCompression; 1342 ULONG PinWeight; 1343 KS_FRAMING_ITEM FramingItem[1]; 1344 } KSALLOCATOR_FRAMING_EX,*PKSALLOCATOR_FRAMING_EX; 1345 1346 #define KSMEMORY_TYPE_WILDCARD GUID_NULL 1347 #define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL 1348 1349 #define KSMEMORY_TYPE_DONT_CARE GUID_NULL 1350 #define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL 1351 1352 #define KS_TYPE_DONT_CARE GUID_NULL 1353 #define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL 1354 1355 #define STATIC_KSMEMORY_TYPE_SYSTEM \ 1356 0x091bb638,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 1357 DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_SYSTEM); 1358 #define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM) 1359 1360 #define STATIC_KSMEMORY_TYPE_USER \ 1361 0x8cb0fc28,0x7893,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 1362 DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802",KSMEMORY_TYPE_USER); 1363 #define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER) 1364 1365 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ 1366 0xd833f8f8,0x7894,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 1367 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_PAGED); 1368 #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) 1369 1370 #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \ 1371 0x4a6d5fc4,0x7895,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 1372 DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_NONPAGED); 1373 #define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED) 1374 1375 #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \ 1376 0x091bb639,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 1377 DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_DEVICE_UNKNOWN); 1378 #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN) 1379 1380 #define DECLARE_SIMPLE_FRAMING_EX(FramingExName,MemoryType,Flags,Frames,Alignment,MinFrameSize,MaxFrameSize) \ 1381 const KSALLOCATOR_FRAMING_EX FramingExName = \ 1382 { \ 1383 1, \ 1384 0, \ 1385 { \ 1386 1, \ 1387 1, \ 1388 0 \ 1389 }, \ 1390 0, \ 1391 { \ 1392 { \ 1393 MemoryType, \ 1394 STATIC_KS_TYPE_DONT_CARE, \ 1395 0, \ 1396 0, \ 1397 Flags, \ 1398 Frames, \ 1399 Alignment, \ 1400 0, \ 1401 { \ 1402 0, \ 1403 (ULONG)-1, \ 1404 1 \ 1405 }, \ 1406 { \ 1407 { \ 1408 MinFrameSize, \ 1409 MaxFrameSize, \ 1410 1 \ 1411 }, \ 1412 0, \ 1413 0 \ 1414 } \ 1415 } \ 1416 } \ 1417 } 1418 1419 #define SetDefaultKsCompression(KsCompressionPointer) \ 1420 { \ 1421 KsCompressionPointer->RatioNumerator = 1; \ 1422 KsCompressionPointer->RatioDenominator = 1; \ 1423 KsCompressionPointer->RatioConstantMargin = 0; \ 1424 } 1425 1426 #define SetDontCareKsFramingRange(KsFramingRangePointer) \ 1427 { \ 1428 KsFramingRangePointer->MinFrameSize = 0; \ 1429 KsFramingRangePointer->MaxFrameSize = (ULONG) -1; \ 1430 KsFramingRangePointer->Stepping = 1; \ 1431 } 1432 1433 #define SetKsFramingRange(KsFramingRangePointer,P_MinFrameSize,P_MaxFrameSize) \ 1434 { \ 1435 KsFramingRangePointer->MinFrameSize = P_MinFrameSize; \ 1436 KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize; \ 1437 KsFramingRangePointer->Stepping = 1; \ 1438 } 1439 1440 #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer,P_MinFrameSize,P_MaxFrameSize) \ 1441 { \ 1442 KS_FRAMING_RANGE *KsFramingRange = \ 1443 &KsFramingRangeWeightedPointer->Range; \ 1444 SetKsFramingRange(KsFramingRange,P_MinFrameSize,P_MaxFrameSize);\ 1445 KsFramingRangeWeightedPointer->InPlaceWeight = 0; \ 1446 KsFramingRangeWeightedPointer->NotInPlaceWeight = 0; \ 1447 } 1448 1449 #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer,P_MemoryType,P_Flags,P_Frames,P_Alignment,P_MinFrameSize,P_MaxFrameSize) \ 1450 { \ 1451 KS_COMPRESSION *KsCompression = \ 1452 &FramingExPointer->OutputCompression; \ 1453 KS_FRAMING_RANGE *KsFramingRange = \ 1454 &FramingExPointer->FramingItem[0].PhysicalRange;\ 1455 KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = \ 1456 &FramingExPointer->FramingItem[0].FramingRange; \ 1457 FramingExPointer->CountItems = 1; \ 1458 FramingExPointer->PinFlags = 0; \ 1459 SetDefaultKsCompression(KsCompression); \ 1460 FramingExPointer->PinWeight = 0; \ 1461 FramingExPointer->FramingItem[0].MemoryType = P_MemoryType; \ 1462 FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE; \ 1463 FramingExPointer->FramingItem[0].MemoryFlags = 0; \ 1464 FramingExPointer->FramingItem[0].BusFlags = 0; \ 1465 FramingExPointer->FramingItem[0].Flags = P_Flags; \ 1466 FramingExPointer->FramingItem[0].Frames = P_Frames; \ 1467 FramingExPointer->FramingItem[0].FileAlignment = P_Alignment; \ 1468 FramingExPointer->FramingItem[0].MemoryTypeWeight = 0; \ 1469 SetDontCareKsFramingRange(KsFramingRange); \ 1470 SetKsFramingRangeWeighted(KsFramingRangeWeighted, \ 1471 P_MinFrameSize,P_MaxFrameSize); \ 1472 } 1473 1474 #define STATIC_KSEVENTSETID_StreamAllocator \ 1475 0x75d95571,0x073c,0x11d0,0xa1,0x61,0x00,0x20,0xaf,0xd1,0x56,0xe4 1476 DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator); 1477 #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator) 1478 1479 typedef enum { 1480 KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, 1481 KSEVENT_STREAMALLOCATOR_FREEFRAME 1482 } KSEVENT_STREAMALLOCATOR; 1483 1484 #define STATIC_KSMETHODSETID_StreamAllocator \ 1485 0xcf6e4341,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 1486 DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator); 1487 #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator) 1488 1489 typedef enum { 1490 KSMETHOD_STREAMALLOCATOR_ALLOC, 1491 KSMETHOD_STREAMALLOCATOR_FREE 1492 } KSMETHOD_STREAMALLOCATOR; 1493 1494 #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler) \ 1495 DEFINE_KSMETHOD_ITEM( \ 1496 KSMETHOD_STREAMALLOCATOR_ALLOC, \ 1497 KSMETHOD_TYPE_WRITE, \ 1498 (Handler), \ 1499 sizeof(KSMETHOD), \ 1500 sizeof(PVOID), \ 1501 NULL) 1502 1503 #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler) \ 1504 DEFINE_KSMETHOD_ITEM( \ 1505 KSMETHOD_STREAMALLOCATOR_FREE, \ 1506 KSMETHOD_TYPE_READ, \ 1507 (Handler), \ 1508 sizeof(KSMETHOD), \ 1509 sizeof(PVOID), \ 1510 NULL) 1511 1512 #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet,MethodAlloc,MethodFree)\ 1513 DEFINE_KSMETHOD_TABLE(AllocatorSet) { \ 1514 DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc), \ 1515 DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree) \ 1516 } 1517 1518 #define STATIC_KSPROPSETID_StreamAllocator \ 1519 0xcf6e4342,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 1520 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator); 1521 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) 1522 1523 #if defined(_NTDDK_) 1524 typedef enum { 1525 KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, 1526 KSPROPERTY_STREAMALLOCATOR_STATUS 1527 } KSPROPERTY_STREAMALLOCATOR; 1528 1529 #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler) \ 1530 DEFINE_KSPROPERTY_ITEM( \ 1531 KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\ 1532 (Handler), \ 1533 sizeof(KSPROPERTY), \ 1534 sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\ 1535 NULL, NULL, 0, NULL, NULL, 0) 1536 1537 #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler) \ 1538 DEFINE_KSPROPERTY_ITEM( \ 1539 KSPROPERTY_STREAMALLOCATOR_STATUS, \ 1540 (Handler), \ 1541 sizeof(KSPROPERTY), \ 1542 sizeof(KSSTREAMALLOCATOR_STATUS), \ 1543 NULL, NULL, 0, NULL, NULL, 0) 1544 1545 #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet,PropFunctionTable,PropStatus)\ 1546 DEFINE_KSPROPERTY_TABLE(AllocatorSet) { \ 1547 DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus), \ 1548 DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\ 1549 } 1550 1551 typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject, 1552 PVOID *Frame); 1553 typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame); 1554 1555 typedef struct { 1556 PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; 1557 PFNALLOCATOR_FREEFRAME FreeFrame; 1558 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; 1559 #endif /* _NTDDK_ */ 1560 1561 typedef struct { 1562 KSALLOCATOR_FRAMING Framing; 1563 ULONG AllocatedFrames; 1564 ULONG Reserved; 1565 } KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS; 1566 1567 typedef struct { 1568 KSALLOCATOR_FRAMING_EX Framing; 1569 ULONG AllocatedFrames; 1570 ULONG Reserved; 1571 } KSSTREAMALLOCATOR_STATUS_EX,*PKSSTREAMALLOCATOR_STATUS_EX; 1572 1573 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 1574 #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 1575 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 1576 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 1577 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 1578 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 1579 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 1580 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 1581 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 1582 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER 0x00000400 1583 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800 1584 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 1585 1586 typedef struct { 1587 LONGLONG Time; 1588 ULONG Numerator; 1589 ULONG Denominator; 1590 } KSTIME,*PKSTIME; 1591 1592 typedef struct { 1593 ULONG Size; 1594 ULONG TypeSpecificFlags; 1595 KSTIME PresentationTime; 1596 LONGLONG Duration; 1597 ULONG FrameExtent; 1598 ULONG DataUsed; 1599 PVOID Data; 1600 ULONG OptionsFlags; 1601 #ifdef _WIN64 1602 ULONG Reserved; 1603 #endif 1604 } KSSTREAM_HEADER,*PKSSTREAM_HEADER; 1605 1606 #define STATIC_KSPROPSETID_StreamInterface \ 1607 0x1fdd8ee1,0x9cd3,0x11d0,0x82,0xaa,0x00,0x00,0xf8,0x22,0xfe,0x8a 1608 DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface); 1609 #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface) 1610 1611 typedef enum { 1612 KSPROPERTY_STREAMINTERFACE_HEADERSIZE 1613 } KSPROPERTY_STREAMINTERFACE; 1614 1615 #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(GetHandler) \ 1616 DEFINE_KSPROPERTY_ITEM( \ 1617 KSPROPERTY_STREAMINTERFACE_HEADERSIZE, \ 1618 (GetHandler), \ 1619 sizeof(KSPROPERTY), \ 1620 sizeof(ULONG), \ 1621 NULL,NULL,0,NULL,NULL,0) 1622 1623 #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,HeaderSizeHandler) \ 1624 DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) { \ 1625 DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(HeaderSizeHandler)\ 1626 } 1627 1628 #define STATIC_KSPROPSETID_Stream \ 1629 0x65aaba60,0x98ae,0x11cf,0xa1,0x0d,0x00,0x20,0xaf,0xd1,0x56,0xe4 1630 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream); 1631 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) 1632 1633 typedef enum { 1634 KSPROPERTY_STREAM_ALLOCATOR, 1635 KSPROPERTY_STREAM_QUALITY, 1636 KSPROPERTY_STREAM_DEGRADATION, 1637 KSPROPERTY_STREAM_MASTERCLOCK, 1638 KSPROPERTY_STREAM_TIMEFORMAT, 1639 KSPROPERTY_STREAM_PRESENTATIONTIME, 1640 KSPROPERTY_STREAM_PRESENTATIONEXTENT, 1641 KSPROPERTY_STREAM_FRAMETIME, 1642 KSPROPERTY_STREAM_RATECAPABILITY, 1643 KSPROPERTY_STREAM_RATE, 1644 KSPROPERTY_STREAM_PIPE_ID 1645 } KSPROPERTY_STREAM; 1646 1647 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler,SetHandler) \ 1648 DEFINE_KSPROPERTY_ITEM( \ 1649 KSPROPERTY_STREAM_ALLOCATOR, \ 1650 (GetHandler), \ 1651 sizeof(KSPROPERTY), \ 1652 sizeof(HANDLE), \ 1653 (SetHandler), \ 1654 NULL, 0, NULL, NULL, 0) 1655 1656 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler) \ 1657 DEFINE_KSPROPERTY_ITEM( \ 1658 KSPROPERTY_STREAM_QUALITY, \ 1659 (Handler), \ 1660 sizeof(KSPROPERTY), \ 1661 sizeof(KSQUALITY_MANAGER), \ 1662 NULL, NULL, 0, NULL, NULL, 0) 1663 1664 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler,SetHandler)\ 1665 DEFINE_KSPROPERTY_ITEM( \ 1666 KSPROPERTY_STREAM_DEGRADATION, \ 1667 (GetHandler), \ 1668 sizeof(KSPROPERTY), \ 1669 0, \ 1670 (SetHandler), \ 1671 NULL, 0, NULL, NULL, 0) 1672 1673 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler,SetHandler)\ 1674 DEFINE_KSPROPERTY_ITEM( \ 1675 KSPROPERTY_STREAM_MASTERCLOCK, \ 1676 (GetHandler), \ 1677 sizeof(KSPROPERTY), \ 1678 sizeof(HANDLE), \ 1679 (SetHandler), \ 1680 NULL, 0, NULL, NULL, 0) 1681 1682 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler) \ 1683 DEFINE_KSPROPERTY_ITEM( \ 1684 KSPROPERTY_STREAM_TIMEFORMAT, \ 1685 (Handler), \ 1686 sizeof(KSPROPERTY), \ 1687 sizeof(GUID), \ 1688 NULL, NULL, 0, NULL, NULL, 0) 1689 1690 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler,SetHandler)\ 1691 DEFINE_KSPROPERTY_ITEM( \ 1692 KSPROPERTY_STREAM_PRESENTATIONTIME, \ 1693 (GetHandler), \ 1694 sizeof(KSPROPERTY), \ 1695 sizeof(KSTIME), \ 1696 (SetHandler), \ 1697 NULL, 0, NULL, NULL, 0) 1698 1699 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler) \ 1700 DEFINE_KSPROPERTY_ITEM( \ 1701 KSPROPERTY_STREAM_PRESENTATIONEXTENT, \ 1702 (Handler), \ 1703 sizeof(KSPROPERTY), \ 1704 sizeof(LONGLONG), \ 1705 NULL, NULL, 0, NULL, NULL, 0) 1706 1707 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler) \ 1708 DEFINE_KSPROPERTY_ITEM( \ 1709 KSPROPERTY_STREAM_FRAMETIME, \ 1710 (Handler), \ 1711 sizeof(KSPROPERTY), \ 1712 sizeof(KSFRAMETIME), \ 1713 NULL, NULL, 0, NULL, NULL, 0) 1714 1715 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler) \ 1716 DEFINE_KSPROPERTY_ITEM( \ 1717 KSPROPERTY_STREAM_RATECAPABILITY, \ 1718 (Handler), \ 1719 sizeof(KSRATE_CAPABILITY), \ 1720 sizeof(KSRATE), \ 1721 NULL, NULL, 0, NULL, NULL, 0) 1722 1723 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler,SetHandler) \ 1724 DEFINE_KSPROPERTY_ITEM( \ 1725 KSPROPERTY_STREAM_RATE, \ 1726 (GetHandler), \ 1727 sizeof(KSPROPERTY), \ 1728 sizeof(KSRATE), \ 1729 (SetHandler), \ 1730 NULL, 0, NULL, NULL, 0) 1731 1732 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler,SetHandler) \ 1733 DEFINE_KSPROPERTY_ITEM( \ 1734 KSPROPERTY_STREAM_PIPE_ID, \ 1735 (GetHandler), \ 1736 sizeof(KSPROPERTY), \ 1737 sizeof(HANDLE), \ 1738 (SetHandler), \ 1739 NULL, 0, NULL, NULL, 0) 1740 1741 typedef struct { 1742 HANDLE QualityManager; 1743 PVOID Context; 1744 } KSQUALITY_MANAGER,*PKSQUALITY_MANAGER; 1745 1746 typedef struct { 1747 LONGLONG Duration; 1748 ULONG FrameFlags; 1749 ULONG Reserved; 1750 } KSFRAMETIME,*PKSFRAMETIME; 1751 1752 #define KSFRAMETIME_VARIABLESIZE 0x00000001 1753 1754 typedef struct { 1755 LONGLONG PresentationStart; 1756 LONGLONG Duration; 1757 KSPIN_INTERFACE Interface; 1758 LONG Rate; 1759 ULONG Flags; 1760 } KSRATE,*PKSRATE; 1761 1762 #define KSRATE_NOPRESENTATIONSTART 0x00000001 1763 #define KSRATE_NOPRESENTATIONDURATION 0x00000002 1764 1765 typedef struct { 1766 KSPROPERTY Property; 1767 KSRATE Rate; 1768 } KSRATE_CAPABILITY,*PKSRATE_CAPABILITY; 1769 1770 #define STATIC_KSPROPSETID_Clock \ 1771 0xDF12A4C0,0xAC17,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1772 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000",KSPROPSETID_Clock); 1773 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) 1774 1775 #define NANOSECONDS 10000000 1776 #define KSCONVERT_PERFORMANCE_TIME(Frequency,PerformanceTime) \ 1777 ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS / (Frequency)) << 32) + \ 1778 ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS) % (Frequency)) << 32) +\ 1779 ((ULONGLONG)(PerformanceTime).LowPart *NANOSECONDS)) / (Frequency))) 1780 1781 typedef struct { 1782 ULONG CreateFlags; 1783 } KSCLOCK_CREATE,*PKSCLOCK_CREATE; 1784 1785 typedef struct { 1786 LONGLONG Time; 1787 LONGLONG SystemTime; 1788 } KSCORRELATED_TIME,*PKSCORRELATED_TIME; 1789 1790 typedef struct { 1791 LONGLONG Granularity; 1792 LONGLONG Error; 1793 } KSRESOLUTION,*PKSRESOLUTION; 1794 1795 typedef enum { 1796 KSPROPERTY_CLOCK_TIME, 1797 KSPROPERTY_CLOCK_PHYSICALTIME, 1798 KSPROPERTY_CLOCK_CORRELATEDTIME, 1799 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, 1800 KSPROPERTY_CLOCK_RESOLUTION, 1801 KSPROPERTY_CLOCK_STATE, 1802 #if defined(_NTDDK_) 1803 KSPROPERTY_CLOCK_FUNCTIONTABLE 1804 #endif /* _NTDDK_ */ 1805 } KSPROPERTY_CLOCK; 1806 1807 #if defined(_NTDDK_) 1808 typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject); 1809 typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject, 1810 PLONGLONG SystemTime); 1811 1812 typedef struct { 1813 PFNKSCLOCK_GETTIME GetTime; 1814 PFNKSCLOCK_GETTIME GetPhysicalTime; 1815 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; 1816 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; 1817 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; 1818 1819 typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer, 1820 LARGE_INTEGER DueTime, PKDPC Dpc); 1821 typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer); 1822 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context, 1823 PLONGLONG SystemTime); 1824 1825 typedef PVOID PKSDEFAULTCLOCK; 1826 1827 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler) \ 1828 DEFINE_KSPROPERTY_ITEM( \ 1829 KSPROPERTY_CLOCK_TIME, \ 1830 (Handler), \ 1831 sizeof(KSPROPERTY), sizeof(LONGLONG), \ 1832 NULL, NULL, 0, NULL, NULL, 0) 1833 1834 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler) \ 1835 DEFINE_KSPROPERTY_ITEM( \ 1836 KSPROPERTY_CLOCK_PHYSICALTIME, \ 1837 (Handler), \ 1838 sizeof(KSPROPERTY), sizeof(LONGLONG), \ 1839 NULL, NULL, 0, NULL, NULL, 0) 1840 1841 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler) \ 1842 DEFINE_KSPROPERTY_ITEM( \ 1843 KSPROPERTY_CLOCK_CORRELATEDTIME, \ 1844 (Handler), \ 1845 sizeof(KSPROPERTY), \ 1846 sizeof(KSCORRELATED_TIME), \ 1847 NULL, NULL, 0, NULL, NULL, 0) 1848 1849 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler) \ 1850 DEFINE_KSPROPERTY_ITEM( \ 1851 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ 1852 (Handler), \ 1853 sizeof(KSPROPERTY), \ 1854 sizeof(KSCORRELATED_TIME), \ 1855 NULL, NULL, 0, NULL, NULL, 0) 1856 1857 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler) \ 1858 DEFINE_KSPROPERTY_ITEM( \ 1859 KSPROPERTY_CLOCK_RESOLUTION, \ 1860 (Handler), \ 1861 sizeof(KSPROPERTY),sizeof(KSRESOLUTION),\ 1862 NULL, NULL, 0, NULL, NULL, 0) 1863 1864 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler) \ 1865 DEFINE_KSPROPERTY_ITEM( \ 1866 KSPROPERTY_CLOCK_STATE, \ 1867 (Handler), \ 1868 sizeof(KSPROPERTY), sizeof(KSSTATE), \ 1869 NULL, NULL, 0, NULL, NULL, 0) 1870 1871 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler) \ 1872 DEFINE_KSPROPERTY_ITEM( \ 1873 KSPROPERTY_CLOCK_FUNCTIONTABLE, \ 1874 (Handler), \ 1875 sizeof(KSPROPERTY), \ 1876 sizeof(KSCLOCK_FUNCTIONTABLE), \ 1877 NULL, NULL, 0, NULL, NULL, 0) 1878 1879 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,PropTime,PropPhysicalTime,PropCorrelatedTime,PropCorrelatedPhysicalTime,PropResolution,PropState,PropFunctionTable)\ 1880 DEFINE_KSPROPERTY_TABLE(ClockSet) { \ 1881 DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime), \ 1882 DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime), \ 1883 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ 1884 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ 1885 DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution), \ 1886 DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState), \ 1887 DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable), \ 1888 } 1889 #endif /* _NTDDK_ */ 1890 1891 #define STATIC_KSEVENTSETID_Clock \ 1892 0x364D8E20,0x62C7,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1893 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock); 1894 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) 1895 1896 typedef enum { 1897 KSEVENT_CLOCK_INTERVAL_MARK, 1898 KSEVENT_CLOCK_POSITION_MARK 1899 } KSEVENT_CLOCK_POSITION; 1900 1901 #define STATIC_KSEVENTSETID_Connection \ 1902 0x7f4bcbe0,0x9ea5,0x11cf,0xa5,0xd6,0x28,0xdb,0x04,0xc1,0x00,0x00 1903 DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection); 1904 #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection) 1905 1906 typedef enum { 1907 KSEVENT_CONNECTION_POSITIONUPDATE, 1908 KSEVENT_CONNECTION_DATADISCONTINUITY, 1909 KSEVENT_CONNECTION_TIMEDISCONTINUITY, 1910 KSEVENT_CONNECTION_PRIORITY, 1911 KSEVENT_CONNECTION_ENDOFSTREAM 1912 } KSEVENT_CONNECTION; 1913 1914 typedef struct { 1915 PVOID Context; 1916 ULONG Proportion; 1917 LONGLONG DeltaTime; 1918 } KSQUALITY,*PKSQUALITY; 1919 1920 typedef struct { 1921 PVOID Context; 1922 ULONG Status; 1923 } KSERROR,*PKSERROR; 1924 1925 typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE; 1926 1927 #define STATIC_KSDEGRADESETID_Standard \ 1928 0x9F564180,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 1929 DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard); 1930 #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard) 1931 1932 typedef enum { 1933 KSDEGRADE_STANDARD_SAMPLE, 1934 KSDEGRADE_STANDARD_QUALITY, 1935 KSDEGRADE_STANDARD_COMPUTATION, 1936 KSDEGRADE_STANDARD_SKIP 1937 } KSDEGRADE_STANDARD; 1938 1939 #if defined(_NTDDK_) 1940 1941 #define KSPROBE_STREAMREAD 0x00000000 1942 #define KSPROBE_STREAMWRITE 0x00000001 1943 #define KSPROBE_ALLOCATEMDL 0x00000010 1944 #define KSPROBE_PROBEANDLOCK 0x00000020 1945 #define KSPROBE_SYSTEMADDRESS 0x00000040 1946 #define KSPROBE_MODIFY 0x00000200 1947 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) 1948 #define KSPROBE_ALLOWFORMATCHANGE 0x00000080 1949 #define KSSTREAM_READ KSPROBE_STREAMREAD 1950 #define KSSTREAM_WRITE KSPROBE_STREAMWRITE 1951 #define KSSTREAM_PAGED_DATA 0x00000000 1952 #define KSSTREAM_NONPAGED_DATA 0x00000100 1953 #define KSSTREAM_SYNCHRONOUS 0x00001000 1954 #define KSSTREAM_FAILUREEXCEPTION 0x00002000 1955 1956 typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp); 1957 typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data); 1958 typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject, 1959 PKSIDENTIFIER Request, 1960 ULONG RequestLength, PVOID Data, 1961 ULONG DataLength, 1962 PIO_STATUS_BLOCK IoStatus); 1963 typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize, 1964 BOOLEAN InputOperation); 1965 1966 typedef struct { 1967 KSPROPERTY_MEMBERSHEADER MembersHeader; 1968 const VOID *Members; 1969 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; 1970 1971 typedef struct { 1972 KSIDENTIFIER PropTypeSet; 1973 ULONG MembersListCount; 1974 const KSPROPERTY_MEMBERSLIST *MembersList; 1975 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; 1976 1977 #define DEFINE_KSPROPERTY_TABLE(tablename) \ 1978 const KSPROPERTY_ITEM tablename[] = 1979 1980 #define DEFINE_KSPROPERTY_ITEM(PropertyId,GetHandler,MinProperty,MinData,SetHandler,Values,RelationsCount,Relations,SupportHandler,SerializedSize)\ 1981 { \ 1982 PropertyId, (PFNKSHANDLER)GetHandler, \ 1983 MinProperty, MinData, \ 1984 (PFNKSHANDLER)SetHandler, \ 1985 (PKSPROPERTY_VALUES)Values, RelationsCount, \ 1986 (PKSPROPERTY)Relations, \ 1987 (PFNKSHANDLER)SupportHandler, \ 1988 (ULONG)SerializedSize \ 1989 } 1990 1991 typedef struct { 1992 ULONG PropertyId; 1993 __C89_NAMELESS union { 1994 PFNKSHANDLER GetPropertyHandler; 1995 BOOLEAN GetSupported; 1996 }; 1997 ULONG MinProperty; 1998 ULONG MinData; 1999 __C89_NAMELESS union { 2000 PFNKSHANDLER SetPropertyHandler; 2001 BOOLEAN SetSupported; 2002 }; 2003 const KSPROPERTY_VALUES *Values; 2004 ULONG RelationsCount; 2005 const KSPROPERTY *Relations; 2006 PFNKSHANDLER SupportHandler; 2007 ULONG SerializedSize; 2008 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; 2009 2010 #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler) \ 2011 { \ 2012 PropertyId, (PFNKSFASTHANDLER)GetHandler, \ 2013 (PFNKSFASTHANDLER)SetHandler, 0 \ 2014 } 2015 2016 typedef struct { 2017 ULONG PropertyId; 2018 __C89_NAMELESS union { 2019 PFNKSFASTHANDLER GetPropertyHandler; 2020 BOOLEAN GetSupported; 2021 }; 2022 __C89_NAMELESS union { 2023 PFNKSFASTHANDLER SetPropertyHandler; 2024 BOOLEAN SetSupported; 2025 }; 2026 ULONG Reserved; 2027 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; 2028 2029 #define DEFINE_KSPROPERTY_SET(Set,PropertiesCount,PropertyItem,FastIoCount,FastIoTable)\ 2030 { \ 2031 Set, \ 2032 PropertiesCount, PropertyItem, \ 2033 FastIoCount, FastIoTable \ 2034 } 2035 2036 #define DEFINE_KSPROPERTY_SET_TABLE(tablename) \ 2037 const KSPROPERTY_SET tablename[] = 2038 2039 typedef struct { 2040 const GUID *Set; 2041 ULONG PropertiesCount; 2042 const KSPROPERTY_ITEM *PropertyItem; 2043 ULONG FastIoCount; 2044 const KSFASTPROPERTY_ITEM *FastIoTable; 2045 } KSPROPERTY_SET, *PKSPROPERTY_SET; 2046 2047 #define DEFINE_KSMETHOD_TABLE(tablename) \ 2048 const KSMETHOD_ITEM tablename[] = 2049 2050 #define DEFINE_KSMETHOD_ITEM(MethodId,Flags,MethodHandler,MinMethod,MinData,SupportHandler)\ 2051 { \ 2052 MethodId, (PFNKSHANDLER)MethodHandler, \ 2053 MinMethod, MinData, \ 2054 SupportHandler, Flags \ 2055 } 2056 2057 typedef struct { 2058 ULONG MethodId; 2059 __C89_NAMELESS union { 2060 PFNKSHANDLER MethodHandler; 2061 BOOLEAN MethodSupported; 2062 }; 2063 ULONG MinMethod; 2064 ULONG MinData; 2065 PFNKSHANDLER SupportHandler; 2066 ULONG Flags; 2067 } KSMETHOD_ITEM, *PKSMETHOD_ITEM; 2068 2069 #define DEFINE_KSFASTMETHOD_ITEM(MethodId,MethodHandler) \ 2070 { \ 2071 MethodId, (PFNKSFASTHANDLER)MethodHandler \ 2072 } 2073 2074 typedef struct { 2075 ULONG MethodId; 2076 __C89_NAMELESS union { 2077 PFNKSFASTHANDLER MethodHandler; 2078 BOOLEAN MethodSupported; 2079 }; 2080 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; 2081 2082 #define DEFINE_KSMETHOD_SET(Set,MethodsCount,MethodItem,FastIoCount,FastIoTable)\ 2083 { \ 2084 Set, \ 2085 MethodsCount, MethodItem, \ 2086 FastIoCount, FastIoTable \ 2087 } 2088 2089 #define DEFINE_KSMETHOD_SET_TABLE(tablename) \ 2090 const KSMETHOD_SET tablename[] = 2091 2092 typedef struct { 2093 const GUID *Set; 2094 ULONG MethodsCount; 2095 const KSMETHOD_ITEM *MethodItem; 2096 ULONG FastIoCount; 2097 const KSFASTMETHOD_ITEM *FastIoTable; 2098 } KSMETHOD_SET, *PKSMETHOD_SET; 2099 2100 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY; 2101 typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData, 2102 struct _KSEVENT_ENTRY* EventEntry); 2103 typedef VOID (*PFNKSREMOVEEVENT)(PFILE_OBJECT FileObject, 2104 struct _KSEVENT_ENTRY* EventEntry); 2105 2106 #define DEFINE_KSEVENT_TABLE(tablename) \ 2107 const KSEVENT_ITEM tablename[] = 2108 2109 #define DEFINE_KSEVENT_ITEM(EventId,DataInput,ExtraEntryData,AddHandler,RemoveHandler,SupportHandler)\ 2110 { \ 2111 EventId, DataInput, ExtraEntryData, \ 2112 AddHandler, RemoveHandler, SupportHandler \ 2113 } 2114 2115 typedef struct { 2116 ULONG EventId; 2117 ULONG DataInput; 2118 ULONG ExtraEntryData; 2119 PFNKSADDEVENT AddHandler; 2120 PFNKSREMOVEEVENT RemoveHandler; 2121 PFNKSHANDLER SupportHandler; 2122 } KSEVENT_ITEM, *PKSEVENT_ITEM; 2123 2124 #define DEFINE_KSEVENT_SET(Set,EventsCount,EventItem) \ 2125 { \ 2126 Set, EventsCount, EventItem \ 2127 } 2128 2129 #define DEFINE_KSEVENT_SET_TABLE(tablename) \ 2130 const KSEVENT_SET tablename[] = 2131 2132 typedef struct { 2133 const GUID *Set; 2134 ULONG EventsCount; 2135 const KSEVENT_ITEM *EventItem; 2136 } KSEVENT_SET, *PKSEVENT_SET; 2137 2138 typedef struct { 2139 KDPC Dpc; 2140 ULONG ReferenceCount; 2141 KSPIN_LOCK AccessLock; 2142 } KSDPC_ITEM, *PKSDPC_ITEM; 2143 2144 typedef struct { 2145 KSDPC_ITEM DpcItem; 2146 LIST_ENTRY BufferList; 2147 } KSBUFFER_ITEM, *PKSBUFFER_ITEM; 2148 2149 2150 #define KSEVENT_ENTRY_DELETED 1 2151 #define KSEVENT_ENTRY_ONESHOT 2 2152 #define KSEVENT_ENTRY_BUFFERED 4 2153 2154 struct _KSEVENT_ENTRY { 2155 LIST_ENTRY ListEntry; 2156 PVOID Object; 2157 __C89_NAMELESS union { 2158 PKSDPC_ITEM DpcItem; 2159 PKSBUFFER_ITEM BufferItem; 2160 }; 2161 PKSEVENTDATA EventData; 2162 ULONG NotificationType; 2163 const KSEVENT_SET *EventSet; 2164 const KSEVENT_ITEM *EventItem; 2165 PFILE_OBJECT FileObject; 2166 ULONG SemaphoreAdjustment; 2167 ULONG Reserved; 2168 ULONG Flags; 2169 }; 2170 2171 typedef enum { 2172 KSEVENTS_NONE, 2173 KSEVENTS_SPINLOCK, 2174 KSEVENTS_MUTEX, 2175 KSEVENTS_FMUTEX, 2176 KSEVENTS_FMUTEXUNSAFE, 2177 KSEVENTS_INTERRUPT, 2178 KSEVENTS_ERESOURCE 2179 } KSEVENTS_LOCKTYPE; 2180 2181 #define KSDISPATCH_FASTIO 0x80000000 2182 2183 typedef struct { 2184 PDRIVER_DISPATCH Create; 2185 PVOID Context; 2186 UNICODE_STRING ObjectClass; 2187 PSECURITY_DESCRIPTOR SecurityDescriptor; 2188 ULONG Flags; 2189 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; 2190 2191 typedef VOID (*PFNKSITEMFREECALLBACK)(PKSOBJECT_CREATE_ITEM CreateItem); 2192 2193 #define KSCREATE_ITEM_SECURITYCHANGED 0x00000001 2194 #define KSCREATE_ITEM_WILDCARD 0x00000002 2195 #define KSCREATE_ITEM_NOPARAMETERS 0x00000004 2196 #define KSCREATE_ITEM_FREEONSTOP 0x00000008 2197 2198 #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename ) \ 2199 KSOBJECT_CREATE_ITEM tablename[] = 2200 2201 #define DEFINE_KSCREATE_ITEM(DispatchCreate,TypeName,Context) \ 2202 { \ 2203 (DispatchCreate), (PVOID)(Context), \ 2204 { \ 2205 sizeof(TypeName) - sizeof(UNICODE_NULL),\ 2206 sizeof(TypeName), \ 2207 (PWCHAR)(TypeName) \ 2208 }, \ 2209 NULL, 0 \ 2210 } 2211 2212 #define DEFINE_KSCREATE_ITEMEX(DispatchCreate,TypeName,Context,Flags) \ 2213 { \ 2214 (DispatchCreate), \ 2215 (PVOID)(Context), \ 2216 { \ 2217 sizeof(TypeName) - sizeof(UNICODE_NULL),\ 2218 sizeof(TypeName), \ 2219 (PWCHAR)(TypeName) \ 2220 }, \ 2221 NULL, (Flags) \ 2222 } 2223 2224 #define DEFINE_KSCREATE_ITEMNULL(DispatchCreate,Context) \ 2225 { \ 2226 DispatchCreate, Context, \ 2227 { \ 2228 0, 0, NULL, \ 2229 }, \ 2230 NULL, 0 \ 2231 } 2232 2233 typedef struct { 2234 ULONG CreateItemsCount; 2235 PKSOBJECT_CREATE_ITEM CreateItemsList; 2236 } KSOBJECT_CREATE, *PKSOBJECT_CREATE; 2237 2238 typedef struct { 2239 PDRIVER_DISPATCH DeviceIoControl; 2240 PDRIVER_DISPATCH Read; 2241 PDRIVER_DISPATCH Write; 2242 PDRIVER_DISPATCH Flush; 2243 PDRIVER_DISPATCH Close; 2244 PDRIVER_DISPATCH QuerySecurity; 2245 PDRIVER_DISPATCH SetSecurity; 2246 PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; 2247 PFAST_IO_READ FastRead; 2248 PFAST_IO_WRITE FastWrite; 2249 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; 2250 2251 #define DEFINE_KSDISPATCH_TABLE(tablename,DeviceIoControl,Read,Write,Flush,Close,QuerySecurity,SetSecurity,FastDeviceIoControl,FastRead,FastWrite)\ 2252 const KSDISPATCH_TABLE tablename = \ 2253 { \ 2254 DeviceIoControl, \ 2255 Read, \ 2256 Write, \ 2257 Flush, \ 2258 Close, \ 2259 QuerySecurity, \ 2260 SetSecurity, \ 2261 FastDeviceIoControl, \ 2262 FastRead, \ 2263 FastWrite, \ 2264 } 2265 2266 #define KSCREATE_ITEM_IRP_STORAGE(Irp) \ 2267 (*(PKSOBJECT_CREATE_ITEM *)&(Irp)->Tail.Overlay.DriverContext[0]) 2268 #define KSEVENT_SET_IRP_STORAGE(Irp) \ 2269 (*(const KSEVENT_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) 2270 #define KSEVENT_ITEM_IRP_STORAGE(Irp) \ 2271 (*(const KSEVENT_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) 2272 #define KSEVENT_ENTRY_IRP_STORAGE(Irp) \ 2273 (*(PKSEVENT_ENTRY *)&(Irp)->Tail.Overlay.DriverContext[0]) 2274 #define KSMETHOD_SET_IRP_STORAGE(Irp) \ 2275 (*(const KSMETHOD_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) 2276 #define KSMETHOD_ITEM_IRP_STORAGE(Irp) \ 2277 (*(const KSMETHOD_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) 2278 #define KSMETHOD_TYPE_IRP_STORAGE(Irp) \ 2279 (*(ULONG_PTR *)(&(Irp)->Tail.Overlay.DriverContext[2])) 2280 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) \ 2281 (*(PKSPIN_LOCK *)&(Irp)->Tail.Overlay.DriverContext[1]) 2282 #define KSPROPERTY_SET_IRP_STORAGE(Irp) \ 2283 (*(const KSPROPERTY_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) 2284 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) \ 2285 (*(const KSPROPERTY_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) 2286 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) \ 2287 (*(PKSATTRIBUTE_LIST *)&(Irp)->Tail.Overlay.DriverContext[2]) 2288 2289 typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER; 2290 2291 typedef enum { 2292 KsInvokeOnSuccess = 1, 2293 KsInvokeOnError = 2, 2294 KsInvokeOnCancel = 4 2295 } KSCOMPLETION_INVOCATION; 2296 2297 typedef enum { 2298 KsListEntryTail, 2299 KsListEntryHead 2300 } KSLIST_ENTRY_LOCATION; 2301 2302 typedef enum { 2303 KsAcquireOnly, 2304 KsAcquireAndRemove, 2305 KsAcquireOnlySingleItem, 2306 KsAcquireAndRemoveOnlySingleItem 2307 } KSIRP_REMOVAL_OPERATION; 2308 2309 typedef enum { 2310 KsStackCopyToNewLocation, 2311 KsStackReuseCurrentLocation, 2312 KsStackUseNewLocation 2313 } KSSTACK_USE; 2314 2315 typedef enum { 2316 KSTARGET_STATE_DISABLED, 2317 KSTARGET_STATE_ENABLED 2318 } KSTARGET_STATE; 2319 2320 typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context); 2321 typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context); 2322 typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context); 2323 typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String); 2324 2325 #define BUS_INTERFACE_REFERENCE_VERSION 0x100 2326 2327 typedef struct { 2328 INTERFACE Interface; 2329 2330 PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; 2331 PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; 2332 PFNQUERYREFERENCESTRING QueryReferenceString; 2333 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; 2334 2335 #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard 2336 #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard 2337 2338 typedef NTSTATUS (*PFNQUERYMEDIUMSLIST) (PVOID Context, ULONG *MediumsCount, 2339 PKSPIN_MEDIUM *MediumList); 2340 2341 typedef struct 2342 { 2343 INTERFACE Interface; 2344 PFNQUERYMEDIUMSLIST QueryMediumsList; 2345 } BUS_INTERFACE_MEDIUMS,*PBUS_INTERFACE_MEDIUMS; 2346 2347 #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \ 2348 0x4EC35C3E,0x201B,0x11D2,0x87,0x45,0x00,0xA0,0xC9,0x22,0x31,0x96 2349 DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS); 2350 #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS) 2351 2352 #endif /* _NTDDK_ */ 2353 2354 #ifndef PACK_PRAGMAS_NOT_SUPPORTED 2355 #include <pshpack1.h> 2356 #endif 2357 2358 typedef struct { 2359 GUID PropertySet; 2360 ULONG Count; 2361 } KSPROPERTY_SERIALHDR,*PKSPROPERTY_SERIALHDR; 2362 2363 #ifndef PACK_PRAGMAS_NOT_SUPPORTED 2364 #include <poppack.h> 2365 #endif 2366 2367 typedef struct { 2368 KSIDENTIFIER PropTypeSet; 2369 ULONG Id; 2370 ULONG PropertyLength; 2371 } KSPROPERTY_SERIAL,*PKSPROPERTY_SERIAL; 2372 2373 2374 #if defined(_NTDDK_) 2375 2376 #define IOCTL_KS_HANDSHAKE \ 2377 CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) 2378 2379 typedef struct { 2380 GUID ProtocolId; 2381 PVOID Argument1; 2382 PVOID Argument2; 2383 } KSHANDSHAKE, *PKSHANDSHAKE; 2384 2385 typedef struct _KSGATE KSGATE, *PKSGATE; 2386 2387 struct _KSGATE { 2388 LONG Count; 2389 PKSGATE NextGate; 2390 }; 2391 2392 #ifndef _NTOS_ 2393 __forceinline void KsGateTurnInputOn (PKSGATE Gate) 2394 { 2395 while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) { 2396 Gate = Gate->NextGate; 2397 } 2398 } 2399 2400 __forceinline void KsGateTurnInputOff (PKSGATE Gate) 2401 { 2402 while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) { 2403 Gate = Gate->NextGate; 2404 } 2405 } 2406 2407 __forceinline BOOLEAN KsGateGetStateUnsafe (PKSGATE Gate) 2408 { 2409 return (BOOLEAN) (Gate->Count > 0); 2410 } 2411 2412 __forceinline BOOLEAN KsGateCaptureThreshold (PKSGATE Gate) 2413 { 2414 BOOLEAN captured; 2415 2416 captured = (BOOLEAN) (InterlockedCompareExchange(&Gate->Count, 0, 1) == 1); 2417 if (captured) { 2418 KsGateTurnInputOff(Gate->NextGate); 2419 } 2420 return captured; 2421 } 2422 2423 __forceinline void KsGateInitialize (PKSGATE Gate, LONG InitialCount, 2424 PKSGATE NextGate, BOOLEAN StateToPropagate) 2425 { 2426 Gate->Count = InitialCount; 2427 Gate->NextGate = NextGate; 2428 2429 if (NextGate) { 2430 if (InitialCount > 0) { 2431 if (StateToPropagate) KsGateTurnInputOn(NextGate); 2432 } else { 2433 if (! StateToPropagate) KsGateTurnInputOff(NextGate); 2434 } 2435 } 2436 } 2437 2438 __forceinline void KsGateInitializeAnd (PKSGATE AndGate, PKSGATE NextOrGate) 2439 { 2440 KsGateInitialize(AndGate, 1, NextOrGate, TRUE); 2441 } 2442 2443 __forceinline void KsGateInitializeOr (PKSGATE OrGate, PKSGATE NextAndGate) 2444 { 2445 KsGateInitialize(OrGate, 0, NextAndGate, FALSE); 2446 } 2447 2448 __forceinline void KsGateAddOnInputToAnd (PKSGATE AndGate) 2449 { 2450 (VOID)AndGate; 2451 } 2452 2453 __forceinline void KsGateAddOffInputToAnd (PKSGATE AndGate) 2454 { 2455 KsGateTurnInputOff(AndGate); 2456 } 2457 2458 __forceinline void KsGateRemoveOnInputFromAnd (PKSGATE AndGate) 2459 { 2460 (VOID)AndGate; 2461 } 2462 2463 __forceinline void KsGateRemoveOffInputFromAnd (PKSGATE AndGate) 2464 { 2465 KsGateTurnInputOn(AndGate); 2466 } 2467 2468 __forceinline void KsGateAddOnInputToOr (PKSGATE OrGate) 2469 { 2470 KsGateTurnInputOn(OrGate); 2471 } 2472 2473 __forceinline void KsGateAddOffInputToOr (PKSGATE OrGate) 2474 { 2475 (VOID)OrGate; 2476 } 2477 2478 __forceinline void KsGateRemoveOnInputFromOr (PKSGATE OrGate) 2479 { 2480 KsGateTurnInputOff(OrGate); 2481 } 2482 2483 __forceinline void KsGateRemoveOffInputFromOr (PKSGATE OrGate) 2484 { 2485 (VOID)OrGate; 2486 } 2487 2488 __forceinline void KsGateTerminateAnd (PKSGATE AndGate) 2489 { 2490 if (KsGateGetStateUnsafe(AndGate)) { 2491 KsGateRemoveOnInputFromOr(AndGate->NextGate); 2492 } else { 2493 KsGateRemoveOffInputFromOr(AndGate->NextGate); 2494 } 2495 } 2496 2497 __forceinline void KsGateTerminateOr (PKSGATE OrGate) 2498 { 2499 if (KsGateGetStateUnsafe(OrGate)) { 2500 KsGateRemoveOnInputFromAnd(OrGate->NextGate); 2501 } else { 2502 KsGateRemoveOffInputFromAnd(OrGate->NextGate); 2503 } 2504 } 2505 #endif /* _NTOS_ */ 2506 2507 2508 typedef PVOID KSOBJECT_BAG; 2509 2510 2511 typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context, 2512 PKSEVENT_ENTRY EventEntry); 2513 2514 typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device); 2515 2516 typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp, 2517 PCM_RESOURCE_LIST TranslatedResourceList, 2518 PCM_RESOURCE_LIST UntranslatedResourceList); 2519 2520 typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device); 2521 2522 typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp); 2523 2524 typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp); 2525 2526 typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp, 2527 PDEVICE_CAPABILITIES Capabilities); 2528 2529 typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(PKSDEVICE Device,PIRP Irp, 2530 DEVICE_POWER_STATE DeviceTo, 2531 DEVICE_POWER_STATE DeviceFrom, 2532 SYSTEM_POWER_STATE SystemTo, 2533 SYSTEM_POWER_STATE SystemFrom, 2534 POWER_ACTION Action); 2535 2536 typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp, 2537 DEVICE_POWER_STATE To, 2538 DEVICE_POWER_STATE From); 2539 2540 typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory); 2541 2542 typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory, 2543 DEVICE_POWER_STATE State); 2544 2545 typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp); 2546 2547 typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter, 2548 PKSPROCESSPIN_INDEXENTRY Index); 2549 2550 typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter); 2551 2552 typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State); 2553 2554 typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp); 2555 2556 typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState, 2557 KSSTATE FromState); 2558 2559 typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat, 2560 PKSMULTIPLE_ITEM OldAttributeList, 2561 const KSDATARANGE *DataRange, 2562 const KSATTRIBUTE_LIST *AttributeRange); 2563 2564 typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In, 2565 PKSHANDSHAKE Out); 2566 2567 typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin); 2568 2569 typedef void (*PFNKSPINVOID)(PKSPIN Pin); 2570 2571 typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State); 2572 2573 typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer, 2574 LARGE_INTEGER DueTime,PKDPC Dpc); 2575 2576 typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer); 2577 2578 typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin, 2579 PLONGLONG SystemTime); 2580 2581 typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution); 2582 2583 typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin, 2584 PKSALLOCATOR_FRAMING AllocatorFraming, 2585 PVOID *Context); 2586 2587 typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer); 2588 2589 2590 typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE; 2591 2592 struct KSAUTOMATION_TABLE_ { 2593 ULONG PropertySetsCount; 2594 ULONG PropertyItemSize; 2595 const KSPROPERTY_SET *PropertySets; 2596 ULONG MethodSetsCount; 2597 ULONG MethodItemSize; 2598 const KSMETHOD_SET *MethodSets; 2599 ULONG EventSetsCount; 2600 ULONG EventItemSize; 2601 const KSEVENT_SET *EventSets; 2602 #ifndef _WIN64 2603 PVOID Alignment; 2604 #endif 2605 }; 2606 2607 #define DEFINE_KSAUTOMATION_TABLE(table) \ 2608 const KSAUTOMATION_TABLE table = 2609 2610 #define DEFINE_KSAUTOMATION_PROPERTIES(table) \ 2611 SIZEOF_ARRAY(table), \ 2612 sizeof(KSPROPERTY_ITEM), \ 2613 table 2614 2615 #define DEFINE_KSAUTOMATION_METHODS(table) \ 2616 SIZEOF_ARRAY(table), \ 2617 sizeof(KSMETHOD_ITEM), \ 2618 table 2619 2620 #define DEFINE_KSAUTOMATION_EVENTS(table) \ 2621 SIZEOF_ARRAY(table), \ 2622 sizeof(KSEVENT_ITEM), \ 2623 table 2624 2625 #define DEFINE_KSAUTOMATION_PROPERTIES_NULL \ 2626 0, \ 2627 sizeof(KSPROPERTY_ITEM), \ 2628 NULL 2629 2630 #define DEFINE_KSAUTOMATION_METHODS_NULL \ 2631 0, \ 2632 sizeof(KSMETHOD_ITEM), \ 2633 NULL 2634 2635 #define DEFINE_KSAUTOMATION_EVENTS_NULL \ 2636 0, \ 2637 sizeof(KSEVENT_ITEM), \ 2638 NULL 2639 2640 #define MIN_DEV_VER_FOR_QI (0x100) 2641 2642 struct _KSDEVICE_DISPATCH { 2643 PFNKSDEVICECREATE Add; 2644 PFNKSDEVICEPNPSTART Start; 2645 PFNKSDEVICE PostStart; 2646 PFNKSDEVICEIRP QueryStop; 2647 PFNKSDEVICEIRPVOID CancelStop; 2648 PFNKSDEVICEIRPVOID Stop; 2649 PFNKSDEVICEIRP QueryRemove; 2650 PFNKSDEVICEIRPVOID CancelRemove; 2651 PFNKSDEVICEIRPVOID Remove; 2652 PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; 2653 PFNKSDEVICEIRPVOID SurpriseRemoval; 2654 PFNKSDEVICEQUERYPOWER QueryPower; 2655 PFNKSDEVICESETPOWER SetPower; 2656 PFNKSDEVICEIRP QueryInterface; 2657 }; 2658 2659 struct _KSFILTER_DISPATCH { 2660 PFNKSFILTERIRP Create; 2661 PFNKSFILTERIRP Close; 2662 PFNKSFILTERPROCESS Process; 2663 PFNKSFILTERVOID Reset; 2664 }; 2665 2666 struct _KSPIN_DISPATCH { 2667 PFNKSPINIRP Create; 2668 PFNKSPINIRP Close; 2669 PFNKSPIN Process; 2670 PFNKSPINVOID Reset; 2671 PFNKSPINSETDATAFORMAT SetDataFormat; 2672 PFNKSPINSETDEVICESTATE SetDeviceState; 2673 PFNKSPIN Connect; 2674 PFNKSPINVOID Disconnect; 2675 const KSCLOCK_DISPATCH *Clock; 2676 const KSALLOCATOR_DISPATCH *Allocator; 2677 }; 2678 2679 struct _KSCLOCK_DISPATCH { 2680 PFNKSPINSETTIMER SetTimer; 2681 PFNKSPINCANCELTIMER CancelTimer; 2682 PFNKSPINCORRELATEDTIME CorrelatedTime; 2683 PFNKSPINRESOLUTION Resolution; 2684 }; 2685 2686 struct _KSALLOCATOR_DISPATCH { 2687 PFNKSPININITIALIZEALLOCATOR InitializeAllocator; 2688 PFNKSDELETEALLOCATOR DeleteAllocator; 2689 PFNKSDEFAULTALLOCATE Allocate; 2690 PFNKSDEFAULTFREE Free; 2691 }; 2692 2693 #define KSDEVICE_DESCRIPTOR_VERSION (0x100) 2694 2695 struct _KSDEVICE_DESCRIPTOR { 2696 const KSDEVICE_DISPATCH *Dispatch; 2697 ULONG FilterDescriptorsCount; 2698 const KSFILTER_DESCRIPTOR*const *FilterDescriptors; 2699 ULONG Version; 2700 }; 2701 2702 struct _KSFILTER_DESCRIPTOR { 2703 const KSFILTER_DISPATCH *Dispatch; 2704 const KSAUTOMATION_TABLE *AutomationTable; 2705 ULONG Version; 2706 #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) 2707 ULONG Flags; 2708 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 2709 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 2710 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 2711 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008 2712 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000 2713 const GUID *ReferenceGuid; 2714 ULONG PinDescriptorsCount; 2715 ULONG PinDescriptorSize; 2716 const KSPIN_DESCRIPTOR_EX *PinDescriptors; 2717 ULONG CategoriesCount; 2718 const GUID *Categories; 2719 ULONG NodeDescriptorsCount; 2720 ULONG NodeDescriptorSize; 2721 const KSNODE_DESCRIPTOR *NodeDescriptors; 2722 ULONG ConnectionsCount; 2723 const KSTOPOLOGY_CONNECTION *Connections; 2724 const KSCOMPONENTID *ComponentId; 2725 }; 2726 2727 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor) \ 2728 const KSFILTER_DESCRIPTOR descriptor = 2729 2730 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table) \ 2731 SIZEOF_ARRAY(table), \ 2732 sizeof(table[0]), \ 2733 table 2734 2735 #define DEFINE_KSFILTER_CATEGORIES(table) \ 2736 SIZEOF_ARRAY(table), \ 2737 table 2738 2739 #define DEFINE_KSFILTER_CATEGORY(category) \ 2740 1, \ 2741 &(category) 2742 2743 #define DEFINE_KSFILTER_CATEGORIES_NULL \ 2744 0, \ 2745 NULL 2746 2747 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table) \ 2748 SIZEOF_ARRAY(table), \ 2749 sizeof(table[0]), \ 2750 table 2751 2752 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL \ 2753 0, \ 2754 sizeof(KSNODE_DESCRIPTOR), \ 2755 NULL 2756 2757 #define DEFINE_KSFILTER_CONNECTIONS(table) \ 2758 SIZEOF_ARRAY(table), \ 2759 table 2760 2761 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS \ 2762 0, \ 2763 NULL 2764 2765 #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table) \ 2766 const KSFILTER_DESCRIPTOR*const table[] = 2767 2768 struct _KSPIN_DESCRIPTOR_EX { 2769 const KSPIN_DISPATCH *Dispatch; 2770 const KSAUTOMATION_TABLE *AutomationTable; 2771 KSPIN_DESCRIPTOR PinDescriptor; 2772 ULONG Flags; 2773 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 2774 #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING 2775 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 2776 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 2777 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 2778 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 2779 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 2780 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 2781 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 2782 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 2783 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 2784 #define KSPIN_FLAG_SPLITTER 0x00020000 2785 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 2786 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 2787 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000 2788 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 2789 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) 2790 #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 2791 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000 2792 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000 2793 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000 2794 ULONG InstancesPossible; 2795 ULONG InstancesNecessary; 2796 const KSALLOCATOR_FRAMING_EX *AllocatorFraming; 2797 PFNKSINTERSECTHANDLEREX IntersectHandler; 2798 }; 2799 2800 #define DEFINE_KSPIN_DEFAULT_INTERFACES \ 2801 0, \ 2802 NULL 2803 2804 #define DEFINE_KSPIN_DEFAULT_MEDIUMS \ 2805 0, \ 2806 NULL 2807 2808 struct _KSNODE_DESCRIPTOR { 2809 const KSAUTOMATION_TABLE *AutomationTable; 2810 const GUID *Type; 2811 const GUID *Name; 2812 #ifndef _WIN64 2813 PVOID Alignment; 2814 #endif 2815 }; 2816 2817 #ifndef _WIN64 2818 #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ 2819 { (automation), (type), (name), NULL } 2820 #else 2821 #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ 2822 { (automation), (type), (name) } 2823 #endif 2824 2825 struct _KSDEVICE { 2826 const KSDEVICE_DESCRIPTOR *Descriptor; 2827 KSOBJECT_BAG Bag; 2828 PVOID Context; 2829 PDEVICE_OBJECT FunctionalDeviceObject; 2830 PDEVICE_OBJECT PhysicalDeviceObject; 2831 PDEVICE_OBJECT NextDeviceObject; 2832 BOOLEAN Started; 2833 SYSTEM_POWER_STATE SystemPowerState; 2834 DEVICE_POWER_STATE DevicePowerState; 2835 }; 2836 2837 struct _KSFILTERFACTORY { 2838 const KSFILTER_DESCRIPTOR *FilterDescriptor; 2839 KSOBJECT_BAG Bag; 2840 PVOID Context; 2841 }; 2842 2843 struct _KSFILTER { 2844 const KSFILTER_DESCRIPTOR *Descriptor; 2845 KSOBJECT_BAG Bag; 2846 PVOID Context; 2847 }; 2848 2849 struct _KSPIN { 2850 const KSPIN_DESCRIPTOR_EX *Descriptor; 2851 KSOBJECT_BAG Bag; 2852 PVOID Context; 2853 ULONG Id; 2854 KSPIN_COMMUNICATION Communication; 2855 BOOLEAN ConnectionIsExternal; 2856 KSPIN_INTERFACE ConnectionInterface; 2857 KSPIN_MEDIUM ConnectionMedium; 2858 KSPRIORITY ConnectionPriority; 2859 PKSDATAFORMAT ConnectionFormat; 2860 PKSMULTIPLE_ITEM AttributeList; 2861 ULONG StreamHeaderSize; 2862 KSPIN_DATAFLOW DataFlow; 2863 KSSTATE DeviceState; 2864 KSRESET ResetState; 2865 KSSTATE ClientState; 2866 }; 2867 2868 struct _KSMAPPING { 2869 PHYSICAL_ADDRESS PhysicalAddress; 2870 ULONG ByteCount; 2871 ULONG Alignment; 2872 }; 2873 2874 struct _KSSTREAM_POINTER_OFFSET 2875 { 2876 #if defined(_NTDDK_) 2877 __C89_NAMELESS union { 2878 PUCHAR Data; 2879 PKSMAPPING Mappings; 2880 }; 2881 #else 2882 PUCHAR Data; 2883 #endif /* _NTDDK_ */ 2884 #ifndef _WIN64 2885 PVOID Alignment; 2886 #endif 2887 ULONG Count; 2888 ULONG Remaining; 2889 }; 2890 2891 struct _KSSTREAM_POINTER 2892 { 2893 PVOID Context; 2894 PKSPIN Pin; 2895 PKSSTREAM_HEADER StreamHeader; 2896 PKSSTREAM_POINTER_OFFSET Offset; 2897 KSSTREAM_POINTER_OFFSET OffsetIn; 2898 KSSTREAM_POINTER_OFFSET OffsetOut; 2899 }; 2900 2901 struct _KSPROCESSPIN { 2902 PKSPIN Pin; 2903 PKSSTREAM_POINTER StreamPointer; 2904 PKSPROCESSPIN InPlaceCounterpart; 2905 PKSPROCESSPIN DelegateBranch; 2906 PKSPROCESSPIN CopySource; 2907 PVOID Data; 2908 ULONG BytesAvailable; 2909 ULONG BytesUsed; 2910 ULONG Flags; 2911 BOOLEAN Terminate; 2912 }; 2913 2914 struct _KSPROCESSPIN_INDEXENTRY { 2915 PKSPROCESSPIN *Pins; 2916 ULONG Count; 2917 }; 2918 2919 typedef enum { 2920 KsObjectTypeDevice, 2921 KsObjectTypeFilterFactory, 2922 KsObjectTypeFilter, 2923 KsObjectTypePin 2924 } KSOBJECTTYPE; 2925 2926 2927 typedef void (*PFNKSFREE)(PVOID Data); 2928 2929 typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl, 2930 PVOID Context,NTSTATUS Status); 2931 2932 typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp); 2933 2934 2935 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) 2936 #ifndef _IKsControl_ 2937 #define _IKsControl_ 2938 2939 typedef struct IKsControl *PIKSCONTROL; 2940 2941 #ifndef DEFINE_ABSTRACT_UNKNOWN 2942 #define DEFINE_ABSTRACT_UNKNOWN() \ 2943 STDMETHOD_(NTSTATUS,QueryInterface) (THIS_ \ 2944 REFIID InterfaceId, \ 2945 PVOID *Interface \ 2946 ) PURE; \ 2947 STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ 2948 STDMETHOD_(ULONG,Release)(THIS) PURE; 2949 #endif 2950 2951 #undef INTERFACE 2952 #define INTERFACE IKsControl 2953 DECLARE_INTERFACE_(IKsControl,IUnknown) 2954 { 2955 DEFINE_ABSTRACT_UNKNOWN() 2956 STDMETHOD_(NTSTATUS,KsProperty)(THIS_ 2957 PKSPROPERTY Property, 2958 ULONG PropertyLength, 2959 PVOID PropertyData, 2960 ULONG DataLength, 2961 ULONG *BytesReturned 2962 ) PURE; 2963 STDMETHOD_(NTSTATUS,KsMethod) (THIS_ 2964 PKSMETHOD Method, 2965 ULONG MethodLength, 2966 PVOID MethodData, 2967 ULONG DataLength, 2968 ULONG *BytesReturned 2969 ) PURE; 2970 STDMETHOD_(NTSTATUS,KsEvent) (THIS_ 2971 PKSEVENT Event, 2972 ULONG EventLength, 2973 PVOID EventData, 2974 ULONG DataLength, 2975 ULONG *BytesReturned 2976 ) PURE; 2977 }; 2978 typedef struct IKsReferenceClock *PIKSREFERENCECLOCK; 2979 2980 #undef INTERFACE 2981 #define INTERFACE IKsReferenceClock 2982 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) 2983 { 2984 DEFINE_ABSTRACT_UNKNOWN() 2985 STDMETHOD_(LONGLONG,GetTime) (THIS) PURE; 2986 STDMETHOD_(LONGLONG,GetPhysicalTime) (THIS) PURE; 2987 STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ 2988 PLONGLONG SystemTime 2989 ) PURE; 2990 STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ 2991 PLONGLONG SystemTime 2992 ) PURE; 2993 STDMETHOD_(NTSTATUS,GetResolution) (THIS_ 2994 PKSRESOLUTION Resolution 2995 ) PURE; 2996 STDMETHOD_(NTSTATUS,GetState) (THIS_ 2997 PKSSTATE State 2998 ) PURE; 2999 }; 3000 #undef INTERFACE 3001 3002 #define INTERFACE IKsDeviceFunctions 3003 DECLARE_INTERFACE_(IKsDeviceFunctions,IUnknown) 3004 { 3005 DEFINE_ABSTRACT_UNKNOWN() 3006 STDMETHOD_(NTSTATUS,RegisterAdapterObjectEx) (THIS_ 3007 PADAPTER_OBJECT AdapterObject, 3008 PDEVICE_DESCRIPTION DeviceDescription, 3009 ULONG NumberOfMapRegisters, 3010 ULONG MaxMappingsByteCount, 3011 ULONG MappingTableStride 3012 ) PURE; 3013 }; 3014 3015 #undef INTERFACE 3016 #define STATIC_IID_IKsControl \ 3017 0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 3018 DEFINE_GUID(IID_IKsControl, 3019 0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96); 3020 #define STATIC_IID_IKsFastClock \ 3021 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e 3022 DEFINE_GUID(IID_IKsFastClock, 3023 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e); 3024 #define STATIC_IID_IKsDeviceFunctions \ 3025 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd 3026 DEFINE_GUID(IID_IKsDeviceFunctions, 3027 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd); 3028 #endif /* _IKsControl_ */ 3029 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ 3030 3031 #endif /* _NTDDK_ */ 3032 3033 3034 #ifdef __cplusplus 3035 extern "C" { 3036 #endif 3037 3038 #ifdef _KSDDK_ 3039 #define KSDDKAPI 3040 #else 3041 #define KSDDKAPI DECLSPEC_IMPORT 3042 #endif 3043 3044 #if defined(_NTDDK_) 3045 3046 KSDDKAPI NTSTATUS NTAPI KsEnableEvent 3047 (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, 3048 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, 3049 PVOID EventsLock); 3050 3051 KSDDKAPI NTSTATUS NTAPI KsEnableEventWithAllocator 3052 (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, 3053 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, 3054 PVOID EventsLock, PFNKSALLOCATOR Allocator, ULONG EventItemSize); 3055 3056 KSDDKAPI NTSTATUS NTAPI KsDisableEvent 3057 (PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, 3058 PVOID EventsLock); 3059 3060 KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry); 3061 3062 KSDDKAPI VOID NTAPI KsFreeEventList 3063 (PFILE_OBJECT FileObject, PLIST_ENTRY EventsList, 3064 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); 3065 3066 KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry); 3067 3068 KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent 3069 (PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data); 3070 3071 KSDDKAPI VOID NTAPI KsGenerateEventList 3072 (GUID *Set, ULONG EventId, PLIST_ENTRY EventsList, 3073 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); 3074 3075 KSDDKAPI NTSTATUS NTAPI KsPropertyHandler 3076 (PIRP Irp, ULONG PropertySetsCount, 3077 const KSPROPERTY_SET *PropertySet); 3078 3079 KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator 3080 (PIRP Irp, ULONG PropertySetsCount, 3081 const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator, 3082 ULONG PropertyItemSize); 3083 3084 KSDDKAPI BOOLEAN NTAPI KsFastPropertyHandler 3085 (PFILE_OBJECT FileObject, PKSPROPERTY Property, 3086 ULONG PropertyLength, PVOID Data, ULONG DataLength, 3087 PIO_STATUS_BLOCK IoStatus, ULONG PropertySetsCount, 3088 const KSPROPERTY_SET *PropertySet); 3089 3090 KSDDKAPI NTSTATUS NTAPI KsMethodHandler 3091 (PIRP Irp, ULONG MethodSetsCount, 3092 const KSMETHOD_SET *MethodSet); 3093 3094 KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator 3095 (PIRP Irp, ULONG MethodSetsCount, 3096 const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator, 3097 ULONG MethodItemSize); 3098 3099 KSDDKAPI BOOLEAN NTAPI KsFastMethodHandler 3100 (PFILE_OBJECT FileObject, PKSMETHOD Method, ULONG MethodLength, 3101 PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus, 3102 ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet); 3103 3104 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp); 3105 3106 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx 3107 (PIRP Irp, PVOID InitializeContext, 3108 PFNKSDEFAULTALLOCATE DefaultAllocate, 3109 PFNKSDEFAULTFREE DefaultFree, 3110 PFNKSINITIALIZEALLOCATOR InitializeAllocator, 3111 PFNKSDELETEALLOCATOR DeleteAllocator); 3112 3113 KSDDKAPI NTSTATUS NTAPI KsCreateAllocator 3114 (HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming, 3115 PHANDLE AllocatorHandle); 3116 3117 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest 3118 (PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming); 3119 3120 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx 3121 (PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize, 3122 const KSALLOCATOR_FRAMING_EX *PinFraming); 3123 3124 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock); 3125 3126 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx 3127 (PKSDEFAULTCLOCK *DefaultClock, PVOID Context, 3128 PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer, 3129 PFNKSCORRELATEDTIME CorrelatedTime, 3130 const KSRESOLUTION *Resolution, ULONG Flags); 3131 3132 KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock); 3133 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock); 3134 3135 KSDDKAPI NTSTATUS NTAPI KsCreateClock 3136 (HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate, 3137 PHANDLE ClockHandle); 3138 3139 KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest 3140 (PIRP Irp, PKSCLOCK_CREATE *ClockCreate); 3141 3142 KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock); 3143 KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State); 3144 KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock); 3145 KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time); 3146 3147 KSDDKAPI NTSTATUS NTAPI KsCreatePin 3148 (HANDLE FilterHandle, PKSPIN_CONNECT Connect, 3149 ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle); 3150 3151 KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest 3152 (PIRP Irp, ULONG DescriptorsCount, 3153 const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect); 3154 3155 KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler 3156 (PIRP Irp, PKSPROPERTY Property, PVOID Data, 3157 ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor); 3158 3159 KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection 3160 (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, 3161 const KSPIN_DESCRIPTOR *Descriptor, 3162 PFNKSINTERSECTHANDLER IntersectHandler); 3163 3164 KSDDKAPI NTSTATUS NTAPI KsPinDataIntersectionEx 3165 (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, 3166 const KSPIN_DESCRIPTOR *Descriptor, ULONG DescriptorSize, 3167 PFNKSINTERSECTHANDLEREX IntersectHandler, PVOID HandlerContext); 3168 3169 KSDDKAPI NTSTATUS NTAPI KsHandleSizedListQuery 3170 (PIRP Irp, ULONG DataItemsCount, ULONG DataItemSize, 3171 const VOID *DataItems); 3172 3173 #ifndef MAKEINTRESOURCE 3174 #define MAKEINTRESOURCE(r) ((ULONG_PTR) (USHORT) r) 3175 #endif 3176 #ifndef RT_STRING 3177 #define RT_STRING MAKEINTRESOURCE(6) 3178 #define RT_RCDATA MAKEINTRESOURCE(10) 3179 #endif 3180 3181 KSDDKAPI NTSTATUS NTAPI KsLoadResource 3182 (PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName, 3183 ULONG ResourceType, PVOID *Resource, PULONG ResourceSize); 3184 3185 KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId 3186 (HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId, 3187 PULONG ValueType); 3188 3189 KSDDKAPI NTSTATUS NTAPI KsMapModuleName 3190 (PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName, 3191 PUNICODE_STRING ImageName, PULONG_PTR ResourceId, 3192 PULONG ValueType); 3193 3194 KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header); 3195 KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header); 3196 KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); 3197 KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); 3198 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler); 3199 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler); 3200 3201 KSDDKAPI NTSTATUS NTAPI KsReadFile 3202 (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, 3203 PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, 3204 ULONG Key, KPROCESSOR_MODE RequestorMode); 3205 3206 KSDDKAPI NTSTATUS NTAPI KsWriteFile 3207 (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, 3208 PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, 3209 ULONG Key, KPROCESSOR_MODE RequestorMode); 3210 3211 KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile 3212 (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, 3213 FILE_INFORMATION_CLASS FileInformationClass); 3214 3215 KSDDKAPI NTSTATUS NTAPI KsSetInformationFile 3216 (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, 3217 FILE_INFORMATION_CLASS FileInformationClass); 3218 3219 KSDDKAPI NTSTATUS NTAPI KsStreamIo 3220 (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, 3221 PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext, 3222 KSCOMPLETION_INVOCATION CompletionInvocationFlags, 3223 PIO_STATUS_BLOCK IoStatusBlock, PVOID StreamHeaders, ULONG Length, 3224 ULONG Flags, KPROCESSOR_MODE RequestorMode); 3225 3226 KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize); 3227 KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer); 3228 KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject); 3229 3230 KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler 3231 (PDRIVER_OBJECT DriverObject, ULONG MajorFunction); 3232 3233 KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest 3234 (PDEVICE_OBJECT DeviceObject, PIRP Irp); 3235 3236 KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion 3237 (PDEVICE_OBJECT DeviceObject, PIRP Irp); 3238 3239 KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); 3240 3241 KSDDKAPI BOOLEAN NTAPI KsDispatchFastIoDeviceControlFailure 3242 (PFILE_OBJECT FileObject, BOOLEAN Wait, PVOID InputBuffer, 3243 ULONG InputBufferLength, PVOID OutputBuffer, 3244 ULONG OutputBufferLength, ULONG IoControlCode, 3245 PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); 3246 3247 KSDDKAPI BOOLEAN NTAPI KsDispatchFastReadFailure 3248 (PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, 3249 ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, 3250 PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); 3251 3252 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure 3253 3254 KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp); 3255 KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock); 3256 KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel); 3257 3258 KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue 3259 (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, 3260 KSLIST_ENTRY_LOCATION ListLocation, 3261 KSIRP_REMOVAL_OPERATION RemovalOperation); 3262 3263 KSDDKAPI NTSTATUS NTAPI KsMoveIrpsOnCancelableQueue 3264 (PLIST_ENTRY SourceList, PKSPIN_LOCK SourceLock, 3265 PLIST_ENTRY DestinationList, PKSPIN_LOCK DestinationLock, 3266 KSLIST_ENTRY_LOCATION ListLocation, 3267 PFNKSIRPLISTCALLBACK ListCallback, PVOID Context); 3268 3269 KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp); 3270 3271 KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue 3272 (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp, 3273 KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel); 3274 3275 KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue); 3276 3277 KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler 3278 (PIRP Irp, PKSPROPERTY Property, PVOID Data, 3279 const KSTOPOLOGY *Topology); 3280 3281 KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive); 3282 KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header); 3283 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp); 3284 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp); 3285 KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); 3286 3287 KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject 3288 (KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject, 3289 PDEVICE_OBJECT BaseObject); 3290 3291 KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header); 3292 KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header); 3293 3294 KSDDKAPI VOID NTAPI KsRecalculateStackDepth 3295 (KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation); 3296 3297 KSDDKAPI VOID NTAPI KsSetTargetState 3298 (KSOBJECT_HEADER Header, KSTARGET_STATE TargetState); 3299 3300 KSDDKAPI VOID NTAPI KsSetTargetDeviceObject 3301 (KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice); 3302 3303 KSDDKAPI VOID NTAPI KsSetPowerDispatch 3304 (KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch, 3305 PVOID PowerContext); 3306 3307 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header); 3308 3309 KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader 3310 (KSDEVICE_HEADER *Header, ULONG ItemsCount, 3311 PKSOBJECT_CREATE_ITEM ItemsList); 3312 3313 KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header); 3314 3315 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader 3316 (KSOBJECT_HEADER *Header, ULONG ItemsCount, 3317 PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp, 3318 const KSDISPATCH_TABLE *Table); 3319 3320 KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header); 3321 3322 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader 3323 (KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, 3324 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); 3325 3326 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader 3327 (KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, 3328 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); 3329 3330 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem 3331 (KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem, 3332 BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback); 3333 3334 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem 3335 (KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem); 3336 3337 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext 3338 (KSDEVICE_HEADER Header, PVOID Context); 3339 3340 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity 3341 (PSECURITY_DESCRIPTOR ParentSecurity, 3342 PSECURITY_DESCRIPTOR *DefaultSecurity); 3343 3344 KSDDKAPI NTSTATUS NTAPI KsForwardIrp 3345 (PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation); 3346 3347 KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp 3348 (PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject, 3349 KSSTACK_USE StackUse); 3350 3351 KSDDKAPI NTSTATUS NTAPI KsSynchronousIoControlDevice 3352 (PFILE_OBJECT FileObject, KPROCESSOR_MODE RequestorMode, 3353 ULONG IoControl, PVOID InBuffer, ULONG InSize, PVOID OutBuffer, 3354 ULONG OutSize, PULONG BytesReturned); 3355 3356 KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry 3357 (PFILE_OBJECT FileObject, HANDLE ParentKey, 3358 PUNICODE_STRING RegistryPath); 3359 3360 KSDDKAPI NTSTATUS NTAPI KsCacheMedium 3361 (PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium, 3362 ULONG PinDirection); 3363 3364 KSDDKAPI NTSTATUS NTAPI KsRegisterWorker 3365 (WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker); 3366 3367 KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker 3368 (WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem, 3369 PKSWORKER *Worker); 3370 3371 KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker); 3372 KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem); 3373 KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker); 3374 KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker); 3375 3376 KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode 3377 (HANDLE ParentHandle, PKSNODE_CREATE NodeCreate, 3378 ACCESS_MASK DesiredAccess, PHANDLE NodeHandle); 3379 3380 KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest 3381 (PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate); 3382 3383 KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables 3384 (PKSAUTOMATION_TABLE *AutomationTableAB, 3385 PKSAUTOMATION_TABLE AutomationTableA, 3386 PKSAUTOMATION_TABLE AutomationTableB, 3387 KSOBJECT_BAG Bag); 3388 3389 KSDDKAPI NTSTATUS NTAPI KsInitializeDriver 3390 (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName, 3391 const KSDEVICE_DESCRIPTOR *Descriptor); 3392 3393 KSDDKAPI NTSTATUS NTAPI KsAddDevice 3394 (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject); 3395 3396 KSDDKAPI NTSTATUS NTAPI KsCreateDevice 3397 (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject, 3398 const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize, 3399 PKSDEVICE *Device); 3400 3401 KSDDKAPI NTSTATUS NTAPI KsInitializeDevice 3402 (PDEVICE_OBJECT FunctionalDeviceObject, 3403 PDEVICE_OBJECT PhysicalDeviceObject, 3404 PDEVICE_OBJECT NextDeviceObject, 3405 const KSDEVICE_DESCRIPTOR *Descriptor); 3406 3407 KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject); 3408 KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject); 3409 KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device); 3410 KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device); 3411 3412 KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject 3413 (PKSDEVICE Device, PADAPTER_OBJECT AdapterObject, 3414 ULONG MaxMappingsByteCount, ULONG MappingTableStride); 3415 3416 KSDDKAPI ULONG NTAPI KsDeviceGetBusData 3417 (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, 3418 ULONG Length); 3419 3420 KSDDKAPI ULONG NTAPI KsDeviceSetBusData 3421 (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, 3422 ULONG Length); 3423 3424 KSDDKAPI NTSTATUS NTAPI KsCreateFilterFactory 3425 (PDEVICE_OBJECT DeviceObject, const KSFILTER_DESCRIPTOR *Descriptor, 3426 PWSTR RefString, PSECURITY_DESCRIPTOR SecurityDescriptor, 3427 ULONG CreateItemFlags, PFNKSFILTERFACTORYPOWER SleepCallback, 3428 PFNKSFILTERFACTORYPOWER WakeCallback, 3429 PKSFILTERFACTORY *FilterFactory); 3430 3431 #define KsDeleteFilterFactory(FilterFactory) \ 3432 KsFreeObjectCreateItemsByContext( *(KSDEVICE_HEADER *)( \ 3433 KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->DeviceExtension),\ 3434 FilterFactory) 3435 3436 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData 3437 (PKSFILTERFACTORY FilterFactory, 3438 const KSFILTER_DESCRIPTOR *FilterDescriptor); 3439 3440 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem 3441 (PKSFILTERFACTORY FilterFactory, PWSTR RefString, 3442 PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags); 3443 3444 KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState 3445 (PKSFILTERFACTORY FilterFactory, BOOLEAN NewState); 3446 3447 KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink 3448 (PKSFILTERFACTORY FilterFactory); 3449 3450 KSDDKAPI void NTAPI KsAddEvent(PVOID Object, PKSEVENT_ENTRY EventEntry); 3451 3452 __forceinline void KsFilterAddEvent (PKSFILTER Filter, PKSEVENT_ENTRY EventEntry) 3453 { 3454 KsAddEvent(Filter, EventEntry); 3455 } 3456 3457 __forceinline void KsPinAddEvent (PKSPIN Pin, PKSEVENT_ENTRY EventEntry) 3458 { 3459 KsAddEvent(Pin, EventEntry); 3460 } 3461 3462 KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler 3463 (PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry); 3464 3465 KSDDKAPI void NTAPI KsGenerateEvents 3466 (PVOID Object, const GUID *EventSet, ULONG EventId, 3467 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, 3468 PVOID CallBackContext); 3469 3470 __forceinline void KsFilterGenerateEvents 3471 (PKSFILTER Filter, const GUID *EventSet, ULONG EventId, 3472 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, 3473 PVOID CallBackContext) 3474 { 3475 KsGenerateEvents(Filter, EventSet, EventId, DataSize, Data, CallBack, 3476 CallBackContext); 3477 } 3478 3479 __forceinline void KsPinGenerateEvents 3480 (PKSPIN Pin, const GUID *EventSet, ULONG EventId, 3481 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, 3482 PVOID CallBackContext) 3483 { 3484 KsGenerateEvents(Pin, EventSet, EventId, DataSize, Data, CallBack, 3485 CallBackContext); 3486 } 3487 3488 typedef enum { 3489 KSSTREAM_POINTER_STATE_UNLOCKED = 0, 3490 KSSTREAM_POINTER_STATE_LOCKED 3491 } KSSTREAM_POINTER_STATE; 3492 3493 KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount 3494 (PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes); 3495 3496 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer 3497 (PKSPIN Pin, KSSTREAM_POINTER_STATE State); 3498 3499 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer 3500 (PKSPIN Pin, KSSTREAM_POINTER_STATE State); 3501 3502 KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode 3503 (PKSSTREAM_POINTER StreamPointer, NTSTATUS Status); 3504 3505 KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer); 3506 KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject); 3507 3508 KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock 3509 (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, 3510 BOOLEAN Eject); 3511 3512 KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer); 3513 3514 KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone 3515 (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback, 3516 ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer); 3517 3518 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets 3519 (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, 3520 BOOLEAN Eject); 3521 3522 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer); 3523 KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer); 3524 3525 KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp 3526 (PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp, 3527 PBOOLEAN LastFrameInIrp); 3528 3529 KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout 3530 (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback, 3531 ULONGLONG Interval); 3532 3533 KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer); 3534 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin); 3535 3536 KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone 3537 (PKSSTREAM_POINTER StreamPointer); 3538 3539 KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out); 3540 KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp); 3541 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp); 3542 KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject); 3543 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromFileObject (PFILE_OBJECT FileObject); 3544 3545 __forceinline PKSFILTER KsGetFilterFromFileObject (PFILE_OBJECT FileObject) 3546 { 3547 return (PKSFILTER) KsGetObjectFromFileObject(FileObject); 3548 } 3549 3550 __forceinline PKSPIN KsGetPinFromFileObject (PFILE_OBJECT FileObject) 3551 { 3552 return (PKSPIN) KsGetObjectFromFileObject(FileObject); 3553 } 3554 3555 KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter); 3556 KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter); 3557 KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter); 3558 KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous); 3559 KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin); 3560 KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate); 3561 KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate); 3562 KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin); 3563 KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin); 3564 KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin); 3565 3566 KSDDKAPI void NTAPI KsPinGetCopyRelationships 3567 (PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch); 3568 3569 KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous); 3570 KSDDKAPI PVOID NTAPI KsGetParent (PVOID Object); 3571 3572 __forceinline PKSDEVICE KsFilterFactoryGetParentDevice (PKSFILTERFACTORY FilterFactory) 3573 { 3574 return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); 3575 } 3576 3577 __forceinline PKSFILTERFACTORY KsFilterGetParentFilterFactory (PKSFILTER Filter) 3578 { 3579 return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); 3580 } 3581 3582 KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin); 3583 KSDDKAPI PVOID NTAPI KsGetFirstChild (PVOID Object); 3584 3585 __forceinline PKSFILTERFACTORY KsDeviceGetFirstChildFilterFactory (PKSDEVICE Device) 3586 { 3587 return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device); 3588 } 3589 3590 __forceinline PKSFILTER KsFilterFactoryGetFirstChildFilter (PKSFILTERFACTORY FilterFactory) 3591 { 3592 return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory); 3593 } 3594 3595 KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId); 3596 KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId); 3597 KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object); 3598 KSDDKAPI PKSPIN NTAPI KsPinGetNextSiblingPin (PKSPIN Pin); 3599 3600 __forceinline PKSFILTERFACTORY KsFilterFactoryGetNextSiblingFilterFactory 3601 (PKSFILTERFACTORY FilterFactory) 3602 { 3603 return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory); 3604 } 3605 3606 __forceinline PKSFILTER KsFilterGetNextSiblingFilter (PKSFILTER Filter) 3607 { 3608 return (PKSFILTER) KsGetNextSibling((PVOID) Filter); 3609 } 3610 3611 KSDDKAPI PKSDEVICE NTAPI KsGetDevice (PVOID Object); 3612 3613 __forceinline PKSDEVICE KsFilterFactoryGetDevice (PKSFILTERFACTORY FilterFactory) 3614 { 3615 return KsGetDevice((PVOID) FilterFactory); 3616 } 3617 3618 __forceinline PKSDEVICE KsFilterGetDevice (PKSFILTER Filter) 3619 { 3620 return KsGetDevice((PVOID) Filter); 3621 } 3622 3623 __forceinline PKSDEVICE KsPinGetDevice (PKSPIN Pin) 3624 { 3625 return KsGetDevice((PVOID) Pin); 3626 } 3627 3628 KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp); 3629 KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp); 3630 KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp); 3631 KSDDKAPI void NTAPI KsAcquireControl (PVOID Object); 3632 KSDDKAPI void NTAPI KsReleaseControl (PVOID Object); 3633 3634 __forceinline void KsFilterAcquireControl (PKSFILTER Filter) 3635 { 3636 KsAcquireControl((PVOID) Filter); 3637 } 3638 3639 __forceinline void KsFilterReleaseControl (PKSFILTER Filter) 3640 { 3641 KsReleaseControl((PVOID) Filter); 3642 } 3643 3644 __forceinline void KsPinAcquireControl (PKSPIN Pin) 3645 { 3646 KsAcquireControl((PVOID) Pin); 3647 } 3648 3649 __forceinline void KsPinReleaseControl (PKSPIN Pin) 3650 { 3651 KsReleaseControl((PVOID) Pin); 3652 } 3653 3654 KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag 3655 (KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free); 3656 3657 KSDDKAPI ULONG NTAPI KsRemoveItemFromObjectBag 3658 (KSOBJECT_BAG ObjectBag, PVOID Item, BOOLEAN Free); 3659 3660 #define KsDiscard(Object,Pointer) \ 3661 KsRemoveItemFromObjectBag((Object)->Bag, (PVOID)(Pointer), TRUE) 3662 3663 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag); 3664 KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag); 3665 3666 KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems 3667 (KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource); 3668 3669 KSDDKAPI NTSTATUS NTAPI _KsEdit 3670 (KSOBJECT_BAG ObjectBag, PVOID *PointerToPointerToItem, 3671 ULONG NewSize, ULONG OldSize, ULONG Tag); 3672 3673 #define KsEdit(Object, PointerToPointer, Tag) \ 3674 _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), \ 3675 sizeof(**(PointerToPointer)), sizeof(**(PointerToPointer)), (Tag)) 3676 3677 #define KsEditSized(Object, PointerToPointer, NewSize, OldSize, Tag) \ 3678 _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), (NewSize), (OldSize), (Tag)) 3679 3680 KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins 3681 (PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID, 3682 ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList, 3683 GUID *CategoryList); 3684 3685 KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory 3686 (PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor, 3687 PULONG PinID); 3688 3689 KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode 3690 (PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor, 3691 PULONG NodeID); 3692 3693 KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections 3694 (PKSFILTER Filter, ULONG NewConnectionsCount, 3695 const KSTOPOLOGY_CONNECTION *const NewTopologyConnections); 3696 3697 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface 3698 (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); 3699 3700 KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin); 3701 KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin); 3702 3703 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface 3704 (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); 3705 3706 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) 3707 KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface 3708 (PKSPIN Pin, PIKSREFERENCECLOCK *Interface); 3709 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ 3710 3711 KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time); 3712 3713 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame 3714 (PKSPIN Pin, PVOID Data, ULONG Size, 3715 PKSSTREAM_HEADER StreamHeader, PVOID Context); 3716 3717 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl 3718 (PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader, 3719 PVOID Context); 3720 3721 KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback 3722 (PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn); 3723 3724 KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback 3725 (PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion); 3726 3727 KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback 3728 (PKSPIN Pin, PFNKSPINHANDSHAKE Handshake); 3729 3730 KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks 3731 (PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake); 3732 3733 KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks 3734 (PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake); 3735 3736 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) 3737 KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown 3738 (PVOID Object, PUNKNOWN ClientUnknown); 3739 3740 KSDDKAPI PUNKNOWN NTAPI KsGetOuterUnknown (PVOID Object); 3741 3742 __forceinline PUNKNOWN KsDeviceRegisterAggregatedClientUnknown 3743 (PKSDEVICE Device, PUNKNOWN ClientUnknown) 3744 { 3745 return KsRegisterAggregatedClientUnknown((PVOID)Device, ClientUnknown); 3746 } 3747 3748 __forceinline PUNKNOWN KsDeviceGetOuterUnknown (PKSDEVICE Device) 3749 { 3750 return KsGetOuterUnknown((PVOID) Device); 3751 } 3752 3753 __forceinline PUNKNOWN KsFilterFactoryRegisterAggregatedClientUnknown 3754 (PKSFILTERFACTORY FilterFactory, PUNKNOWN ClientUnknown) 3755 { 3756 return KsRegisterAggregatedClientUnknown((PVOID)FilterFactory, ClientUnknown); 3757 } 3758 3759 __forceinline PUNKNOWN KsFilterFactoryGetOuterUnknown (PKSFILTERFACTORY FilterFactory) 3760 { 3761 return KsGetOuterUnknown((PVOID)FilterFactory); 3762 } 3763 3764 __forceinline PUNKNOWN KsFilterRegisterAggregatedClientUnknown 3765 (PKSFILTER Filter, PUNKNOWN ClientUnknown) 3766 { 3767 return KsRegisterAggregatedClientUnknown((PVOID)Filter, ClientUnknown); 3768 } 3769 3770 __forceinline PUNKNOWN KsFilterGetOuterUnknown (PKSFILTER Filter) 3771 { 3772 return KsGetOuterUnknown((PVOID)Filter); 3773 } 3774 3775 __forceinline PUNKNOWN KsPinRegisterAggregatedClientUnknown 3776 (PKSPIN Pin, PUNKNOWN ClientUnknown) 3777 { 3778 return KsRegisterAggregatedClientUnknown((PVOID)Pin, ClientUnknown); 3779 } 3780 3781 __forceinline PUNKNOWN KsPinGetOuterUnknown (PKSPIN Pin) 3782 { 3783 return KsGetOuterUnknown((PVOID)Pin); 3784 } 3785 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ 3786 3787 #else /* _NTDDK_ */ 3788 3789 #ifndef KS_NO_CREATE_FUNCTIONS 3790 KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle); 3791 KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle); 3792 KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle); 3793 KSDDKAPI DWORD WINAPI KsCreateTopologyNode(HANDLE ParentHandle,PKSNODE_CREATE NodeCreate,ACCESS_MASK DesiredAccess,PHANDLE NodeHandle); 3794 #endif 3795 3796 #endif /* _NTDDK_ */ 3797 3798 #ifdef __cplusplus 3799 } 3800 #endif 3801 3802 #define DENY_USERMODE_ACCESS(pIrp,CompleteRequest) \ 3803 if(pIrp->RequestorMode!=KernelMode) { \ 3804 pIrp->IoStatus.Information = 0; \ 3805 pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; \ 3806 if(CompleteRequest) \ 3807 IoCompleteRequest (pIrp,IO_NO_INCREMENT); \ 3808 return STATUS_INVALID_DEVICE_REQUEST; \ 3809 } 3810 3811 #endif /* _KS_ */ 3812