ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ks.h
Go to the documentation of this file.
00001 /*
00002     ReactOS
00003     Kernel Streaming API
00004 
00005     by Andrew Greenwood
00006 
00007     NOTES:
00008     This is a basic stubbing of the Kernel Streaming API header. It is
00009     very incomplete - a lot of the #defines are not set to any value at all.
00010 
00011     Some of the structs/funcs may be incorrectly grouped.
00012 
00013     GUIDs need to be defined properly.
00014 
00015     AVStream functionality (XP and above, DirectX 8.0 and above) will NOT
00016     implemented for a while.
00017 
00018     Some example code for interaction from usermode:
00019     DeviceIoControl(
00020         FilterHandle,
00021         IOCTL_KS_PROPERTY,
00022         &Property,
00023         sizeof(KSPROPERTY),
00024         &SeekingCapabilities,
00025         sizeof(KS_SEEKING_CAPABILITIES),
00026         &BytesReturned,
00027         &Overlapped);
00028 */
00029 
00030 #ifndef _KS_
00031 #define _KS_
00032 
00033 #ifdef __cplusplus
00034 extern "C" {
00035 #endif
00036 
00037 #ifdef BUILDING_KS
00038     #define KSDDKAPI
00039 #else
00040     #define KSDDKAPI //DECLSPEC_IMPORT /* TODO */
00041 #endif
00042 
00043 
00044 #define KSFILTER_NODE   ((ULONG)-1)
00045 #define KSALL_NODES     ((ULONG)-1)
00046 
00047 #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
00048 #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
00049 #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
00050 #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
00051 #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
00052 #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
00053 
00054 #define KSDATAFORMAT_BIT_ATTRIBUTES                         1
00055 #define KSDATAFORMAT_ATTRIBUTES                             (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
00056 
00057 #if defined(_NTDDK_)
00058 typedef PVOID PKSWORKER;
00059 #endif
00060 
00061 #ifndef SIZEOF_ARRAY
00062     #define SIZEOF_ARRAY(a)        (sizeof(a)/sizeof((a)[0]))
00063 #endif
00064 
00065 /* ===============================================================
00066     GUID definition helpers
00067 */
00068 
00069 #ifndef _NTRTL_
00070     #ifndef DEFINE_GUIDEX
00071         #ifdef _MSC_VER
00072             #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
00073         #else
00074             #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
00075         #endif
00076     #endif
00077 
00078     #ifndef STATICGUIDOF
00079         #define STATICGUIDOF(guid) STATIC_##guid
00080     #endif
00081 #endif
00082 
00083 #if defined(__cplusplus) && _MSC_VER >= 1100
00084     #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name
00085     #define DEFINE_GUIDNAMED(name) __uuidof(struct name)
00086 #else
00087     #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name)
00088     #define DEFINE_GUIDNAMED(name) name
00089 #endif
00090 
00091 
00092 #define STATIC_GUID_NULL \
00093     0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
00094 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
00095 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
00096 
00097 
00098 #define STATIC_KSNAME_Filter\
00099     0x9b365890L, 0x165f, 0x11d0, {0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
00100 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
00101 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
00102 
00103 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
00104     0xd833f8f8L, 0x7894, 0x11d1, {0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}
00105 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
00106 #define KSMEMORY_TYPE_KERNEL_PAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
00107 
00108 /* ===============================================================
00109     I/O Control Codes
00110 */
00111 
00112 #define IOCTL_KS_DISABLE_EVENT \
00113     CTL_CODE( \
00114         FILE_DEVICE_KS, \
00115         0x000, \
00116         METHOD_NEITHER, \
00117         FILE_ANY_ACCESS)
00118 
00119 #define IOCTL_KS_ENABLE_EVENT \
00120     CTL_CODE( \
00121         FILE_DEVICE_KS, \
00122         0x001, \
00123         METHOD_NEITHER, \
00124         FILE_ANY_ACCESS)
00125 
00126 // WAS 2
00127 #define IOCTL_KS_METHOD \
00128     CTL_CODE( \
00129         FILE_DEVICE_KS, \
00130         0x003, \
00131         METHOD_NEITHER, \
00132         FILE_ANY_ACCESS)
00133 
00134 // WAS 3
00135 #define IOCTL_KS_PROPERTY \
00136     CTL_CODE( \
00137         FILE_DEVICE_KS, \
00138         0x000, \
00139         METHOD_NEITHER, \
00140         FILE_ANY_ACCESS)
00141 
00142 #define IOCTL_KS_WRITE_STREAM \
00143     CTL_CODE( \
00144         FILE_DEVICE_KS, \
00145         0x004, \
00146         METHOD_NEITHER, \
00147         FILE_WRITE_ACCESS)
00148 
00149 #define IOCTL_KS_READ_STREAM \
00150     CTL_CODE( \
00151         FILE_DEVICE_KS, \
00152         0x005, \
00153         METHOD_NEITHER, \
00154         FILE_READ_ACCESS)
00155 
00156 #define IOCTL_KS_RESET_STATE \
00157     CTL_CODE( \
00158         FILE_DEVICE_KS, \
00159         0x006, \
00160         METHOD_NEITHER, \
00161         FILE_ANY_ACCESS)
00162 
00163 
00164 /* ===============================================================
00165     Categories
00166 */
00167 
00168 #define STATIC_KSCATEGORY_BRIDGE \
00169     0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00170 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
00171 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
00172 
00173 #define STATIC_KSCATEGORY_CAPTURE \
00174     0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00175 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
00176 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
00177 
00178 #define STATIC_KSCATEGORY_RENDER \
00179     0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00180 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
00181 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
00182 
00183 #define STATIC_KSCATEGORY_MIXER \
00184     0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00185 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
00186 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
00187 
00188 #define STATIC_KSCATEGORY_SPLITTER \
00189     0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00190 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
00191 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
00192 
00193 #define STATIC_KSCATEGORY_DATACOMPRESSOR \
00194     0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00195 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
00196 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
00197 
00198 #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
00199     0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00200 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
00201 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
00202 
00203 #define STATIC_KSCATEGORY_DATATRANSFORM \
00204     0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00205 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
00206 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
00207 
00208 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
00209     0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00210 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
00211 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
00212 
00213 #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
00214     0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00215 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
00216 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
00217 
00218 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
00219     0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00220 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
00221 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
00222 
00223 #define STATIC_KSCATEGORY_FILESYSTEM \
00224     0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00225 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
00226 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
00227 
00228 #define STATIC_KSCATEGORY_CLOCK \
00229     0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00230 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
00231 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
00232 
00233 #define STATIC_KSCATEGORY_PROXY \
00234     0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00235 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
00236 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
00237 
00238 #define STATIC_KSCATEGORY_QUALITY \
00239     0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00240 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
00241 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
00242 
00243 /* ===============================================================
00244     Common
00245 */
00246 
00247 typedef struct
00248 {
00249     GUID Set;
00250     ULONG Id;
00251     ULONG Flags;
00252 } KSIDENTIFIER, *PKSIDENTIFIER;
00253 
00254 typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY;
00255 typedef KSIDENTIFIER KSMETHOD, *PKSMETHOD;
00256 typedef KSIDENTIFIER KSEVENT, *PKSEVENT;
00257 
00258 typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
00259 
00260 typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
00261 typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
00262 
00263 typedef union {
00264     struct {
00265         ULONG   FormatSize;
00266         ULONG   Flags;
00267         ULONG   SampleSize;
00268         ULONG   Reserved;
00269         GUID    MajorFormat;
00270         GUID    SubFormat;
00271         GUID    Specifier;
00272     };
00273     LONGLONG    Alignment;
00274 } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
00275 
00276 
00277 typedef struct
00278 {
00279     ULONG Size;
00280     ULONG Flags;
00281     GUID Attribute;
00282 } KSATTRIBUTE, *PKSATTRIBUTE;
00283 
00284 
00285 
00286 /* ===============================================================
00287     Interface Sets - TODO
00288 */
00289 
00290 #if 0
00291 #define KSINTERFACESETID_Media
00292 
00293 #define KSINTERFACE_STANDARD_STREAMING
00294 #define KSINTERFACE_STANDARD_LOOPED_STREAMING
00295 #define KSINTERFACE_STANDARD_CONTROL
00296 #endif
00297 
00298 #define STATIC_KSINTERFACESETID_Standard \
00299     0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00300 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
00301 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
00302 
00303 typedef enum
00304 {
00305     KSINTERFACE_STANDARD_STREAMING,
00306     KSINTERFACE_STANDARD_LOOPED_STREAMING,
00307     KSINTERFACE_STANDARD_CONTROL
00308 } KSINTERFACE_STANDARD;
00309 
00310 #define STATIC_KSINTERFACESETID_FileIo \
00311     0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00312 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
00313 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
00314 
00315 
00316 
00317 
00318 /* ===============================================================
00319     Mediums
00320 */
00321 
00322 typedef enum
00323 {
00324     KSINTERFACE_FILEIO_STREAMING
00325 } KSINTERFACE_FILEIO;
00326 
00327 #define KSMEDIUM_TYPE_ANYINSTANCE       0
00328 
00329 #define STATIC_KSMEDIUMSETID_Standard \
00330     0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00331 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
00332 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
00333 
00334 
00335 /* ===============================================================
00336     Clock Properties/Methods/Events
00337 */
00338 
00339 #define STATIC_KSPROPSETID_Clock \
00340     0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00341 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
00342 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
00343 
00344 typedef enum
00345 {
00346     KSPROPERTY_CLOCK_TIME,
00347     KSPROPERTY_CLOCK_PHYSICALTIME,
00348     KSPROPERTY_CLOCK_CORRELATEDTIME,
00349     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
00350     KSPROPERTY_CLOCK_RESOLUTION,
00351     KSPROPERTY_CLOCK_STATE,
00352 #if defined(_NTDDK_)
00353     KSPROPERTY_CLOCK_FUNCTIONTABLE
00354 #endif // defined(_NTDDK_)
00355 } KSPROPERTY_CLOCK;
00356 
00357 #define STATIC_KSEVENTSETID_Clock \
00358     0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00359 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
00360 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
00361 
00362 typedef enum
00363 {
00364     KSEVENT_CLOCK_INTERVAL_MARK,
00365     KSEVENT_CLOCK_POSITION_MARK
00366 } KSEVENT_CLOCK_POSITION;
00367 
00368 
00369 /* ===============================================================
00370     Connection Properties/Methods/Events
00371 */
00372 
00373 #define STATIC_KSPROPSETID_Connection \
00374     0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00375 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
00376 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
00377 
00378 
00379 typedef enum
00380 {
00381     KSPROPERTY_CONNECTION_STATE,
00382     KSPROPERTY_CONNECTION_PRIORITY,
00383     KSPROPERTY_CONNECTION_DATAFORMAT,
00384     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
00385     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
00386     KSPROPERTY_CONNECTION_ACQUIREORDERING,
00387     KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
00388     KSPROPERTY_CONNECTION_STARTAT
00389 } KSPROPERTY_CONNECTION;
00390 
00391 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
00392     DEFINE_KSPROPERTY_ITEM(\
00393         KSPROPERTY_CONNECTION_STATE,\
00394         (GetHandler),\
00395         sizeof(KSPROPERTY),\
00396         sizeof(KSSTATE),\
00397         (SetHandler),\
00398         NULL, 0, NULL, NULL, 0)
00399 
00400 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
00401     DEFINE_KSPROPERTY_ITEM(\
00402         KSPROPERTY_CONNECTION_PRIORITY,\
00403         (GetHandler),\
00404         sizeof(KSPROPERTY),\
00405         sizeof(KSPRIORITY),\
00406         (SetHandler),\
00407         NULL, 0, NULL, NULL, 0)
00408 
00409 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
00410     DEFINE_KSPROPERTY_ITEM(\
00411         KSPROPERTY_CONNECTION_DATAFORMAT,\
00412         (GetHandler),\
00413         sizeof(KSPROPERTY),\
00414         0,\
00415         (SetHandler),\
00416         NULL, 0, NULL, NULL, 0)
00417 
00418 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
00419     DEFINE_KSPROPERTY_ITEM(\
00420         KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
00421         (Handler),\
00422         sizeof(KSPROPERTY),\
00423         sizeof(KSALLOCATOR_FRAMING),\
00424         NULL, NULL, 0, NULL, NULL, 0)
00425 
00426 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
00427     DEFINE_KSPROPERTY_ITEM(\
00428         KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
00429         (Handler),\
00430         sizeof(KSPROPERTY),\
00431         0,\
00432         NULL, NULL, 0, NULL, NULL, 0)
00433 
00434 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
00435     DEFINE_KSPROPERTY_ITEM(\
00436         KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
00437         NULL,\
00438         sizeof(KSPROPERTY),\
00439         sizeof(KSDATAFORMAT),\
00440         (Handler),\
00441         NULL, 0, NULL, NULL, 0)
00442 
00443 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
00444     DEFINE_KSPROPERTY_ITEM(\
00445         KSPROPERTY_CONNECTION_ACQUIREORDERING,\
00446         (Handler),\
00447         sizeof(KSPROPERTY),\
00448         sizeof(int),\
00449         NULL, NULL, 0, NULL, NULL, 0)
00450 
00451 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
00452     DEFINE_KSPROPERTY_ITEM(\
00453         KSPROPERTY_CONNECTION_STARTAT,\
00454         NULL,\
00455         sizeof(KSPROPERTY),\
00456         sizeof(KSRELATIVEEVENT),\
00457         (Handler),\
00458         NULL, 0, NULL, NULL, 0)
00459 
00460 
00461 typedef enum
00462 {
00463     KSEVENT_CONNECTION_POSITIONUPDATE,
00464     KSEVENT_CONNECTION_DATADISCONTINUITY,
00465     KSEVENT_CONNECTION_TIMEDISCONTINUITY,
00466     KSEVENT_CONNECTION_PRIORITY,
00467     KSEVENT_CONNECTION_ENDOFSTREAM
00468 } KSEVENT_CONNECTION;
00469 
00470 
00471 /* ===============================================================
00472     General
00473     Properties/Methods/Events
00474 */
00475 
00476 #define STATIC_KSPROPSETID_General\
00477     0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00478 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
00479 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
00480 
00481 
00482 typedef enum
00483 {
00484     KSPROPERTY_GENERAL_COMPONENTID
00485 } KSPROPERTY_GENERAL;
00486 
00487 
00488 /* ===============================================================
00489     Graph Manager
00490     Properties/Methods/Events
00491 */
00492 
00493 #define KSPROPSETID_GM \
00494     0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D}
00495 
00496 typedef enum
00497 {
00498     KSPROPERTY_GM_GRAPHMANAGER,
00499     KSPROPERTY_GM_TIMESTAMP_CLOCK,
00500     KSPROPERTY_GM_RATEMATCH,
00501     KSPROPERTY_GM_RENDERCLOCK
00502 } KSPROPERTY_GM;
00503 
00504 
00505 /* ===============================================================
00506     Media Seeking
00507     Properties/Methods/Events
00508 */
00509 
00510 #define STATIC_KSPROPSETID_MediaSeeking\
00511     0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
00512 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
00513 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
00514 
00515 typedef enum {
00516     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
00517     KSPROPERTY_MEDIASEEKING_FORMATS,
00518     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
00519     KSPROPERTY_MEDIASEEKING_POSITION,
00520     KSPROPERTY_MEDIASEEKING_STOPPOSITION,
00521     KSPROPERTY_MEDIASEEKING_POSITIONS,
00522     KSPROPERTY_MEDIASEEKING_DURATION,
00523     KSPROPERTY_MEDIASEEKING_AVAILABLE,
00524     KSPROPERTY_MEDIASEEKING_PREROLL,
00525     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
00526 } KSPROPERTY_MEDIASEEKING;
00527 
00528 typedef enum {
00529     KS_SEEKING_NoPositioning,
00530     KS_SEEKING_AbsolutePositioning,
00531     KS_SEEKING_RelativePositioning,
00532     KS_SEEKING_IncrementalPositioning,
00533     KS_SEEKING_PositioningBitsMask = 0x3,
00534     KS_SEEKING_SeekToKeyFrame,
00535     KS_SEEKING_ReturnTime = 0x8
00536 } KS_SEEKING_FLAGS;
00537 
00538 typedef enum {
00539     KS_SEEKING_CanSeekAbsolute = 0x1,
00540     KS_SEEKING_CanSeekForwards = 0x2,
00541     KS_SEEKING_CanSeekBackwards = 0x4,
00542     KS_SEEKING_CanGetCurrentPos = 0x8,
00543     KS_SEEKING_CanGetStopPos = 0x10,
00544     KS_SEEKING_CanGetDuration = 0x20,
00545     KS_SEEKING_CanPlayBackwards = 0x40
00546 } KS_SEEKING_CAPABILITIES;
00547 
00548 typedef struct {
00549     LONGLONG            Current;
00550     LONGLONG            Stop;
00551     KS_SEEKING_FLAGS    CurrentFlags;
00552     KS_SEEKING_FLAGS    StopFlags;
00553 } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
00554 
00555 typedef struct {
00556     LONGLONG    Earliest;
00557     LONGLONG    Latest;
00558 } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
00559 
00560 typedef struct {
00561     KSPROPERTY  Property;
00562     GUID        SourceFormat;
00563     GUID        TargetFormat;
00564     LONGLONG    Time;
00565 } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
00566 
00567 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
00568     DEFINE_KSPROPERTY_ITEM(\
00569         KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
00570         (Handler),\
00571         sizeof(KSPROPERTY),\
00572         sizeof(KS_SEEKING_CAPABILITIES),\
00573         NULL, NULL, 0, NULL, NULL, 0)
00574 
00575 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
00576     DEFINE_KSPROPERTY_ITEM(\
00577         KSPROPERTY_MEDIASEEKING_FORMATS,\
00578         (Handler),\
00579         sizeof(KSPROPERTY),\
00580         0,\
00581         NULL, NULL, 0, NULL, NULL, 0)
00582 
00583 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
00584     DEFINE_KSPROPERTY_ITEM(\
00585         KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
00586         (GetHandler),\
00587         sizeof(KSPROPERTY),\
00588         sizeof(GUID),\
00589         (SetHandler),\
00590         NULL, 0, NULL, NULL, 0)
00591 
00592 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
00593     DEFINE_KSPROPERTY_ITEM(\
00594         KSPROPERTY_MEDIASEEKING_POSITION,\
00595         (Handler),\
00596         sizeof(KSPROPERTY),\
00597         sizeof(LONGLONG),\
00598         NULL, NULL, 0, NULL, NULL, 0)
00599 
00600 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
00601     DEFINE_KSPROPERTY_ITEM(\
00602         KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
00603         (Handler),\
00604         sizeof(KSPROPERTY),\
00605         sizeof(LONGLONG),\
00606         NULL, NULL, 0, NULL, NULL, 0)
00607 
00608 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
00609     DEFINE_KSPROPERTY_ITEM(\
00610         KSPROPERTY_MEDIASEEKING_POSITIONS,\
00611         NULL,\
00612         sizeof(KSPROPERTY),\
00613         sizeof(KSPROPERTY_POSITIONS),\
00614         (Handler),\
00615         NULL, 0, NULL, NULL, 0)
00616 
00617 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
00618     DEFINE_KSPROPERTY_ITEM(\
00619         KSPROPERTY_MEDIASEEKING_DURATION,\
00620         (Handler),\
00621         sizeof(KSPROPERTY),\
00622         sizeof(LONGLONG),\
00623         NULL, NULL, 0, NULL, NULL, 0)
00624 
00625 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
00626     DEFINE_KSPROPERTY_ITEM(\
00627         KSPROPERTY_MEDIASEEKING_AVAILABLE,\
00628         (Handler),\
00629         sizeof(KSPROPERTY),\
00630         sizeof(KSPROPERTY_MEDIAAVAILABLE),\
00631         NULL, NULL, 0, NULL, NULL, 0)
00632 
00633 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
00634     DEFINE_KSPROPERTY_ITEM(\
00635         KSPROPERTY_MEDIASEEKING_PREROLL,\
00636         (Handler),\
00637         sizeof(KSPROPERTY),\
00638         sizeof(LONGLONG),\
00639         NULL, NULL, 0, NULL, NULL, 0)
00640 
00641 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
00642     DEFINE_KSPROPERTY_ITEM(\
00643         KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
00644         (Handler),\
00645         sizeof(KSP_TIMEFORMAT),\
00646         sizeof(LONGLONG),\
00647         NULL, NULL, 0, NULL, NULL, 0)
00648 
00649 /* ===============================================================
00650     Pin
00651     Properties/Methods/Events
00652 */
00653 
00654 #define STATIC_KSPROPSETID_Pin\
00655     0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}
00656 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
00657 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
00658 
00659 #define STATIC_KSNAME_Pin\
00660     0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00661 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
00662 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
00663 
00664 
00665 typedef enum
00666 {
00667     KSPROPERTY_PIN_CINSTANCES,
00668     KSPROPERTY_PIN_CTYPES,
00669     KSPROPERTY_PIN_DATAFLOW,
00670     KSPROPERTY_PIN_DATARANGES,
00671     KSPROPERTY_PIN_DATAINTERSECTION,
00672     KSPROPERTY_PIN_INTERFACES,
00673     KSPROPERTY_PIN_MEDIUMS,
00674     KSPROPERTY_PIN_COMMUNICATION,
00675     KSPROPERTY_PIN_GLOBALCINSTANCES,
00676     KSPROPERTY_PIN_NECESSARYINSTANCES,
00677     KSPROPERTY_PIN_PHYSICALCONNECTION,
00678     KSPROPERTY_PIN_CATEGORY,
00679     KSPROPERTY_PIN_NAME,
00680     KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
00681     KSPROPERTY_PIN_PROPOSEDATAFORMAT
00682 } KSPROPERTY_PIN;
00683 
00684 typedef struct
00685 {
00686     KSPROPERTY      Property;
00687     ULONG           PinId;
00688     ULONG           Reserved;
00689 } KSP_PIN, *PKSP_PIN;
00690 
00691 #define KSINSTANCE_INDETERMINATE    ((ULONG)-1)
00692 
00693 typedef struct
00694 {
00695     ULONG  PossibleCount;
00696     ULONG  CurrentCount;
00697 } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
00698 
00699 typedef struct
00700 {
00701     ULONG   Size;
00702     ULONG   Pin;
00703     WCHAR   SymbolicLinkName[1];
00704 } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
00705 
00706 
00707 /* ===============================================================
00708     Quality
00709     Properties/Methods/Events
00710 */
00711 
00712 #define KSPROPSETID_Quality \
00713     0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
00714 
00715 typedef enum
00716 {
00717     KSPROPERTY_QUALITY_REPORT,
00718     KSPROPERTY_QUALITY_ERROR
00719 } KSPROPERTY_QUALITY;
00720 
00721 
00722 /* ===============================================================
00723     Stream
00724     Properties/Methods/Events
00725 */
00726 
00727 #define STATIC_KSPROPSETID_Stream\
00728     0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
00729 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
00730 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
00731 
00732 typedef enum
00733 {
00734     KSPROPERTY_STREAM_ALLOCATOR,
00735     KSPROPERTY_STREAM_QUALITY,
00736     KSPROPERTY_STREAM_DEGRADATION,
00737     KSPROPERTY_STREAM_MASTERCLOCK,
00738     KSPROPERTY_STREAM_TIMEFORMAT,
00739     KSPROPERTY_STREAM_PRESENTATIONTIME,
00740     KSPROPERTY_STREAM_PRESENTATIONEXTENT,
00741     KSPROPERTY_STREAM_FRAMETIME,
00742     KSPROPERTY_STREAM_RATECAPABILITY,
00743     KSPROPERTY_STREAM_RATE,
00744     KSPROPERTY_STREAM_PIPE_ID
00745 } KSPROPERTY_STREAM;
00746 
00747 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
00748     DEFINE_KSPROPERTY_ITEM(\
00749         KSPROPERTY_STREAM_ALLOCATOR,\
00750         (GetHandler),\
00751         sizeof(KSPROPERTY),\
00752         sizeof(HANDLE),\
00753         (SetHandler),\
00754         NULL, 0, NULL, NULL, 0)
00755 
00756 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
00757     DEFINE_KSPROPERTY_ITEM(\
00758         KSPROPERTY_STREAM_QUALITY,\
00759         (Handler),\
00760         sizeof(KSPROPERTY),\
00761         sizeof(KSQUALITY_MANAGER),\
00762         NULL, NULL, 0, NULL, NULL, 0)
00763 
00764 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
00765     DEFINE_KSPROPERTY_ITEM(\
00766         KSPROPERTY_STREAM_DEGRADATION,\
00767         (GetHandler),\
00768         sizeof(KSPROPERTY),\
00769         0,\
00770         (SetHandler),\
00771         NULL, 0, NULL, NULL, 0)
00772 
00773 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
00774     DEFINE_KSPROPERTY_ITEM(\
00775         KSPROPERTY_STREAM_MASTERCLOCK,\
00776         (GetHandler),\
00777         sizeof(KSPROPERTY),\
00778         sizeof(HANDLE),\
00779         (SetHandler),\
00780         NULL, 0, NULL, NULL, 0)
00781 
00782 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
00783     DEFINE_KSPROPERTY_ITEM(\
00784         KSPROPERTY_STREAM_TIMEFORMAT,\
00785         (Handler),\
00786         sizeof(KSPROPERTY),\
00787         sizeof(GUID),\
00788         NULL, NULL, 0, NULL, NULL, 0)
00789 
00790 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
00791     DEFINE_KSPROPERTY_ITEM(\
00792         KSPROPERTY_STREAM_PRESENTATIONTIME,\
00793         (GetHandler),\
00794         sizeof(KSPROPERTY),\
00795         sizeof(KSTIME),\
00796         (SetHandler),\
00797         NULL, 0, NULL, NULL, 0)
00798 
00799 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
00800     DEFINE_KSPROPERTY_ITEM(\
00801         KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
00802         (Handler),\
00803         sizeof(KSPROPERTY),\
00804         sizeof(LONGLONG),\
00805         NULL, NULL, 0, NULL, NULL, 0)
00806 
00807 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
00808     DEFINE_KSPROPERTY_ITEM(\
00809         KSPROPERTY_STREAM_FRAMETIME,\
00810         (Handler),\
00811         sizeof(KSPROPERTY),\
00812         sizeof(KSFRAMETIME),\
00813         NULL, NULL, 0, NULL, NULL, 0)
00814 
00815 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
00816     DEFINE_KSPROPERTY_ITEM(\
00817         KSPROPERTY_STREAM_RATECAPABILITY,\
00818         (Handler),\
00819         sizeof(KSRATE_CAPABILITY),\
00820         sizeof(KSRATE),\
00821         NULL, NULL, 0, NULL, NULL, 0)
00822 
00823 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
00824     DEFINE_KSPROPERTY_ITEM(\
00825         KSPROPERTY_STREAM_RATE,\
00826         (GetHandler),\
00827         sizeof(KSPROPERTY),\
00828         sizeof(KSRATE),\
00829         (SetHandler),\
00830         NULL, 0, NULL, NULL, 0)
00831 
00832 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
00833     DEFINE_KSPROPERTY_ITEM(\
00834         KSPROPERTY_STREAM_PIPE_ID,\
00835         (GetHandler),\
00836         sizeof(KSPROPERTY),\
00837         sizeof(HANDLE),\
00838         (SetHandler),\
00839         NULL, 0, NULL, NULL, 0)
00840 
00841 /* ===============================================================
00842     StreamAllocator
00843     Properties/Methods/Events
00844 */
00845 
00846 #define STATIC_KSPROPSETID_StreamAllocator\
00847     0xcf6e4342L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
00848 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
00849 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
00850 
00851 typedef enum
00852 {
00853     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
00854     KSPROPERTY_STREAMALLOCATOR_STATUS
00855 } KSPROPERTY_STREAMALLOCATOR;
00856 
00857 #define KSMETHODSETID_StreamAllocator \
00858     0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
00859 
00860 typedef enum
00861 {
00862     KSMETHOD_STREAMALLOCATOR_ALLOC,
00863     KSMETHOD_STREAMALLOCATOR_FREE
00864 } KSMETHOD_STREAMALLOCATOR;
00865 
00866 
00867 #define KSEVENTSETID_StreamAllocator
00868 
00869 typedef enum
00870 {
00871     KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
00872     KSEVENT_STREAMALLOCATOR_FREEFRAME
00873 } KSEVENT_STREAMALLOCATOR;
00874 
00875 
00876 /* ===============================================================
00877     StreamInterface
00878     Properties/Methods/Events
00879 */
00880 
00881 #define KSPROPSETID_StreamInterface \
00882     0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
00883 
00884 typedef enum
00885 {
00886     KSPROPERTY_STREAMINTERFACE_HEADERSIZE
00887 } KSPROPERTY_STREAMINTERFACE;
00888 
00889 
00890 /* ===============================================================
00891     Topology
00892     Properties/Methods/Events
00893 */
00894 
00895 #define STATIC_KSPROPSETID_Topology\
00896     0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00897 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
00898 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
00899 
00900 typedef enum {
00901     KSPROPERTY_TOPOLOGY_CATEGORIES,
00902     KSPROPERTY_TOPOLOGY_NODES,
00903     KSPROPERTY_TOPOLOGY_CONNECTIONS,
00904     KSPROPERTY_TOPOLOGY_NAME
00905 } KSPROPERTY_TOPOLOGY;
00906 
00907 /* ===============================================================
00908     Property Sets for audio drivers - TODO
00909 */
00910 
00911 #define STATIC_KSPROPTYPESETID_General \
00912     0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
00913 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
00914 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
00915 
00916 /*
00917     KSPROPERTY_AC3_ALTERNATE_AUDIO
00918     KSPROPERTY_AC3_BIT_STREAM_MODE
00919     KSPROPERTY_AC3_DIALOGUE_LEVEL
00920     KSPROPERTY_AC3_DOWNMIX
00921     KSPROPERTY_AC3_ERROR_CONCEALMENT
00922     KSPROPERTY_AC3_LANGUAGE_CODE
00923     KSPROPERTY_AC3_ROOM_TYPE
00924 */
00925 
00926 #define KSPROPSETID_Acoustic_Echo_Cancel
00927 /*
00928     KSPROPERTY_AEC_MODE
00929     KSPROPERTY_AEC_NOISE_FILL_ENABLE
00930     KSPROPERTY_AEC_STATUS
00931 */
00932 
00933 /*
00934     KSPROPERTY_AUDIO_3D_INTERFACE
00935     KSPROPERTY_AUDIO_AGC
00936     KSPROPERTY_AUDIO_ALGORITHM_INSTANCE
00937     KSPROPERTY_AUDIO_BASS
00938     KSPROPERTY_AUDIO_BASS_BOOST
00939     KSPROPERTY_AUDIO_CHANNEL_CONFIG
00940     KSPROPERTY_AUDIO_CHORUS_LEVEL
00941     KSPROPERTY_AUDIO_COPY_PROTECTION
00942     KSPROPERTY_AUDIO_CPU_RESOURCES
00943     KSPROPERTY_AUDIO_DELAY
00944     KSPROPERTY_AUDIO_DEMUX_DEST
00945     KSPROPERTY_AUDIO_DEV_SPECIFIC
00946     KSPROPERTY_AUDIO_DYNAMIC_RANGE
00947     KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE
00948     KSPROPERTY_AUDIO_EQ_BANDS
00949     KSPROPERTY_AUDIO_EQ_LEVEL
00950     KSPROPERTY_AUDIO_FILTER_STATE
00951     KSPROPERTY_AUDIO_LATENCY
00952     KSPROPERTY_AUDIO_LOUDNESS
00953     KSPROPERTY_AUDIO_MANUFACTURE_GUID
00954     KSPROPERTY_AUDIO_MID
00955     KSPROPERTY_AUDIO_MIX_LEVEL_CAPS
00956     KSPROPERTY_AUDIO_MIX_LEVEL_TABLE
00957     KSPROPERTY_AUDIO_MUTE
00958     KSPROPERTY_AUDIO_MUX_SOURCE
00959     KSPROPERTY_AUDIO_NUM_EQ_BANDS
00960     KSPROPERTY_AUDIO_PEAKMETER
00961     KSPROPERTY_AUDIO_POSITION
00962     KSPROPERTY_AUDIO_PREFERRED_STATUS
00963     KSPROPERTY_AUDIO_PRODUCT_GUID
00964     KSPROPERTY_AUDIO_QUALITY
00965     KSPROPERTY_AUDIO_REVERB_LEVEL
00966     KSPROPERTY_AUDIO_SAMPLING_RATE
00967     KSPROPERTY_AUDIO_STEREO_ENHANCE
00968     KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY
00969     KSPROPERTY_AUDIO_SURROUND_ENCODE
00970     KSPROPERTY_AUDIO_TREBLE
00971     KSPROPERTY_AUDIO_VOLUMELEVEL
00972     KSPROPERTY_AUDIO_WIDE_MODE
00973     KSPROPERTY_AUDIO_WIDENESS
00974 */
00975 
00976 #define KSPROPSETID_AudioGfx
00977 /*
00978     KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID
00979     KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID
00980 */
00981 
00982 #define KSPROPSETID_DirectSound3DBuffer
00983 /*
00984     KSPROPERTY_DIRECTSOUND3DBUFFER_ALL
00985     KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES
00986     KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION
00987     KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME
00988     KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE
00989     KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE
00990     KSPROPERTY_DIRECTSOUND3DBUFFER_MODE
00991     KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION
00992     KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY
00993 */
00994 
00995 #define KSPROPSETID_DirectSound3DListener
00996 /*
00997     KSPROPERTY_DIRECTSOUND3DLISTENER_ALL
00998     KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION
00999     KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH
01000     KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR
01001     KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR
01002     KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION
01003     KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION
01004     KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR
01005     KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
01006 */
01007 
01008 #define KSPROPSETID_Hrtf3d
01009 /*
01010     KSPROPERTY_HRTF3D_FILTER_FORMAT
01011     KSPROPERTY_HRTF3D_INITIALIZE
01012     KSPROPERTY_HRTF3D_PARAMS
01013 */
01014 
01015 #define KSPROPSETID_Itd3d
01016 /*
01017     KSPROPERTY_ITD3D_PARAMS
01018 */
01019 
01020 #define KSPROPSETID_TopologyNode
01021 /*
01022     KSPROPERTY_TOPOLOGYNODE_ENABLE
01023     KSPROPERTY_TOPOLOGYNODE_RESET
01024 */
01025 
01026 
01027 /* ===============================================================
01028     Node Types
01029 */
01030 /*
01031     KSNODETYPE_3D_EFFECTS
01032     KSNODETYPE_ACOUSTIC_ECHO_CANCEL
01033     KSNODETYPE_ADC
01034     KSNODETYPE_AGC
01035     KSNODETYPE_CHORUS
01036     KSNODETYPE_DAC
01037     KSNODETYPE_DELAY
01038     KSNODETYPE_DEMUX
01039     KSNODETYPE_DEV_SPECIFIC
01040     KSNODETYPE_DMSYNTH
01041     KSNODETYPE_DMSYNTH_CAPS
01042     KSNODETYPE_DRM_DESCRAMBLE
01043     KSNODETYPE_EQUALIZER
01044     KSNODETYPE_LOUDNESS
01045     KSNODETYPE_MUTE
01046     KSNODETYPE_MUX
01047     KSNODETYPE_PEAKMETER
01048     KSNODETYPE_PROLOGIC_DECODER
01049     KSNODETYPE_PROLOGIC_ENCODER
01050     KSNODETYPE_REVERB
01051     KSNODETYPE_SRC
01052     KSNODETYPE_STEREO_ENHANCE
01053     KSNODETYPE_STEREO_WIDE
01054     KSNODETYPE_SUM
01055     KSNODETYPE_SUPERMIX
01056     KSNODETYPE_SWMIDI
01057     KSNODETYPE_SWSYNTH
01058     KSNODETYPE_SYNTHESIZER
01059     KSNODETYPE_TONE
01060     KSNODETYPE_VOLUME
01061 */
01062 
01063 
01064 typedef PVOID   KSDEVICE_HEADER,
01065                 KSOBJECT_HEADER,
01066                 KSOBJECT_BAG;
01067 
01068 
01069 
01070 
01071 /* ===============================================================
01072     Method Types
01073 */
01074 
01075 #define KSMETHOD_TYPE_NONE          0x00000000
01076 #define KSMETHOD_TYPE_READ          0x00000001
01077 #define KSMETHOD_TYPE_WRITE         0x00000002
01078 #define KSMETHOD_TYPE_MODIFY        0x00000003
01079 #define KSMETHOD_TYPE_SOURCE        0x00000004
01080 #define KSMETHOD_TYPE_SEND          0x00000001
01081 #define KSMETHOD_TYPE_SETSUPPORT    0x00000100
01082 #define KSMETHOD_TYPE_BASICSUPPORT  0x00000200
01083 
01084 
01085 /* ===============================================================
01086     Property Types
01087 */
01088 
01089 #define KSPROPERTY_TYPE_GET             0x00000001
01090 #define KSPROPERTY_TYPE_SET             0x00000002
01091 #define KSPROPERTY_TYPE_SETSUPPORT      0x00000100
01092 #define KSPROPERTY_TYPE_BASICSUPPORT    0x00000200
01093 #define KSPROPERTY_TYPE_RELATIONS       0x00000400
01094 #define KSPROPERTY_TYPE_SERIALIZESET    0x00000800
01095 #define KSPROPERTY_TYPE_UNSERIALIZESET  0x00001000
01096 #define KSPROPERTY_TYPE_SERIALIZERAW    0x00002000
01097 #define KSPROPERTY_TYPE_UNSERIALIZERAW  0x00004000
01098 #define KSPROPERTY_TYPE_SERIALIZESIZE   0x00008000
01099 #define KSPROPERTY_TYPE_DEFAULT_VALUES  0x00010000
01100 
01101 
01102 /* ===============================================================
01103     Topology Methods/Properties
01104 */
01105 
01106 #define KSMETHOD_TYPE_TOPOLOGY          0x10000000
01107 #define KSPROPERTY_TYPE_TOPOLOGY        0x10000000
01108 
01109 /*
01110 #define DEFINE_KS_GUID(GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK) \
01111     DEFINE_GUID(??, 0x#GA#L, 0xGB, 0xGC, 0xGD, 0xGE, 0xGF, 0xGG, 0xGH, 0xGI, 0xGJ, 0xGK) \
01112     "GA-GB-GC-GDGE-GFGGGHGIGJGK"
01113 */
01114 
01115 /* ===============================================================
01116     KS Category GUIDs
01117 
01118     BRIDGE - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01119     CAPTURE - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01120     RENDER - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01121     MIXER - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01122     SPLITTER - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01123     DATACOMPRESSOR - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01124     DATADECOMPRESSOR - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01125     DATATRANSFORM - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01126     COMMUNICATIONSTRANSFORM - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01127     INTERFACETRANSFORM - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01128     MEDIUMTRANSFORM - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01129     FILESYSTEM - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01130     CLOCK - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01131     PROXY - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01132     QUALITY - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01133 */
01134 
01135 /* ===============================================================
01136     KSNAME GUIDs (defined also as KSSTRING_Xxx L"{...}"
01137 
01138     Filter - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
01139     Pin - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01140     Clock - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01141     Allocator - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01142     TopologyNode - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01143 */
01144 
01145 /* ===============================================================
01146     Interface GUIDs
01147 
01148     Standard - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01149     FileIo - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01150 */
01151 
01152 /* ===============================================================
01153     Medium Type GUIDs
01154 
01155     Standard - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01156 */
01157 
01158 /* ===============================================================
01159     Property Set GUIDs
01160 
01161     General - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01162     StreamIo - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01163     MediaSeeking - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
01164     Topology - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01165     GM - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
01166     Quality - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01167     Connection - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01168 */
01169 
01170 /* ===============================================================
01171     StreamAllocator Sets
01172 
01173     Event set - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
01174     Method set - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
01175     Property set - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
01176 */
01177 
01178 /* ===============================================================
01179     StreamInterface Sets
01180 
01181     Property set - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
01182 */
01183 
01184 /* ===============================================================
01185     Clock Sets
01186 
01187     Property set - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01188     Event sets - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
01189 */
01190 
01191 /* ===============================================================
01192     Connection Sets
01193 
01194     Event set - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
01195 */
01196 
01197 /* ===============================================================
01198     Time Format GUIDs
01199 
01200     KSTIME_FORMAT_NONE  (null guid)
01201     FRAME - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
01202     BYTE - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
01203     SAMPLE - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
01204     FIELD - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
01205     MEDIA_TIME - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
01206 */
01207 
01208 /* ===============================================================
01209     Media Type GUIDs
01210 
01211     NULL
01212     Stream -
01213     None -
01214 
01215     TODO ...
01216 */
01217 
01218 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
01219     0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
01220 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
01221 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
01222 
01223 
01224 /* ===============================================================
01225     KSMEMORY_TYPE_xxx
01226 
01227     WILDCARD, DONT_CARE = NULL
01228     SYSTEM - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
01229     USER - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
01230     KERNEL_PAGED - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
01231     KERNEL_NONPAGED - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
01232     DEVICE_UNKNOWN - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
01233 */
01234 
01235 /* ===============================================================
01236     Enums
01237     (values have been checked)
01238 */
01239 
01240 #ifndef _MSC_VER
01241 
01242 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
01243                                MinProperty,\
01244                                MinData,\
01245                                SetHandler,\
01246                                Values, RelationsCount, Relations, SupportHandler,\
01247                                SerializedSize)\
01248 {\
01249      PropertyId, {(PFNKSHANDLER)GetHandler}, MinProperty, MinData,\
01250      {(PFNKSHANDLER)SetHandler},\
01251     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
01252     (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
01253 }
01254 
01255 #else
01256 
01257 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
01258                                MinProperty,\
01259                                MinData,\
01260                                SetHandler,\
01261                                Values, RelationsCount, Relations, SupportHandler,\
01262                                SerializedSize)\
01263 {\
01264     PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
01265     (PFNKSHANDLER)SetHandler,\
01266     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
01267     (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
01268 }
01269 
01270 #endif
01271 
01272 
01273 typedef enum
01274 {
01275     KsObjectTypeDevice,
01276     KsObjectTypeFilterFactory,
01277     KsObjectTypeFilter,
01278     KsObjectTypePin
01279 } KSOBJECTTYPE;
01280 
01281 typedef enum
01282 {
01283     KSSTATE_STOP,
01284     KSSTATE_ACQUIRE,
01285     KSSTATE_PAUSE,
01286     KSSTATE_RUN
01287 } KSSTATE, *PKSSTATE;
01288 
01289 typedef enum
01290 {
01291     KSTARGET_STATE_DISABLED,
01292     KSTARGET_STATE_ENABLED
01293 } KSTARGET_STATE;
01294 
01295 typedef enum
01296 {
01297     KSRESET_BEGIN,
01298     KSRESET_END
01299 } KSRESET;
01300 
01301 typedef enum
01302 {
01303     KSEVENTS_NONE,
01304     KSEVENTS_SPINLOCK,
01305     KSEVENTS_MUTEX,
01306     KSEVENTS_FMUTEX,
01307     KSEVENTS_FMUTEXUNSAFE,
01308     KSEVENTS_INTERRUPT,
01309     KSEVENTS_ERESOURCE
01310 } KSEVENTS_LOCKTYPE;
01311 
01312 typedef enum
01313 {
01314     KSDEGRADE_STANDARD_SIMPLE,
01315     KSDEGRADE_STANDARD_QUALITY,
01316     KSDEGRADE_STANDARD_COMPUTATION,
01317     KSDEGRADE_STANDARD_SKIP
01318 } KSDEGRADE_STANDARD;
01319 
01320 typedef enum
01321 {
01322     KSPIN_DATAFLOW_IN = 1,
01323     KSPIN_DATAFLOW_OUT
01324 } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
01325 
01326 typedef enum
01327 {
01328     KSPIN_COMMUNICATION_NONE,
01329     KSPIN_COMMUNICATION_SINK,
01330     KSPIN_COMMUNICATION_SOURCE,
01331     KSPIN_COMMUNICATION_BOTH,
01332     KSPIN_COMMUNICATION_BRIDGE
01333 } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
01334 
01335 typedef enum
01336 {
01337     KsListEntryTail,
01338     KsListEntryHead
01339 } KSLIST_ENTRY_LOCATION;
01340 
01341 typedef enum
01342 {
01343     KsStackCopyToNewLocation,
01344     KsStackReuseCurrentLocation,
01345     KsStackUseNewLocation
01346 } KSSTACK_USE;
01347 
01348 typedef enum
01349 {
01350     KsAcquireOnly,
01351     KsAcquireAndRemove,
01352     KsAcquireOnlySingleItem,
01353     KsAcquireAndRemoveOnlySingleItem
01354 } KSIRP_REMOVAL_OPERATION;
01355 
01356 typedef enum
01357 {
01358     KsInvokeOnSuccess = 1,
01359     KsInvokeOnError = 2,
01360     KsInvokeOnCancel = 4
01361 } KSCOMPLETION_INVOCATION;
01362 
01363 
01364 #if defined(_NTDDK_)
01365 /* MOVE ME */
01366 typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)(
01367     IN PVOID Context,
01368     IN PIRP Irp);
01369 #endif
01370 
01371 #if defined(_NTDDK_) && !defined(__wtypes_h__)
01372 enum VARENUM {
01373     VT_EMPTY = 0,
01374     VT_NULL = 1,
01375     VT_I2 = 2,
01376     VT_I4 = 3,
01377     VT_R4 = 4,
01378     VT_R8 = 5,
01379     VT_CY = 6,
01380     VT_DATE = 7,
01381     VT_BSTR = 8,
01382     VT_DISPATCH = 9,
01383     VT_ERROR = 10,
01384     VT_BOOL = 11,
01385     VT_VARIANT = 12,
01386     VT_UNKNOWN = 13,
01387     VT_DECIMAL = 14,
01388     VT_I1 = 16,
01389     VT_UI1 = 17,
01390     VT_UI2 = 18,
01391     VT_UI4 = 19,
01392     VT_I8 = 20,
01393     VT_UI8 = 21,
01394     VT_INT = 22,
01395     VT_UINT = 23,
01396     VT_VOID = 24,
01397     VT_HRESULT  = 25,
01398     VT_PTR = 26,
01399     VT_SAFEARRAY = 27,
01400     VT_CARRAY = 28,
01401     VT_USERDEFINED = 29,
01402     VT_LPSTR = 30,
01403     VT_LPWSTR = 31,
01404     VT_FILETIME = 64,
01405     VT_BLOB = 65,
01406     VT_STREAM = 66,
01407     VT_STORAGE = 67,
01408     VT_STREAMED_OBJECT = 68,
01409     VT_STORED_OBJECT = 69,
01410     VT_BLOB_OBJECT = 70,
01411     VT_CF = 71,
01412     VT_CLSID = 72,
01413     VT_VECTOR = 0x1000,
01414     VT_ARRAY = 0x2000,
01415     VT_BYREF = 0x4000,
01416     VT_RESERVED = 0x8000,
01417     VT_ILLEGAL = 0xffff,
01418     VT_ILLEGALMASKED = 0xfff,
01419     VT_TYPEMASK = 0xfff
01420 };
01421 #endif
01422 
01423 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD       STATIC_GUID_NULL
01424 #define KSDATAFORMAT_TYPE_WILDCARD              GUID_NULL
01425 
01426 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD    STATIC_GUID_NULL
01427 #define KSDATAFORMAT_SUBTYPE_WILDCARD           GUID_NULL
01428 
01429 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD  STATIC_GUID_NULL
01430 #define KSDATAFORMAT_SPECIFIER_WILDCARD         GUID_NULL
01431 
01432 /* ===============================================================
01433     Framing
01434 */
01435 
01436 typedef struct
01437 {
01438     ULONG   MinFrameSize;
01439     ULONG   MaxFrameSize;
01440     ULONG   Stepping;
01441 } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
01442 
01443 typedef struct
01444 {
01445     KS_FRAMING_RANGE  Range;
01446     ULONG             InPlaceWeight;
01447     ULONG             NotInPlaceWeight;
01448 } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
01449 
01450 typedef struct
01451 {
01452     GUID                        MemoryType;
01453     GUID                        BusType;
01454     ULONG                       MemoryFlags;
01455     ULONG                       BusFlags;   
01456     ULONG                       Flags;   
01457     ULONG                       Frames;
01458     ULONG                       FileAlignment;
01459     ULONG                       MemoryTypeWeight;
01460     KS_FRAMING_RANGE            PhysicalRange;
01461     KS_FRAMING_RANGE_WEIGHTED   FramingRange; 
01462 } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
01463 
01464 typedef struct
01465 {
01466     ULONG   RatioNumerator;
01467     ULONG   RatioDenominator; 
01468     ULONG   RatioConstantMargin;
01469 } KS_COMPRESSION, *PKS_COMPRESSION;
01470 
01471 
01472 /* ===============================================================
01473     Priorities
01474 */
01475 
01476 #define KSPRIORITY_LOW          0x00000001
01477 #define KSPRIORITY_NORMAL       0x40000000
01478 #define KSPRIORITY_HIGH         0x80000000
01479 #define KSPRIORITY_EXCLUSIVE    0xFFFFFFFF
01480 
01481 typedef struct
01482 {
01483     ULONG PriorityClass;
01484     ULONG PrioritySubClass;
01485 } KSPRIORITY, *PKSPRIORITY;
01486 
01487 
01488 /* ===============================================================
01489     Dispatch Table
01490     http://www.osronline.com/DDKx/stream/ks-struct_494j.htm
01491 */
01492 #if defined(_NTDDK_)
01493 typedef struct
01494 {
01495     PDRIVER_DISPATCH DeviceIoControl;
01496     PDRIVER_DISPATCH Read;
01497     PDRIVER_DISPATCH Write;
01498     PDRIVER_DISPATCH Flush;
01499     PDRIVER_DISPATCH Close;
01500     PDRIVER_DISPATCH QuerySecurity;
01501     PDRIVER_DISPATCH SetSecurity;
01502     PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
01503     PFAST_IO_READ FastRead;
01504     PFAST_IO_WRITE FastWrite;
01505 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
01506 
01507 
01508 #define KSCREATE_ITEM_IRP_STORAGE(Irp)      (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0])
01509 #define KSEVENT_SET_IRP_STORAGE(Irp)        (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
01510 #define KSEVENT_ITEM_IRP_STORAGE(Irp)       (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
01511 #define KSEVENT_ENTRY_IRP_STORAGE(Irp)      (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0])
01512 #define KSMETHOD_SET_IRP_STORAGE(Irp)       (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
01513 #define KSMETHOD_ITEM_IRP_STORAGE(Irp)      (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
01514 #define KSMETHOD_TYPE_IRP_STORAGE(Irp)      (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2]))
01515 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)   (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1])
01516 #define KSPROPERTY_SET_IRP_STORAGE(Irp)     (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
01517 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp)    (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
01518 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
01519 
01520 typedef 
01521 VOID
01522 (NTAPI *PFNREFERENCEDEVICEOBJECT)( 
01523     IN PVOID Context
01524     );
01525     
01526 typedef 
01527 VOID
01528 (NTAPI *PFNDEREFERENCEDEVICEOBJECT)( 
01529     IN PVOID Context
01530     );
01531     
01532 typedef
01533 NTSTATUS
01534 (NTAPI *PFNQUERYREFERENCESTRING)( 
01535     IN PVOID Context,
01536     IN OUT PWCHAR *String
01537     );
01538 
01539 typedef struct
01540 {
01541     INTERFACE                   Interface;
01542     PFNREFERENCEDEVICEOBJECT    ReferenceDeviceObject;
01543     PFNDEREFERENCEDEVICEOBJECT  DereferenceDeviceObject;
01544     PFNQUERYREFERENCESTRING     QueryReferenceString;
01545 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
01546 
01547 typedef struct
01548 {
01549     KDPC            Dpc;
01550     ULONG           ReferenceCount;
01551     KSPIN_LOCK      AccessLock;
01552 } KSDPC_ITEM, *PKSDPC_ITEM;
01553 
01554 typedef struct
01555 {
01556     KSDPC_ITEM          DpcItem;
01557     LIST_ENTRY          BufferList;
01558 } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
01559 
01560 #endif
01561 
01562 typedef struct
01563 {
01564     GUID    Manufacturer;
01565     GUID    Product;
01566     GUID    Component;
01567     GUID    Name;
01568     ULONG   Version;
01569     ULONG   Revision;
01570 } KSCOMPONENTID, *PKSCOMPONENTID;
01571 
01572 /* ===============================================================
01573     Properties
01574 */
01575 
01576 typedef struct
01577 {
01578     GUID            PropertySet;
01579     ULONG           Count;
01580 } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
01581 
01582 typedef struct
01583 {
01584     KSIDENTIFIER    PropTypeSet;
01585     ULONG           Id;
01586     ULONG           PropertyLength;
01587 } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
01588 
01589 
01590 typedef union
01591 {
01592     struct {
01593         LONG    SignedMinimum;
01594         LONG    SignedMaximum;
01595     
01596 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
01597      }_SIGNED;
01598 #else
01599      };
01600 #endif
01601 
01602     struct {
01603         ULONG   UnsignedMinimum;
01604         ULONG   UnsignedMaximum;
01605 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
01606      }_UNSIGNED;
01607 #else
01608      };
01609 #endif
01610 
01611 } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
01612 
01613 typedef union
01614 {
01615     struct {
01616         LONGLONG    SignedMinimum;
01617         LONGLONG    SignedMaximum;
01618 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
01619      }_SIGNED64;
01620 #else
01621      };
01622 #endif
01623 
01624     struct {
01625 #if defined(_NTDDK_)
01626         ULONGLONG   UnsignedMinimum;
01627         ULONGLONG   UnsignedMaximum;
01628 #else
01629         DWORDLONG   UnsignedMinimum;
01630         DWORDLONG   UnsignedMaximum;
01631 #endif
01632 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
01633      }_UNSIGNED64;
01634 #else
01635      };
01636 #endif
01637 } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
01638 
01639 typedef struct
01640 {
01641     ULONG           AccessFlags;
01642     ULONG           DescriptionSize;
01643     KSIDENTIFIER    PropTypeSet;
01644     ULONG           MembersListCount;
01645     ULONG           Reserved;
01646 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
01647 
01648 typedef struct
01649 {
01650     ULONG   MembersFlags;
01651     ULONG   MembersSize;
01652     ULONG   MembersCount;
01653     ULONG   Flags;
01654 } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
01655 
01656 typedef struct {
01657     KSPROPERTY_MEMBERSHEADER    MembersHeader;
01658     const VOID*                 Members;
01659 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
01660 
01661 #define KSPROPERTY_MEMBER_RANGES            0x00000001
01662 #define KSPROPERTY_MEMBER_STEPPEDRANGES     0x00000002
01663 #define KSPROPERTY_MEMBER_VALUES            0x00000003
01664 
01665 #define KSPROPERTY_MEMBER_FLAG_DEFAULT                      0x00000001
01666 #if (NTDDI_VERSION >= NTDDI_WINXP)
01667 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL    0x00000002
01668 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM         0x00000004
01669 #endif
01670 
01671 
01672 typedef struct {
01673     KSIDENTIFIER                    PropTypeSet;
01674     ULONG                           MembersListCount;
01675     const KSPROPERTY_MEMBERSLIST*   MembersList;
01676 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
01677 
01678 #if defined(_NTDDK_)
01679 typedef NTSTATUS (NTAPI *PFNKSHANDLER)(
01680     IN  PIRP Irp,
01681     IN  PKSIDENTIFIER Request,
01682     IN  OUT PVOID Data);
01683 
01684 typedef struct 
01685 {
01686     ULONG PropertyId;
01687     union 
01688     {
01689         PFNKSHANDLER GetPropertyHandler;
01690         BOOLEAN GetSupported;
01691     };
01692     ULONG MinProperty;
01693     ULONG MinData;
01694     union {
01695         PFNKSHANDLER SetPropertyHandler;
01696         BOOLEAN SetSupported;
01697     };
01698     const KSPROPERTY_VALUES * Values;
01699     ULONG RelationsCount;
01700     const KSPROPERTY * Relations;
01701     PFNKSHANDLER SupportHandler;
01702     ULONG SerializedSize;
01703 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
01704 
01705 
01706 typedef
01707 BOOLEAN
01708 (NTAPI *PFNKSFASTHANDLER)(
01709     IN PFILE_OBJECT FileObject,
01710     IN PKSIDENTIFIER Request,
01711     IN ULONG RequestLength,
01712     IN OUT PVOID Data,
01713     IN ULONG DataLength,
01714     OUT PIO_STATUS_BLOCK IoStatus
01715     );
01716 
01717 typedef struct {
01718     ULONG                       PropertyId;
01719     union {
01720         PFNKSFASTHANDLER            GetPropertyHandler;
01721         BOOLEAN                     GetSupported;
01722     };
01723     union {
01724         PFNKSFASTHANDLER            SetPropertyHandler;
01725         BOOLEAN                     SetSupported;
01726     };
01727     ULONG                       Reserved;
01728 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
01729 
01730 typedef struct
01731 {
01732     const GUID* Set;
01733     ULONG PropertiesCount;
01734     const KSPROPERTY_ITEM * PropertyItem;
01735     ULONG FastIoCount;
01736     const KSFASTPROPERTY_ITEM* FastIoTable;
01737 } KSPROPERTY_SET, *PKSPROPERTY_SET;
01738 
01739 #endif
01740 
01741 typedef struct
01742 {
01743     ULONG                       SteppingDelta;
01744     ULONG                       Reserved;
01745     KSPROPERTY_BOUNDS_LONG      Bounds;
01746 } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
01747 
01748 typedef struct
01749 {
01750 #if defined(_NTDDK_)
01751     ULONGLONG                   SteppingDelta;
01752 #else
01753     DWORDLONG                   SteppingDelta;
01754 #endif
01755     KSPROPERTY_BOUNDS_LONGLONG  Bounds;
01756 } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
01757 
01758 /* ===============================================================
01759     Allocator Framing
01760 */
01761 
01762 typedef struct
01763 {
01764     union {
01765         ULONG       OptionsFlags;
01766         ULONG       RequirementsFlags;
01767     };
01768 #if defined(_NTDDK_)
01769     POOL_TYPE   PoolType;
01770 #else
01771     ULONG       PoolType;
01772 #endif 
01773     ULONG       Frames;
01774     ULONG       FrameSize;
01775     ULONG       FileAlignment;
01776     ULONG       Reserved;
01777 } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
01778 
01779 typedef struct
01780 {
01781     ULONG               CountItems;
01782     ULONG               PinFlags;
01783     KS_COMPRESSION      OutputCompression;
01784     ULONG               PinWeight;
01785     KS_FRAMING_ITEM     FramingItem[1]; 
01786 } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
01787 
01788 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER   0x00000001
01789 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY      0x00000002
01790 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY    0x00000004
01791 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE      0x00000008
01792 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY   0x80000000
01793 
01794 #define KSALLOCATOR_OPTIONF_COMPATIBLE              0x00000001
01795 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY           0x00000002
01796 #define KSALLOCATOR_OPTIONF_VALID                   0x00000003
01797 
01798 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT       0x00000010
01799 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC            0x00000020
01800 #define KSALLOCATOR_FLAG_CAN_ALLOCATE               0x00000040
01801 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO  0x00000080
01802 
01803 /* ===============================================================
01804     Quality
01805 */
01806 
01807 typedef struct
01808 {
01809     PVOID       Context;
01810     ULONG       Proportion;
01811     LONGLONG    DeltaTime;
01812 } KSQUALITY, *PKSQUALITY;
01813 
01814 typedef struct
01815 {
01816     HANDLE QualityManager;
01817     PVOID Context;
01818 } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
01819 
01820 typedef struct
01821 {
01822     LONGLONG        PresentationStart;
01823     LONGLONG        Duration;
01824     KSPIN_INTERFACE Interface;
01825     LONG            Rate;
01826     ULONG           Flags;
01827 } KSRATE, *PKSRATE;
01828 
01829 typedef struct
01830 {
01831     KSPROPERTY      Property;
01832     KSRATE          Rate;
01833 } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
01834 
01835 typedef struct
01836 {
01837     LONGLONG Granularity;
01838     LONGLONG Error;
01839 } KSRESOLUTION, *PKSRESOLUTION;
01840 
01841 typedef struct
01842 {
01843     ULONG       NotificationType;
01844     union {
01845         struct {
01846             HANDLE              Event;
01847             ULONG_PTR           Reserved[2];
01848         } EventHandle;
01849         struct {
01850             HANDLE              Semaphore;
01851             ULONG               Reserved;
01852             LONG                Adjustment;
01853         } SemaphoreHandle;
01854 #if defined(_NTDDK_)
01855         struct {
01856             PVOID               Event;
01857             KPRIORITY           Increment;
01858             ULONG_PTR           Reserved;
01859         } EventObject;
01860         struct {
01861             PVOID               Semaphore;
01862             KPRIORITY           Increment;
01863             LONG                Adjustment;
01864         } SemaphoreObject;
01865         struct {
01866             PKDPC               Dpc;
01867             ULONG               ReferenceCount;
01868             ULONG_PTR           Reserved;
01869         } Dpc;
01870         struct {
01871             PWORK_QUEUE_ITEM    WorkQueueItem;
01872             WORK_QUEUE_TYPE     WorkQueueType;
01873             ULONG_PTR           Reserved;
01874         } WorkItem;
01875         struct {
01876             PWORK_QUEUE_ITEM    WorkQueueItem;
01877             PKSWORKER           KsWorkerObject;
01878             ULONG_PTR           Reserved;
01879         } KsWorkItem;
01880 #endif
01881         struct {
01882             PVOID               Unused;
01883             LONG_PTR            Alignment[2];
01884         } Alignment;
01885     };
01886 } KSEVENTDATA, *PKSEVENTDATA;
01887 
01888 #define KSEVENTF_EVENT_HANDLE       0x00000001
01889 #define KSEVENTF_SEMAPHORE_HANDLE   0x00000002
01890 #if defined(_NTDDK_)
01891 #define KSEVENTF_EVENT_OBJECT       0x00000004
01892 #define KSEVENTF_SEMAPHORE_OBJECT   0x00000008
01893 #define KSEVENTF_DPC                0x00000010
01894 #define KSEVENTF_WORKITEM           0x00000020
01895 #define KSEVENTF_KSWORKITEM         0x00000080
01896 #endif
01897 
01898 
01899 #define KSEVENT_TYPE_ENABLE         0x00000001
01900 #define KSEVENT_TYPE_ONESHOT        0x00000002
01901 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
01902 #define KSEVENT_TYPE_SETSUPPORT     0x00000100
01903 #define KSEVENT_TYPE_BASICSUPPORT   0x00000200
01904 #define KSEVENT_TYPE_QUERYBUFFER    0x00000400
01905 
01906 #define KSEVENT_TYPE_TOPOLOGY 0x10000000
01907 
01908 typedef struct
01909 {
01910     ULONG Size;
01911     ULONG Flags;
01912     union {
01913         HANDLE ObjectHandle;
01914         PVOID ObjectPointer;
01915     };
01916     PVOID Reserved;
01917     KSEVENT Event;
01918     KSEVENTDATA EventData;
01919 } KSRELATIVEEVENT, *PKSRELATIVEEVENT;
01920 
01921 #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
01922 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
01923 
01924 /* ===============================================================
01925     Timing
01926 */
01927 
01928 
01929 typedef struct {
01930     KSEVENTDATA     EventData;
01931     LONGLONG        MarkTime;
01932 } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
01933 
01934 typedef struct {
01935     KSEVENTDATA     EventData;
01936     LONGLONG        TimeBase;
01937     LONGLONG        Interval;
01938 } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
01939 
01940 typedef struct {
01941     LONGLONG        TimeBase;
01942     LONGLONG        Interval;
01943 } KSINTERVAL, *PKSINTERVAL;
01944 
01945 
01946 
01947 typedef struct
01948 {
01949     LONGLONG Time;
01950     ULONG Numerator;
01951     ULONG Denominator;
01952 } KSTIME, *PKSTIME;
01953 
01954 typedef struct
01955 {
01956     LONGLONG    Time;
01957     LONGLONG    SystemTime;
01958 } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
01959 
01960 typedef struct
01961 {
01962     LONGLONG    Duration;
01963     ULONG       FrameFlags;
01964     ULONG       Reserved;
01965 } KSFRAMETIME, *PKSFRAMETIME;
01966 
01967 
01968 /* ===============================================================
01969     Clocks
01970 */
01971 
01972 typedef PVOID   PKSDEFAULTCLOCK;
01973 
01974 typedef struct
01975 {
01976     ULONG       CreateFlags;
01977 } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
01978 
01979 #if defined(_NTDDK_)
01980 
01981 typedef
01982 LONGLONG
01983 (FASTCALL *PFNKSCLOCK_GETTIME)(
01984     IN PFILE_OBJECT FileObject
01985     );
01986 typedef
01987 LONGLONG
01988 (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
01989     IN PFILE_OBJECT FileObject,
01990     OUT PLONGLONG SystemTime);
01991 
01992 typedef struct
01993 {
01994     PFNKSCLOCK_GETTIME GetTime;
01995     PFNKSCLOCK_GETTIME GetPhysicalTime;
01996     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
01997     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
01998 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
01999 
02000 
02001 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
02002     DEFINE_KSPROPERTY_ITEM(\
02003         KSPROPERTY_CLOCK_TIME,\
02004         (Handler),\
02005         sizeof(KSPROPERTY),\
02006         sizeof(LONGLONG),\
02007         NULL, NULL, 0, NULL, NULL, 0)
02008 
02009 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
02010     DEFINE_KSPROPERTY_ITEM(\
02011         KSPROPERTY_CLOCK_PHYSICALTIME,\
02012         (Handler),\
02013         sizeof(KSPROPERTY),\
02014         sizeof(LONGLONG),\
02015         NULL, NULL, 0, NULL, NULL, 0)
02016 
02017 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
02018     DEFINE_KSPROPERTY_ITEM(\
02019         KSPROPERTY_CLOCK_CORRELATEDTIME,\
02020         (Handler),\
02021         sizeof(KSPROPERTY),\
02022         sizeof(KSCORRELATED_TIME),\
02023         NULL, NULL, 0, NULL, NULL, 0)
02024 
02025 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
02026     DEFINE_KSPROPERTY_ITEM(\
02027         KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
02028         (Handler),\
02029         sizeof(KSPROPERTY),\
02030         sizeof(KSCORRELATED_TIME),\
02031         NULL, NULL, 0, NULL, NULL, 0)
02032 
02033 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
02034     DEFINE_KSPROPERTY_ITEM(\
02035         KSPROPERTY_CLOCK_RESOLUTION,\
02036         (Handler),\
02037         sizeof(KSPROPERTY),\
02038         sizeof(KSRESOLUTION),\
02039         NULL, NULL, 0, NULL, NULL, 0)
02040 
02041 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
02042     DEFINE_KSPROPERTY_ITEM(\
02043         KSPROPERTY_CLOCK_STATE,\
02044         (Handler),\
02045         sizeof(KSPROPERTY),\
02046         sizeof(KSSTATE),\
02047         NULL, NULL, 0, NULL, NULL, 0)
02048 
02049 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
02050     DEFINE_KSPROPERTY_ITEM(\
02051         KSPROPERTY_CLOCK_FUNCTIONTABLE,\
02052         (Handler),\
02053         sizeof(KSPROPERTY),\
02054         sizeof(KSCLOCK_FUNCTIONTABLE),\
02055         NULL, NULL, 0, NULL, NULL, 0)
02056 
02057 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
02058     PropTime, PropPhysicalTime,\
02059     PropCorrelatedTime, PropCorrelatedPhysicalTime,\
02060     PropResolution, PropState, PropFunctionTable)\
02061 DEFINE_KSPROPERTY_TABLE(ClockSet) {\
02062     DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
02063     DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
02064     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
02065     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
02066     DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
02067     DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
02068     DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\
02069 }
02070 
02071 /* ===============================================================
02072     Objects ??? SORT ME!
02073 */
02074 
02075 #define KSCREATE_ITEM_SECURITYCHANGED       0x1
02076 #define KSCREATE_ITEM_WILDCARD              0x2
02077 #define KSCREATE_ITEM_NOPARAMETERS          0x4
02078 #define KSCREATE_ITEM_FREEONSTOP            0x8
02079 
02080 typedef struct
02081 {
02082     PDRIVER_DISPATCH       Create;
02083     PVOID                  Context;
02084     UNICODE_STRING         ObjectClass;
02085     PSECURITY_DESCRIPTOR   SecurityDescriptor;
02086     ULONG                  Flags;
02087 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
02088 
02089 typedef struct
02090 {
02091     ULONG                    CreateItemsCount;
02092     PKSOBJECT_CREATE_ITEM    CreateItemsList;
02093 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
02094 
02095 typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
02096     IN  PKSOBJECT_CREATE_ITEM CreateItem);
02097 
02098 #endif
02099 
02100 typedef struct
02101 {
02102     ULONG    Size;
02103     ULONG    Count;
02104 } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
02105 
02106 typedef struct
02107 {
02108     KSEVENT         Event;
02109     PKSEVENTDATA    EventData;
02110     PVOID           Reserved;
02111 } KSQUERYBUFFER, *PKSQUERYBUFFER;
02112 
02113 typedef struct
02114 {
02115     PVOID       Context;
02116     ULONG       Status;
02117 } KSERROR, *PKSERROR;
02118 
02119 /* ===============================================================
02120     Methods
02121 */
02122 #if defined(_NTDDK_)
02123 
02124 typedef struct
02125 {
02126     ULONG                   MethodId;
02127     union {
02128         PFNKSHANDLER            MethodHandler;
02129         BOOLEAN                 MethodSupported;
02130     };
02131     ULONG                   MinMethod;
02132     ULONG                   MinData;
02133     PFNKSHANDLER            SupportHandler;
02134     ULONG                   Flags;
02135 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
02136 
02137 #ifndef _MSC_VER
02138 
02139 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
02140                              MethodHandler,\
02141                              MinMethod, MinData, SupportHandler)\
02142 {\
02143     MethodId, {(PFNKSHANDLER)MethodHandler}, MinMethod, MinData,\
02144     SupportHandler, Flags\
02145 }
02146 
02147 #else
02148 
02149 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
02150                              MethodHandler,\
02151                              MinMethod, MinData, SupportHandler)\
02152 {\
02153     MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
02154     SupportHandler, Flags\
02155 }
02156 
02157 
02158 
02159 #endif
02160 
02161 
02162 typedef struct
02163 {
02164     ULONG                   MethodId;
02165     union {
02166         PFNKSFASTHANDLER        MethodHandler;
02167         BOOLEAN                 MethodSupported;
02168     };
02169 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
02170 
02171 #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
02172 {\
02173     MethodId, (PFNKSFASTHANDLER)MethodHandler\
02174 }
02175 
02176     
02177 typedef struct
02178 {
02179     const GUID*             Set;
02180     ULONG                   MethodsCount;
02181     const KSMETHOD_ITEM*    MethodItem;
02182     ULONG                   FastIoCount;
02183     const KSFASTMETHOD_ITEM*FastIoTable;
02184 } KSMETHOD_SET, *PKSMETHOD_SET;
02185 
02186 
02187 #define DEFINE_KSMETHOD_SET(Set,\
02188                             MethodsCount,\
02189                             MethodItem,\
02190                             FastIoCount,\
02191                             FastIoTable)\
02192 {\
02193     Set,\
02194     MethodsCount,\
02195     MethodItem,\
02196     FastIoCount,\
02197     FastIoTable\
02198 }
02199 
02200 #endif
02201 /* ===============================================================
02202     Nodes
02203 */
02204 
02205 typedef struct
02206 {
02207     KSPROPERTY      Property;
02208     ULONG           NodeId;
02209     ULONG           Reserved;
02210 } KSP_NODE, *PKSP_NODE;
02211 
02212 typedef struct
02213 {
02214     KSMETHOD Method;
02215     ULONG NodeID;
02216     ULONG Reserved;
02217 } KSM_NODE, *PKSM_NODE;
02218 
02219 typedef struct
02220 {
02221     KSEVENT         Event;
02222     ULONG           NodeId;
02223     ULONG           Reserved;
02224 } KSE_NODE, *PKSE_NODE;
02225 
02226 typedef struct {
02227     ULONG       CreateFlags;
02228     ULONG       Node;
02229 } KSNODE_CREATE, *PKSNODE_CREATE;
02230 
02231 
02232 /* ===============================================================
02233     Events
02234 */
02235 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY;
02236 
02237 #if defined(_NTDDK_)
02238     
02239 typedef NTSTATUS (NTAPI *PFNKSADDEVENT)(
02240     IN  PIRP Irp,
02241     IN  PKSEVENTDATA EventData,
02242     IN  struct _KSEVENT_ENTRY* EventEntry);
02243 
02244 typedef
02245 VOID
02246 (NTAPI *PFNKSREMOVEEVENT)(
02247     IN PFILE_OBJECT FileObject,
02248     IN struct _KSEVENT_ENTRY* EventEntry
02249     );
02250 
02251 typedef struct
02252 {
02253     ULONG               EventId;
02254     ULONG               DataInput;
02255     ULONG               ExtraEntryData;
02256     PFNKSADDEVENT       AddHandler;
02257     PFNKSREMOVEEVENT    RemoveHandler;
02258     PFNKSHANDLER        SupportHandler;
02259 } KSEVENT_ITEM, *PKSEVENT_ITEM;
02260 
02261 typedef struct
02262 {
02263     const GUID*         Set;
02264     ULONG               EventsCount;
02265     const KSEVENT_ITEM* EventItem;
02266 } KSEVENT_SET, *PKSEVENT_SET;
02267 
02268 struct _KSEVENT_ENTRY
02269 {
02270     LIST_ENTRY      ListEntry;
02271     PVOID           Object;
02272     union {
02273         PKSDPC_ITEM         DpcItem;
02274         PKSBUFFER_ITEM      BufferItem;
02275     };
02276     PKSEVENTDATA        EventData;
02277     ULONG               NotificationType;
02278     const KSEVENT_SET*  EventSet;
02279     const KSEVENT_ITEM* EventItem;
02280     PFILE_OBJECT        FileObject;
02281     ULONG               SemaphoreAdjustment;
02282     ULONG               Reserved;
02283     ULONG               Flags;
02284 };
02285 
02286 #endif
02287 /* ===============================================================
02288     Pins
02289 */
02290 
02291 #if defined(_NTDDK_)
02292 
02293 typedef struct _KSPIN  KSPIN, *PKSPIN;
02294 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
02295 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
02296 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
02297 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
02298 
02299 #define IOCTL_KS_HANDSHAKE             CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
02300 
02301 typedef struct {
02302     GUID ProtocolId;
02303     PVOID Argument1;
02304     PVOID Argument2;
02305 } KSHANDSHAKE, *PKSHANDSHAKE;
02306 
02307 typedef
02308 NTSTATUS
02309 (NTAPI *PFNKSPINHANDSHAKE)(
02310     IN PKSPIN Pin,
02311     IN PKSHANDSHAKE In,
02312     IN PKSHANDSHAKE Out
02313     );
02314 
02315 typedef
02316 void
02317 (NTAPI *PFNKSPINPOWER)(
02318     IN PKSPIN Pin,
02319     IN DEVICE_POWER_STATE State
02320     );
02321 
02322 typedef
02323 void
02324 (NTAPI *PFNKSPINFRAMERETURN)(
02325     IN PKSPIN Pin,
02326     IN PVOID Data OPTIONAL,
02327     IN ULONG Size OPTIONAL,
02328     IN PMDL Mdl OPTIONAL,
02329     IN PVOID Context OPTIONAL,
02330     IN NTSTATUS Status
02331     );
02332 
02333 typedef
02334 void
02335 (NTAPI *PFNKSPINIRPCOMPLETION)(
02336     IN PKSPIN Pin,
02337     IN PIRP Irp
02338     );
02339 
02340 typedef
02341 NTSTATUS
02342 (NTAPI *PFNKSPINIRP)(
02343     IN PKSPIN Pin,
02344     IN PIRP Irp
02345     );
02346 
02347 typedef
02348 NTSTATUS
02349 (NTAPI *PFNKSPIN)(
02350     IN PKSPIN Pin
02351     );
02352 
02353 typedef
02354 void
02355 (NTAPI *PFNKSPINVOID)(
02356     IN PKSPIN Pin
02357     );
02358 
02359 typedef
02360 void
02361 (NTAPI *PFNKSSTREAMPOINTER)(
02362     IN PKSSTREAM_POINTER StreamPointer
02363     );
02364 
02365 typedef struct {
02366     ULONG Count;
02367     PKSATTRIBUTE* Attributes;
02368 } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
02369 
02370 typedef
02371 NTSTATUS
02372 (NTAPI *PFNKSPINSETDATAFORMAT)(
02373     IN PKSPIN Pin,
02374     IN PKSDATAFORMAT OldFormat OPTIONAL,
02375     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
02376     IN const KSDATARANGE* DataRange,
02377     IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
02378     );
02379 
02380 typedef
02381 NTSTATUS
02382 (NTAPI *PFNKSPINSETDEVICESTATE)(
02383     IN PKSPIN Pin,
02384     IN KSSTATE ToState,
02385     IN KSSTATE FromState
02386     );
02387 
02388 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
02389 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
02390 
02391 typedef struct
02392 {
02393     PFNKSPINIRP Create;
02394     PFNKSPINIRP Close;
02395     PFNKSPIN Process;
02396     PFNKSPINVOID Reset;
02397     PFNKSPINSETDATAFORMAT SetDataFormat;
02398     PFNKSPINSETDEVICESTATE SetDeviceState;
02399     PFNKSPIN Connect;
02400     PFNKSPINVOID Disconnect;
02401     const KSCLOCK_DISPATCH* Clock;
02402     const KSALLOCATOR_DISPATCH* Allocator;
02403 } KSPIN_DISPATCH, *PKSPIN_DISPATCH;
02404 
02405 typedef
02406 BOOLEAN
02407 (NTAPI *PFNKSPINSETTIMER)(
02408     IN PKSPIN Pin,
02409     IN PKTIMER Timer,
02410     IN LARGE_INTEGER DueTime,
02411     IN PKDPC Dpc
02412     );
02413 
02414 typedef
02415 BOOLEAN
02416 (NTAPI *PFNKSPINCANCELTIMER)(
02417     IN PKSPIN Pin,
02418     IN PKTIMER Timer
02419     );
02420 
02421 typedef
02422 LONGLONG
02423 (FASTCALL *PFNKSPINCORRELATEDTIME)(
02424     IN PKSPIN Pin,
02425     OUT PLONGLONG SystemTime
02426     );
02427 
02428 typedef
02429 void
02430 (NTAPI *PFNKSPINRESOLUTION)(
02431     IN PKSPIN Pin,
02432     OUT PKSRESOLUTION Resolution
02433     );
02434 
02435 struct _KSCLOCK_DISPATCH {
02436     PFNKSPINSETTIMER SetTimer;
02437     PFNKSPINCANCELTIMER CancelTimer;
02438     PFNKSPINCORRELATEDTIME CorrelatedTime;
02439     PFNKSPINRESOLUTION Resolution;
02440 };
02441 
02442 typedef
02443 NTSTATUS
02444 (NTAPI *PFNKSPININITIALIZEALLOCATOR)(
02445     IN PKSPIN Pin,
02446     IN PKSALLOCATOR_FRAMING AllocatorFraming,
02447     OUT PVOID* Context
02448     );
02449 
02450 typedef PVOID (NTAPI *PFNKSDELETEALLOCATOR)(
02451     IN  PVOID Context);
02452 
02453 typedef PVOID (NTAPI *PFNKSDEFAULTALLOCATE)(
02454     IN  PVOID Context);
02455 
02456 typedef PVOID (NTAPI *PFNKSDEFAULTFREE)(
02457     IN  PVOID Context,
02458     IN  PVOID Buffer);
02459 
02460 struct _KSALLOCATOR_DISPATCH {
02461     PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
02462     PFNKSDELETEALLOCATOR DeleteAllocator;
02463     PFNKSDEFAULTALLOCATE Allocate;
02464     PFNKSDEFAULTFREE Free;
02465 };
02466 
02467 typedef struct
02468 {
02469     ULONG PropertySetsCount;
02470     ULONG PropertyItemSize;
02471     const KSPROPERTY_SET* PropertySets;
02472     ULONG MethodSetsCount;
02473     ULONG MethodItemSize;
02474     const KSMETHOD_SET* MethodSets;
02475     ULONG EventSetsCount;
02476     ULONG EventItemSize;
02477     const KSEVENT_SET* EventSets;
02478 #if !defined(_WIN64)
02479     PVOID Alignment;
02480 #endif
02481 } KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
02482 
02483 
02484 
02485 typedef struct
02486 {
02487     ULONG                   InterfacesCount;
02488     const KSPIN_INTERFACE*  Interfaces;
02489     ULONG                   MediumsCount;
02490     const KSPIN_MEDIUM*     Mediums;
02491     ULONG                   DataRangesCount;
02492     const PKSDATARANGE*     DataRanges;
02493     KSPIN_DATAFLOW          DataFlow;
02494     KSPIN_COMMUNICATION     Communication;
02495     const GUID*             Category;
02496     const GUID*             Name;
02497     union {
02498         LONGLONG            Reserved;
02499         struct {
02500             ULONG           ConstrainedDataRangesCount;
02501             PKSDATARANGE*   ConstrainedDataRanges;
02502         };
02503     };
02504 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
02505 
02506 typedef
02507 NTSTATUS
02508 (NTAPI *PFNKSINTERSECTHANDLER)(
02509     IN PIRP Irp,
02510     IN PKSP_PIN Pin,
02511     IN PKSDATARANGE DataRange,
02512     OUT PVOID Data OPTIONAL
02513     );
02514 
02515 typedef
02516 NTSTATUS
02517 (NTAPI *PFNKSINTERSECTHANDLEREX)(
02518     IN PVOID Context,
02519     IN PIRP Irp,
02520     IN PKSP_PIN Pin,
02521     IN PKSDATARANGE DataRange,
02522     IN PKSDATARANGE MatchingDataRange,
02523     IN ULONG DataBufferSize,
02524     OUT PVOID Data OPTIONAL,
02525     OUT PULONG DataSize
02526     );
02527 
02528 typedef struct
02529 {
02530     const KSPIN_DISPATCH* Dispatch;
02531     const KSAUTOMATION_TABLE* AutomationTable;
02532     KSPIN_DESCRIPTOR PinDescriptor;
02533     ULONG Flags;
02534     ULONG InstancesPossible;
02535     ULONG InstancesNecessary;
02536     const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
02537     PFNKSINTERSECTHANDLEREX IntersectHandler;
02538 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
02539 
02540 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
02541 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
02542 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
02543 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008
02544 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
02545 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000
02546 #endif
02547 
02548 
02549 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
02550 #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
02551 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
02552 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
02553 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
02554 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
02555 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
02556 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
02557 
02558 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
02559 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
02560 
02561 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
02562 #define KSPIN_FLAG_SPLITTER 0x00020000
02563 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
02564 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
02565 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
02566 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
02567 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
02568 #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
02569 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000
02570 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000
02571 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
02572 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000
02573 #endif
02574 
02575 struct _KSPIN
02576 {
02577     const KSPIN_DESCRIPTOR_EX* Descriptor;
02578     KSOBJECT_BAG Bag;
02579     PVOID Context;
02580     ULONG Id;
02581     KSPIN_COMMUNICATION Communication;
02582     BOOLEAN ConnectionIsExternal;
02583     KSPIN_INTERFACE ConnectionInterface;
02584     KSPIN_MEDIUM ConnectionMedium;
02585     KSPRIORITY ConnectionPriority;
02586     PKSDATAFORMAT ConnectionFormat;
02587     PKSMULTIPLE_ITEM AttributeList;
02588     ULONG StreamHeaderSize;
02589     KSPIN_DATAFLOW DataFlow;
02590     KSSTATE DeviceState;
02591     KSRESET ResetState;
02592     KSSTATE ClientState;
02593 };
02594 
02595 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
02596     DEFINE_KSPROPERTY_ITEM(\
02597         KSPROPERTY_PIN_CINSTANCES,\
02598         (Handler),\
02599         sizeof(KSP_PIN),\
02600         sizeof(KSPIN_CINSTANCES),\
02601         NULL, NULL, 0, NULL, NULL, 0)
02602 
02603 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
02604     DEFINE_KSPROPERTY_ITEM(\
02605         KSPROPERTY_PIN_CTYPES,\
02606         (Handler),\
02607         sizeof(KSPROPERTY),\
02608         sizeof(ULONG),\
02609         NULL, NULL, 0, NULL, NULL, 0)
02610 
02611 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
02612     DEFINE_KSPROPERTY_ITEM(\
02613         KSPROPERTY_PIN_DATAFLOW,\
02614         (Handler),\
02615         sizeof(KSP_PIN),\
02616         sizeof(KSPIN_DATAFLOW),\
02617         NULL, NULL, 0, NULL, NULL, 0)
02618 
02619 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
02620     DEFINE_KSPROPERTY_ITEM(\
02621         KSPROPERTY_PIN_DATARANGES,\
02622         (Handler),\
02623         sizeof(KSP_PIN),\
02624         0,\
02625         NULL, NULL, 0, NULL, NULL, 0)
02626 
02627 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
02628     DEFINE_KSPROPERTY_ITEM(\
02629         KSPROPERTY_PIN_DATAINTERSECTION,\
02630         (Handler),\
02631         sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
02632         0,\
02633         NULL, NULL, 0, NULL, NULL, 0)
02634 
02635 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
02636     DEFINE_KSPROPERTY_ITEM(\
02637         KSPROPERTY_PIN_INTERFACES,\
02638         (Handler),\
02639         sizeof(KSP_PIN),\
02640         0,\
02641         NULL, NULL, 0, NULL, NULL, 0)
02642 
02643 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
02644     DEFINE_KSPROPERTY_ITEM(\
02645         KSPROPERTY_PIN_MEDIUMS,\
02646         (Handler),\
02647         sizeof(KSP_PIN),\
02648         0,\
02649         NULL, NULL, 0, NULL, NULL, 0)
02650 
02651 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
02652     DEFINE_KSPROPERTY_ITEM(\
02653         KSPROPERTY_PIN_COMMUNICATION,\
02654         (Handler),\
02655         sizeof(KSP_PIN),\
02656         sizeof(KSPIN_COMMUNICATION),\
02657         NULL, NULL, 0, NULL, NULL, 0)
02658 
02659 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
02660     DEFINE_KSPROPERTY_ITEM(\
02661         KSPROPERTY_PIN_GLOBALCINSTANCES,\
02662         (Handler),\
02663         sizeof(KSP_PIN),\
02664         sizeof(KSPIN_CINSTANCES),\
02665         NULL, NULL, 0, NULL, NULL, 0)
02666 
02667 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
02668     DEFINE_KSPROPERTY_ITEM(\
02669         KSPROPERTY_PIN_NECESSARYINSTANCES,\
02670         (Handler),\
02671         sizeof(KSP_PIN),\
02672         sizeof(ULONG),\
02673         NULL, NULL, 0, NULL, NULL, 0)
02674 
02675 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
02676     DEFINE_KSPROPERTY_ITEM(\
02677         KSPROPERTY_PIN_PHYSICALCONNECTION,\
02678         (Handler),\
02679         sizeof(KSP_PIN),\
02680         0,\
02681         NULL, NULL, 0, NULL, NULL, 0)
02682 
02683 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
02684     DEFINE_KSPROPERTY_ITEM(\
02685         KSPROPERTY_PIN_CATEGORY,\
02686         (Handler),\
02687         sizeof(KSP_PIN),\
02688         sizeof(GUID),\
02689         NULL, NULL, 0, NULL, NULL, 0)
02690 
02691 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
02692     DEFINE_KSPROPERTY_ITEM(\
02693         KSPROPERTY_PIN_NAME,\
02694         (Handler),\
02695         sizeof(KSP_PIN),\
02696         0,\
02697         NULL, NULL, 0, NULL, NULL, 0)
02698 
02699 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
02700     DEFINE_KSPROPERTY_ITEM(\
02701         KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
02702         (Handler),\
02703         sizeof(KSP_PIN),\
02704         0,\
02705         NULL, NULL, 0, NULL, NULL, 0)
02706 
02707 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
02708     DEFINE_KSPROPERTY_ITEM(\
02709         KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
02710         NULL,\
02711         sizeof(KSP_PIN),\
02712         sizeof(KSDATAFORMAT),\
02713         (Handler), NULL, 0, NULL, NULL, 0)
02714 
02715 #define DEFINE_KSPROPERTY_PINSET(PinSet,\
02716     PropGeneral, PropInstances, PropIntersection)\
02717 DEFINE_KSPROPERTY_TABLE(PinSet) {\
02718     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
02719     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
02720     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
02721     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
02722     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
02723     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
02724     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
02725     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
02726     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
02727     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
02728 }
02729 
02730 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
02731     PropGeneral, PropInstances, PropIntersection)\
02732 DEFINE_KSPROPERTY_TABLE(PinSet) {\
02733     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
02734     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
02735     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
02736     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
02737     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
02738     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
02739     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
02740     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
02741     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
02742     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
02743     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
02744 }
02745 
02746 
02747 
02748 typedef
02749 void
02750 (NTAPI *PFNKSFREE)(
02751     IN PVOID Data
02752     );
02753 
02754 
02755 
02756 #define DEFINE_KSPROPERTY_TABLE(tablename)\
02757     const KSPROPERTY_ITEM tablename[] =
02758 
02759 #endif
02760 
02761 typedef struct
02762 {
02763     KSPIN_INTERFACE Interface;
02764     KSPIN_MEDIUM Medium;
02765     ULONG PinId;
02766     HANDLE PinToHandle;
02767     KSPRIORITY Priority;
02768 } KSPIN_CONNECT, *PKSPIN_CONNECT;
02769 
02770 /* ===============================================================
02771     Topology
02772 */
02773 
02774 typedef struct
02775 {
02776     ULONG FromNode;
02777     ULONG FromNodePin;
02778     ULONG ToNode;
02779     ULONG ToNodePin;
02780 } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
02781 
02782 typedef struct
02783 {
02784     ULONG CategoriesCount;
02785     const GUID* Categories;
02786     ULONG TopologyNodesCount;
02787     const GUID* TopologyNodes;
02788     ULONG TopologyConnectionsCount;
02789     const KSTOPOLOGY_CONNECTION* TopologyConnections;
02790     const GUID* TopologyNodesNames;
02791     ULONG Reserved;
02792 } KSTOPOLOGY, *PKSTOPOLOGY;
02793 
02794 
02795 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
02796     DEFINE_KSPROPERTY_ITEM(\
02797         KSPROPERTY_TOPOLOGY_CATEGORIES,\
02798         (Handler),\
02799         sizeof(KSPROPERTY),\
02800         0,\
02801         NULL, NULL, 0, NULL, NULL, 0)
02802 
02803 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
02804     DEFINE_KSPROPERTY_ITEM(\
02805         KSPROPERTY_TOPOLOGY_NODES,\
02806         (Handler),\
02807         sizeof(KSPROPERTY),\
02808         0,\
02809         NULL, NULL, 0, NULL, NULL, 0)
02810 
02811 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
02812     DEFINE_KSPROPERTY_ITEM(\
02813         KSPROPERTY_TOPOLOGY_CONNECTIONS,\
02814         (Handler),\
02815         sizeof(KSPROPERTY),\
02816         0,\
02817         NULL, NULL, 0, NULL, NULL, 0)
02818 
02819 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
02820     DEFINE_KSPROPERTY_ITEM(\
02821         KSPROPERTY_TOPOLOGY_NAME,\
02822         (Handler),\
02823         sizeof(KSP_NODE),\
02824         0,\
02825         NULL, NULL, 0, NULL, NULL, 0)
02826 
02827 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
02828 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
02829     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
02830     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
02831     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
02832     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
02833 }
02834 
02835 /* ===============================================================
02836     ??? SORT ME
02837 */
02838 
02839 /* TODO */
02840 typedef void* UNKNOWN;
02841 
02842 typedef PVOID (NTAPI *PFNKSINITIALIZEALLOCATOR)(
02843     IN  PVOID InitialContext,
02844     IN  PKSALLOCATOR_FRAMING AllocatorFraming,
02845     OUT PVOID* Context);
02846 
02847 #if defined(_NTDDK_)
02848 typedef NTSTATUS (NTAPI *PFNKSALLOCATOR)(
02849     IN  PIRP Irp,
02850     IN  ULONG BufferSize,
02851     IN  BOOLEAN InputOperation);
02852 
02853 typedef NTSTATUS (NTAPI *PFNKINTERSECTHANDLEREX)(
02854     IN  PVOID Context,
02855     IN  PIRP Irp,
02856     IN  PKSP_PIN Pin,
02857     IN  PKSDATARANGE DataRange,
02858     IN  PKSDATARANGE MatchingDataRange,
02859     IN  ULONG DataBufferSize,
02860     OUT PVOID Data OPTIONAL,
02861     OUT PULONG DataSize);
02862 
02863 
02864 typedef
02865 NTSTATUS
02866 (NTAPI *PFNALLOCATOR_ALLOCATEFRAME)(
02867     IN PFILE_OBJECT FileObject,
02868     PVOID *Frame
02869     );
02870 
02871 typedef
02872 VOID
02873 (NTAPI *PFNALLOCATOR_FREEFRAME)(
02874     IN PFILE_OBJECT FileObject,
02875     IN PVOID Frame
02876     );
02877 
02878 typedef struct {
02879     PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
02880     PFNALLOCATOR_FREEFRAME      FreeFrame;
02881 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
02882 
02883 #endif
02884 
02885 typedef struct
02886 {
02887     KSALLOCATOR_FRAMING Framing;
02888     ULONG AllocatedFrames;
02889     ULONG Reserved;
02890 } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
02891 
02892 typedef struct
02893 {
02894     KSALLOCATOR_FRAMING_EX Framing;
02895     ULONG AllocatedFrames;
02896     ULONG Reserved;
02897 } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
02898 
02899 typedef struct
02900 {
02901     ULONG Size;
02902     ULONG TypeSpecificFlags;
02903     KSTIME PresentationTime;
02904     LONGLONG Duration;
02905     ULONG FrameExtent;
02906     ULONG DataUsed;
02907     PVOID Data;
02908     ULONG OptionsFlags;
02909 #ifdef _WIN64
02910   ULONG  Reserved;
02911 #endif
02912 } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
02913 
02914 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT        0x00000001
02915 #define KSSTREAM_HEADER_OPTIONSF_PREROLL            0x00000002
02916 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY  0x00000004
02917 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED        0x00000008
02918 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID          0x00000010
02919 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY  0x00000040
02920 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE       0x00000080
02921 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID      0x00000100
02922 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM        0x00000200
02923 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER   0x00000400
02924 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800
02925 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA         0x80000000
02926 
02927 /* ===============================================================
02928     XP / DX8
02929 */
02930 #if defined(_NTDDK_)
02931 
02932 typedef struct _KSGATE KSGATE, *PKSGATE;
02933 
02934 struct _KSGATE {
02935     LONG Count;
02936     PKSGATE NextGate;
02937 };
02938 
02939 #ifndef _NTOS_
02940 
02941 static
02942 void
02943 __inline
02944 KsGateTurnInputOn(
02945     IN PKSGATE Gate OPTIONAL)
02946 {
02947     while (Gate && (InterlockedIncrement(&Gate->Count) == 1))
02948     {
02949         Gate = Gate->NextGate;
02950     }
02951 }
02952 
02953 static
02954 void
02955 __inline
02956 KsGateTurnInputOff(
02957     IN PKSGATE Gate OPTIONAL)
02958 {
02959     while (Gate && (InterlockedDecrement(&Gate->Count) == 0))
02960     {
02961         Gate = Gate->NextGate;
02962     }
02963 }
02964 
02965 static
02966 BOOLEAN
02967 __inline
02968 KsGateGetStateUnsafe(
02969     IN PKSGATE Gate)
02970 {
02971     ASSERT(Gate);
02972     return((BOOLEAN)(Gate->Count > 0));
02973 }
02974 
02975 static
02976 BOOLEAN
02977 __inline
02978 KsGateCaptureThreshold(
02979     IN PKSGATE Gate)
02980 {
02981     BOOLEAN captured;
02982 
02983     ASSERT(Gate);
02984 
02985     captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1);
02986 
02987     if (captured)
02988     {
02989         KsGateTurnInputOff(Gate->NextGate);
02990     }
02991 
02992     return captured;
02993 }
02994 
02995 static
02996 void
02997 __inline
02998 KsGateInitialize(
02999     IN PKSGATE Gate,
03000     IN LONG InitialCount,
03001     IN PKSGATE NextGate OPTIONAL,
03002     IN BOOLEAN StateToPropagate
03003     )
03004 {
03005     ASSERT(Gate);
03006     Gate->Count = InitialCount;
03007     Gate->NextGate = NextGate;
03008 
03009     if (NextGate)
03010     {
03011         if (InitialCount > 0)
03012         {
03013             if (StateToPropagate)
03014             {
03015                 KsGateTurnInputOn(NextGate);
03016             }
03017         }
03018         else
03019         {
03020             if (!StateToPropagate)
03021             {
03022                 KsGateTurnInputOff(NextGate);
03023             }
03024         }
03025     }
03026 }
03027 
03028 static
03029 void
03030 __inline
03031 KsGateInitializeAnd(
03032     IN PKSGATE AndGate,
03033     IN PKSGATE NextOrGate OPTIONAL)
03034 {
03035     KsGateInitialize(AndGate,1,NextOrGate,TRUE);
03036 }
03037 
03038 static
03039 void
03040 __inline
03041 KsGateInitializeOr(
03042     IN PKSGATE OrGate,
03043     IN PKSGATE NextAndGate OPTIONAL)
03044 {
03045     KsGateInitialize(OrGate,0,NextAndGate,FALSE);
03046 }
03047 
03048 static
03049 void
03050 __inline
03051 KsGateAddOnInputToAnd(
03052     IN PKSGATE AndGate)
03053 {
03054     UNREFERENCED_PARAMETER (AndGate);
03055 }
03056 
03057 static
03058 void
03059 __inline
03060 KsGateAddOffInputToAnd(
03061     IN PKSGATE AndGate)
03062 {
03063     KsGateTurnInputOff(AndGate);
03064 }
03065 
03066 static
03067 void
03068 __inline
03069 KsGateRemoveOnInputFromAnd(
03070     IN PKSGATE AndGate)
03071 {
03072     UNREFERENCED_PARAMETER (AndGate);
03073 }
03074 
03075 static
03076 void
03077 __inline
03078 KsGateRemoveOffInputFromAnd(
03079     IN PKSGATE AndGate)
03080 {
03081     KsGateTurnInputOn(AndGate);
03082 }
03083 
03084 static
03085 void
03086 __inline
03087 KsGateAddOnInputToOr(
03088     IN PKSGATE OrGate)
03089 {
03090     KsGateTurnInputOn(OrGate);
03091 }
03092 
03093 static
03094 void
03095 __inline
03096 KsGateAddOffInputToOr(
03097     IN PKSGATE OrGate)
03098 {
03099     UNREFERENCED_PARAMETER (OrGate);
03100 }
03101 
03102 static
03103 void
03104 __inline
03105 KsGateRemoveOnInputFromOr(
03106     IN PKSGATE OrGate) 
03107 {
03108     KsGateTurnInputOff(OrGate);
03109 }
03110 
03111 static
03112 void
03113 __inline
03114 KsGateRemoveOffInputFromOr(
03115     IN PKSGATE OrGate)
03116 {
03117     UNREFERENCED_PARAMETER (OrGate);
03118 }
03119 
03120 static
03121 void
03122 __inline
03123 KsGateTerminateAnd(
03124     IN PKSGATE AndGate)
03125 {
03126     ASSERT(AndGate);
03127     if (KsGateGetStateUnsafe(AndGate))
03128     {
03129         KsGateRemoveOnInputFromOr(AndGate->NextGate);
03130     }
03131     else
03132     {
03133         KsGateRemoveOffInputFromOr(AndGate->NextGate);
03134     }
03135 }
03136 
03137 static
03138 void
03139 __inline
03140 KsGateTerminateOr(
03141     IN PKSGATE OrGate)
03142 {
03143     ASSERT(OrGate);
03144     if (KsGateGetStateUnsafe(OrGate))
03145     {
03146         KsGateRemoveOnInputFromAnd(OrGate->NextGate);
03147     }
03148     else
03149     {
03150         KsGateRemoveOffInputFromAnd(OrGate->NextGate);
03151     }
03152 }
03153 
03154 #endif
03155 
03156 
03157 struct _KSMAPPING {
03158     PHYSICAL_ADDRESS PhysicalAddress;
03159     ULONG ByteCount;
03160     ULONG Alignment;
03161 };
03162 #endif
03163 
03164 typedef enum {
03165     KSSTREAM_POINTER_STATE_UNLOCKED = 0,
03166     KSSTREAM_POINTER_STATE_LOCKED
03167 } KSSTREAM_POINTER_STATE;
03168 
03169 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
03170 
03171 struct _KSSTREAM_POINTER_OFFSET
03172 {
03173 #if defined(_NTDDK_)
03174     union {
03175         PUCHAR Data;
03176         PKSMAPPING Mappings;
03177     };
03178 #else
03179     PUCHAR Data;
03180 #endif
03181 #if !defined(_WIN64)
03182     PVOID Alignment;
03183 #endif
03184     ULONG Count;
03185     ULONG Remaining;
03186 };
03187 #if defined(_NTDDK_)
03188 struct _KSSTREAM_POINTER
03189 {
03190     PVOID Context;
03191     PKSPIN Pin;
03192     PKSSTREAM_HEADER StreamHeader;
03193     PKSSTREAM_POINTER_OFFSET Offset;
03194     KSSTREAM_POINTER_OFFSET OffsetIn;
03195     KSSTREAM_POINTER_OFFSET OffsetOut;
03196 };
03197 
03198 struct _KSPROCESSPIN
03199 {
03200     PKSPIN Pin;
03201     PKSSTREAM_POINTER StreamPointer;
03202     PKSPROCESSPIN InPlaceCounterpart;
03203     PKSPROCESSPIN DelegateBranch;
03204     PKSPROCESSPIN CopySource;
03205     PVOID Data;
03206     ULONG BytesAvailable;
03207     ULONG BytesUsed;
03208     ULONG Flags;
03209     BOOLEAN Terminate;
03210 };
03211 
03212 struct _KSPROCESSPIN_INDEXENTRY
03213 {
03214     PKSPROCESSPIN* Pins;
03215     ULONG Count;
03216 };
03217 #endif
03218 
03219 /* ===============================================================
03220     Device Dispatch
03221 */
03222 
03223 
03224 
03225 #if defined(_NTDDK_)
03226 
03227 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
03228 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
03229 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
03230 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
03231 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
03232 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
03233 
03234 typedef NTSTATUS (NTAPI *PFNKSDEVICECREATE)(
03235     IN PKSDEVICE Device);
03236 
03237 typedef NTSTATUS (NTAPI *PFNKSDEVICEPNPSTART)(
03238     IN PKSDEVICE Device,
03239     IN PIRP Irp,
03240     IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
03241     IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL);
03242 
03243 typedef NTSTATUS (NTAPI *PFNKSDEVICE)(
03244     IN PKSDEVICE Device);
03245 
03246 typedef NTSTATUS (NTAPI *PFNKSDEVICEIRP)(
03247     IN PKSDEVICE Device,
03248     IN PIRP Irp);
03249 
03250 typedef VOID (NTAPI *PFNKSDEVICEIRPVOID)(
03251     IN PKSDEVICE Device,
03252     IN PIRP Irp);
03253 
03254 typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)(
03255     IN PKSDEVICE Device,
03256     IN PIRP Irp,
03257     IN OUT PDEVICE_CAPABILITIES Capabilities);
03258 
03259 typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYPOWER)(
03260     IN PKSDEVICE Device,
03261     IN PIRP Irp,
03262     IN DEVICE_POWER_STATE DeviceTo,
03263     IN DEVICE_POWER_STATE DeviceFrom,
03264     IN SYSTEM_POWER_STATE SystemTo,
03265     IN SYSTEM_POWER_STATE SystemFrom,
03266     IN POWER_ACTION Action);
03267 
03268 typedef VOID (NTAPI *PFNKSDEVICESETPOWER)(
03269     IN PKSDEVICE Device,
03270     IN PIRP Irp,
03271     IN DEVICE_POWER_STATE To,
03272     IN DEVICE_POWER_STATE From);
03273 
03274 typedef struct _KSDEVICE_DISPATCH {
03275     PFNKSDEVICECREATE Add;
03276     PFNKSDEVICEPNPSTART Start;
03277     PFNKSDEVICE PostStart;
03278     PFNKSDEVICEIRP QueryStop;
03279     PFNKSDEVICEIRPVOID CancelStop;
03280     PFNKSDEVICEIRPVOID Stop;
03281     PFNKSDEVICEIRP QueryRemove;
03282     PFNKSDEVICEIRPVOID CancelRemove;
03283     PFNKSDEVICEIRPVOID Remove;
03284     PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
03285     PFNKSDEVICEIRPVOID SurpriseRemoval;
03286     PFNKSDEVICEQUERYPOWER QueryPower;
03287     PFNKSDEVICESETPOWER SetPower;
03288     PFNKSDEVICEIRP QueryInterface;
03289 }KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
03290 
03291 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
03292 #define KSDEVICE_DESCRIPTOR_VERSION_2 (0x110)
03293 #define MIN_DEV_VER_FOR_FLAGS (0x110)
03294 #endif
03295 
03296 struct _KSDEVICE
03297 {
03298     const KSDEVICE_DESCRIPTOR* Descriptor;
03299     KSOBJECT_BAG Bag;
03300     PVOID Context;
03301     PDEVICE_OBJECT FunctionalDeviceObject;
03302     PDEVICE_OBJECT PhysicalDeviceObject;
03303     PDEVICE_OBJECT NextDeviceObject;
03304     BOOLEAN Started;
03305     SYSTEM_POWER_STATE SystemPowerState;
03306     DEVICE_POWER_STATE DevicePowerState;
03307 };
03308 #endif
03309 
03310 /* ===============================================================
03311     Filter Dispatch
03312 */
03313 #if defined(_NTDDK_)
03314 struct _KSFILTER
03315 {
03316     const KSFILTER_DESCRIPTOR* Descriptor;
03317     KSOBJECT_BAG Bag;
03318     PVOID Context;
03319 };
03320 
03321 typedef
03322 void
03323 (NTAPI *PFNKSFILTERPOWER)(
03324     IN PKSFILTER Filter,
03325     IN DEVICE_POWER_STATE State
03326     );
03327 
03328 typedef NTSTATUS (NTAPI *PFNKSFILTERIRP)(
03329     IN PKSFILTER Filter,
03330     IN PIRP Irp);
03331 
03332 typedef NTSTATUS (NTAPI *PFNKSFILTERPROCESS)(
03333     IN PKSFILTER Filter,
03334     IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
03335 
03336 typedef NTSTATUS (NTAPI *PFNKSFILTERVOID)(
03337     IN PKSFILTER Filter);
03338 
03339 struct _KSFILTER_DISPATCH
03340 {
03341     PFNKSFILTERIRP Create;
03342     PFNKSFILTERIRP Close;
03343     PFNKSFILTERPROCESS Process;
03344     PFNKSFILTERVOID Reset;
03345 };
03346 
03347 struct _KSNODE_DESCRIPTOR
03348 {
03349   const KSAUTOMATION_TABLE*  AutomationTable;
03350   const GUID*  Type;
03351   const GUID*  Name;
03352 #if !defined(_WIN64)
03353     PVOID Alignment;
03354 #endif
03355 };
03356 
03357 struct _KSFILTER_DESCRIPTOR
03358 {
03359   const KSFILTER_DISPATCH*  Dispatch;
03360   const KSAUTOMATION_TABLE*  AutomationTable;
03361   ULONG  Version;
03362   ULONG  Flags;
03363   const GUID*  ReferenceGuid;
03364   ULONG  PinDescriptorsCount;
03365   ULONG  PinDescriptorSize;
03366   const KSPIN_DESCRIPTOR_EX*  PinDescriptors;
03367   ULONG  CategoriesCount;
03368   const GUID*  Categories;
03369   ULONG  NodeDescriptorsCount;
03370   ULONG  NodeDescriptorSize;
03371   const KSNODE_DESCRIPTOR*  NodeDescriptors;
03372   ULONG  ConnectionsCount;
03373   const KSTOPOLOGY_CONNECTION*  Connections;
03374   const KSCOMPONENTID*  ComponentId;
03375 };
03376 
03377 #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
03378 
03379 struct _KSDEVICE_DESCRIPTOR
03380 {
03381     const KSDEVICE_DISPATCH*  Dispatch;
03382     ULONG  FilterDescriptorsCount;
03383     const  KSFILTER_DESCRIPTOR*const* FilterDescriptors;
03384     ULONG  Version;
03385     ULONG  Flags;
03386 };
03387 
03388 struct _KSFILTERFACTORY {
03389     const KSFILTER_DESCRIPTOR* FilterDescriptor;
03390     KSOBJECT_BAG Bag;
03391     PVOID Context;
03392 };
03393 
03394 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
03395     const KSFILTER_DESCRIPTOR descriptor =
03396 
03397 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
03398     SIZEOF_ARRAY(table),\
03399     sizeof(table[0]),\
03400     table
03401 
03402 #define DEFINE_KSFILTER_CATEGORIES(table)\
03403     SIZEOF_ARRAY(table),\
03404     table
03405 
03406 #define DEFINE_KSFILTER_CATEGORY(category)\
03407     1,\
03408     &(category)
03409 
03410 #define DEFINE_KSFILTER_CATEGORIES_NULL\
03411     0,\
03412     NULL
03413 
03414 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
03415     SIZEOF_ARRAY(table),\
03416     sizeof(table[0]),\
03417     table
03418 
03419 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
03420     0,\
03421     sizeof(KSNODE_DESCRIPTOR),\
03422     NULL
03423 
03424 #define DEFINE_KSFILTER_CONNECTIONS(table)\
03425     SIZEOF_ARRAY(table),\
03426     table
03427 
03428 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
03429     0,\
03430     NULL
03431 
03432 #endif
03433 /* ===============================================================
03434     Minidriver Callbacks
03435 */
03436 #if defined(_NTDDK_)
03437 typedef NTSTATUS (NTAPI *KStrMethodHandler)(
03438     IN  PIRP Irp,
03439     IN  PKSIDENTIFIER Request,
03440     IN  OUT PVOID Data);
03441 
03442 typedef NTSTATUS (NTAPI *KStrSupportHandler)(
03443     IN  PIRP Irp,
03444     IN  PKSIDENTIFIER Request,
03445     IN  OUT PVOID Data);
03446 #endif
03447 
03448 /* ===============================================================
03449     Allocator Functions
03450 */
03451 #if defined(_NTDDK_)
03452 KSDDKAPI NTSTATUS NTAPI
03453 KsCreateAllocator(
03454     IN  HANDLE ConnectionHandle,
03455     IN  PKSALLOCATOR_FRAMING AllocatorFraming,
03456     OUT PHANDLE AllocatorHandle);
03457 
03458 KSDDKAPI NTSTATUS NTAPI
03459 KsCreateDefaultAllocator(
03460     IN  PIRP Irp);
03461 
03462 KSDDKAPI NTSTATUS NTAPI
03463 KsValidateAllocatorCreateRequest(
03464     IN  PIRP Irp,
03465     OUT PKSALLOCATOR_FRAMING* AllocatorFraming);
03466 
03467 KSDDKAPI NTSTATUS NTAPI
03468 KsCreateDefaultAllocatorEx(
03469     IN  PIRP Irp,
03470     IN  PVOID InitializeContext OPTIONAL,
03471     IN  PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
03472     IN  PFNKSDEFAULTFREE DefaultFree OPTIONAL,
03473     IN  PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
03474     IN  PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL);
03475 
03476 KSDDKAPI NTSTATUS NTAPI
03477 KsValidateAllocatorFramingEx(
03478     IN  PKSALLOCATOR_FRAMING_EX Framing,
03479     IN  ULONG BufferSize,
03480     IN  const KSALLOCATOR_FRAMING_EX* PinFraming);
03481 #endif
03482 
03483 /* ===============================================================
03484     Clock Functions
03485 */
03486 #if defined(_NTDDK_)
03487 typedef BOOLEAN (NTAPI *PFNKSSETTIMER)(
03488     IN  PVOID Context,
03489     IN  PKTIMER Timer,
03490     IN  LARGE_INTEGER DueTime,
03491     IN  PKDPC Dpc);
03492 
03493 typedef BOOLEAN (NTAPI *PFNKSCANCELTIMER)(
03494     IN  PVOID Context,
03495     IN  PKTIMER Timer);
03496 
03497 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(
03498     IN  PVOID Context,
03499     OUT PLONGLONG SystemTime);
03500 
03501 KSDDKAPI NTSTATUS NTAPI
03502 KsCreateClock(
03503     IN  HANDLE ConnectionHandle,
03504     IN  PKSCLOCK_CREATE ClockCreate,
03505     OUT PHANDLE ClockHandle);
03506 
03507 KSDDKAPI NTSTATUS NTAPI
03508 KsCreateDefaultClock(
03509     IN  PIRP Irp,
03510     IN  PKSDEFAULTCLOCK DefaultClock);
03511 
03512 KSDDKAPI NTSTATUS NTAPI
03513 KsAllocateDefaultClock(
03514     OUT PKSDEFAULTCLOCK* DefaultClock);
03515 
03516 KSDDKAPI NTSTATUS NTAPI
03517 KsAllocateDefaultClockEx(
03518     OUT PKSDEFAULTCLOCK* DefaultClock,
03519     IN  PVOID Context OPTIONAL,
03520     IN  PFNKSSETTIMER SetTimer OPTIONAL,
03521     IN  PFNKSCANCELTIMER CancelTimer OPTIONAL,
03522     IN  PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
03523     IN  const KSRESOLUTION* Resolution OPTIONAL,
03524     IN  ULONG Flags);
03525 
03526 KSDDKAPI VOID NTAPI
03527 KsFreeDefaultClock(
03528     IN  PKSDEFAULTCLOCK DefaultClock);
03529 
03530 KSDDKAPI NTSTATUS NTAPI
03531 KsValidateClockCreateRequest(
03532     IN  PIRP Irp,
03533     OUT PKSCLOCK_CREATE* ClockCreate);
03534 
03535 KSDDKAPI KSSTATE NTAPI
03536 KsGetDefaultClockState(
03537     IN  PKSDEFAULTCLOCK DefaultClock);
03538 
03539 KSDDKAPI VOID NTAPI
03540 KsSetDefaultClockState(
03541     IN  PKSDEFAULTCLOCK DefaultClock,
03542     IN  KSSTATE State);
03543 
03544 KSDDKAPI LONGLONG NTAPI
03545 KsGetDefaultClockTime(
03546     IN  PKSDEFAULTCLOCK DefaultClock);
03547 
03548 KSDDKAPI VOID NTAPI
03549 KsSetDefaultClockTime(
03550     IN  PKSDEFAULTCLOCK DefaultClock,
03551     IN  LONGLONG Time);
03552 #endif
03553 
03554 /* ===============================================================
03555     Method Functions
03556 */
03557 
03558 /* Method sets - TODO: Make into macros! */
03559 #if defined(_NTDDK_)
03560 #if 0
03561 VOID
03562 KSMETHOD_SET_IRP_STORAGE(
03563     IN  IRP Irp);
03564 
03565 VOID
03566 KSMETHOD_ITEM_IRP_STORAGE(
03567     IN  IRP Irp);
03568 
03569 VOID
03570 KSMETHOD_TYPE_IRP_STORAGE(
03571     IN  IRP Irp);
03572 #endif
03573 
03574 KSDDKAPI NTSTATUS NTAPI
03575 KsMethodHandler(
03576     IN  PIRP Irp,
03577     IN  ULONG MethodSetsCount,
03578     IN  PKSMETHOD_SET MethodSet);
03579 
03580 KSDDKAPI NTSTATUS NTAPI
03581 KsMethodHandlerWithAllocator(
03582     IN  PIRP Irp,
03583     IN  ULONG MethodSetsCount,
03584     IN  PKSMETHOD_SET MethodSet,
03585     IN  PFNKSALLOCATOR Allocator OPTIONAL,
03586     IN  ULONG MethodItemSize OPTIONAL);
03587 
03588 KSDDKAPI BOOLEAN NTAPI
03589 KsFastMethodHandler(
03590     IN  PFILE_OBJECT FileObject,
03591     IN  PKSMETHOD UNALIGNED Method,
03592     IN  ULONG MethodLength,
03593     IN  OUT PVOID UNALIGNED Data,
03594     IN  ULONG DataLength,
03595     OUT PIO_STATUS_BLOCK IoStatus,
03596     IN  ULONG MethodSetsCount,
03597     IN  const KSMETHOD_SET* MethodSet);
03598 #endif
03599 
03600 /* ===============================================================
03601     Property Functions
03602 */
03603 #if defined(_NTDDK_)
03604 KSDDKAPI NTSTATUS NTAPI
03605 KsPropertyHandler(
03606     IN  PIRP Irp,
03607     IN  ULONG PropertySetsCount,
03608     IN  const KSPROPERTY_SET* PropertySet);
03609 
03610 KSDDKAPI NTSTATUS NTAPI
03611 KsPropertyHandlerWithAllocator(
03612     IN  PIRP Irp,
03613     IN  ULONG PropertySetsCount,
03614     IN  PKSPROPERTY_SET PropertySet,
03615     IN  PFNKSALLOCATOR Allocator OPTIONAL,
03616     IN  ULONG PropertyItemSize OPTIONAL);
03617 
03618 KSDDKAPI NTSTATUS NTAPI
03619 KsUnserializeObjectPropertiesFromRegistry(
03620     IN  PFILE_OBJECT FileObject,
03621     IN  HANDLE ParentKey OPTIONAL,
03622     IN  PUNICODE_STRING RegistryPath OPTIONAL);
03623 
03624 KSDDKAPI BOOLEAN NTAPI
03625 KsFastPropertyHandler(
03626     IN  PFILE_OBJECT FileObject,
03627     IN  PKSPROPERTY UNALIGNED Property,
03628     IN  ULONG PropertyLength,
03629     IN  OUT PVOID UNALIGNED Data,
03630     IN  ULONG DataLength,
03631     OUT PIO_STATUS_BLOCK IoStatus,
03632     IN  ULONG PropertySetsCount,
03633     IN  const KSPROPERTY_SET* PropertySet);
03634 #endif
03635 
03636 /* ===============================================================
03637     Event Functions
03638 */
03639 
03640 #if defined(_NTDDK_)
03641 
03642 #define KSPROBE_STREAMREAD      0x00000000
03643 #define KSPROBE_STREAMWRITE     0x00000001
03644 #define KSPROBE_ALLOCATEMDL     0x00000010
03645 #define KSPROBE_PROBEANDLOCK    0x00000020
03646 #define KSPROBE_SYSTEMADDRESS   0x00000040
03647 #define KSPROBE_MODIFY          0x00000200
03648 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
03649 #define KSPROBE_ALLOWFORMATCHANGE   0x00000080
03650 
03651 #define KSSTREAM_READ           KSPROBE_STREAMREAD
03652 #define KSSTREAM_WRITE          KSPROBE_STREAMWRITE
03653 #define KSSTREAM_PAGED_DATA     0x00000000
03654 #define KSSTREAM_NONPAGED_DATA  0x00000100
03655 #define KSSTREAM_SYNCHRONOUS    0x00001000
03656 #define KSSTREAM_FAILUREEXCEPTION 0x00002000
03657 
03658 typedef
03659 BOOLEAN
03660 (NTAPI *PFNKSGENERATEEVENTCALLBACK)(
03661     IN PVOID Context,
03662     IN PKSEVENT_ENTRY EventEntry
03663     );
03664 
03665 KSDDKAPI NTSTATUS NTAPI
03666 KsGenerateEvent(
03667     IN  PKSEVENT_ENTRY EntryEvent);
03668 
03669 KSDDKAPI void NTAPI
03670 KsGenerateEvents(
03671     IN PVOID Object,
03672     IN const GUID* EventSet OPTIONAL,
03673     IN ULONG EventId,
03674     IN ULONG DataSize,
03675     IN PVOID Data OPTIONAL,
03676     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
03677     IN PVOID CallBackContext OPTIONAL
03678     );
03679 
03680 
03681 KSDDKAPI NTSTATUS NTAPI
03682 KsEnableEventWithAllocator(
03683     IN  PIRP Irp,
03684     IN  ULONG EventSetsCount,
03685     IN  PKSEVENT_SET EventSet,
03686     IN  OUT PLIST_ENTRY EventsList OPTIONAL,
03687     IN  KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
03688     IN  PVOID EventsLock OPTIONAL,
03689     IN  PFNKSALLOCATOR Allocator OPTIONAL,
03690     IN  ULONG EventItemSize OPTIONAL);
03691 
03692 KSDDKAPI NTSTATUS NTAPI
03693 KsGenerateDataEvent(
03694     IN  PKSEVENT_ENTRY EventEntry,
03695     IN  ULONG DataSize,
03696     IN  PVOID Data);
03697 
03698 KSDDKAPI NTSTATUS NTAPI
03699 KsEnableEvent(
03700     IN  PIRP Irp,
03701     IN  ULONG EventSetsCount,
03702     IN  KSEVENT_SET* EventSet,
03703     IN  OUT PLIST_ENTRY EventsList OPTIONAL,
03704     IN  KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
03705     IN  PVOID EventsLock OPTIONAL);
03706 
03707 KSDDKAPI VOID NTAPI
03708 KsDiscardEvent(
03709     IN  PKSEVENT_ENTRY EventEntry);
03710 
03711 KSDDKAPI NTSTATUS NTAPI
03712 KsDisableEvent(
03713     IN  PIRP Irp,
03714     IN  OUT PLIST_ENTRY EventsList,
03715     IN  KSEVENTS_LOCKTYPE EventsFlags,
03716     IN  PVOID EventsLock);
03717 
03718 KSDDKAPI VOID NTAPI
03719 KsFreeEventList(
03720     IN  PFILE_OBJECT FileObject,
03721     IN  OUT PLIST_ENTRY EventsList,
03722     IN  KSEVENTS_LOCKTYPE EVentsFlags,
03723     IN  PVOID EventsLock);
03724 
03725 /* ===============================================================
03726     Topology Functions
03727 */
03728 
03729 KSDDKAPI NTSTATUS NTAPI
03730 KsValidateTopologyNodeCreateRequest(
03731     IN  PIRP Irp,
03732     IN  PKSTOPOLOGY Topology,
03733     OUT PKSNODE_CREATE* NodeCreate);
03734 
03735 KSDDKAPI NTSTATUS NTAPI
03736 KsCreateTopologyNode(
03737     IN  HANDLE ParentHandle,
03738     IN  PKSNODE_CREATE NodeCreate,
03739     IN  ACCESS_MASK DesiredAccess,
03740     OUT PHANDLE NodeHandle);
03741 
03742 KSDDKAPI NTSTATUS NTAPI
03743 KsTopologyPropertyHandler(
03744     IN  PIRP Irp,
03745     IN  PKSPROPERTY Property,
03746     IN  OUT PVOID Data,
03747     IN  const KSTOPOLOGY* Topology);
03748 
03749 
03750 
03751 /* ===============================================================
03752     Connectivity Functions
03753 */
03754 
03755 KSDDKAPI NTSTATUS NTAPI
03756 KsCreatePin(
03757     IN  HANDLE FilterHandle,
03758     IN  PKSPIN_CONNECT Connect,
03759     IN  ACCESS_MASK DesiredAccess,
03760     OUT PHANDLE ConnectionHandle);
03761 
03762 KSDDKAPI NTSTATUS NTAPI
03763 KsValidateConnectRequest(
03764     IN  PIRP Irp,
03765     IN  ULONG DescriptorsCount,
03766     IN  KSPIN_DESCRIPTOR* Descriptor,
03767     OUT PKSPIN_CONNECT* Connect);
03768 
03769 KSDDKAPI NTSTATUS NTAPI
03770 KsPinPropertyHandler(
03771     IN  PIRP Irp,
03772     IN  PKSPROPERTY Property,
03773     IN  OUT PVOID Data,
03774     IN  ULONG DescriptorsCount,
03775     IN  const KSPIN_DESCRIPTOR* Descriptor);
03776 
03777 KSDDKAPI NTSTATUS NTAPI
03778 KsPinDataIntersection(
03779     IN  PIRP Irp,
03780     IN  PKSP_PIN Pin,
03781     OUT PVOID Data,
03782     IN  ULONG DescriptorsCount,
03783     IN  const KSPIN_DESCRIPTOR* Descriptor,
03784     IN  PFNKSINTERSECTHANDLER IntersectHandler);
03785 
03786 KSDDKAPI NTSTATUS NTAPI
03787 KsPinDataIntersectionEx(
03788     IN  PIRP Irp,
03789     IN  PKSP_PIN Pin,
03790     OUT PVOID Data,
03791     IN  ULONG DescriptorsCount,
03792     IN  const KSPIN_DESCRIPTOR* Descriptor,
03793     IN  ULONG DescriptorSize,
03794     IN  PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
03795     IN  PVOID HandlerContext OPTIONAL);
03796 
03797 KSDDKAPI PKSFILTER NTAPI
03798 KsPinGetParentFilter(
03799     IN PKSPIN Pin
03800     );
03801 
03802 KSDDKAPI PKSPIN NTAPI
03803 KsPinGetNextSiblingPin(
03804     IN PKSPIN Pin
03805     );
03806 
03807 
03808 /* Does this belong here? */
03809 
03810 KSDDKAPI NTSTATUS NTAPI
03811 KsHandleSizedListQuery(
03812     IN  PIRP Irp,
03813     IN  ULONG DataItemsCount,
03814     IN  ULONG DataItemSize,
03815     IN  const VOID* DataItems);
03816 
03817 
03818 /* ===============================================================
03819     IRP Helper Functions
03820 */
03821 
03822 typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)(
03823     IN  PIRP Irp,
03824     IN  PVOID Context);
03825 
03826 KSDDKAPI NTSTATUS NTAPI
03827 KsAcquireResetValue(
03828     IN  PIRP Irp,
03829     OUT KSRESET* ResetValue);
03830 
03831 KSDDKAPI VOID NTAPI
03832 KsAddIrpToCancelableQueue(
03833     IN  OUT PLIST_ENTRY QueueHead,
03834     IN  PKSPIN_LOCK SpinLock,
03835     IN  PIRP Irp,
03836     IN  KSLIST_ENTRY_LOCATION ListLocation,
03837     IN  PDRIVER_CANCEL DriverCancel OPTIONAL);
03838 
03839 KSDDKAPI NTSTATUS NTAPI
03840 KsAddObjectCreateItemToDeviceHeader(
03841     IN  KSDEVICE_HEADER Header,
03842     IN  PDRIVER_DISPATCH Create,
03843     IN  PVOID Context,
03844     IN  PWCHAR ObjectClass,
03845     IN  PSECURITY_DESCRIPTOR SecurityDescriptor);
03846 
03847 KSDDKAPI NTSTATUS NTAPI
03848 KsAddObjectCreateItemToObjectHeader(
03849     IN  KSOBJECT_HEADER Header,
03850     IN  PDRIVER_DISPATCH Create,
03851     IN  PVOID Context,
03852     IN  PWCHAR ObjectClass,
03853     IN  PSECURITY_DESCRIPTOR SecurityDescriptor);
03854 
03855 KSDDKAPI NTSTATUS NTAPI
03856 KsAllocateDeviceHeader(
03857     OUT KSDEVICE_HEADER* Header,
03858     IN  ULONG ItemsCount,
03859     IN  PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL);
03860 
03861 KSDDKAPI NTSTATUS NTAPI
03862 KsAllocateExtraData(
03863     IN  PIRP Irp,
03864     IN  ULONG ExtraSize,
03865     OUT PVOID* ExtraBuffer);
03866 
03867 KSDDKAPI NTSTATUS NTAPI
03868 KsAllocateObjectCreateItem(
03869     IN  KSDEVICE_HEADER Header,
03870     IN  PKSOBJECT_CREATE_ITEM CreateItem,
03871     IN  BOOLEAN AllocateEntry,
03872     IN  PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL);
03873 
03874 KSDDKAPI NTSTATUS NTAPI
03875 KsAllocateObjectHeader(
03876     OUT KSOBJECT_HEADER *Header,
03877     IN  ULONG ItemsCount,
03878     IN  PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
03879     IN  PIRP Irp,
03880     IN  KSDISPATCH_TABLE* Table);
03881 
03882 KSDDKAPI VOID NTAPI
03883 KsCancelIo(
03884     IN  OUT PLIST_ENTRY QueueHead,
03885     IN  PKSPIN_LOCK SpinLock);
03886 
03887 KSDDKAPI VOID NTAPI
03888 KsCancelRoutine(
03889     IN  PDEVICE_OBJECT DeviceObject,
03890     IN  PIRP Irp);
03891 
03892 KSDDKAPI NTSTATUS NTAPI
03893 KsDefaultDeviceIoCompletion(
03894     IN  PDEVICE_OBJECT DeviceObject,
03895     IN  PIRP Irp);
03896 
03897 /* ELSEWHERE
03898 KSDDKAPI ULONG NTAPI
03899 KsDecrementCountedWorker(
03900     IN  PKSWORKER Worker);
03901 */
03902 
03903 KSDDKAPI BOOLEAN NTAPI
03904 KsDispatchFastIoDeviceControlFailure(
03905     IN  PFILE_OBJECT FileObject,
03906     IN  BOOLEAN Wait,
03907     IN  PVOID InputBuffer  OPTIONAL,
03908     IN  ULONG InputBufferLength,
03909     OUT PVOID OutputBuffer  OPTIONAL,
03910     IN  ULONG OutputBufferLength,
03911     IN  ULONG IoControlCode,
03912     OUT PIO_STATUS_BLOCK IoStatus,
03913     IN  PDEVICE_OBJECT DeviceObject);   /* always return false */
03914 
03915 KSDDKAPI BOOLEAN NTAPI
03916 KsDispatchFastReadFailure(
03917     IN  PFILE_OBJECT FileObject,
03918     IN  PLARGE_INTEGER FileOffset,
03919     IN  ULONG Length,
03920     IN  BOOLEAN Wait,
03921     IN  ULONG LockKey,
03922     OUT PVOID Buffer,
03923     OUT PIO_STATUS_BLOCK IoStatus,
03924     IN  PDEVICE_OBJECT DeviceObject);   /* always return false */
03925 
03926 /* This function does the same as the above */
03927 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
03928 
03929 KSDDKAPI NTSTATUS NTAPI
03930 KsDispatchInvalidDeviceRequest(
03931     IN  PDEVICE_OBJECT DeviceObject,
03932     IN  PIRP Irp);
03933 
03934 KSDDKAPI NTSTATUS NTAPI
03935 KsDispatchIrp(
03936     IN  PDEVICE_OBJECT DeviceObject,
03937     IN  PIRP Irp);
03938 
03939 KSDDKAPI NTSTATUS NTAPI
03940 KsDispatchSpecificMethod(
03941     IN  PIRP Irp,
03942     IN  PFNKSHANDLER Handler);
03943 
03944 KSDDKAPI NTSTATUS NTAPI
03945 KsDispatchSpecificProperty(
03946     IN  PIRP Irp,
03947     IN  PFNKSHANDLER Handler);
03948 
03949 KSDDKAPI NTSTATUS NTAPI
03950 KsForwardAndCatchIrp(
03951     IN  PDEVICE_OBJECT DeviceObject,
03952     IN  PIRP Irp,
03953     IN  PFILE_OBJECT FileObject,
03954     IN  KSSTACK_USE StackUse);
03955 
03956 KSDDKAPI NTSTATUS NTAPI
03957 KsForwardIrp(
03958     IN  PIRP Irp,
03959     IN  PFILE_OBJECT FileObject,
03960     IN  BOOLEAN ReuseStackLocation);
03961 
03962 KSDDKAPI VOID NTAPI
03963 KsFreeDeviceHeader(
03964     IN  KSDEVICE_HEADER Header);
03965 
03966 KSDDKAPI VOID NTAPI
03967 KsFreeObjectHeader(
03968     IN  PVOID Header);
03969 
03970 KSDDKAPI NTSTATUS NTAPI
03971 KsGetChildCreateParameter(
03972     IN  PIRP Irp,
03973     OUT PVOID* CreateParameter);
03974 
03975 KSDDKAPI NTSTATUS NTAPI
03976 KsMoveIrpsOnCancelableQueue(
03977     IN  OUT PLIST_ENTRY SourceList,
03978     IN  PKSPIN_LOCK SourceLock,
03979     IN  OUT PLIST_ENTRY DestinationList,
03980     IN  PKSPIN_LOCK DestinationLock OPTIONAL,
03981     IN  KSLIST_ENTRY_LOCATION ListLocation,
03982     IN  PFNKSIRPLISTCALLBACK ListCallback,
03983     IN  PVOID Context);
03984 
03985 KSDDKAPI NTSTATUS NTAPI
03986 KsProbeStreamIrp(
03987     IN  PIRP Irp,
03988     IN  ULONG ProbeFlags,
03989     IN  ULONG HeaderSize);
03990 
03991 KSDDKAPI NTSTATUS NTAPI
03992 KsQueryInformationFile(
03993     IN  PFILE_OBJECT FileObject,
03994     OUT PVOID FileInformation,
03995     IN  ULONG Length,
03996     IN  FILE_INFORMATION_CLASS FileInformationClass);
03997 
03998 KSDDKAPI ACCESS_MASK NTAPI
03999 KsQueryObjectAccessMask(
04000     IN KSOBJECT_HEADER Header);
04001 
04002 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
04003 KsQueryObjectCreateItem(
04004     IN KSOBJECT_HEADER Header);
04005 
04006 KSDDKAPI NTSTATUS NTAPI
04007 KsReadFile(
04008     IN  PFILE_OBJECT FileObject,
04009     IN  PKEVENT Event OPTIONAL,
04010     IN  PVOID PortContext OPTIONAL,
04011     OUT PIO_STATUS_BLOCK IoStatusBlock,
04012     OUT PVOID Buffer,
04013     IN  ULONG Length,
04014     IN  ULONG Key OPTIONAL,
04015     IN  KPROCESSOR_MODE RequestorMode);
04016 
04017 KSDDKAPI VOID NTAPI
04018 KsReleaseIrpOnCancelableQueue(
04019     IN  PIRP Irp,
04020     IN  PDRIVER_CANCEL DriverCancel OPTIONAL);
04021 
04022 KSDDKAPI PIRP NTAPI
04023 KsRemoveIrpFromCancelableQueue(
04024     IN  OUT PLIST_ENTRY QueueHead,
04025     IN  PKSPIN_LOCK SpinLock,
04026     IN  KSLIST_ENTRY_LOCATION ListLocation,
04027     IN  KSIRP_REMOVAL_OPERATION RemovalOperation);
04028 
04029 KSDDKAPI VOID NTAPI
04030 KsRemoveSpecificIrpFromCancelableQueue(
04031     IN  PIRP Irp);
04032 
04033 KSDDKAPI NTSTATUS NTAPI
04034 KsSetInformationFile(
04035     IN  PFILE_OBJECT FileObject,
04036     IN  PVOID FileInformation,
04037     IN  ULONG Length,
04038     IN  FILE_INFORMATION_CLASS FileInformationClass);
04039 
04040 KSDDKAPI NTSTATUS NTAPI
04041 KsSetMajorFunctionHandler(
04042     IN  PDRIVER_OBJECT DriverObject,
04043     IN  ULONG MajorFunction);
04044 
04045 KSDDKAPI NTSTATUS NTAPI
04046 KsStreamIo(
04047     IN  PFILE_OBJECT FileObject,
04048     IN  PKEVENT Event OPTIONAL,
04049     IN  PVOID PortContext OPTIONAL,
04050     IN  PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
04051     IN  PVOID CompletionContext OPTIONAL,
04052     IN  KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
04053     OUT PIO_STATUS_BLOCK IoStatusBlock,
04054     IN  OUT PVOID StreamHeaders,
04055     IN  ULONG Length,
04056     IN  ULONG Flags,
04057     IN  KPROCESSOR_MODE RequestorMode);
04058 
04059 KSDDKAPI NTSTATUS NTAPI
04060   KsWriteFile(
04061     IN  PFILE_OBJECT FileObject,
04062     IN  PKEVENT Event OPTIONAL,
04063     IN  PVOID PortContext OPTIONAL,
04064     OUT PIO_STATUS_BLOCK IoStatusBlock,
04065     IN  PVOID Buffer,
04066     IN  ULONG Length,
04067     IN  ULONG Key OPTIONAL,
04068     IN  KPROCESSOR_MODE RequestorMode);
04069 
04070 
04071 KSDDKAPI NTSTATUS NTAPI
04072   KsDefaultForwardIrp(
04073     IN PDEVICE_OBJECT DeviceObject,
04074     IN PIRP Irp);
04075 
04076 /* ===============================================================
04077     Worker Management Functions
04078 */
04079 
04080 KSDDKAPI NTSTATUS NTAPI
04081 KsRegisterWorker(
04082     IN  WORK_QUEUE_TYPE WorkQueueType,
04083     OUT PKSWORKER* Worker);
04084 
04085 KSDDKAPI VOID NTAPI
04086 KsUnregisterWorker(
04087     IN  PKSWORKER Worker);
04088 
04089 KSDDKAPI NTSTATUS NTAPI
04090 KsRegisterCountedWorker(
04091     IN  WORK_QUEUE_TYPE WorkQueueType,
04092     IN  PWORK_QUEUE_ITEM CountedWorkItem,
04093     OUT PKSWORKER* Worker);
04094 
04095 KSDDKAPI ULONG NTAPI
04096 KsDecrementCountedWorker(
04097     IN  PKSWORKER Worker);
04098 
04099 KSDDKAPI ULONG NTAPI
04100 KsIncrementCountedWorker(
04101     IN  PKSWORKER Worker);
04102 
04103 KSDDKAPI NTSTATUS NTAPI
04104 KsQueueWorkItem(
04105     IN  PKSWORKER Worker,
04106     IN  PWORK_QUEUE_ITEM WorkItem);
04107 
04108 
04109 /* ===============================================================
04110     Resources / Images
04111 */
04112 
04113 KSDDKAPI NTSTATUS NTAPI
04114 KsLoadResource(
04115     IN  PVOID ImageBase,
04116     IN  POOL_TYPE PoolType,
04117     IN  ULONG_PTR ResourceName,
04118     IN  ULONG ResourceType,
04119     OUT PVOID* Resource,
04120     OUT PULONG ResourceSize);
04121 
04122 /* TODO: Implement
04123 KSDDKAPI NTSTATUS NTAPI
04124 KsGetImageNameAndResourceId(
04125     IN  HANDLE RegKey,
04126     OUT PUNICODE_STRING ImageName,
04127     OUT PULONG_PTR ResourceId,
04128     OUT PULONG ValueType);
04129 
04130 KSDDKAPI NTSTATUS NTAPI
04131 KsMapModuleName(
04132     IN  PDEVICE_OBJECT PhysicalDeviceObject,
04133     IN  PUNICODE_STRING ModuleName,
04134     OUT PUNICODE_STRING ImageName,
04135     OUT PULONG_PTR ResourceId,
04136     OUT PULONG ValueType);
04137 */
04138 
04139 
04140 /* ===============================================================
04141     Misc. Helper Functions
04142 */
04143 
04144 KSDDKAPI PVOID NTAPI
04145 KsGetNextSibling(
04146     IN PVOID Object);
04147 
04148 
04149 KSDDKAPI NTSTATUS NTAPI
04150 KsCacheMedium(
04151     IN  PUNICODE_STRING SymbolicLink,
04152     IN  PKSPIN_MEDIUM Medium,
04153     IN  ULONG PinDirection);
04154 
04155 KSDDKAPI NTSTATUS NTAPI
04156 KsDefaultDispatchPnp(
04157     IN  PDEVICE_OBJECT DeviceObject,
04158     IN  PIRP Irp);
04159 
04160 KSDDKAPI VOID NTAPI
04161 KsSetDevicePnpAndBaseObject(
04162     IN  KSDEVICE_HEADER Header,
04163     IN  PDEVICE_OBJECT PnpDeviceObject,
04164     IN  PDEVICE_OBJECT BaseDevice);
04165 
04166 KSDDKAPI NTSTATUS NTAPI
04167 KsDefaultDispatchPower(
04168     IN  PDEVICE_OBJECT DeviceObject,
04169     IN  PIRP Irp);
04170 
04171 KSDDKAPI VOID NTAPI
04172 KsSetPowerDispatch(
04173     IN  KSOBJECT_HEADER Header,
04174     IN  PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
04175     IN  PVOID PowerContext OPTIONAL);
04176 
04177 KSDDKAPI NTSTATUS NTAPI
04178 KsReferenceBusObject(
04179     IN  KSDEVICE_HEADER Header);
04180 
04181 KSDDKAPI VOID NTAPI
04182 KsDereferenceBusObject(
04183     IN  KSDEVICE_HEADER Header);
04184 
04185 KSDDKAPI NTSTATUS NTAPI
04186 KsFreeObjectCreateItem(
04187     IN  KSDEVICE_HEADER Header,
04188     IN  PUNICODE_STRING CreateItem);
04189 
04190 KSDDKAPI NTSTATUS NTAPI
04191 KsFreeObjectCreateItemsByContext(
04192     IN  KSDEVICE_HEADER Header,
04193     IN  PVOID Context);
04194 
04195 KSDDKAPI VOID NTAPI
04196 KsNullDriverUnload(
04197     IN  PDRIVER_OBJECT DriverObject);
04198 
04199 KSDDKAPI PDEVICE_OBJECT NTAPI
04200 KsQueryDevicePnpObject(
04201     IN  KSDEVICE_HEADER Header);
04202 
04203 KSDDKAPI VOID NTAPI
04204 KsRecalculateStackDepth(
04205     IN  KSDEVICE_HEADER Header,
04206     IN  BOOLEAN ReuseStackLocation);
04207 
04208 KSDDKAPI VOID NTAPI
04209 KsSetTargetDeviceObject(
04210     IN  KSOBJECT_HEADER Header,
04211     IN  PDEVICE_OBJECT TargetDevice OPTIONAL);
04212 
04213 KSDDKAPI VOID NTAPI
04214 KsSetTargetState(
04215     IN  KSOBJECT_HEADER Header,
04216     IN  KSTARGET_STATE TargetState);
04217 
04218 KSDDKAPI NTSTATUS NTAPI
04219 KsSynchronousIoControlDevice(
04220     IN  PFILE_OBJECT FileObject,
04221     IN  KPROCESSOR_MODE RequestorMode,
04222     IN  ULONG IoControl,
04223     IN  PVOID InBuffer,
04224     IN  ULONG InSize,
04225     OUT PVOID OutBuffer,
04226     IN  ULONG OUtSize,
04227     OUT PULONG BytesReturned);
04228 
04229 KSDDKAPI
04230 PKSPIN
04231 NTAPI
04232 KsFilterGetFirstChildPin(
04233     IN PKSFILTER Filter,
04234     IN ULONG PinId
04235     );
04236 
04237 KSDDKAPI
04238 PFILE_OBJECT
04239 NTAPI
04240 KsPinGetConnectedPinFileObject(
04241     IN PKSPIN Pin
04242     );
04243 
04244 #else
04245 
04246 #if !defined( KS_NO_CREATE_FUNCTIONS )
04247 
04248 KSDDKAPI
04249 DWORD
04250 WINAPI
04251 KsCreateAllocator(
04252     IN HANDLE ConnectionHandle,
04253     IN PKSALLOCATOR_FRAMING AllocatorFraming,
04254     OUT PHANDLE AllocatorHandle
04255     );
04256 
04257 KSDDKAPI
04258 DWORD
04259 NTAPI
04260 KsCreateClock(
04261     IN HANDLE ConnectionHandle,
04262     IN PKSCLOCK_CREATE ClockCreate,
04263     OUT PHANDLE ClockHandle
04264     );
04265 
04266 KSDDKAPI
04267 DWORD
04268 WINAPI
04269 KsCreatePin(
04270     IN HANDLE FilterHandle,
04271     IN PKSPIN_CONNECT Connect,
04272     IN ACCESS_MASK DesiredAccess,
04273     OUT PHANDLE ConnectionHandle
04274     );
04275 
04276 KSDDKAPI
04277 DWORD
04278 WINAPI
04279 KsCreateTopologyNode(
04280     IN HANDLE ParentHandle,
04281     IN PKSNODE_CREATE NodeCreate,
04282     IN ACCESS_MASK DesiredAccess,
04283     OUT PHANDLE NodeHandle
04284     );
04285     
04286 #endif
04287 
04288 #endif
04289 
04290 /* ===============================================================
04291     AVStream Functions (XP / DirectX 8)
04292     NOT IMPLEMENTED YET
04293     http://www.osronline.com/ddkx/stream/avstream_5q9f.htm
04294 */
04295 
04296 #if defined(_NTDDK_)
04297 
04298 KSDDKAPI
04299 NTSTATUS
04300 NTAPI
04301 KsMergeAutomationTables(
04302     OUT PKSAUTOMATION_TABLE* AutomationTableAB,
04303     IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
04304     IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
04305     IN KSOBJECT_BAG Bag OPTIONAL
04306     );
04307 
04308 KSDDKAPI
04309 NTSTATUS
04310 NTAPI
04311 KsInitializeDriver(
04312     IN PDRIVER_OBJECT  DriverObject,
04313     IN PUNICODE_STRING  RegistryPath,
04314     IN const KSDEVICE_DESCRIPTOR  *Descriptor OPTIONAL);
04315 
04316 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
04317 
04318 
04319 
04320 KSDDKAPI
04321 NTSTATUS
04322 NTAPI
04323 KsInitializeDevice (
04324     IN PDEVICE_OBJECT  FunctionalDeviceObject,
04325     IN PDEVICE_OBJECT  PhysicalDeviceObject,
04326     IN PDEVICE_OBJECT  NextDeviceObject,
04327     IN const KSDEVICE_DESCRIPTOR*  Descriptor OPTIONAL);
04328 
04329 
04330 typedef void (NTAPI *PFNKSFILTERFACTORYPOWER)(
04331     IN  PKSFILTERFACTORY FilterFactory,
04332     IN  DEVICE_POWER_STATE State);
04333 
04334 KSDDKAPI
04335 NTSTATUS
04336 NTAPI
04337 _KsEdit(
04338     IN  KSOBJECT_BAG ObjectBag,
04339     IN  OUT PVOID* PointerToPointerToItem,
04340     IN  ULONG NewSize,
04341     IN  ULONG OldSize,
04342     IN  ULONG Tag);
04343 
04344 KSDDKAPI
04345 VOID
04346 NTAPI
04347 KsAcquireControl(
04348     IN  PVOID Object);
04349 
04350 KSDDKAPI
04351 VOID
04352 NTAPI
04353 KsAcquireDevice(
04354     IN  PKSDEVICE Device);
04355 
04356 KSDDKAPI
04357 NTSTATUS
04358 NTAPI
04359 KsAddDevice(
04360     IN  PDRIVER_OBJECT DriverObject,
04361     IN  PDEVICE_OBJECT PhysicalDeviceObject);
04362 
04363 KSDDKAPI
04364 VOID
04365 NTAPI
04366 KsAddEvent(
04367     IN  PVOID Object,
04368     IN  PKSEVENT_ENTRY EventEntry);
04369 
04370 KSDDKAPI
04371 NTSTATUS
04372 NTAPI
04373 KsAddItemToObjectBag(
04374     IN  KSOBJECT_BAG ObjectBag,
04375     IN  PVOID Item,
04376     IN  PFNKSFREE Free OPTIONAL);
04377 
04378 KSDDKAPI
04379 ULONG
04380 NTAPI
04381 KsRemoveItemFromObjectBag(
04382     IN KSOBJECT_BAG ObjectBag,
04383     IN PVOID Item,
04384     IN BOOLEAN Free);
04385 
04386 KSDDKAPI
04387 NTSTATUS
04388 NTAPI
04389 KsAllocateObjectBag(
04390     IN  PKSDEVICE Device,
04391     OUT KSOBJECT_BAG* ObjectBag);
04392 
04393 KSDDKAPI
04394 VOID
04395 NTAPI
04396 KsFreeObjectBag(
04397     IN KSOBJECT_BAG ObjectBag
04398     );
04399 
04400 KSDDKAPI
04401 VOID
04402 NTAPI
04403 KsCompletePendingRequest(
04404     IN  PIRP Irp);
04405 
04406 KSDDKAPI
04407 NTSTATUS
04408 NTAPI
04409 KsCopyObjectBagItems(
04410     IN  KSOBJECT_BAG ObjectBagDestination,
04411     IN  KSOBJECT_BAG ObjectBagSource);
04412 
04413 KSDDKAPI
04414 NTSTATUS
04415 NTAPI
04416 KsCreateDevice(
04417     IN  PDRIVER_OBJECT DriverObject,
04418     IN  PDEVICE_OBJECT PhysicalDeviceObject,
04419     IN  const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
04420     IN  ULONG ExtensionSize OPTIONAL,
04421     OUT PKSDEVICE* Device OPTIONAL);
04422 
04423 KSDDKAPI
04424 NTSTATUS
04425 NTAPI
04426 KsCreateFilterFactory(
04427     IN  PDEVICE_OBJECT DeviceObject,
04428     IN  const KSFILTER_DESCRIPTOR* Descriptor,
04429     IN  PWCHAR RefString OPTIONAL,
04430     IN  PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
04431     IN  ULONG CreateItemFlags,
04432     IN  PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
04433     IN  PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
04434     OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
04435 
04436 KSDDKAPI
04437 NTSTATUS
04438 NTAPI
04439 KsFilterFactorySetDeviceClassesState(
04440     IN PKSFILTERFACTORY FilterFactory,
04441     IN BOOLEAN NewState
04442     );
04443 
04444 KSDDKAPI
04445 NTSTATUS
04446 NTAPI
04447 KsFilterFactoryUpdateCacheData(
04448     IN PKSFILTERFACTORY FilterFactory,
04449     IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL
04450     );
04451 
04452 KSDDKAPI
04453 PKSPIN
04454 NTAPI
04455 KsGetPinFromIrp(
04456     IN PIRP Irp
04457     );
04458 
04459 KSDDKAPI
04460 PKSFILTER
04461 NTAPI
04462 KsGetFilterFromIrp(
04463     IN PIRP Irp
04464     );
04465 
04466 KSDDKAPI
04467 NTSTATUS
04468 NTAPI
04469 KsDefaultAddEventHandler(
04470     IN  PIRP Irp,
04471     IN  PKSEVENTDATA EventData,
04472     IN  OUT PKSEVENT_ENTRY EventEntry);
04473 
04474 KSDDKAPI
04475 NTSTATUS
04476 NTAPI
04477 KsDispatchQuerySecurity(
04478     IN PDEVICE_OBJECT DeviceObject,
04479     IN PIRP Irp
04480     );
04481 
04482 KSDDKAPI
04483 NTSTATUS
04484 NTAPI
04485 KsDispatchSetSecurity(
04486     IN PDEVICE_OBJECT DeviceObject,
04487     IN PIRP Irp
04488     );
04489 
04490 KSDDKAPI
04491 PVOID
04492 NTAPI
04493 KsGetParent(
04494     IN PVOID Object
04495     );
04496 
04497 
04498 static
04499 PKSFILTERFACTORY
04500 __inline
04501 KsFilterGetParentFilterFactory(
04502     IN PKSFILTER Filter
04503     )
04504 {
04505     return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
04506 }
04507 
04508 static
04509 PKSDEVICE
04510 __inline
04511 KsFilterFactoryGetParentDevice(
04512     IN PKSFILTERFACTORY FilterFactory
04513     )
04514 {
04515     return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
04516 }
04517 
04518 
04519 
04520 #define KsDeleteFilterFactory(FilterFactory)                                           \
04521             KsFreeObjectCreateItemsByContext(                                          \
04522             *(KSDEVICE_HEADER *)(                                                      \
04523             KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->    \
04524             DeviceExtension),                                                          \
04525             FilterFactory)
04526 
04527 KSDDKAPI
04528 ULONG
04529 NTAPI
04530 KsDeviceGetBusData(
04531     IN  PKSDEVICE Device,
04532     IN  ULONG DataType,
04533     IN  PVOID Buffer,
04534     IN  ULONG Offset,
04535     IN  ULONG Length);
04536 
04537 
04538 KSDDKAPI
04539 PVOID
04540 NTAPI
04541 KsGetFirstChild(
04542     IN PVOID Object
04543     );
04544 
04545 KSDDKAPI
04546 PKSFILTERFACTORY
04547 NTAPI
04548 KsDeviceGetFirstChildFilterFactory(
04549     IN  PKSDEVICE Device);
04550 
04551 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
04552 
04553 KSDDKAPI
04554 PUNKNOWN
04555 NTAPI
04556 KsGetOuterUnknown(
04557     IN PVOID Object
04558     );
04559 
04560 static
04561 __inline
04562 PUNKNOWN
04563 KsDeviceGetOuterUnknown(
04564     IN  PKSDEVICE Device)
04565 {
04566     return KsGetOuterUnknown((PVOID) Device);
04567 }
04568 
04569 KSDDKAPI
04570 PUNKNOWN
04571 NTAPI
04572 KsDeviceRegisterAggregatedClientUnknown(
04573     IN  PKSDEVICE Device,
04574     IN  PUNKNOWN ClientUnknown);
04575 
04576 
04577 #endif
04578 
04579 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
04580 
04581 typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
04582 
04583 #undef INTERFACE
04584 #define INTERFACE IKsReferenceClock
04585 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
04586 {
04587     DEFINE_ABSTRACT_UNKNOWN() // For C
04588 
04589     STDMETHOD_(LONGLONG,GetTime)(THIS
04590         ) PURE;
04591     STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
04592         ) PURE;
04593     STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
04594         OUT PLONGLONG SystemTime
04595         ) PURE;
04596     STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
04597         OUT PLONGLONG SystemTime
04598         ) PURE;
04599     STDMETHOD_(NTSTATUS, GetResolution)(THIS_
04600         OUT PKSRESOLUTION Resolution
04601         ) PURE;
04602     STDMETHOD_(NTSTATUS, GetState)(THIS_
04603         OUT PKSSTATE State
04604         ) PURE;
04605 };
04606 
04607 #undef INTERFACE
04608 #define INTERFACE IKsControl
04609 
04610 DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
04611 
04612 DECLARE_INTERFACE_(IKsControl,IUnknown)
04613 {
04614     STDMETHOD_(NTSTATUS, QueryInterface)( THIS_ 
04615         REFIID InterfaceId,
04616         PVOID* Interface)PURE;
04617 
04618     STDMETHOD_(ULONG, AddRef)(THIS) PURE;
04619 
04620     STDMETHOD_(ULONG, Release)(THIS) PURE;
04621 
04622     STDMETHOD_(NTSTATUS, KsProperty)(THIS_
04623         IN PKSPROPERTY Property,
04624         IN ULONG PropertyLength,
04625         IN OUT PVOID PropertyData,
04626         IN ULONG DataLength,
04627         OUT ULONG* BytesReturned
04628         ) PURE;
04629     STDMETHOD_(NTSTATUS, KsMethod)(THIS_
04630         IN PKSMETHOD Method,
04631         IN ULONG MethodLength,
04632         IN OUT PVOID MethodData,
04633         IN ULONG DataLength,
04634         OUT ULONG* BytesReturned
04635         ) PURE;
04636     STDMETHOD_(NTSTATUS, KsEvent)(THIS_
04637         IN PKSEVENT Event OPTIONAL,
04638         IN ULONG EventLength,
04639         IN OUT PVOID EventData,
04640         IN ULONG DataLength,
04641         OUT ULONG* BytesReturned
04642         ) PURE;
04643 };
04644 
04645 #undef INTERFACE
04646 typedef IKsControl* PIKSCONTROL;
04647 
04648 #endif
04649 
04650 KSDDKAPI
04651 VOID
04652 NTAPI
04653 KsDeviceRegisterAdapterObject(
04654     IN  PKSDEVICE Device,
04655     IN  PADAPTER_OBJECT AdapterObject,
04656     IN  ULONG MaxMappingByteCount,
04657     IN  ULONG MappingTableStride);
04658 
04659 KSDDKAPI
04660 ULONG
04661 NTAPI
04662 KsDeviceSetBusData(
04663     IN  PKSDEVICE Device,
04664     IN  ULONG DataType,
04665     IN  PVOID Buffer,
04666     IN  ULONG Offset,
04667     IN  ULONG Length);
04668 
04669 
04670 KSDDKAPI
04671 VOID
04672 NTAPI
04673 KsReleaseControl(
04674     IN PVOID Object
04675     );
04676 
04677 #define KsDiscard(object, pointer) \
04678     KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE)
04679 
04680 #define KsFilterAcquireControl(Filter) \
04681     KsAcquireControl((PVOID) Filter);
04682 
04683 #define KsFilterReleaseControl(Filter) \
04684     KsReleaseControl((PVOID) Filter);
04685 
04686 #define KsFilterAddEvent(Filter, EventEntry) \
04687     KsAddEvent(Filter,EventEntry);
04688 
04689 KSDDKAPI
04690 VOID
04691 NTAPI
04692 KsFilterAcquireProcessingMutex(
04693     IN  PKSFILTER Filter);
04694 
04695 
04696 KSDDKAPI
04697 NTSTATUS
04698 NTAPI
04699 KsFilterAddTopologyConnections(
04700     IN  PKSFILTER Filter,
04701     IN  ULONG NewConnectionsCount,
04702     IN  const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
04703 
04704 KSDDKAPI
04705 VOID
04706 NTAPI
04707 KsFilterAttemptProcessing(
04708     IN  PKSFILTER Filter,
04709     IN  BOOLEAN Asynchronous);
04710 
04711 KSDDKAPI
04712 NTSTATUS
04713 NTAPI
04714 KsFilterCreateNode(
04715     IN  PKSFILTER Filter,
04716     IN  const KSNODE_DESCRIPTOR *const NodeDescriptor,
04717     OUT PULONG NodeID);
04718 
04719 KSDDKAPI
04720 NTSTATUS
04721 NTAPI
04722 KsFilterCreatePinFactory(
04723     IN  PKSFILTER Filter,
04724     IN  const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
04725     OUT PULONG PinID);
04726 
04727 KSDDKAPI
04728 PKSDEVICE
04729 __inline
04730 KsFilterFactoryGetDevice(
04731     IN  PKSFILTERFACTORY FilterFactory);
04732 
04733 /* etc. */
04734 #endif /* avstream */
04735 
04736 #ifdef __cplusplus
04737 }
04738 #endif
04739 
04740 #endif

Generated on Sun May 27 2012 04:31:34 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.