home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / ks.h < prev    next >
C/C++ Source or Header  |  1998-04-25  |  83KB  |  2,868 lines

  1. /*++
  2.  
  3. Copyright 1996 - 1998 Microsoft Corporation.
  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. #define _KS_
  18.  
  19. #if !defined(_NTRTL_)
  20.     #ifndef DEFINE_GUIDEX
  21.         #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
  22.     #endif // !defined(DEFINE_GUIDEX)
  23.  
  24.     #ifndef STATICGUIDOF
  25.         #define STATICGUIDOF(guid) STATIC_##guid
  26.     #endif // !defined(STATICGUIDOF)
  27. #endif // !defined(_NTRTL_)
  28.  
  29. #ifndef SIZEOF_ARRAY
  30.     #define SIZEOF_ARRAY(ar)        (sizeof(ar)/sizeof((ar)[0]))
  31. #endif // !defined(SIZEOF_ARRAY)
  32.  
  33. #if defined(__cplusplus) && _MSC_VER >= 1100
  34. #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n
  35. #define DEFINE_GUIDNAMED(n) __uuidof(struct n)
  36. #else // !defined(__cplusplus)
  37. #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n)
  38. #define DEFINE_GUIDNAMED(n) n
  39. #endif // !defined(__cplusplus)
  40.  
  41. //===========================================================================
  42.  
  43. #define STATIC_GUID_NULL \
  44.     0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  45.  
  46. DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
  47. #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
  48.  
  49. //===========================================================================
  50.  
  51. #define IOCTL_KS_PROPERTY              CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
  52. #define IOCTL_KS_ENABLE_EVENT          CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
  53. #define IOCTL_KS_DISABLE_EVENT         CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
  54. #define IOCTL_KS_METHOD                CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
  55. #define IOCTL_KS_WRITE_STREAM          CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
  56. #define IOCTL_KS_READ_STREAM           CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
  57. #define IOCTL_KS_RESET_STATE           CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
  58.  
  59. //===========================================================================
  60.  
  61. typedef enum {
  62.     KSRESET_BEGIN,
  63.     KSRESET_END
  64. } KSRESET;
  65.  
  66. typedef enum {
  67.     KSSTATE_STOP,
  68.     KSSTATE_ACQUIRE,
  69.     KSSTATE_PAUSE,
  70.     KSSTATE_RUN
  71. } KSSTATE, *PKSSTATE;
  72.  
  73. #define KSPRIORITY_LOW        0x00000001
  74. #define KSPRIORITY_NORMAL     0x40000000
  75. #define KSPRIORITY_HIGH       0x80000000
  76. #define KSPRIORITY_EXCLUSIVE  0xFFFFFFFF
  77.  
  78. typedef struct {
  79.     ULONG   PriorityClass;
  80.     ULONG   PrioritySubClass;
  81. } KSPRIORITY, *PKSPRIORITY;
  82.  
  83. typedef union {
  84.     struct {
  85.         GUID    Set;
  86.         ULONG   Id;
  87.         ULONG   Flags;
  88.     };
  89. #if defined(_NTDDK_)
  90.     ULONGLONG  Alignment;
  91. #else // !_NTDDK_
  92.     DWORDLONG  Alignment;
  93. #endif // !_NTDDK_
  94. } KSIDENTIFIER, *PKSIDENTIFIER;
  95.  
  96. typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT;
  97.  
  98. #define KSMETHOD_TYPE_NONE                  0x00000000
  99. #define KSMETHOD_TYPE_READ                  0x00000001
  100. #define KSMETHOD_TYPE_WRITE                 0x00000002
  101. #define KSMETHOD_TYPE_MODIFY                0x00000003
  102. #define KSMETHOD_TYPE_SOURCE                0x00000004
  103. #define KSMETHOD_TYPE_SETSUPPORT            0x00000100
  104. #define KSMETHOD_TYPE_BASICSUPPORT          0x00000200
  105.  
  106. #define KSPROPERTY_TYPE_GET                 0x00000001
  107. #define KSPROPERTY_TYPE_SET                 0x00000002
  108. #define KSPROPERTY_TYPE_SETSUPPORT          0x00000100
  109. #define KSPROPERTY_TYPE_BASICSUPPORT        0x00000200
  110. #define KSPROPERTY_TYPE_RELATIONS           0x00000400
  111. #define KSPROPERTY_TYPE_SERIALIZESET        0x00000800
  112. #define KSPROPERTY_TYPE_UNSERIALIZESET      0x00001000
  113. #define KSPROPERTY_TYPE_SERIALIZERAW        0x00002000
  114. #define KSPROPERTY_TYPE_UNSERIALIZERAW      0x00004000
  115. #define KSPROPERTY_TYPE_SERIALIZESIZE       0x00008000
  116. #define KSPROPERTY_TYPE_DEFAULTVALUES       0x00010000
  117.  
  118. #define KSPROPERTY_TYPE_TOPOLOGY            0x10000000
  119.  
  120. #define STATIC_KSPROPTYPESETID_General \
  121.     0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  122. DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
  123. #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
  124.  
  125. #if defined(_NTDDK_) && !defined(__wtypes_h__)
  126. enum VARENUM {
  127.     VT_EMPTY = 0,
  128.     VT_NULL = 1,
  129.     VT_I2 = 2,
  130.     VT_I4 = 3,
  131.     VT_R4 = 4,
  132.     VT_R8 = 5,
  133.     VT_CY = 6,
  134.     VT_DATE = 7,
  135.     VT_BSTR = 8,
  136.     VT_DISPATCH = 9,
  137.     VT_ERROR = 10,
  138.     VT_BOOL = 11,
  139.     VT_VARIANT = 12,
  140.     VT_UNKNOWN = 13,
  141.     VT_DECIMAL = 14,
  142.     VT_I1 = 16,
  143.     VT_UI1 = 17,
  144.     VT_UI2 = 18,
  145.     VT_UI4 = 19,
  146.     VT_I8 = 20,
  147.     VT_UI8 = 21,
  148.     VT_INT = 22,
  149.     VT_UINT = 23,
  150.     VT_VOID = 24,
  151.     VT_HRESULT  = 25,
  152.     VT_PTR = 26,
  153.     VT_SAFEARRAY = 27,
  154.     VT_CARRAY = 28,
  155.     VT_USERDEFINED = 29,
  156.     VT_LPSTR = 30,
  157.     VT_LPWSTR = 31,
  158.     VT_FILETIME = 64,
  159.     VT_BLOB = 65,
  160.     VT_STREAM = 66,
  161.     VT_STORAGE = 67,
  162.     VT_STREAMED_OBJECT = 68,
  163.     VT_STORED_OBJECT = 69,
  164.     VT_BLOB_OBJECT = 70,
  165.     VT_CF = 71,
  166.     VT_CLSID = 72,
  167.     VT_VECTOR = 0x1000,
  168.     VT_ARRAY = 0x2000,
  169.     VT_BYREF = 0x4000,
  170.     VT_RESERVED = 0x8000,
  171.     VT_ILLEGAL = 0xffff,
  172.     VT_ILLEGALMASKED = 0xfff,
  173.     VT_TYPEMASK = 0xfff
  174. };
  175. #endif // _NTDDK_ && !__wtypes_h__
  176.  
  177. typedef struct {
  178.     ULONG    Size;
  179.     ULONG    Count;
  180. } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
  181.  
  182. typedef struct {
  183.     ULONG           AccessFlags;
  184.     ULONG           DescriptionSize;
  185.     KSIDENTIFIER    PropTypeSet;
  186.     ULONG           MembersListCount;
  187.     ULONG           Reserved;
  188. } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
  189.  
  190. #define KSPROPERTY_MEMBER_RANGES            0x00000001
  191. #define KSPROPERTY_MEMBER_STEPPEDRANGES     0x00000002
  192. #define KSPROPERTY_MEMBER_VALUES            0x00000003
  193.  
  194. #define KSPROPERTY_MEMBER_FLAG_DEFAULT      0x00000001
  195.  
  196. typedef struct {
  197.     ULONG   MembersFlags;
  198.     ULONG   MembersSize;
  199.     ULONG   MembersCount;
  200.     ULONG   Flags;
  201. } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
  202.  
  203. typedef union {
  204.     struct {
  205.         LONG    SignedMinimum;
  206.         LONG    SignedMaximum;
  207.     };
  208.     struct {
  209.         ULONG   UnsignedMinimum;
  210.         ULONG   UnsignedMaximum;
  211.     };
  212. } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
  213.  
  214. typedef union {
  215.     struct {
  216.         LONGLONG    SignedMinimum;
  217.         LONGLONG    SignedMaximum;
  218.     };
  219.     struct {
  220. #if defined(_NTDDK_)
  221.         ULONGLONG   UnsignedMinimum;
  222.         ULONGLONG   UnsignedMaximum;
  223. #else // !_NTDDK_
  224.         DWORDLONG   UnsignedMinimum;
  225.         DWORDLONG   UnsignedMaximum;
  226. #endif // !_NTDDK_
  227.     };
  228. } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
  229.  
  230. typedef struct {
  231.     ULONG                       SteppingDelta;
  232.     ULONG                       Reserved;
  233.     KSPROPERTY_BOUNDS_LONG      Bounds;
  234. } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
  235.  
  236. typedef struct {
  237. #if defined(_NTDDK_)
  238.     ULONGLONG                   SteppingDelta;
  239. #else // !_NTDDK_
  240.     DWORDLONG                   SteppingDelta;
  241. #endif // !_NTDDK_
  242.     KSPROPERTY_BOUNDS_LONGLONG  Bounds;
  243. } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
  244.  
  245. //===========================================================================
  246.  
  247. typedef struct _KSEVENTDATA *PKSEVENTDATA;
  248.  
  249. #if defined(_NTDDK_)
  250.  
  251. typedef
  252. VOID
  253. (*PFNKSEVENTCALLBACK)(
  254.     IN PKSEVENTDATA Context,
  255.     IN ULONG DataSize,
  256.     IN PVOID Data
  257.     );
  258.  
  259. #endif // defined(_NTDDK_)
  260.  
  261. typedef struct _KSEVENTDATA {
  262.     union {
  263.         struct {
  264.             ULONG       NotificationType;
  265.             ULONG       Reserved;
  266.         };
  267. #if defined(_NTDDK_)
  268.         ULONGLONG     Alignment;
  269. #else // !_NTDDK_
  270.         DWORDLONG     Alignment;
  271. #endif // !_NTDDK_
  272.     };
  273.     union {
  274.         struct {
  275.             HANDLE              Event;
  276.             ULONG               Reserved;
  277.         } EventHandle;
  278. #if defined(_NTDDK_)
  279.         struct {
  280.             PVOID               Event;
  281.             KPRIORITY           Increment;
  282.         } EventObject;
  283.         struct {
  284.             PKDPC               Dpc;
  285.             ULONG               ReferenceCount;
  286.         } Dpc;
  287.         struct {
  288.             PWORK_QUEUE_ITEM    WorkQueueItem;
  289.             WORK_QUEUE_TYPE     WorkQueueType;
  290.         } WorkItem;
  291.         struct {
  292.             PFNKSEVENTCALLBACK  Callback;
  293.             USHORT              Slots;
  294.             USHORT              SlotSize;
  295.         } Callback;
  296. #endif // defined(_NTDDK_)
  297.     };
  298. } KSEVENTDATA;
  299.  
  300. #define KSEVENTF_HANDLE     0x00000001
  301. #if defined(_NTDDK_)
  302. #define KSEVENTF_OBJECT     0x00000002
  303. #define KSEVENTF_DPC        0x00000004
  304. #define KSEVENTF_WORKITEM   0x00000008
  305. #define KSEVENTF_CALLBACK   0x00000010
  306. #endif // defined(_NTDDK_)
  307.  
  308. #define KSEVENT_TYPE_ENABLE         0x00000001
  309. #define KSEVENT_TYPE_ONESHOT        0x00000002
  310. #define KSEVENT_TYPE_SETSUPPORT     0x00000100
  311. #define KSEVENT_TYPE_BASICSUPPORT   0x00000200
  312.  
  313. //===========================================================================
  314.  
  315. typedef struct {
  316.     KSEVENTDATA     EventData;
  317.     LONGLONG        MarkTime;
  318. } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
  319.  
  320. typedef struct {
  321.     KSEVENTDATA     EventData;
  322.     LONGLONG        TimeBase;
  323.     LONGLONG        Interval;
  324. } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
  325.  
  326. typedef struct {
  327.     LONGLONG        TimeBase;
  328.     LONGLONG        Interval;
  329. } KSINTERVAL, *PKSINTERVAL;
  330.  
  331. //===========================================================================
  332.  
  333. #define STATIC_KSPROPSETID_MediaSeeking\
  334.     0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  335. DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
  336. #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
  337.  
  338. typedef enum {
  339.     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
  340.     KSPROPERTY_MEDIASEEKING_FORMATS,
  341.     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
  342.     KSPROPERTY_MEDIASEEKING_POSITION,
  343.     KSPROPERTY_MEDIASEEKING_STOPPOSITION,
  344.     KSPROPERTY_MEDIASEEKING_POSITIONS,
  345.     KSPROPERTY_MEDIASEEKING_DURATION,
  346.     KSPROPERTY_MEDIASEEKING_AVAILABLE,
  347.     KSPROPERTY_MEDIASEEKING_PREROLL,
  348.     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
  349. } KSPROPERTY_MEDIASEEKING;
  350.  
  351. typedef enum {
  352.     KS_SEEKING_NoPositioning,
  353.     KS_SEEKING_AbsolutePositioning,
  354.     KS_SEEKING_RelativePositioning,
  355.     KS_SEEKING_IncrementalPositioning,
  356.     KS_SEEKING_PositioningBitsMask = 0x3,
  357.     KS_SEEKING_SeekToKeyFrame,
  358.     KS_SEEKING_ReturnTime = 0x8
  359. } KS_SEEKING_FLAGS;
  360.  
  361. typedef enum {
  362.     KS_SEEKING_CanSeekAbsolute = 0x1,
  363.     KS_SEEKING_CanSeekForwards = 0x2,
  364.     KS_SEEKING_CanSeekBackwards = 0x4,
  365.     KS_SEEKING_CanGetCurrentPos = 0x8,
  366.     KS_SEEKING_CanGetStopPos = 0x10,
  367.     KS_SEEKING_CanGetDuration = 0x20,
  368.     KS_SEEKING_CanPlayBackwards = 0x40
  369. } KS_SEEKING_CAPABILITIES;
  370.  
  371. typedef struct {
  372.     LONGLONG            Current;
  373.     LONGLONG            Stop;
  374.     KS_SEEKING_FLAGS    CurrentFlags;
  375.     KS_SEEKING_FLAGS    StopFlags;
  376. } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
  377.  
  378. typedef struct {
  379.     LONGLONG    Earliest;
  380.     LONGLONG    Latest;
  381. } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
  382.  
  383. typedef struct {
  384.     KSPROPERTY  Property;
  385.     GUID        SourceFormat;
  386.     GUID        TargetFormat;
  387.     LONGLONG    Time;
  388. } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
  389.  
  390. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
  391.     DEFINE_KSPROPERTY_ITEM(\
  392.         KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
  393.         (Handler),\
  394.         sizeof(KSPROPERTY),\
  395.         sizeof(KS_SEEKING_CAPABILITIES),\
  396.         NULL, NULL, 0, NULL, NULL, 0)
  397.  
  398. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
  399.     DEFINE_KSPROPERTY_ITEM(\
  400.         KSPROPERTY_MEDIASEEKING_FORMATS,\
  401.         (Handler),\
  402.         sizeof(KSPROPERTY),\
  403.         0,\
  404.         NULL, NULL, 0, NULL, NULL, 0)
  405.  
  406. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
  407.     DEFINE_KSPROPERTY_ITEM(\
  408.         KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
  409.         (GetHandler),\
  410.         sizeof(KSPROPERTY),\
  411.         sizeof(GUID),\
  412.         (SetHandler),\
  413.         NULL, 0, NULL, NULL, 0)
  414.  
  415. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
  416.     DEFINE_KSPROPERTY_ITEM(\
  417.         KSPROPERTY_MEDIASEEKING_POSITION,\
  418.         (Handler),\
  419.         sizeof(KSPROPERTY),\
  420.         sizeof(LONGLONG),\
  421.         NULL, NULL, 0, NULL, NULL, 0)
  422.  
  423. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
  424.     DEFINE_KSPROPERTY_ITEM(\
  425.         KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
  426.         (Handler),\
  427.         sizeof(KSPROPERTY),\
  428.         sizeof(LONGLONG),\
  429.         NULL, NULL, 0, NULL, NULL, 0)
  430.  
  431. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
  432.     DEFINE_KSPROPERTY_ITEM(\
  433.         KSPROPERTY_MEDIASEEKING_POSITIONS,\
  434.         NULL,\
  435.         sizeof(KSPROPERTY),\
  436.         sizeof(KSPROPERTY_POSITIONS),\
  437.         (Handler),\
  438.         NULL, 0, NULL, NULL, 0)
  439.  
  440. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
  441.     DEFINE_KSPROPERTY_ITEM(\
  442.         KSPROPERTY_MEDIASEEKING_DURATION,\
  443.         (Handler),\
  444.         sizeof(KSPROPERTY),\
  445.         sizeof(LONGLONG),\
  446.         NULL, NULL, 0, NULL, NULL, 0)
  447.  
  448. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
  449.     DEFINE_KSPROPERTY_ITEM(\
  450.         KSPROPERTY_MEDIASEEKING_AVAILABLE,\
  451.         (Handler),\
  452.         sizeof(KSPROPERTY),\
  453.         sizeof(KSPROPERTY_MEDIAAVAILABLE),\
  454.         NULL, NULL, 0, NULL, NULL, 0)
  455.  
  456. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
  457.     DEFINE_KSPROPERTY_ITEM(\
  458.         KSPROPERTY_MEDIASEEKING_PREROLL,\
  459.         (Handler),\
  460.         sizeof(KSPROPERTY),\
  461.         sizeof(LONGLONG),\
  462.         NULL, NULL, 0, NULL, NULL, 0)
  463.  
  464. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
  465.     DEFINE_KSPROPERTY_ITEM(\
  466.         KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
  467.         (Handler),\
  468.         sizeof(KSP_TIMEFORMAT),\
  469.         sizeof(LONGLONG),\
  470.         NULL, NULL, 0, NULL, NULL, 0)
  471.  
  472. //===========================================================================
  473.  
  474. #define STATIC_KSPROPSETID_Topology\
  475.     0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  476. DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
  477. #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
  478.  
  479. typedef enum {
  480.     KSPROPERTY_TOPOLOGY_CATEGORIES,
  481.     KSPROPERTY_TOPOLOGY_NODES,
  482.     KSPROPERTY_TOPOLOGY_CONNECTIONS,
  483.     KSPROPERTY_TOPOLOGY_NAME
  484. } KSPROPERTY_TOPOLOGY;
  485.  
  486. typedef struct {
  487.     KSPROPERTY      Property;
  488.     ULONG           NodeId;
  489.     ULONG           Reserved;
  490. } KSP_NODE, *PKSP_NODE;
  491.  
  492. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
  493.     DEFINE_KSPROPERTY_ITEM(\
  494.         KSPROPERTY_TOPOLOGY_CATEGORIES,\
  495.         (Handler),\
  496.         sizeof(KSPROPERTY),\
  497.         0,\
  498.         NULL, NULL, 0, NULL, NULL, 0)
  499.  
  500. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
  501.     DEFINE_KSPROPERTY_ITEM(\
  502.         KSPROPERTY_TOPOLOGY_NODES,\
  503.         (Handler),\
  504.         sizeof(KSPROPERTY),\
  505.         0,\
  506.         NULL, NULL, 0, NULL, NULL, 0)
  507.  
  508. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
  509.     DEFINE_KSPROPERTY_ITEM(\
  510.         KSPROPERTY_TOPOLOGY_CONNECTIONS,\
  511.         (Handler),\
  512.         sizeof(KSPROPERTY),\
  513.         0,\
  514.         NULL, NULL, 0, NULL, NULL, 0)
  515.  
  516. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  517.     DEFINE_KSPROPERTY_ITEM(\
  518.         KSPROPERTY_TOPOLOGY_NAME,\
  519.         (Handler),\
  520.         sizeof(KSP_NODE),\
  521.         0,\
  522.         NULL, NULL, 0, NULL, NULL, 0)
  523.  
  524. #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
  525. DEFINE_KSPROPERTY_TABLE(TopologySet) {\
  526.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
  527.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
  528.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
  529.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  530. }
  531.  
  532. #define STATIC_KSCATEGORY_BRIDGE \
  533.     0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  534. DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
  535. #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
  536.  
  537. #define STATIC_KSCATEGORY_CAPTURE \
  538.     0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  539. DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
  540. #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
  541.  
  542. #define STATIC_KSCATEGORY_RENDER \
  543.     0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  544. DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
  545. #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
  546.  
  547. #define STATIC_KSCATEGORY_MIXER \
  548.     0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  549. DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
  550. #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
  551.  
  552. #define STATIC_KSCATEGORY_SPLITTER \
  553.     0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  554. DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
  555. #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
  556.  
  557. #define STATIC_KSCATEGORY_DATACOMPRESSOR \
  558.     0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  559. DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
  560. #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
  561.  
  562. #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
  563.     0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  564. DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
  565. #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
  566.  
  567. #define STATIC_KSCATEGORY_DATATRANSFORM \
  568.     0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  569. DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
  570. #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
  571.  
  572. #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
  573.     0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  574. DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
  575. #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
  576.  
  577. #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
  578.     0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  579. DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
  580. #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
  581.  
  582. #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
  583.     0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  584. DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
  585. #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
  586.  
  587. #define STATIC_KSCATEGORY_FILESYSTEM \
  588.     0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  589. DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
  590. #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
  591.  
  592. // KSNAME_Clock
  593. #define STATIC_KSCATEGORY_CLOCK \
  594.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  595. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
  596. #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
  597.  
  598. #define STATIC_KSCATEGORY_PROXY \
  599.     0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  600. DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
  601. #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
  602.  
  603. #define STATIC_KSCATEGORY_QUALITY \
  604.     0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  605. DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
  606. #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
  607.  
  608. typedef struct {
  609.     ULONG   FromNode;
  610.     ULONG   FromNodePin;
  611.     ULONG   ToNode;
  612.     ULONG   ToNodePin;
  613. } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
  614.  
  615. typedef struct {
  616.     ULONG                           CategoriesCount;
  617.     GUID*                           Categories;
  618.     ULONG                           TopologyNodesCount;
  619.     GUID*                           TopologyNodes;
  620.     ULONG                           TopologyConnectionsCount;
  621.     const KSTOPOLOGY_CONNECTION*    TopologyConnections;
  622.     GUID*                           TopologyNodesNames;
  623.     ULONG                           Reserved;
  624. } KSTOPOLOGY, *PKSTOPOLOGY;
  625.  
  626. #define KSFILTER_NODE   ((ULONG)-1)
  627.  
  628. typedef struct {
  629.     ULONG       CreateFlags;
  630.     ULONG       Node;
  631. } KSNODE_CREATE, *PKSNODE_CREATE;
  632.  
  633. //===========================================================================
  634.  
  635. // TIME_FORMAT_NONE
  636. #define STATIC_KSTIME_FORMAT_NONE       STATIC_GUID_NULL
  637. #define KSTIME_FORMAT_NONE              GUID_NULL
  638.  
  639. // TIME_FORMAT_FRAME
  640. #define STATIC_KSTIME_FORMAT_FRAME\
  641.     0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  642. DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME);
  643. #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
  644.  
  645. // TIME_FORMAT_BYTE             
  646. #define STATIC_KSTIME_FORMAT_BYTE\
  647.     0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  648. DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE);
  649. #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
  650.  
  651. // TIME_FORMAT_SAMPLE
  652. #define STATIC_KSTIME_FORMAT_SAMPLE\
  653.     0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  654. DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE);
  655. #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
  656.  
  657. // TIME_FORMAT_FIELD
  658. #define STATIC_KSTIME_FORMAT_FIELD\
  659.     0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  660. DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD);
  661. #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
  662.  
  663. // TIME_FORMAT_MEDIA_TIME
  664. #define STATIC_KSTIME_FORMAT_MEDIA_TIME\
  665.     0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  666. DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME);
  667. #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
  668.  
  669. //===========================================================================
  670.  
  671. typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
  672.  
  673. #define STATIC_KSINTERFACESETID_Standard \
  674.     0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  675. DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
  676. #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
  677.  
  678. typedef enum {
  679.     KSINTERFACE_STANDARD_STREAMING,
  680.     KSINTERFACE_STANDARD_LOOPED_STREAMING,
  681.     KSINTERFACE_STANDARD_CONTROL
  682. } KSINTERFACE_STANDARD;
  683.  
  684. //===========================================================================
  685.  
  686. #define KSMEDIUM_TYPE_ANYINSTANCE       0
  687. #define KSMEDIUM_TYPE_SPECIFICINSTANCE  1
  688.  
  689. #define STATIC_KSMEDIUMSETID_Standard \
  690.     0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  691. DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
  692. #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
  693.  
  694. //For compatibility only
  695. #define KSMEDIUM_STANDARD_DEVIO     KSMEDIUM_TYPE_ANYINSTANCE
  696.  
  697. #define STATIC_KSMEDIUMSETID_FileIo \
  698.     0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  699. DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSMEDIUMSETID_FileIo);
  700. #define KSMEDIUMSETID_FileIo DEFINE_GUIDNAMED(KSMEDIUMSETID_FileIo)
  701.  
  702. //===========================================================================
  703.  
  704. #define STATIC_KSPROPSETID_Pin\
  705.     0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
  706. DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
  707. #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
  708.  
  709. typedef enum {
  710.     KSPROPERTY_PIN_CINSTANCES,
  711.     KSPROPERTY_PIN_CTYPES,
  712.     KSPROPERTY_PIN_DATAFLOW,
  713.     KSPROPERTY_PIN_DATARANGES,
  714.     KSPROPERTY_PIN_DATAINTERSECTION,
  715.     KSPROPERTY_PIN_INTERFACES,
  716.     KSPROPERTY_PIN_MEDIUMS,
  717.     KSPROPERTY_PIN_COMMUNICATION,
  718.     KSPROPERTY_PIN_GLOBALCINSTANCES,
  719.     KSPROPERTY_PIN_NECESSARYINSTANCES,
  720.     KSPROPERTY_PIN_PHYSICALCONNECTION,
  721.     KSPROPERTY_PIN_CATEGORY,
  722.     KSPROPERTY_PIN_NAME
  723. } KSPROPERTY_PIN;
  724.  
  725. typedef struct {
  726.     KSPROPERTY      Property;
  727.     ULONG           PinId;
  728.     ULONG           Reserved;
  729. } KSP_PIN, *PKSP_PIN;
  730.  
  731. #define KSINSTANCE_INDETERMINATE    ((ULONG)-1)
  732.  
  733. typedef struct {
  734.     ULONG  PossibleCount;
  735.     ULONG  CurrentCount;
  736. } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
  737.  
  738. typedef enum {
  739.     KSPIN_DATAFLOW_IN = 1,
  740.     KSPIN_DATAFLOW_OUT
  741. } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
  742.  
  743. #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION   0
  744. #define KSDATAFORMAT_TEMPORAL_COMPRESSION       (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
  745.  
  746. typedef union {
  747.     struct {
  748.         ULONG   FormatSize;
  749.         ULONG   Flags;
  750.         ULONG   SampleSize;
  751.         ULONG   Reserved;
  752.         GUID    MajorFormat;
  753.         GUID    SubFormat;
  754.         GUID    Specifier;
  755.     };
  756. #if defined(_NTDDK_)
  757.     ULONGLONG  Alignment;
  758. #else // !_NTDDK_
  759.     DWORDLONG  Alignment;
  760. #endif // !_NTDDK_
  761. } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  762.  
  763. typedef enum {
  764.     KSPIN_COMMUNICATION_NONE,
  765.     KSPIN_COMMUNICATION_SINK,
  766.     KSPIN_COMMUNICATION_SOURCE,
  767.     KSPIN_COMMUNICATION_BOTH,
  768.     KSPIN_COMMUNICATION_BRIDGE
  769. } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
  770.  
  771. typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
  772.  
  773. typedef struct {
  774.     KSPIN_INTERFACE Interface;
  775.     KSPIN_MEDIUM    Medium;
  776.     ULONG           PinId;
  777.     HANDLE          PinToHandle;
  778.     KSPRIORITY      Priority;
  779. } KSPIN_CONNECT, *PKSPIN_CONNECT;
  780.  
  781. typedef struct {
  782.     ULONG   Size;
  783.     ULONG   Pin;
  784.     WCHAR   SymbolicLinkName[1];
  785. } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
  786.  
  787. #if defined(_NTDDK_)
  788. typedef
  789. NTSTATUS
  790. (*PFNKSINTERSECTHANDLER)(
  791.     IN PIRP Irp,
  792.     IN PKSP_PIN Pin,
  793.     IN PKSDATARANGE DataRange,
  794.     OUT PVOID Data
  795.     );
  796. #endif // _NTDDK_
  797.  
  798. #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\
  799.     const KSPIN_INTERFACE tablename[] =
  800.  
  801. #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\
  802.     {\
  803.         STATICGUIDOF(guid),\
  804.         (interface),\
  805.         0\
  806.     }
  807.  
  808. #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\
  809.     const KSPIN_MEDIUM tablename[] =
  810.  
  811. #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\
  812.     DEFINE_KSPIN_INTERFACE_ITEM(guid, medium)
  813.  
  814. #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
  815.     DEFINE_KSPROPERTY_ITEM(\
  816.         KSPROPERTY_PIN_CINSTANCES,\
  817.         (Handler),\
  818.         sizeof(KSP_PIN),\
  819.         sizeof(KSPIN_CINSTANCES),\
  820.         NULL, NULL, 0, NULL, NULL, 0)
  821.  
  822. #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
  823.     DEFINE_KSPROPERTY_ITEM(\
  824.         KSPROPERTY_PIN_CTYPES,\
  825.         (Handler),\
  826.         sizeof(KSPROPERTY),\
  827.         sizeof(ULONG),\
  828.         NULL, NULL, 0, NULL, NULL, 0)
  829.  
  830. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
  831.     DEFINE_KSPROPERTY_ITEM(\
  832.         KSPROPERTY_PIN_DATAFLOW,\
  833.         (Handler),\
  834.         sizeof(KSP_PIN),\
  835.         sizeof(KSPIN_DATAFLOW),\
  836.         NULL, NULL, 0, NULL, NULL, 0)
  837.  
  838. #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
  839.     DEFINE_KSPROPERTY_ITEM(\
  840.         KSPROPERTY_PIN_DATARANGES,\
  841.         (Handler),\
  842.         sizeof(KSP_PIN),\
  843.         0,\
  844.         NULL, NULL, 0, NULL, NULL, 0)
  845.  
  846. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
  847.     DEFINE_KSPROPERTY_ITEM(\
  848.         KSPROPERTY_PIN_DATAINTERSECTION,\
  849.         (Handler),\
  850.         sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
  851.         0,\
  852.         NULL, NULL, 0, NULL, NULL, 0)
  853.  
  854. #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
  855.     DEFINE_KSPROPERTY_ITEM(\
  856.         KSPROPERTY_PIN_INTERFACES,\
  857.         (Handler),\
  858.         sizeof(KSP_PIN),\
  859.         0,\
  860.         NULL, NULL, 0, NULL, NULL, 0)
  861.  
  862. #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
  863.     DEFINE_KSPROPERTY_ITEM(\
  864.         KSPROPERTY_PIN_MEDIUMS,\
  865.         (Handler),\
  866.         sizeof(KSP_PIN),\
  867.         0,\
  868.         NULL, NULL, 0, NULL, NULL, 0)
  869.  
  870. #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
  871.     DEFINE_KSPROPERTY_ITEM(\
  872.         KSPROPERTY_PIN_COMMUNICATION,\
  873.         (Handler),\
  874.         sizeof(KSP_PIN),\
  875.         sizeof(KSPIN_COMMUNICATION),\
  876.         NULL, NULL, 0, NULL, NULL, 0)
  877.  
  878. #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
  879.     DEFINE_KSPROPERTY_ITEM(\
  880.         KSPROPERTY_PIN_GLOBALCINSTANCES,\
  881.         (Handler),\
  882.         sizeof(KSP_PIN),\
  883.         sizeof(KSPIN_CINSTANCES),\
  884.         NULL, NULL, 0, NULL, NULL, 0)
  885.  
  886. #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
  887.     DEFINE_KSPROPERTY_ITEM(\
  888.         KSPROPERTY_PIN_NECESSARYINSTANCES,\
  889.         (Handler),\
  890.         sizeof(KSP_PIN),\
  891.         sizeof(ULONG),\
  892.         NULL, NULL, 0, NULL, NULL, 0)
  893.  
  894. #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
  895.     DEFINE_KSPROPERTY_ITEM(\
  896.         KSPROPERTY_PIN_PHYSICALCONNECTION,\
  897.         (Handler),\
  898.         sizeof(KSP_PIN),\
  899.         0,\
  900.         NULL, NULL, 0, NULL, NULL, 0)
  901.  
  902. #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
  903.     DEFINE_KSPROPERTY_ITEM(\
  904.         KSPROPERTY_PIN_CATEGORY,\
  905.         (Handler),\
  906.         sizeof(KSP_PIN),\
  907.         sizeof(GUID),\
  908.         NULL, NULL, 0, NULL, NULL, 0)
  909.  
  910. #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
  911.     DEFINE_KSPROPERTY_ITEM(\
  912.         KSPROPERTY_PIN_NAME,\
  913.         (Handler),\
  914.         sizeof(KSP_PIN),\
  915.         0,\
  916.         NULL, NULL, 0, NULL, NULL, 0)
  917.  
  918. #define DEFINE_KSPROPERTY_PINSET(PinSet,\
  919.     PropGeneral, PropInstances, PropIntersection)\
  920. DEFINE_KSPROPERTY_TABLE(PinSet) {\
  921.     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  922.     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  923.     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  924.     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  925.     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  926.     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  927.     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  928.     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  929.     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  930.     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
  931. }
  932.  
  933. #define STATIC_KSNAME_Filter\
  934.     0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  935. DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
  936. #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
  937.  
  938. #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
  939.  
  940. #define STATIC_KSNAME_Pin\
  941.     0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  942. DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
  943. #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
  944.  
  945. #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
  946.  
  947. #define STATIC_KSNAME_Clock\
  948.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  949. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock);
  950. #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
  951.  
  952. #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
  953.  
  954. #define STATIC_KSNAME_Allocator\
  955.     0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  956. DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator);
  957. #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
  958.  
  959. #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
  960.  
  961. #define STATIC_KSNAME_TopologyNode\
  962.     0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  963. DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode);
  964. #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
  965.  
  966. #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
  967.  
  968. #if defined(_NTDDK_)
  969.  
  970. typedef struct {
  971.     ULONG                   InterfacesCount;
  972.     const KSPIN_INTERFACE*  Interfaces;
  973.     ULONG                   MediumsCount;
  974.     const KSPIN_MEDIUM*     Mediums;
  975.     ULONG                   DataRangesCount;
  976.     const PKSDATARANGE*     DataRanges;
  977.     KSPIN_DATAFLOW          DataFlow;
  978.     KSPIN_COMMUNICATION     Communication;
  979.     GUID*                   Category;
  980.     GUID*                   Name;
  981.     LONGLONG                Reserved;
  982. } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
  983. typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
  984.  
  985. #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\
  986.     const KSPIN_DESCRIPTOR tablename[] =
  987.  
  988. #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\
  989.     InterfacesCount, Interfaces,\
  990.     MediumsCount, Mediums,\
  991.     DataRangesCount, DataRanges,\
  992.     DataFlow, Communication)\
  993. {\
  994.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  995.     DataRangesCount, DataRanges, DataFlow, Communication,\
  996.     NULL, NULL, 0\
  997. }
  998. #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\
  999.     InterfacesCount, Interfaces,\
  1000.     MediumsCount, Mediums,\
  1001.     DataRangesCount, DataRanges,\
  1002.     DataFlow, Communication,\
  1003.     Category, Name)\
  1004. {\
  1005.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  1006.     DataRangesCount, DataRanges, DataFlow, Communication,\
  1007.     Category, Name, 0\
  1008. }
  1009.  
  1010. #endif // defined(_NTDDK_)
  1011.  
  1012. //===========================================================================
  1013.  
  1014. // MEDIATYPE_NULL
  1015. #define STATIC_KSDATAFORMAT_TYPE_WILDCARD       STATIC_GUID_NULL
  1016. #define KSDATAFORMAT_TYPE_WILDCARD              GUID_NULL
  1017.  
  1018. // MEDIASUBTYPE_NULL
  1019. #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD    STATIC_GUID_NULL
  1020. #define KSDATAFORMAT_SUBTYPE_WILDCARD           GUID_NULL
  1021.  
  1022. // MEDIATYPE_Stream
  1023. #define STATIC_KSDATAFORMAT_TYPE_STREAM\
  1024.     0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  1025. DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM);
  1026. #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
  1027.  
  1028. #define STATIC_KSDATAFORMAT_SUBTYPE_UNKNOWN\
  1029.     0xF97B2060L, 0x3BC0, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1030. DEFINE_GUIDSTRUCT("F97B2060-3BC0-11D0-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_UNKNOWN);
  1031. #define KSDATAFORMAT_SUBTYPE_UNKNOWN DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_UNKNOWN)
  1032.  
  1033. #define STATIC_KSDATAFORMAT_SPECIFIER_NONE  STATIC_GUID_NULL
  1034. #define KSDATAFORMAT_SPECIFIER_NONE         GUID_NULL
  1035.  
  1036. #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\
  1037.     0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1038. DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME);
  1039. #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
  1040.  
  1041. #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\
  1042.     0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1043. DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE);
  1044. #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
  1045.  
  1046. #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD\
  1047.     0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1048. DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_WILDCARD);
  1049. #define KSDATAFORMAT_SPECIFIER_WILDCARD DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WILDCARD)
  1050.  
  1051. //===========================================================================
  1052.  
  1053. #define STATIC_KSPROPSETID_Quality \
  1054.     0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1055. DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality);
  1056. #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
  1057.  
  1058. typedef enum {
  1059.     KSPROPERTY_QUALITY_REPORT
  1060. } KSPROPERTY_QUALITY;
  1061.  
  1062. #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\
  1063.     DEFINE_KSPROPERTY_ITEM(\
  1064.         KSPROPERTY_QUALITY_REPORT,\
  1065.         (GetHandler),\
  1066.         sizeof(KSPROPERTY),\
  1067.         sizeof(KSQUALITY),\
  1068.         (SetHandler),\
  1069.         NULL, 0, NULL, NULL, 0)
  1070.  
  1071. //===========================================================================
  1072.  
  1073. #define STATIC_KSPROPSETID_Connection \
  1074.     0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1075. DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
  1076. #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
  1077.  
  1078. typedef enum {
  1079.     KSPROPERTY_CONNECTION_STATE,
  1080.     KSPROPERTY_CONNECTION_PRIORITY,
  1081.     KSPROPERTY_CONNECTION_DATAFORMAT,
  1082.     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
  1083.     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
  1084.     KSPROPERTY_CONNECTION_ACQUIREORDERING
  1085. } KSPROPERTY_CONNECTION;
  1086.  
  1087. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
  1088.     DEFINE_KSPROPERTY_ITEM(\
  1089.         KSPROPERTY_CONNECTION_STATE,\
  1090.         (GetHandler),\
  1091.         sizeof(KSPROPERTY),\
  1092.         sizeof(KSSTATE),\
  1093.         (SetHandler),\
  1094.         NULL, 0, NULL, NULL, 0)
  1095.  
  1096. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
  1097.     DEFINE_KSPROPERTY_ITEM(\
  1098.         KSPROPERTY_CONNECTION_PRIORITY,\
  1099.         (GetHandler),\
  1100.         sizeof(KSPROPERTY),\
  1101.         sizeof(KSPRIORITY),\
  1102.         (SetHandler),\
  1103.         NULL, 0, NULL, NULL, 0)
  1104.  
  1105. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
  1106.     DEFINE_KSPROPERTY_ITEM(\
  1107.         KSPROPERTY_CONNECTION_DATAFORMAT,\
  1108.         (GetHandler),\
  1109.         sizeof(KSPROPERTY),\
  1110.         0,\
  1111.         (SetHandler),\
  1112.         NULL, 0, NULL, NULL, 0)
  1113.  
  1114. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
  1115.     DEFINE_KSPROPERTY_ITEM(\
  1116.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
  1117.         (Handler),\
  1118.         sizeof(KSPROPERTY),\
  1119.         sizeof(KSALLOCATOR_FRAMING),\
  1120.         NULL, NULL, 0, NULL, NULL, 0)
  1121.  
  1122. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
  1123.     DEFINE_KSPROPERTY_ITEM(\
  1124.         KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
  1125.         NULL,\
  1126.         sizeof(KSPROPERTY),\
  1127.         sizeof(KSDATAFORMAT),\
  1128.         (Handler),\
  1129.         NULL, 0, NULL, NULL, 0)
  1130.  
  1131. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
  1132.     DEFINE_KSPROPERTY_ITEM(\
  1133.         KSPROPERTY_CONNECTION_ACQUIREORDERING,\
  1134.         (Handler),\
  1135.         sizeof(KSPROPERTY),\
  1136.         sizeof(BOOL),\
  1137.         NULL, NULL, 0, NULL, NULL, 0)
  1138.  
  1139. //===========================================================================
  1140.  
  1141. #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER   0x00000001
  1142. #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY      0x00000002
  1143. #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY    0x00000004
  1144. #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE      0x00000008
  1145. #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY   0x80000000
  1146.  
  1147. #define KSALLOCATOR_OPTIONF_COMPATIBLE              0x00000001
  1148. #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY           0x00000002
  1149. #define KSALLOCATOR_OPTIONF_VALID                   0x00000003
  1150.  
  1151. typedef struct {
  1152.     union {
  1153.         ULONG       OptionsFlags;       // allocator options (create)
  1154.         ULONG       RequirementsFlags;  // allocation requirements (query)
  1155.     };
  1156. #if defined(_NTDDK_)
  1157.     POOL_TYPE   PoolType;
  1158. #else // !_NTDDK_
  1159.     ULONG       PoolType;
  1160. #endif // !_NTDDK_
  1161.     ULONG       Frames;     // total number of allowable outstanding frames
  1162.     ULONG       FrameSize;  // total size of frame
  1163.     ULONG       FileAlignment;
  1164.     ULONG       Reserved;
  1165. } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
  1166.  
  1167. // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4}
  1168.  
  1169. #define STATIC_KSEVENTSETID_StreamAllocator\
  1170.     0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1171. DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator);
  1172. #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
  1173.  
  1174. typedef enum {
  1175.     KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
  1176.     KSEVENT_STREAMALLOCATOR_FREEFRAME
  1177. } KSEVENT_STREAMALLOCATOR;
  1178.  
  1179. #define STATIC_KSMETHODSETID_StreamAllocator\
  1180.     0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1181. DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator);
  1182. #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
  1183.  
  1184. typedef enum {
  1185.     KSMETHOD_STREAMALLOCATOR_ALLOC,
  1186.     KSMETHOD_STREAMALLOCATOR_FREE
  1187. } KSMETHOD_STREAMALLOCATOR;
  1188.  
  1189. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\
  1190.     DEFINE_KSMETHOD_ITEM(\
  1191.         KSMETHOD_STREAMALLOCATOR_ALLOC,\
  1192.         KSMETHOD_TYPE_WRITE,\
  1193.         (Handler),\
  1194.         sizeof(KSMETHOD),\
  1195.         sizeof(PVOID),\
  1196.         NULL)
  1197.  
  1198. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\
  1199.     DEFINE_KSMETHOD_ITEM(\
  1200.         KSMETHOD_STREAMALLOCATOR_FREE,\
  1201.         KSMETHOD_TYPE_READ,\
  1202.         (Handler),\
  1203.         sizeof(KSMETHOD),\
  1204.         sizeof(PVOID),\
  1205.         NULL)
  1206.  
  1207. #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\
  1208. DEFINE_KSMETHOD_TABLE(AllocatorSet) {\
  1209.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\
  1210.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\
  1211. }
  1212.  
  1213. #define STATIC_KSPROPSETID_StreamAllocator\
  1214.     0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1215. DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
  1216. #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
  1217.  
  1218. #if defined(_NTDDK_)
  1219. typedef enum {
  1220.     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
  1221.     KSPROPERTY_STREAMALLOCATOR_STATUS
  1222. } KSPROPERTY_STREAMALLOCATOR;
  1223.  
  1224. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\
  1225.     DEFINE_KSPROPERTY_ITEM(\
  1226.         KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
  1227.         (Handler),\
  1228.         sizeof(KSPROPERTY),\
  1229.         sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
  1230.         NULL, NULL, 0, NULL, NULL, 0)
  1231.         
  1232. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\
  1233.     DEFINE_KSPROPERTY_ITEM(\
  1234.         KSPROPERTY_STREAMALLOCATOR_STATUS,\
  1235.         (Handler),\
  1236.         sizeof(KSPROPERTY),\
  1237.         sizeof(KSSTREAMALLOCATOR_STATUS),\
  1238.         NULL, NULL, 0, NULL, NULL, 0)
  1239.  
  1240. #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\
  1241. DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\
  1242.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\
  1243.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
  1244. }
  1245.  
  1246. typedef
  1247. NTSTATUS
  1248. (*PFNALLOCATOR_ALLOCATEFRAME)(
  1249.     IN PFILE_OBJECT FileObject,
  1250.     PVOID *Frame
  1251.     );
  1252.  
  1253. typedef
  1254. VOID
  1255. (*PFNALLOCATOR_FREEFRAME)(
  1256.     IN PFILE_OBJECT FileObject,
  1257.     IN PVOID Frame
  1258.     );
  1259.  
  1260. typedef struct {
  1261.     PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
  1262.     PFNALLOCATOR_FREEFRAME      FreeFrame;
  1263. } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
  1264. #endif // defined(_NTDDK_)
  1265.  
  1266. typedef struct {
  1267.     KSALLOCATOR_FRAMING Framing;
  1268.     ULONG               AllocatedFrames;
  1269.     ULONG               Reserved;
  1270. } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
  1271.  
  1272. #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT        0x00000001
  1273. #define KSSTREAM_HEADER_OPTIONSF_PREROLL            0x00000002
  1274. #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY  0x00000004
  1275. #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED        0x00000008
  1276. #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID          0x00000010
  1277. #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY  0x00000040
  1278. #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE       0x00000080
  1279. #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID      0x00000100
  1280. #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM        0x00000200
  1281. #define KSSTREAM_HEADER_OPTIONSF_EXTENDEDHEADER     0x10000000
  1282. #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA         0x80000000
  1283.  
  1284. typedef struct {
  1285.     LONGLONG    Time;
  1286.     ULONG       Numerator;
  1287.     ULONG       Denominator;
  1288. } KSTIME, *PKSTIME;
  1289.  
  1290. typedef struct {
  1291.     KSTIME      PresentationTime;
  1292.     LONGLONG    Duration;
  1293.     ULONG       FrameExtent;
  1294.     ULONG       DataUsed;
  1295.     PVOID       Data;
  1296.     ULONG       OptionsFlags;
  1297. } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
  1298.  
  1299. #define STATIC_KSPROPSETID_StreamInterface\
  1300.     0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
  1301. DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface);
  1302. #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
  1303.  
  1304. typedef enum {
  1305.     KSPROPERTY_STREAMINTERFACE_HEADERSIZE
  1306. } KSPROPERTY_STREAMINTERFACE;
  1307.  
  1308. #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\
  1309.     DEFINE_KSPROPERTY_ITEM(\
  1310.         KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\
  1311.         (GetHandler),\
  1312.         sizeof(KSPROPERTY),\
  1313.         sizeof(ULONG),\
  1314.         NULL, NULL, 0, NULL, NULL, 0)
  1315.         
  1316. #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\
  1317.     HeaderSizeHandler)\
  1318. DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\
  1319.     DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\
  1320. }
  1321.  
  1322. #define STATIC_KSPROPSETID_Stream\
  1323.     0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1324. DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
  1325. #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
  1326.  
  1327. typedef enum {
  1328.     KSPROPERTY_STREAM_ALLOCATOR,
  1329.     KSPROPERTY_STREAM_QUALITY,
  1330.     KSPROPERTY_STREAM_DEGRADATION,
  1331.     KSPROPERTY_STREAM_MASTERCLOCK,
  1332.     KSPROPERTY_STREAM_TIMEFORMAT,
  1333.     KSPROPERTY_STREAM_PRESENTATIONTIME,
  1334.     KSPROPERTY_STREAM_PRESENTATIONEXTENT,
  1335.     KSPROPERTY_STREAM_FRAMETIME,
  1336.     KSPROPERTY_STREAM_RATECAPABILITY,
  1337.     KSPROPERTY_STREAM_RATE
  1338. } KSPROPERTY_STREAM;
  1339.  
  1340. #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
  1341.     DEFINE_KSPROPERTY_ITEM(\
  1342.         KSPROPERTY_STREAM_ALLOCATOR,\
  1343.         (GetHandler),\
  1344.         sizeof(KSPROPERTY),\
  1345.         sizeof(HANDLE),\
  1346.         (SetHandler),\
  1347.         NULL, 0, NULL, NULL, 0)
  1348.  
  1349. #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
  1350.     DEFINE_KSPROPERTY_ITEM(\
  1351.         KSPROPERTY_STREAM_QUALITY,\
  1352.         (Handler),\
  1353.         sizeof(KSPROPERTY),\
  1354.         sizeof(KSQUALITY_MANAGER),\
  1355.         NULL, NULL, 0, NULL, NULL, 0)
  1356.  
  1357. #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
  1358.     DEFINE_KSPROPERTY_ITEM(\
  1359.         KSPROPERTY_STREAM_DEGRADATION,\
  1360.         (GetHandler),\
  1361.         sizeof(KSPROPERTY),\
  1362.         0,\
  1363.         (SetHandler),\
  1364.         NULL, 0, NULL, NULL, 0)
  1365.  
  1366. #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
  1367.     DEFINE_KSPROPERTY_ITEM(\
  1368.         KSPROPERTY_STREAM_MASTERCLOCK,\
  1369.         (GetHandler),\
  1370.         sizeof(KSPROPERTY),\
  1371.         sizeof(HANDLE),\
  1372.         (SetHandler),\
  1373.         NULL, 0, NULL, NULL, 0)
  1374.  
  1375. #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
  1376.     DEFINE_KSPROPERTY_ITEM(\
  1377.         KSPROPERTY_STREAM_TIMEFORMAT,\
  1378.         (Handler),\
  1379.         sizeof(KSPROPERTY),\
  1380.         sizeof(GUID),\
  1381.         NULL, NULL, 0, NULL, NULL, 0)
  1382.  
  1383. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
  1384.     DEFINE_KSPROPERTY_ITEM(\
  1385.         KSPROPERTY_STREAM_PRESENTATIONTIME,\
  1386.         (GetHandler),\
  1387.         sizeof(KSPROPERTY),\
  1388.         sizeof(KSTIME),\
  1389.         (SetHandler),\
  1390.         NULL, 0, NULL, NULL, 0)
  1391.  
  1392. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
  1393.     DEFINE_KSPROPERTY_ITEM(\
  1394.         KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
  1395.         (Handler),\
  1396.         sizeof(KSPROPERTY),\
  1397.         sizeof(LONGLONG),\
  1398.         NULL, NULL, 0, NULL, NULL, 0)
  1399.  
  1400. #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
  1401.     DEFINE_KSPROPERTY_ITEM(\
  1402.         KSPROPERTY_STREAM_FRAMETIME,\
  1403.         (Handler),\
  1404.         sizeof(KSPROPERTY),\
  1405.         sizeof(KSFRAMETIME),\
  1406.         NULL, NULL, 0, NULL, NULL, 0)
  1407.  
  1408. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
  1409.     DEFINE_KSPROPERTY_ITEM(\
  1410.         KSPROPERTY_STREAM_RATECAPABILITY,\
  1411.         (Handler),\
  1412.         sizeof(KSRATE_CAPABILITY),\
  1413.         sizeof(KSRATE),\
  1414.         NULL, NULL, 0, NULL, NULL, 0)
  1415.  
  1416. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
  1417.     DEFINE_KSPROPERTY_ITEM(\
  1418.         KSPROPERTY_STREAM_RATE,\
  1419.         (GetHandler),\
  1420.         sizeof(KSPROPERTY),\
  1421.         sizeof(KSRATE),\
  1422.         (SetHandler),\
  1423.         NULL, 0, NULL, NULL, 0)
  1424.  
  1425. typedef struct {
  1426.     HANDLE      QualityManager;
  1427.     ULONG       Context;
  1428. } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
  1429.  
  1430. typedef struct {
  1431.     LONGLONG    Duration;
  1432.     ULONG       FrameFlags;
  1433.     ULONG       Reserved;
  1434. } KSFRAMETIME, *PKSFRAMETIME;
  1435.  
  1436. #define KSFRAMETIME_VARIABLESIZE    0x00000001
  1437.  
  1438. typedef struct {
  1439.     LONGLONG        PresentationStart;
  1440.     LONGLONG        Duration;
  1441.     KSPIN_INTERFACE Interface;
  1442.     LONG            Rate;
  1443.     ULONG           Flags;
  1444. } KSRATE, *PKSRATE;
  1445.  
  1446. #define KSRATE_NOPRESENTATIONSTART      0x00000001
  1447. #define KSRATE_NOPRESENTATIONDURATION   0x00000002
  1448.  
  1449. typedef struct {
  1450.     KSPROPERTY      Property;
  1451.     KSRATE          Rate;
  1452. } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
  1453.  
  1454. #define STATIC_KSPROPSETID_Clock \
  1455.     0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1456. DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
  1457. #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
  1458.  
  1459. typedef struct {
  1460.     ULONG       CreateFlags;
  1461. } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
  1462.  
  1463. typedef struct {
  1464.     LONGLONG    Time;
  1465.     LONGLONG    SystemTime;
  1466. } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
  1467.  
  1468. typedef struct {
  1469.     LONGLONG    Granularity;
  1470.     LONGLONG    Error;
  1471. } KSRESOLUTION, *PKSRESOLUTION;
  1472.  
  1473. typedef enum {
  1474.     KSPROPERTY_CLOCK_TIME,
  1475.     KSPROPERTY_CLOCK_PHYSICALTIME,
  1476.     KSPROPERTY_CLOCK_CORRELATEDTIME,
  1477.     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
  1478.     KSPROPERTY_CLOCK_RESOLUTION,
  1479.     KSPROPERTY_CLOCK_STATE,
  1480. #if defined(_NTDDK_)
  1481.     KSPROPERTY_CLOCK_FUNCTIONTABLE,
  1482.     KSPROPERTY_CLOCK_PARENT
  1483. #endif // defined(_NTDDK_)
  1484. } KSPROPERTY_CLOCK;
  1485.  
  1486. #if defined(_NTDDK_)
  1487.  
  1488. typedef
  1489. LONGLONG
  1490. (FASTCALL *PFNKSCLOCK_GETTIME)(
  1491.     IN PFILE_OBJECT FileObject
  1492.     );
  1493. typedef
  1494. LONGLONG
  1495. (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
  1496.     IN PFILE_OBJECT FileObject,
  1497.     OUT PLONGLONG SystemTime);
  1498.  
  1499. typedef struct {
  1500.     PFNKSCLOCK_GETTIME          GetTime;
  1501.     PFNKSCLOCK_GETTIME          GetPhysicalTime;
  1502.     PFNKSCLOCK_CORRELATEDTIME   GetCorrelatedTime;
  1503.     PFNKSCLOCK_CORRELATEDTIME   GetCorrelatedPhysicalTime;
  1504. } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
  1505.  
  1506. typedef PVOID   PKSDEFAULTCLOCK;
  1507.  
  1508. #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
  1509.     DEFINE_KSPROPERTY_ITEM(\
  1510.         KSPROPERTY_CLOCK_TIME,\
  1511.         (Handler),\
  1512.         sizeof(KSPROPERTY),\
  1513.         sizeof(LONGLONG),\
  1514.         NULL, NULL, 0, NULL, NULL, 0)
  1515.  
  1516. #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
  1517.     DEFINE_KSPROPERTY_ITEM(\
  1518.         KSPROPERTY_CLOCK_PHYSICALTIME,\
  1519.         (Handler),\
  1520.         sizeof(KSPROPERTY),\
  1521.         sizeof(LONGLONG),\
  1522.         NULL, NULL, 0, NULL, NULL, 0)
  1523.  
  1524. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
  1525.     DEFINE_KSPROPERTY_ITEM(\
  1526.         KSPROPERTY_CLOCK_CORRELATEDTIME,\
  1527.         (Handler),\
  1528.         sizeof(KSPROPERTY),\
  1529.         sizeof(KSCORRELATED_TIME),\
  1530.         NULL, NULL, 0, NULL, NULL, 0)
  1531.  
  1532. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
  1533.     DEFINE_KSPROPERTY_ITEM(\
  1534.         KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
  1535.         (Handler),\
  1536.         sizeof(KSPROPERTY),\
  1537.         sizeof(KSCORRELATED_TIME),\
  1538.         NULL, NULL, 0, NULL, NULL, 0)
  1539.  
  1540. #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
  1541.     DEFINE_KSPROPERTY_ITEM(\
  1542.         KSPROPERTY_CLOCK_RESOLUTION,\
  1543.         (Handler),\
  1544.         sizeof(KSPROPERTY),\
  1545.         sizeof(KSRESOLUTION),\
  1546.         NULL, NULL, 0, NULL, NULL, 0)
  1547.  
  1548. #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
  1549.     DEFINE_KSPROPERTY_ITEM(\
  1550.         KSPROPERTY_CLOCK_STATE,\
  1551.         (Handler),\
  1552.         sizeof(KSPROPERTY),\
  1553.         sizeof(KSSTATE),\
  1554.         NULL, NULL, 0, NULL, NULL, 0)
  1555.  
  1556. #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
  1557.     DEFINE_KSPROPERTY_ITEM(\
  1558.         KSPROPERTY_CLOCK_FUNCTIONTABLE,\
  1559.         (Handler),\
  1560.         sizeof(KSPROPERTY),\
  1561.         sizeof(KSCLOCK_FUNCTIONTABLE),\
  1562.         NULL, NULL, 0, NULL, NULL, 0)
  1563.  
  1564. #define DEFINE_KSPROPERTY_ITEM_CLOCK_PARENT(Handler)\
  1565.     DEFINE_KSPROPERTY_ITEM(\
  1566.         KSPROPERTY_CLOCK_PARENT,\
  1567.         (Handler),\
  1568.         sizeof(KSPROPERTY),\
  1569.         sizeof(PFILE_OBJECT),\
  1570.         NULL, NULL, 0, NULL, NULL, 0)
  1571.  
  1572. #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
  1573.     PropTime, PropPhysicalTime,\
  1574.     PropCorrelatedTime, PropCorrelatedPhysicalTime,\
  1575.     PropResolution, PropState, PropFunctionTable, PropParent)\
  1576. DEFINE_KSPROPERTY_TABLE(ClockSet) {\
  1577.     DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
  1578.     DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
  1579.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
  1580.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
  1581.     DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
  1582.     DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
  1583.     DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\
  1584.     DEFINE_KSPROPERTY_ITEM_CLOCK_PARENT(PropParent)\
  1585. }
  1586.  
  1587. #endif // defined(_NTDDK_)
  1588.  
  1589. #define STATIC_KSEVENTSETID_Clock \
  1590.     0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1591. DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
  1592. #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
  1593.  
  1594. typedef enum {
  1595.     KSEVENT_CLOCK_INTERVAL_MARK,
  1596.     KSEVENT_CLOCK_POSITION_MARK
  1597. } KSEVENT_CLOCK_POSITION;
  1598.  
  1599. #define STATIC_KSEVENTSETID_Connection\
  1600.     0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
  1601. DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
  1602. #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
  1603.  
  1604. typedef enum {
  1605.     KSEVENT_CONNECTION_POSITIONUPDATE,
  1606.     KSEVENT_CONNECTION_DATADISCONTINUITY,
  1607.     KSEVENT_CONNECTION_TIMEDISCONTINUITY,
  1608.     KSEVENT_CONNECTION_PRIORITY,
  1609.     KSEVENT_CONNECTION_ENDOFSTREAM
  1610. } KSEVENT_CONNECTION;
  1611.  
  1612. typedef struct {
  1613.     ULONG       Context;
  1614.     ULONG       Proportion;
  1615.     LONGLONG    DeltaTime;
  1616. } KSQUALITY, *PKSQUALITY;
  1617.  
  1618. typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
  1619.  
  1620. #define STATIC_KSDEGRADESETID_Standard\
  1621.     0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1622. DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard);
  1623. #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
  1624.  
  1625. typedef enum {
  1626.     KSDEGRADE_STANDARD_SAMPLE,
  1627.     KSDEGRADE_STANDARD_QUALITY,
  1628.     KSDEGRADE_STANDARD_COMPUTATION,
  1629.     KSDEGRADE_STANDARD_SKIP
  1630. } KSDEGRADE_STANDARD;
  1631.  
  1632. #if defined(_NTDDK_)
  1633.  
  1634. #define KSPROBE_STREAMREAD      0x00000000
  1635. #define KSPROBE_STREAMWRITE     0x00000001
  1636. #define KSPROBE_ALLOCATEMDL     0x00000010
  1637. #define KSPROBE_PROBEANDLOCK    0x00000020
  1638. #define KSPROBE_SYSTEMADDRESS   0x00000040
  1639. #define KSPROBE_ALLOWFORMATCHANGE   0x00000080
  1640.  
  1641. #define KSSTREAM_READ           KSPROBE_STREAMREAD
  1642. #define KSSTREAM_WRITE          KSPROBE_STREAMWRITE
  1643. #define KSSTREAM_PAGED_DATA     0x00000000
  1644. #define KSSTREAM_NONPAGED_DATA  0x00000100
  1645. #define KSSTREAM_SYNCHRONOUS    0x00001000
  1646.  
  1647. typedef
  1648. NTSTATUS
  1649. (*PFNKSHANDLER)(
  1650.     IN PIRP Irp,
  1651.     IN PKSIDENTIFIER Request,
  1652.     IN OUT PVOID Data
  1653.     );
  1654.  
  1655. typedef
  1656. BOOLEAN
  1657. (*PFNKSFASTHANDLER)(
  1658.     IN PFILE_OBJECT FileObject,
  1659.     IN PKSIDENTIFIER UNALIGNED Request,
  1660.     IN ULONG RequestLength,
  1661.     IN OUT PVOID UNALIGNED Data,
  1662.     IN ULONG DataLength,
  1663.     OUT PIO_STATUS_BLOCK IoStatus
  1664.     );
  1665.  
  1666. typedef struct {
  1667.     KSPROPERTY_MEMBERSHEADER    MembersHeader;
  1668.     const VOID*                 Members;
  1669. } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
  1670.  
  1671. typedef struct {
  1672.     KSIDENTIFIER                    PropTypeSet;
  1673.     ULONG                           MembersListCount;
  1674.     const KSPROPERTY_MEMBERSLIST*   MembersList;
  1675. } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
  1676.  
  1677. #define DEFINE_KSPROPERTY_TABLE(tablename)\
  1678.     const KSPROPERTY_ITEM tablename[] =
  1679.  
  1680. #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
  1681.                                MinProperty,\
  1682.                                MinData,\
  1683.                                SetHandler,\
  1684.                                Values, RelationsCount, Relations, SupportHandler,\
  1685.                                SerializedSize)\
  1686. {\
  1687.     PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
  1688.     (PFNKSHANDLER)SetHandler,\
  1689.     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
  1690.     SupportHandler, (ULONG)SerializedSize\
  1691. }
  1692.  
  1693. typedef struct {
  1694.     ULONG                   PropertyId;
  1695.     union {
  1696.         PFNKSHANDLER            GetPropertyHandler;
  1697.         BOOLEAN                 GetSupported;
  1698.     };
  1699.     ULONG                   MinProperty;
  1700.     ULONG                   MinData;
  1701.     union {
  1702.         PFNKSHANDLER            SetPropertyHandler;
  1703.         BOOLEAN                 SetSupported;
  1704.     };
  1705.     const KSPROPERTY_VALUES*Values;
  1706.     ULONG                   RelationsCount;
  1707.     const KSPROPERTY*       Relations;
  1708.     PFNKSHANDLER            SupportHandler;
  1709.     ULONG                   SerializedSize;
  1710. } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
  1711.  
  1712. #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\
  1713. {\
  1714.     PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\
  1715. }
  1716.  
  1717. typedef struct {
  1718.     ULONG                       PropertyId;
  1719.     union {
  1720.         PFNKSFASTHANDLER            GetPropertyHandler;
  1721.         BOOLEAN                     GetSupported;
  1722.     };
  1723.     union {
  1724.         PFNKSFASTHANDLER            SetPropertyHandler;
  1725.         BOOLEAN                     SetSupported;
  1726.     };
  1727.     ULONG                       Reserved;
  1728. } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
  1729.  
  1730. #define DEFINE_KSPROPERTY_SET(Set,\
  1731.                               PropertiesCount,\
  1732.                               PropertyItem,\
  1733.                               FastIoCount,\
  1734.                               FastIoTable)\
  1735. {\
  1736.     Set,\
  1737.     PropertiesCount,\
  1738.     PropertyItem,\
  1739.     FastIoCount,\
  1740.     FastIoTable\
  1741. }
  1742.  
  1743. #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\
  1744.     const KSPROPERTY_SET tablename[] =
  1745.  
  1746. typedef struct {
  1747.     const GUID*                 Set;
  1748.     ULONG                       PropertiesCount;
  1749.     const KSPROPERTY_ITEM*      PropertyItem;
  1750.     ULONG                       FastIoCount;
  1751.     const KSFASTPROPERTY_ITEM*  FastIoTable;
  1752. } KSPROPERTY_SET, *PKSPROPERTY_SET;
  1753.  
  1754. #define DEFINE_KSMETHOD_TABLE(tablename)\
  1755.     const KSMETHOD_ITEM tablename[] =
  1756.  
  1757. #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
  1758.                              MethodHandler,\
  1759.                              MinMethod, MinData, SupportHandler)\
  1760. {\
  1761.     MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
  1762.     SupportHandler, Flags\
  1763. }
  1764.  
  1765. typedef struct {
  1766.     ULONG                   MethodId;
  1767.     union {
  1768.         PFNKSHANDLER            MethodHandler;
  1769.         BOOLEAN                 MethodSupported;
  1770.     };
  1771.     ULONG                   MinMethod;
  1772.     ULONG                   MinData;
  1773.     PFNKSHANDLER            SupportHandler;
  1774.     ULONG                   Flags;
  1775. } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
  1776.  
  1777. #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
  1778. {\
  1779.     MethodId, (PFNKSFASTHANDLER)MethodHandler\
  1780. }
  1781.  
  1782. typedef struct {
  1783.     ULONG                   MethodId;
  1784.     union {
  1785.         PFNKSFASTHANDLER        MethodHandler;
  1786.         BOOLEAN                 MethodSupported;
  1787.     };
  1788. } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
  1789.  
  1790. #define DEFINE_KSMETHOD_SET(Set,\
  1791.                             MethodsCount,\
  1792.                             MethodItem,\
  1793.                             FastIoCount,\
  1794.                             FastIoTable)\
  1795. {\
  1796.     Set,\
  1797.     MethodsCount,\
  1798.     MethodItem,\
  1799.     FastIoCount,\
  1800.     FastIoTable\
  1801. }
  1802.  
  1803. #define DEFINE_KSMETHOD_SET_TABLE(tablename)\
  1804.     const KSMETHOD_SET tablename[] =
  1805.  
  1806. typedef struct {
  1807.     const GUID*             Set;
  1808.     ULONG                   MethodsCount;
  1809.     const KSMETHOD_ITEM*    MethodItem;
  1810.     ULONG                   FastIoCount;
  1811.     const KSFASTMETHOD_ITEM*FastIoTable;
  1812. } KSMETHOD_SET, *PKSMETHOD_SET;
  1813.  
  1814. typedef _KSEVENT_ENTRY;
  1815.  
  1816. typedef
  1817. NTSTATUS
  1818. (*PFNKSADDEVENT)(
  1819.     IN PIRP Irp,
  1820.     IN PKSEVENTDATA EventData,
  1821.     IN struct _KSEVENT_ENTRY* EventEntry
  1822.     );
  1823.  
  1824. typedef
  1825. VOID
  1826. (*PFNKSREMOVEEVENT)(
  1827.     IN PFILE_OBJECT FileObject,
  1828.     IN struct _KSEVENT_ENTRY* EventEntry
  1829.     );
  1830.     
  1831. #define DEFINE_KSEVENT_TABLE(tablename)\
  1832.     const KSEVENT_ITEM tablename[] =
  1833.  
  1834. #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\
  1835.                             AddHandler, RemoveHandler, SupportHandler)\
  1836. {\
  1837.     EventId,\
  1838.     DataInput,\
  1839.     ExtraEntryData,\
  1840.     AddHandler,\
  1841.     RemoveHandler,\
  1842.     SupportHandler\
  1843. }
  1844.  
  1845. typedef struct {
  1846.     ULONG               EventId;
  1847.     ULONG               DataInput;
  1848.     ULONG               ExtraEntryData;
  1849.     PFNKSADDEVENT       AddHandler;
  1850.     PFNKSREMOVEEVENT    RemoveHandler;
  1851.     PFNKSHANDLER        SupportHandler;
  1852. } KSEVENT_ITEM, *PKSEVENT_ITEM;
  1853.  
  1854. #define DEFINE_KSEVENT_SET(Set,\
  1855.                            EventsCount,\
  1856.                            EventItem)\
  1857. {\
  1858.     Set, EventsCount, EventItem\
  1859. }
  1860.  
  1861. #define DEFINE_KSEVENT_SET_TABLE(tablename)\
  1862.     const KSEVENT_SET tablename[] =
  1863.  
  1864. typedef struct {
  1865.     const GUID*         Set;
  1866.     ULONG               EventsCount;
  1867.     const KSEVENT_ITEM* EventItem;
  1868. } KSEVENT_SET, *PKSEVENT_SET;
  1869.  
  1870. typedef struct {
  1871.     KDPC            Dpc;
  1872.     ULONG           ReferenceCount;
  1873.     KSPIN_LOCK      AccessLock;
  1874. } KSDPC_ITEM, *PKSDPC_ITEM;
  1875.  
  1876. typedef struct {
  1877.     KSDPC_ITEM          DpcItem;
  1878.     ULONG               Slots;
  1879.     ULONG               SlotSize;
  1880.     ULONG               ReferenceCount;
  1881.     PFNKSEVENTCALLBACK  Callback;
  1882.     WORK_QUEUE_ITEM     WorkQueueItem;
  1883.     KMUTEX              CallbackMutex;
  1884. } KSCALLBACK_ITEM, *PKSCALLBACK_ITEM;
  1885.  
  1886. #define KSCALLBACK_SLOT_FREE    0
  1887. #define KSCALLBACK_SLOT_FILLING 1
  1888. #define KSCALLBACK_SLOT_FULL    2
  1889. #define KSCALLBACK_SLOT_CALLING 3
  1890.  
  1891. typedef struct {
  1892.     ULONG       Use;
  1893.     ULONG       DataSize;
  1894. } KSCALLBACK_SLOT, *PKSCALLBACK_SLOT;
  1895.  
  1896. #define KSEVENT_ENTRY_DELETED   1
  1897. #define KSEVENT_ENTRY_ONESHOT   2
  1898.  
  1899. typedef struct _KSEVENT_ENTRY {
  1900.     LIST_ENTRY      ListEntry;
  1901.     PVOID           Object;
  1902.     union {
  1903.         PKSDPC_ITEM         DpcItem;
  1904.         PKSCALLBACK_ITEM    CallbackItem;
  1905.     };
  1906.     PKSEVENTDATA        EventData;
  1907.     ULONG               NotificationType;
  1908.     const KSEVENT_SET*  EventSet;
  1909.     const KSEVENT_ITEM* EventItem;
  1910.     PFILE_OBJECT        FileObject;
  1911.     ULONG               Flags;
  1912. } KSEVENT_ENTRY, *PKSEVENT_ENTRY;
  1913.  
  1914. typedef enum {
  1915.     KSEVENTS_NONE,
  1916.     KSEVENTS_SPINLOCK,
  1917.     KSEVENTS_MUTEX,
  1918.     KSEVENTS_FMUTEX,
  1919.     KSEVENTS_FMUTEXUNSAFE,
  1920.     KSEVENTS_INTERRUPT,
  1921.     KSEVENTS_ERESOURCE
  1922. } KSEVENTS_LOCKTYPE;
  1923.  
  1924. #define KSDISPATCH_FASTIO       0x80000000
  1925.  
  1926. typedef struct {
  1927.     PDRIVER_DISPATCH        Create;
  1928.     PVOID                   Context;
  1929.     UNICODE_STRING          ObjectClass;
  1930.     PSECURITY_DESCRIPTOR    SecurityDescriptor;
  1931.     ULONG                   Flags;
  1932. } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
  1933.  
  1934. #define KSCREATE_ITEM_SECURITYCHANGED       0x00000001
  1935.  
  1936. #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\
  1937.     KSOBJECT_CREATE_ITEM tablename[] =
  1938.  
  1939. #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\
  1940. {\
  1941.     (DispatchCreate),\
  1942.     (PVOID)(Context),\
  1943.     {\
  1944.         sizeof(TypeName) - sizeof(UNICODE_NULL),\
  1945.         sizeof(TypeName),\
  1946.         (PWCHAR)(TypeName)\
  1947.     },\
  1948.     NULL, 0\
  1949. }
  1950.  
  1951. #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\
  1952. {\
  1953.     DispatchCreate,\
  1954.     Context,\
  1955.     {\
  1956.         0,\
  1957.         0,\
  1958.         NULL,\
  1959.     },\
  1960.     NULL, 0\
  1961. }
  1962.  
  1963. typedef struct {
  1964.     ULONG                    CreateItemsCount;
  1965.     PKSOBJECT_CREATE_ITEM    CreateItemsList;
  1966. } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
  1967.  
  1968. typedef struct {
  1969.     PDRIVER_DISPATCH        DeviceIoControl;
  1970.     PDRIVER_DISPATCH        Read;
  1971.     PDRIVER_DISPATCH        Write;
  1972.     PDRIVER_DISPATCH        Flush;
  1973.     PDRIVER_DISPATCH        Close;
  1974.     PDRIVER_DISPATCH        QuerySecurity;
  1975.     PDRIVER_DISPATCH        SetSecurity;
  1976.     PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
  1977.     PFAST_IO_READ           FastRead;
  1978.     PFAST_IO_WRITE          FastWrite;
  1979. } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
  1980.  
  1981. #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\
  1982.                                  Flush, Close, QuerySecurity, SetSecurity,\
  1983.                                  FastDeviceIoControl, FastRead, FastWrite  )\
  1984.     const KSDISPATCH_TABLE tablename = \
  1985.     {\
  1986.         DeviceIoControl,        \
  1987.         Read,                   \
  1988.         Write,                  \
  1989.         Flush,                  \
  1990.         Close,                  \
  1991.         QuerySecurity,          \
  1992.         SetSecurity,            \
  1993.         FastDeviceIoControl,    \
  1994.         FastRead,               \
  1995.         FastWrite,              \
  1996.     }
  1997.  
  1998. #define KSCREATE_ITEM_IRP_STORAGE(Irp)      ((PKSOBJECT_CREATE_ITEM)(Irp)->Tail.Overlay.DriverContext[0])
  1999. #define KSEVENT_SET_IRP_STORAGE(Irp)        ((const KSEVENT_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  2000. #define KSEVENT_ENTRY_IRP_STORAGE(Irp)      ((PKSEVENT_ENTRY)(Irp)->Tail.Overlay.DriverContext[0])
  2001. #define KSMETHOD_SET_IRP_STORAGE(Irp)       ((const KSMETHOD_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  2002. #define KSMETHOD_TYPE_IRP_STORAGE(Irp)      ((ULONG)(Irp)->Tail.Overlay.DriverContext[2])
  2003. #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)   ((PKSPIN_LOCK)(Irp)->Tail.Overlay.DriverContext[1])
  2004. #define KSPROPERTY_SET_IRP_STORAGE(Irp)     ((const KSPROPERTY_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  2005.  
  2006. typedef PVOID   KSDEVICE_HEADER, KSOBJECT_HEADER;
  2007.  
  2008. typedef enum {
  2009.     KsInvokeOnSuccess = 1,
  2010.     KsInvokeOnError = 2,
  2011.     KsInvokeOnCancel = 4
  2012. } KSCOMPLETION_INVOCATION;
  2013.  
  2014. typedef enum {
  2015.     KsListEntryTail,
  2016.     KsListEntryHead
  2017. } KSLIST_ENTRY_LOCATION;
  2018.  
  2019. typedef enum {
  2020.     KsAcquireOnly,
  2021.     KsAcquireAndRemove,
  2022.     KsAcquireOnlySingleItem,
  2023.     KsAcquireAndRemoveOnlySingleItem
  2024. } KSIRP_REMOVAL_OPERATION;
  2025.  
  2026. typedef enum {
  2027.     KsStackCopyToNewLocation,
  2028.     KsStackReuseCurrentLocation,
  2029.     KsStackUseNewLocation
  2030. } KSSTACK_USE;
  2031.  
  2032. typedef enum {
  2033.     KSTARGET_STATE_DISABLED,
  2034.     KSTARGET_STATE_ENABLED
  2035. } KSTARGET_STATE;
  2036.  
  2037. typedef
  2038. NTSTATUS
  2039. (*PFNKSIRPLISTCALLBACK)(
  2040.     IN PIRP Irp,
  2041.     IN PVOID Context
  2042.     );
  2043.  
  2044. #endif // defined(_NTDDK_)
  2045.  
  2046. #include <pshpack1.h>
  2047. typedef struct {
  2048.     GUID            PropertySet;
  2049.     ULONG           Count;
  2050. } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
  2051. #include <poppack.h>
  2052.  
  2053. typedef struct {
  2054.     KSIDENTIFIER    PropTypeSet;
  2055.     ULONG           Id;
  2056.     ULONG           PropertyLength;
  2057. } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
  2058.  
  2059. //===========================================================================
  2060.  
  2061. #if defined(__cplusplus)
  2062. extern "C" {
  2063. #endif // defined(__cplusplus)
  2064.  
  2065. //
  2066. // exported prototypes
  2067. //
  2068.  
  2069. #ifdef _KSDDK_
  2070. #define KSDDKAPI
  2071. #else // !_KSDDK_
  2072. #define KSDDKAPI DECLSPEC_IMPORT
  2073. #endif // _KSDDK_
  2074.  
  2075. #if defined(_NTDDK_)
  2076.  
  2077. KSDDKAPI
  2078. NTSTATUS
  2079. NTAPI
  2080. KsEnableEvent(
  2081.     IN PIRP Irp,
  2082.     IN ULONG EventSetsCount,
  2083.     IN const KSEVENT_SET* EventSet,
  2084.     IN OUT PLIST_ENTRY EventsList OPTIONAL,
  2085.     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  2086.     IN PVOID EventsLock OPTIONAL
  2087.     );
  2088.  
  2089. KSDDKAPI
  2090. NTSTATUS
  2091. NTAPI
  2092. KsDisableEvent(
  2093.     IN PIRP Irp,
  2094.     IN OUT PLIST_ENTRY EventsList,
  2095.     IN KSEVENTS_LOCKTYPE EventsFlags,
  2096.     IN PVOID EventsLock
  2097.     );
  2098.  
  2099. KSDDKAPI
  2100. VOID
  2101. NTAPI
  2102. KsDiscardEvent(
  2103.     IN PKSEVENT_ENTRY EventEntry
  2104.     );
  2105.  
  2106. KSDDKAPI
  2107. VOID
  2108. NTAPI
  2109. KsFreeEventList(
  2110.     IN PFILE_OBJECT FileObject,
  2111.     IN OUT PLIST_ENTRY EventsList,
  2112.     IN KSEVENTS_LOCKTYPE EventsFlags,
  2113.     IN PVOID EventsLock
  2114.     );
  2115.  
  2116. KSDDKAPI
  2117. NTSTATUS
  2118. NTAPI
  2119. KsGenerateEvent(
  2120.     IN PKSEVENT_ENTRY EventEntry
  2121.     );
  2122.  
  2123. KSDDKAPI
  2124. NTSTATUS
  2125. NTAPI
  2126. KsGenerateDataEvent(
  2127.     IN PKSEVENT_ENTRY EventEntry,
  2128.     IN ULONG DataSize,
  2129.     IN PVOID Data
  2130.     );
  2131.  
  2132. KSDDKAPI
  2133. VOID
  2134. NTAPI
  2135. KsGenerateEventList(
  2136.     IN GUID* Set OPTIONAL,
  2137.     IN ULONG EventId,
  2138.     IN PLIST_ENTRY EventsList,
  2139.     IN KSEVENTS_LOCKTYPE EventsFlags,
  2140.     IN PVOID EventsLock
  2141.     );
  2142.  
  2143. // property.c:
  2144.  
  2145. KSDDKAPI
  2146. NTSTATUS
  2147. NTAPI
  2148. KsCreateMdlForProperty(
  2149.     IN PIRP Irp
  2150.     );
  2151.  
  2152. KSDDKAPI
  2153. NTSTATUS
  2154. NTAPI
  2155. KsPropertyHandler(
  2156.     IN PIRP Irp,
  2157.     IN ULONG PropertySetsCount,
  2158.     IN const KSPROPERTY_SET* PropertySet
  2159.     );
  2160.  
  2161. KSDDKAPI
  2162. BOOLEAN
  2163. NTAPI
  2164. KsFastPropertyHandler(
  2165.     IN PFILE_OBJECT FileObject,
  2166.     IN PKSPROPERTY UNALIGNED Property,
  2167.     IN ULONG PropertyLength,
  2168.     IN OUT PVOID UNALIGNED Data,
  2169.     IN ULONG DataLength,
  2170.     OUT PIO_STATUS_BLOCK IoStatus,
  2171.     IN ULONG PropertySetsCount,
  2172.     IN const KSPROPERTY_SET* PropertySet
  2173.     );
  2174.  
  2175. // method.c:
  2176.  
  2177. KSDDKAPI
  2178. NTSTATUS
  2179. NTAPI
  2180. KsMethodHandler(
  2181.     IN PIRP Irp,
  2182.     IN ULONG MethodSetsCount,
  2183.     IN const KSMETHOD_SET* MethoSet
  2184.     );
  2185.  
  2186. KSDDKAPI
  2187. BOOLEAN
  2188. NTAPI
  2189. KsFastMethodHandler(
  2190.     IN PFILE_OBJECT FileObject,
  2191.     IN PKSMETHOD UNALIGNED Method,
  2192.     IN ULONG MethodLength,
  2193.     IN OUT PVOID UNALIGNED Data,
  2194.     IN ULONG DataLength,
  2195.     OUT PIO_STATUS_BLOCK IoStatus,
  2196.     IN ULONG MethodSetsCount,
  2197.     IN const KSMETHOD_SET* MethodSet
  2198.     );
  2199.  
  2200. // alloc.c:
  2201.  
  2202. KSDDKAPI
  2203. NTSTATUS
  2204. NTAPI
  2205. KsCreateDefaultAllocator(
  2206.     IN PIRP Irp
  2207.     );
  2208.  
  2209. KSDDKAPI
  2210. NTSTATUS
  2211. NTAPI
  2212. KsCreateAllocator(
  2213.     IN HANDLE ConnectionHandle,
  2214.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  2215.     OUT PHANDLE AllocatorHandle
  2216.     );
  2217.  
  2218. KSDDKAPI
  2219. NTSTATUS
  2220. NTAPI
  2221. KsValidateAllocatorCreateRequest(
  2222.     IN PIRP Irp,
  2223.     OUT PKSALLOCATOR_FRAMING* AllocatorFraming
  2224.     );
  2225.  
  2226. // clock.c:
  2227.  
  2228. KSDDKAPI
  2229. NTSTATUS
  2230. NTAPI
  2231. KsAllocateDefaultClock(
  2232.     OUT PKSDEFAULTCLOCK* DefaultClock
  2233.     );
  2234.  
  2235. KSDDKAPI
  2236. VOID
  2237. NTAPI
  2238. KsFreeDefaultClock(
  2239.     IN PKSDEFAULTCLOCK DefaultClock
  2240.     );
  2241.  
  2242. KSDDKAPI
  2243. NTSTATUS
  2244. NTAPI
  2245. KsCreateDefaultClock(
  2246.     IN PIRP Irp,
  2247.     IN PKSDEFAULTCLOCK DefaultClock
  2248.     );
  2249.  
  2250. KSDDKAPI
  2251. NTSTATUS
  2252. NTAPI
  2253. KsCreateClock(
  2254.     IN HANDLE ConnectionHandle,
  2255.     IN PKSCLOCK_CREATE ClockCreate,
  2256.     OUT PHANDLE ClockHandle
  2257.     );
  2258.  
  2259. KSDDKAPI
  2260. NTSTATUS
  2261. NTAPI
  2262. KsValidateClockCreateRequest(
  2263.     IN PIRP Irp,
  2264.     OUT PKSCLOCK_CREATE* ClockCreate
  2265.     );
  2266.  
  2267. KSDDKAPI
  2268. KSSTATE
  2269. NTAPI
  2270. KsGetDefaultClockState(
  2271.     IN PKSDEFAULTCLOCK DefaultClock
  2272.     );
  2273.  
  2274. KSDDKAPI
  2275. VOID
  2276. NTAPI
  2277. KsSetDefaultClockState(
  2278.     IN PKSDEFAULTCLOCK DefaultClock,
  2279.     IN KSSTATE State
  2280.     );
  2281.  
  2282. KSDDKAPI
  2283. LONGLONG
  2284. NTAPI
  2285. KsGetDefaultClockTime(
  2286.     IN PKSDEFAULTCLOCK DefaultClock
  2287.     );
  2288.  
  2289. KSDDKAPI
  2290. VOID
  2291. NTAPI
  2292. KsSetDefaultClockTime(
  2293.     IN PKSDEFAULTCLOCK DefaultClock,
  2294.     IN LONGLONG Time
  2295.     );
  2296.  
  2297. // connect.c:
  2298.  
  2299. KSDDKAPI
  2300. NTSTATUS
  2301. NTAPI
  2302. KsCreatePin(
  2303.     IN HANDLE FilterHandle,
  2304.     IN PKSPIN_CONNECT Connect,
  2305.     IN ACCESS_MASK DesiredAccess,
  2306.     OUT PHANDLE ConnectionHandle
  2307.     );
  2308.  
  2309. KSDDKAPI
  2310. NTSTATUS
  2311. NTAPI
  2312. KsValidateConnectRequest(
  2313.     IN PIRP Irp,
  2314.     IN ULONG DescriptorsCount,
  2315.     IN const KSPIN_DESCRIPTOR* Descriptor,
  2316.     OUT PKSPIN_CONNECT* Connect
  2317.     );
  2318.  
  2319. KSDDKAPI
  2320. NTSTATUS
  2321. NTAPI
  2322. KsPinPropertyHandler(
  2323.     IN PIRP Irp,
  2324.     IN PKSPROPERTY Property,
  2325.     IN OUT PVOID Data,
  2326.     IN ULONG DescriptorsCount,
  2327.     IN const KSPIN_DESCRIPTOR* Descriptor
  2328.     );
  2329.  
  2330. KSDDKAPI
  2331. NTSTATUS
  2332. NTAPI
  2333. KsPinDataIntersection(
  2334.     IN PIRP Irp,
  2335.     IN PKSP_PIN Pin,
  2336.     OUT PVOID Data,
  2337.     IN ULONG DescriptorsCount,
  2338.     IN const KSPIN_DESCRIPTOR* Descriptor,
  2339.     IN PFNKSINTERSECTHANDLER IntersectHandler
  2340.     );
  2341.  
  2342.  
  2343. KSDDKAPI
  2344. NTSTATUS
  2345. NTAPI
  2346. KsHandleSizedListQuery(
  2347.     IN PIRP Irp,
  2348.     IN ULONG DataItemsCount,
  2349.     IN ULONG DataItemSize,
  2350.     IN const VOID* DataItems
  2351.     );
  2352.  
  2353. // irp.c:
  2354.  
  2355. KSDDKAPI
  2356. NTSTATUS
  2357. NTAPI
  2358. KsDispatchQuerySecurity(
  2359.     IN PDEVICE_OBJECT DeviceObject,
  2360.     IN PIRP Irp
  2361.     );
  2362.  
  2363. KSDDKAPI
  2364. NTSTATUS
  2365. NTAPI
  2366. KsDispatchSetSecurity(
  2367.     IN PDEVICE_OBJECT DeviceObject,
  2368.     IN PIRP Irp
  2369.     );
  2370.  
  2371. KSDDKAPI
  2372. NTSTATUS
  2373. NTAPI
  2374. KsDispatchSpecificProperty(
  2375.     IN PIRP Irp,
  2376.     IN PFNKSHANDLER Handler
  2377.     );
  2378.  
  2379. KSDDKAPI
  2380. NTSTATUS
  2381. NTAPI
  2382. KsDispatchSpecificMethod(
  2383.     IN PIRP Irp,
  2384.     IN PFNKSHANDLER Handler
  2385.     );
  2386.  
  2387. KSDDKAPI
  2388. NTSTATUS
  2389. NTAPI
  2390. KsReadFile(
  2391.     IN PFILE_OBJECT FileObject,
  2392.     IN PKEVENT Event OPTIONAL,
  2393.     IN PVOID PortContext OPTIONAL,
  2394.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  2395.     OUT PVOID Buffer,
  2396.     IN ULONG Length,
  2397.     IN ULONG Key OPTIONAL,
  2398.     IN KPROCESSOR_MODE RequestorMode
  2399.     );
  2400.  
  2401. KSDDKAPI
  2402. NTSTATUS
  2403. NTAPI
  2404. KsWriteFile(
  2405.     IN PFILE_OBJECT FileObject,
  2406.     IN PKEVENT Event OPTIONAL,
  2407.     IN PVOID PortContext OPTIONAL,
  2408.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  2409.     IN PVOID Buffer,
  2410.     IN ULONG Length,
  2411.     IN ULONG Key OPTIONAL,
  2412.     IN KPROCESSOR_MODE RequestorMode
  2413.     );
  2414.  
  2415. KSDDKAPI
  2416. NTSTATUS
  2417. NTAPI
  2418. KsQueryInformationFile(
  2419.     IN PFILE_OBJECT FileObject,
  2420.     OUT PVOID FileInformation,
  2421.     IN ULONG Length,
  2422.     IN FILE_INFORMATION_CLASS FileInformationClass
  2423.     );
  2424.  
  2425. KSDDKAPI
  2426. NTSTATUS
  2427. NTAPI
  2428. KsSetInformationFile(
  2429.     IN PFILE_OBJECT FileObject,
  2430.     IN PVOID FileInformation,
  2431.     IN ULONG Length,
  2432.     IN FILE_INFORMATION_CLASS FileInformationClass
  2433.     );
  2434.  
  2435. KSDDKAPI
  2436. NTSTATUS
  2437. NTAPI
  2438. KsStreamIo(
  2439.     IN PFILE_OBJECT             FileObject,
  2440.     IN PKEVENT                  Event OPTIONAL,
  2441.     IN PVOID                    PortContext OPTIONAL,
  2442.     IN PIO_COMPLETION_ROUTINE   CompletionRoutine OPTIONAL,
  2443.     IN PVOID                    CompletionContext OPTIONAL,
  2444.     IN KSCOMPLETION_INVOCATION  CompletionInvocationFlags OPTIONAL,
  2445.     OUT PIO_STATUS_BLOCK        IoStatusBlock,
  2446.     IN OUT PVOID                StreamHeaders,
  2447.     IN ULONG                    Length,
  2448.     IN ULONG                    Flags,
  2449.     IN KPROCESSOR_MODE          RequestorMode
  2450.     );
  2451.  
  2452. KSDDKAPI
  2453. NTSTATUS
  2454. NTAPI
  2455. KsProbeStreamIrp(
  2456.     IN OUT PIRP Irp,
  2457.     IN ULONG ProbeFlags,
  2458.     IN ULONG HeaderSize
  2459.     );
  2460.  
  2461. KSDDKAPI
  2462. NTSTATUS
  2463. NTAPI
  2464. KsAllocateExtraData(
  2465.     IN OUT PIRP Irp,
  2466.     IN ULONG    HeaderSize,
  2467.     IN ULONG    ExtraSize,
  2468.     OUT PVOID*  ExtraBuffer
  2469.     );
  2470.  
  2471. KSDDKAPI
  2472. VOID
  2473. KsNullDriverUnload(
  2474.     IN PDRIVER_OBJECT   DriverObject
  2475.     );
  2476.  
  2477. KSDDKAPI
  2478. NTSTATUS
  2479. NTAPI
  2480. KsSetMajorFunctionHandler(
  2481.     IN PDRIVER_OBJECT DriverObject,
  2482.     IN ULONG MajorFunction
  2483.     );
  2484.  
  2485. KSDDKAPI
  2486. NTSTATUS
  2487. NTAPI
  2488. KsDispatchInvalidDeviceRequest(
  2489.     IN PDEVICE_OBJECT DeviceObject,
  2490.     IN PIRP Irp
  2491.     );
  2492.  
  2493. KSDDKAPI
  2494. NTSTATUS
  2495. NTAPI
  2496. KsDispatchIrp(
  2497.     IN PDEVICE_OBJECT   DeviceObject,
  2498.     IN PIRP             Irp
  2499.     );
  2500.  
  2501. KSDDKAPI
  2502. BOOLEAN
  2503. NTAPI
  2504. KsDispatchFastIoDeviceControlFailure(
  2505.     IN PFILE_OBJECT FileObject,
  2506.     IN BOOLEAN Wait,
  2507.     IN PVOID InputBuffer OPTIONAL,
  2508.     IN ULONG InputBufferLength,
  2509.     OUT PVOID OutputBuffer OPTIONAL,
  2510.     IN ULONG OutputBufferLength,
  2511.     IN ULONG IoControlCode,
  2512.     OUT PIO_STATUS_BLOCK IoStatus,
  2513.     IN PDEVICE_OBJECT DeviceObject
  2514.     );
  2515.  
  2516. KSDDKAPI
  2517. BOOLEAN
  2518. NTAPI
  2519. KsDispatchFastReadFailure(
  2520.     IN PFILE_OBJECT FileObject,
  2521.     IN PLARGE_INTEGER FileOffset,
  2522.     IN ULONG Length,
  2523.     IN BOOLEAN Wait,
  2524.     IN ULONG LockKey,
  2525.     OUT PVOID Buffer,
  2526.     OUT PIO_STATUS_BLOCK IoStatus,
  2527.     IN PDEVICE_OBJECT DeviceObject
  2528.     );
  2529.  
  2530. #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
  2531.  
  2532. KSDDKAPI
  2533. NTSTATUS
  2534. NTAPI
  2535. KsGetChildCreateParameter(
  2536.     IN PIRP Irp,
  2537.     OUT PVOID* CreateParameter
  2538.     );
  2539.  
  2540. KSDDKAPI
  2541. VOID
  2542. NTAPI
  2543. KsCancelRoutine(
  2544.     IN PDEVICE_OBJECT DeviceObject,
  2545.     IN PIRP Irp
  2546.     );
  2547.  
  2548. KSDDKAPI
  2549. VOID
  2550. NTAPI
  2551. KsCancelIo(   
  2552.     IN OUT PLIST_ENTRY  QueueHead,
  2553.     IN PKSPIN_LOCK SpinLock
  2554.     );
  2555.  
  2556. KSDDKAPI
  2557. VOID
  2558. NTAPI
  2559. KsReleaseIrpOnCancelableQueue(
  2560.     IN PIRP Irp,
  2561.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  2562.     );
  2563.  
  2564. KSDDKAPI
  2565. PIRP
  2566. NTAPI
  2567. KsRemoveIrpFromCancelableQueue(
  2568.     IN OUT PLIST_ENTRY QueueHead,
  2569.     IN PKSPIN_LOCK SpinLock,
  2570.     IN KSLIST_ENTRY_LOCATION ListLocation,
  2571.     IN KSIRP_REMOVAL_OPERATION RemovalOperation
  2572.     );
  2573.  
  2574. KSDDKAPI
  2575. NTSTATUS
  2576. NTAPI
  2577. KsMoveIrpsOnCancelableQueue(
  2578.     IN OUT PLIST_ENTRY SourceList,
  2579.     IN PKSPIN_LOCK SourceLock,
  2580.     IN OUT PLIST_ENTRY DestinationList,
  2581.     IN PKSPIN_LOCK DestinationLock OPTIONAL,
  2582.     IN KSLIST_ENTRY_LOCATION ListLocation,
  2583.     IN PFNKSIRPLISTCALLBACK ListCallback,
  2584.     IN PVOID Context
  2585.     );
  2586.  
  2587. KSDDKAPI
  2588. VOID
  2589. NTAPI
  2590. KsRemoveSpecificIrpFromCancelableQueue(
  2591.     IN PIRP Irp
  2592.     );
  2593.  
  2594. KSDDKAPI
  2595. VOID
  2596. NTAPI
  2597. KsAddIrpToCancelableQueue(
  2598.     IN OUT PLIST_ENTRY QueueHead,
  2599.     IN PKSPIN_LOCK SpinLock,
  2600.     IN PIRP Irp,
  2601.     IN KSLIST_ENTRY_LOCATION ListLocation,
  2602.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  2603.     );
  2604.  
  2605. // api.c:
  2606.  
  2607. KSDDKAPI
  2608. NTSTATUS
  2609. NTAPI
  2610. KsTopologyPropertyHandler(
  2611.     IN PIRP Irp,
  2612.     IN PKSPROPERTY Property,
  2613.     IN OUT PVOID Data,
  2614.     IN const KSTOPOLOGY* Topology
  2615.     );
  2616.  
  2617. KSDDKAPI
  2618. VOID
  2619. NTAPI
  2620. KsAcquireDeviceSecurityLock(
  2621.     IN KSDEVICE_HEADER Header,
  2622.     IN BOOLEAN Exclusive
  2623.     );
  2624.  
  2625. KSDDKAPI
  2626. VOID
  2627. NTAPI
  2628. KsReleaseDeviceSecurityLock(
  2629.     IN KSDEVICE_HEADER Header
  2630.     );
  2631.  
  2632. KSDDKAPI
  2633. NTSTATUS
  2634. NTAPI
  2635. KsDefaultDispatchPnp(
  2636.     IN PDEVICE_OBJECT DeviceObject,
  2637.     IN PIRP Irp
  2638.     );
  2639.  
  2640. KSDDKAPI
  2641. VOID
  2642. NTAPI
  2643. KsSetDevicePnpAndBaseObject(
  2644.     IN KSDEVICE_HEADER  Header,
  2645.     IN PDEVICE_OBJECT   PnpDeviceObject,
  2646.     IN PDEVICE_OBJECT   BaseObject
  2647.     );
  2648.  
  2649. KSDDKAPI
  2650. PDEVICE_OBJECT
  2651. NTAPI
  2652. KsQueryDevicePnpObject(
  2653.     IN KSDEVICE_HEADER Header
  2654.     );
  2655.  
  2656. KSDDKAPI
  2657. ACCESS_MASK
  2658. NTAPI
  2659. KsQueryObjectAccessMask(
  2660.     IN KSOBJECT_HEADER Header
  2661.     );
  2662.  
  2663. KSDDKAPI
  2664. VOID
  2665. NTAPI
  2666. KsRecalculateStackDepth(
  2667.     IN KSDEVICE_HEADER Header,
  2668.     IN BOOLEAN ReuseStackLocation
  2669.     );
  2670.  
  2671. KSDDKAPI
  2672. VOID
  2673. NTAPI
  2674. KsSetTargetState(
  2675.     IN KSOBJECT_HEADER  Header,
  2676.     IN KSTARGET_STATE   TargetState
  2677.     );
  2678.  
  2679. KSDDKAPI
  2680. VOID
  2681. NTAPI
  2682. KsSetTargetDeviceObject(
  2683.     IN KSOBJECT_HEADER Header,
  2684.     IN PDEVICE_OBJECT TargetDevice
  2685.     );
  2686.  
  2687. KSDDKAPI
  2688. PKSOBJECT_CREATE_ITEM
  2689. NTAPI
  2690. KsQueryObjectCreateItem(
  2691.     IN KSOBJECT_HEADER Header
  2692.     );
  2693.  
  2694. KSDDKAPI
  2695. NTSTATUS
  2696. NTAPI
  2697. KsAllocateDeviceHeader(
  2698.     OUT KSDEVICE_HEADER* Header,
  2699.     IN ULONG ItemsCount,
  2700.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
  2701.     );
  2702.  
  2703. KSDDKAPI
  2704. VOID
  2705. NTAPI
  2706. KsFreeDeviceHeader(
  2707.     IN KSDEVICE_HEADER Header
  2708.     );
  2709.  
  2710. KSDDKAPI
  2711. NTSTATUS
  2712. NTAPI
  2713. KsAllocateObjectHeader(
  2714.     OUT KSOBJECT_HEADER* Header,
  2715.     IN ULONG ItemsCount,
  2716.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
  2717.     IN PIRP Irp,
  2718.     IN const KSDISPATCH_TABLE* Table
  2719.     );
  2720.  
  2721. KSDDKAPI
  2722. VOID
  2723. NTAPI
  2724. KsFreeObjectHeader(
  2725.     IN KSOBJECT_HEADER Header
  2726.     );
  2727.  
  2728. KSDDKAPI
  2729. NTSTATUS
  2730. NTAPI
  2731. KsAddObjectCreateItemToDeviceHeader(
  2732.     IN KSDEVICE_HEADER Header,
  2733.     IN PDRIVER_DISPATCH Create,
  2734.     IN PVOID Context,
  2735.     IN PWCHAR ObjectClass,
  2736.     IN PSECURITY_DESCRIPTOR SecurityDescriptor
  2737.     );
  2738.  
  2739. KSDDKAPI
  2740. NTSTATUS
  2741. NTAPI
  2742. KsAddObjectCreateItemToObjectHeader(
  2743.     IN KSOBJECT_HEADER Header,
  2744.     IN PDRIVER_DISPATCH Create,
  2745.     IN PVOID Context,
  2746.     IN PWCHAR ObjectClass,
  2747.     IN PSECURITY_DESCRIPTOR SecurityDescriptor
  2748.     );
  2749.  
  2750. KSDDKAPI
  2751. NTSTATUS
  2752. NTAPI
  2753. KsCreateDefaultSecurity(
  2754.     IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
  2755.     OUT PSECURITY_DESCRIPTOR* DefaultSecurity
  2756.     );
  2757.  
  2758. KSDDKAPI
  2759. NTSTATUS
  2760. NTAPI
  2761. KsForwardIrp(
  2762.     IN PIRP Irp,
  2763.     IN PFILE_OBJECT FileObject,
  2764.     IN BOOLEAN ReuseStackLocation
  2765.     );
  2766.  
  2767. KSDDKAPI
  2768. NTSTATUS
  2769. NTAPI
  2770. KsForwardAndCatchIrp(
  2771.     IN PDEVICE_OBJECT DeviceObject,
  2772.     IN PIRP Irp,
  2773.     IN PFILE_OBJECT FileObject,
  2774.     IN KSSTACK_USE StackUse
  2775.     );
  2776.  
  2777. KSDDKAPI
  2778. NTSTATUS
  2779. NTAPI
  2780. KsSynchronousIoControlDevice(
  2781.     IN PFILE_OBJECT FileObject,
  2782.     IN KPROCESSOR_MODE RequestorMode,
  2783.     IN ULONG IoControl,
  2784.     IN PVOID InBuffer,
  2785.     IN ULONG InSize,
  2786.     OUT PVOID OutBuffer,
  2787.     IN ULONG OutSize,
  2788.     OUT PULONG BytesReturned
  2789.     );
  2790.  
  2791. KSDDKAPI
  2792. NTSTATUS
  2793. NTAPI
  2794. KsUnserializeObjectPropertiesFromRegistry(
  2795.     IN PFILE_OBJECT FileObject,
  2796.     IN HANDLE ParentKey OPTIONAL,
  2797.     IN PUNICODE_STRING RegistryPath OPTIONAL
  2798.     );
  2799.  
  2800. // topology.c:
  2801.  
  2802. KSDDKAPI
  2803. NTSTATUS
  2804. NTAPI
  2805. KsCreateTopologyNode(
  2806.     IN HANDLE ParentHandle,
  2807.     IN PKSNODE_CREATE NodeCreate,
  2808.     IN ACCESS_MASK DesiredAccess,
  2809.     OUT PHANDLE NodeHandle
  2810.     );
  2811.  
  2812. KSDDKAPI
  2813. NTSTATUS
  2814. NTAPI
  2815. KsValidateTopologyNodeCreateRequest(
  2816.     IN PIRP Irp,
  2817.     IN PKSTOPOLOGY Topology,
  2818.     OUT PKSNODE_CREATE* NodeCreate
  2819.     );
  2820.  
  2821. #else // !defined(_NTDDK_)
  2822.  
  2823. KSDDKAPI
  2824. DWORD
  2825. WINAPI
  2826. KsCreateAllocator(
  2827.     IN HANDLE ConnectionHandle,
  2828.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  2829.     OUT PHANDLE AllocatorHandle
  2830.     );
  2831.  
  2832. KSDDKAPI
  2833. DWORD
  2834. NTAPI
  2835. KsCreateClock(
  2836.     IN HANDLE ConnectionHandle,
  2837.     IN PKSCLOCK_CREATE ClockCreate,
  2838.     OUT PHANDLE ClockHandle
  2839.     );
  2840.  
  2841. KSDDKAPI
  2842. DWORD
  2843. WINAPI
  2844. KsCreatePin(
  2845.     IN HANDLE FilterHandle,
  2846.     IN PKSPIN_CONNECT Connect,
  2847.     IN ACCESS_MASK DesiredAccess,
  2848.     OUT PHANDLE ConnectionHandle
  2849.     );
  2850.  
  2851. KSDDKAPI
  2852. DWORD
  2853. WINAPI
  2854. KsCreateTopologyNode(
  2855.     IN HANDLE ParentHandle,
  2856.     IN PKSNODE_CREATE NodeCreate,
  2857.     IN ACCESS_MASK DesiredAccess,
  2858.     OUT PHANDLE NodeHandle
  2859.     );
  2860.  
  2861. #endif // !defined(_NTDDK_)
  2862.  
  2863. #if defined(__cplusplus)
  2864. }
  2865. #endif // defined(__cplusplus)
  2866.  
  2867. #endif // !_KS_
  2868.