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