home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / ks.h < prev    next >
C/C++ Source or Header  |  2000-02-01  |  142KB  |  5,413 lines

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