602 lines
16 KiB
C
602 lines
16 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1989-2002 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
fltUserStructures.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This contains structures, types, and defintiions that are common to both
|
||
|
USER mode and KERNEL mode environments.
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User mode
|
||
|
|
||
|
--*/
|
||
|
#ifndef __FLT_USER_STRUCTURES_H__
|
||
|
#define __FLT_USER_STRUCTURES_H__
|
||
|
|
||
|
#if FLT_MGR_BASELINE
|
||
|
|
||
|
//
|
||
|
// Disable warning for this file
|
||
|
//
|
||
|
|
||
|
#define FLTAPI NTAPI
|
||
|
|
||
|
#define FILTER_NAME_MAX_CHARS 255
|
||
|
#define FILTER_NAME_MAX_BYTES (FILTER_NAME_MAX_CHARS * sizeof( WCHAR ))
|
||
|
|
||
|
#define VOLUME_NAME_MAX_CHARS 1024
|
||
|
#define VOLUME_NAME_MAX_BYTES (VOLUME_NAME_MAX_CHARS * sizeof( WCHAR ))
|
||
|
|
||
|
#define INSTANCE_NAME_MAX_CHARS 255
|
||
|
#define INSTANCE_NAME_MAX_BYTES (INSTANCE_NAME_MAX_CHARS * sizeof( WCHAR ))
|
||
|
|
||
|
typedef HANDLE HFILTER;
|
||
|
typedef HANDLE HFILTER_INSTANCE;
|
||
|
typedef HANDLE HFILTER_VOLUME;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Note: this may be removed in future when all translations from NTSTATUS to
|
||
|
// Win32 error codes are checked in. This is interim - since there the
|
||
|
// translation is not in for all filter manager error codes,
|
||
|
// apps will have to access NTSTATUS codes directly
|
||
|
//
|
||
|
|
||
|
typedef __success(return >= 0) LONG NTSTATUS;
|
||
|
typedef NTSTATUS *PNTSTATUS;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Known File System Types
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef enum _FLT_FILESYSTEM_TYPE {
|
||
|
|
||
|
FLT_FSTYPE_UNKNOWN, //an UNKNOWN file system type
|
||
|
FLT_FSTYPE_RAW, //Microsoft's RAW file system (\FileSystem\RAW)
|
||
|
FLT_FSTYPE_NTFS, //Microsoft's NTFS file system (\FileSystem\Ntfs)
|
||
|
FLT_FSTYPE_FAT, //Microsoft's FAT file system (\FileSystem\Fastfat)
|
||
|
FLT_FSTYPE_CDFS, //Microsoft's CDFS file system (\FileSystem\Cdfs)
|
||
|
FLT_FSTYPE_UDFS, //Microsoft's UDFS file system (\FileSystem\Udfs)
|
||
|
FLT_FSTYPE_LANMAN, //Microsoft's LanMan Redirector (\FileSystem\MRxSmb)
|
||
|
FLT_FSTYPE_WEBDAV, //Microsoft's WebDav redirector (\FileSystem\MRxDav)
|
||
|
FLT_FSTYPE_RDPDR, //Microsoft's Terminal Server redirector (\Driver\rdpdr)
|
||
|
FLT_FSTYPE_NFS, //Microsoft's NFS file system (\FileSystem\NfsRdr)
|
||
|
FLT_FSTYPE_MS_NETWARE, //Microsoft's NetWare redirector (\FileSystem\nwrdr)
|
||
|
FLT_FSTYPE_NETWARE, //Novell's NetWare redirector
|
||
|
FLT_FSTYPE_BSUDF, //The BsUDF CD-ROM driver (\FileSystem\BsUDF)
|
||
|
FLT_FSTYPE_MUP, //Microsoft's Mup redirector (\FileSystem\Mup)
|
||
|
FLT_FSTYPE_RSFX, //Microsoft's WinFS redirector (\FileSystem\RsFxDrv)
|
||
|
FLT_FSTYPE_ROXIO_UDF1, //Roxio's UDF writeable file system (\FileSystem\cdudf_xp)
|
||
|
FLT_FSTYPE_ROXIO_UDF2, //Roxio's UDF readable file system (\FileSystem\UdfReadr_xp)
|
||
|
FLT_FSTYPE_ROXIO_UDF3, //Roxio's DVD file system (\FileSystem\DVDVRRdr_xp)
|
||
|
FLT_FSTYPE_TACIT, //Tacit FileSystem (\Device\TCFSPSE)
|
||
|
FLT_FSTYPE_FS_REC, //Microsoft's File system recognizer (\FileSystem\Fs_rec)
|
||
|
FLT_FSTYPE_INCD, //Nero's InCD file system (\FileSystem\InCDfs)
|
||
|
FLT_FSTYPE_INCD_FAT, //Nero's InCD FAT file system (\FileSystem\InCDFat)
|
||
|
FLT_FSTYPE_EXFAT, //Microsoft's EXFat FILE SYSTEM (\FileSystem\exfat)
|
||
|
FLT_FSTYPE_PSFS, //PolyServ's file system (\FileSystem\psfs)
|
||
|
FLT_FSTYPE_GPFS //IBM General Parallel File System (\FileSystem\gpfs)
|
||
|
|
||
|
} FLT_FILESYSTEM_TYPE, *PFLT_FILESYSTEM_TYPE;
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// The different types information that can be return on an Filter.
|
||
|
//
|
||
|
// Note: Entries with "Aggregate" in the name return information for
|
||
|
// both LEGACY and MINI filters.
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
//
|
||
|
// In xpsp2 we do not have the concept of enumerating legacy filters
|
||
|
// For this reason there is no FilterAggregateBasicInfo in the V1 version
|
||
|
// of the enum
|
||
|
//
|
||
|
|
||
|
typedef enum _FILTER_INFORMATION_CLASS {
|
||
|
|
||
|
FilterFullInformation,
|
||
|
FilterAggregateBasicInformation, //Added to XP SP2 via QFE
|
||
|
FilterAggregateStandardInformation //Longhorn and later
|
||
|
|
||
|
} FILTER_INFORMATION_CLASS, *PFILTER_INFORMATION_CLASS;
|
||
|
|
||
|
//
|
||
|
// The structures for the information returned from the query of
|
||
|
// information on a Filter.
|
||
|
//
|
||
|
|
||
|
typedef struct _FILTER_FULL_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
ULONG FrameID;
|
||
|
|
||
|
ULONG NumberOfInstances;
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
WCHAR FilterNameBuffer[1];
|
||
|
|
||
|
} FILTER_FULL_INFORMATION, *PFILTER_FULL_INFORMATION;
|
||
|
|
||
|
|
||
|
//
|
||
|
// This structure returns information for both legacy filters and mini
|
||
|
// filters.
|
||
|
//
|
||
|
// NOTE: Support for this structures exists in all OS's that support
|
||
|
// filter manager except XP SP2. It was added later to XP SP2
|
||
|
// via a QFE.
|
||
|
//
|
||
|
|
||
|
typedef struct _FILTER_AGGREGATE_BASIC_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
//
|
||
|
// ABI - Aggregate Basic Information flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
#define FLTFL_AGGREGATE_INFO_IS_MINIFILTER 0x00000001
|
||
|
#define FLTFL_AGGREGATE_INFO_IS_LEGACYFILTER 0x00000002
|
||
|
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// Minifilter FULL information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
ULONG FrameID;
|
||
|
|
||
|
ULONG NumberOfInstances;
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
USHORT FilterAltitudeLength;
|
||
|
USHORT FilterAltitudeBufferOffset;
|
||
|
|
||
|
} MiniFilter;
|
||
|
|
||
|
//
|
||
|
// Legacyfilter information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
} LegacyFilter;
|
||
|
|
||
|
} Type;
|
||
|
|
||
|
} FILTER_AGGREGATE_BASIC_INFORMATION, *PFILTER_AGGREGATE_BASIC_INFORMATION;
|
||
|
|
||
|
|
||
|
//
|
||
|
// This structure returns information for both legacy filters and mini
|
||
|
// filters.
|
||
|
//
|
||
|
// NOTE: Support for this structures exists in Vista and Later
|
||
|
//
|
||
|
|
||
|
#if FLT_MGR_LONGHORN
|
||
|
typedef struct _FILTER_AGGREGATE_STANDARD_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
//
|
||
|
// ASI - Aggregate Standard Information flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
#define FLTFL_ASI_IS_MINIFILTER 0x00000001
|
||
|
#define FLTFL_ASI_IS_LEGACYFILTER 0x00000002
|
||
|
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// Minifilter FULL information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
//
|
||
|
// ASIM - Aggregate Standard Information Minifilter flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
|
||
|
|
||
|
ULONG FrameID;
|
||
|
|
||
|
ULONG NumberOfInstances;
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
USHORT FilterAltitudeLength;
|
||
|
USHORT FilterAltitudeBufferOffset;
|
||
|
|
||
|
} MiniFilter;
|
||
|
|
||
|
//
|
||
|
// Legacyfilter information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
//
|
||
|
// ASIL - Aggregate Standard Information LegacyFilter flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
USHORT FilterAltitudeLength;
|
||
|
USHORT FilterAltitudeBufferOffset;
|
||
|
|
||
|
} LegacyFilter;
|
||
|
|
||
|
} Type;
|
||
|
|
||
|
} FILTER_AGGREGATE_STANDARD_INFORMATION, *PFILTER_AGGREGATE_STANDARD_INFORMATION;
|
||
|
#endif // FLT_MGR_LONGHORN
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// The different types information that can be return for a Volume
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef enum _FILTER_VOLUME_INFORMATION_CLASS {
|
||
|
|
||
|
FilterVolumeBasicInformation,
|
||
|
FilterVolumeStandardInformation //Longhorn and later
|
||
|
|
||
|
} FILTER_VOLUME_INFORMATION_CLASS, *PFILTER_VOLUME_INFORMATION_CLASS;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Basic information about a volume (its name)
|
||
|
//
|
||
|
|
||
|
typedef struct _FILTER_VOLUME_BASIC_INFORMATION {
|
||
|
|
||
|
//
|
||
|
// Length of name
|
||
|
//
|
||
|
|
||
|
USHORT FilterVolumeNameLength;
|
||
|
|
||
|
//
|
||
|
// Buffer containing name (it's NOT NULL-terminated)
|
||
|
//
|
||
|
|
||
|
WCHAR FilterVolumeName[1];
|
||
|
|
||
|
} FILTER_VOLUME_BASIC_INFORMATION, *PFILTER_VOLUME_BASIC_INFORMATION;
|
||
|
|
||
|
//
|
||
|
// Additional volume information.
|
||
|
//
|
||
|
// NOTE: Only available in LONGHORN and later OS's
|
||
|
//
|
||
|
|
||
|
#if FLT_MGR_LONGHORN
|
||
|
typedef struct _FILTER_VOLUME_STANDARD_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
//
|
||
|
// VSI - VOlume Standard Information flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
|
||
|
//
|
||
|
// If set this volume is not current attached to a storage stack
|
||
|
//
|
||
|
|
||
|
#define FLTFL_VSI_DETACHED_VOLUME 0x00000001
|
||
|
|
||
|
//
|
||
|
// Identifies which frame this volume structure is in
|
||
|
//
|
||
|
|
||
|
ULONG FrameID;
|
||
|
|
||
|
//
|
||
|
// Identifies the type of file system being used on the volume
|
||
|
//
|
||
|
|
||
|
FLT_FILESYSTEM_TYPE FileSystemType;
|
||
|
|
||
|
//
|
||
|
// Length of name
|
||
|
//
|
||
|
|
||
|
USHORT FilterVolumeNameLength;
|
||
|
|
||
|
//
|
||
|
// Buffer containing name (it's NOT NULL-terminated)
|
||
|
//
|
||
|
|
||
|
WCHAR FilterVolumeName[1];
|
||
|
|
||
|
} FILTER_VOLUME_STANDARD_INFORMATION, *PFILTER_VOLUME_STANDARD_INFORMATION;
|
||
|
#endif // FLT_MGR_LONGHORN
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// The different types information that can be return on an Instance.
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef enum _INSTANCE_INFORMATION_CLASS {
|
||
|
|
||
|
InstanceBasicInformation,
|
||
|
InstancePartialInformation,
|
||
|
InstanceFullInformation,
|
||
|
InstanceAggregateStandardInformation //LONGHORN and later
|
||
|
|
||
|
} INSTANCE_INFORMATION_CLASS, *PINSTANCE_INFORMATION_CLASS;
|
||
|
|
||
|
|
||
|
//
|
||
|
// The structures for the information returned from the query of the information
|
||
|
// on the Instance.
|
||
|
//
|
||
|
|
||
|
typedef __struct_bcount(sizeof(INSTANCE_BASIC_INFORMATION) * InstanceNameLength) struct _INSTANCE_BASIC_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
USHORT InstanceNameLength;
|
||
|
USHORT InstanceNameBufferOffset;
|
||
|
|
||
|
} INSTANCE_BASIC_INFORMATION, *PINSTANCE_BASIC_INFORMATION;
|
||
|
|
||
|
typedef __struct_bcount(sizeof(INSTANCE_PARTIAL_INFORMATION) + InstanceNameLength + AltitudeLength) struct _INSTANCE_PARTIAL_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
USHORT InstanceNameLength;
|
||
|
USHORT InstanceNameBufferOffset;
|
||
|
|
||
|
USHORT AltitudeLength;
|
||
|
USHORT AltitudeBufferOffset;
|
||
|
|
||
|
} INSTANCE_PARTIAL_INFORMATION, *PINSTANCE_PARTIAL_INFORMATION;
|
||
|
|
||
|
typedef __struct_bcount(sizeof(INSTANCE_FULL_INFORMATION) + InstanceNameLength + AltitudeLength + VolumeNameLength + FilterNameLength) struct _INSTANCE_FULL_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
USHORT InstanceNameLength;
|
||
|
USHORT InstanceNameBufferOffset;
|
||
|
|
||
|
USHORT AltitudeLength;
|
||
|
USHORT AltitudeBufferOffset;
|
||
|
|
||
|
USHORT VolumeNameLength;
|
||
|
USHORT VolumeNameBufferOffset;
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
} INSTANCE_FULL_INFORMATION, *PINSTANCE_FULL_INFORMATION;
|
||
|
|
||
|
|
||
|
//
|
||
|
// This information class is used to return instance information about both
|
||
|
// legacy filters and minifilters.
|
||
|
//
|
||
|
|
||
|
#if FLT_MGR_LONGHORN
|
||
|
typedef struct _INSTANCE_AGGREGATE_STANDARD_INFORMATION {
|
||
|
|
||
|
ULONG NextEntryOffset;
|
||
|
|
||
|
//
|
||
|
// IASI - Instance Aggregate Standard Information flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
#define FLTFL_IASI_IS_MINIFILTER 0x00000001
|
||
|
#define FLTFL_IASI_IS_LEGACYFILTER 0x00000002
|
||
|
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// MiniFilter information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
//
|
||
|
// IASIM - Instance Aggregate Standard Information Minifilter flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
|
||
|
//
|
||
|
// If set this volume is not current attached to a storage stack
|
||
|
//
|
||
|
|
||
|
#define FLTFL_IASIM_DETACHED_VOLUME 0x00000001
|
||
|
|
||
|
//
|
||
|
// Identifies which frame this volume structure is in
|
||
|
//
|
||
|
|
||
|
ULONG FrameID;
|
||
|
|
||
|
//
|
||
|
// The type of file system this instance is attached to
|
||
|
//
|
||
|
|
||
|
FLT_FILESYSTEM_TYPE VolumeFileSystemType;
|
||
|
|
||
|
//
|
||
|
// The name of this instance
|
||
|
//
|
||
|
|
||
|
USHORT InstanceNameLength;
|
||
|
USHORT InstanceNameBufferOffset;
|
||
|
|
||
|
//
|
||
|
// The altitude of this instance
|
||
|
//
|
||
|
|
||
|
USHORT AltitudeLength;
|
||
|
USHORT AltitudeBufferOffset;
|
||
|
|
||
|
//
|
||
|
// The volume name this instance is attached to
|
||
|
//
|
||
|
|
||
|
USHORT VolumeNameLength;
|
||
|
USHORT VolumeNameBufferOffset;
|
||
|
|
||
|
//
|
||
|
// The name of the minifilter associated with this instace
|
||
|
//
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
} MiniFilter;
|
||
|
|
||
|
//
|
||
|
// Legacyfilter information
|
||
|
//
|
||
|
|
||
|
struct {
|
||
|
|
||
|
//
|
||
|
// IASIL - Instance Aggregate Standard Information LegacyFilter flags
|
||
|
//
|
||
|
|
||
|
ULONG Flags;
|
||
|
|
||
|
//
|
||
|
// If set this volume is not current attached to a storage stack
|
||
|
//
|
||
|
|
||
|
#define FLTFL_IASIL_DETACHED_VOLUME 0x00000001
|
||
|
|
||
|
//
|
||
|
// The altitude of this attachment
|
||
|
//
|
||
|
|
||
|
USHORT AltitudeLength;
|
||
|
USHORT AltitudeBufferOffset;
|
||
|
|
||
|
//
|
||
|
// The volume name this filter is attached to
|
||
|
//
|
||
|
|
||
|
USHORT VolumeNameLength;
|
||
|
USHORT VolumeNameBufferOffset;
|
||
|
|
||
|
//
|
||
|
// The name of the filter associated with this attachment
|
||
|
//
|
||
|
|
||
|
USHORT FilterNameLength;
|
||
|
USHORT FilterNameBufferOffset;
|
||
|
|
||
|
} LegacyFilter;
|
||
|
|
||
|
} Type;
|
||
|
|
||
|
} INSTANCE_AGGREGATE_STANDARD_INFORMATION, *PINSTANCE_AGGREGATE_STANDARD_INFORMATION;
|
||
|
#endif // FLT_MGR_LONGHORN
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Message defintitions
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef struct _FILTER_MESSAGE_HEADER {
|
||
|
|
||
|
//
|
||
|
// OUT
|
||
|
//
|
||
|
// Total buffer length in bytes, including the FILTER_REPLY_HEADER, of
|
||
|
// the expected reply. If no reply is expected, 0 is returned.
|
||
|
//
|
||
|
|
||
|
ULONG ReplyLength;
|
||
|
|
||
|
//
|
||
|
// OUT
|
||
|
//
|
||
|
// Unique Id for this message. This will be set when the kernel message
|
||
|
// satifies this FilterGetMessage or FilterInstanceGetMessage request.
|
||
|
// If replying to this message, this is the MessageId that should be used.
|
||
|
//
|
||
|
|
||
|
ULONGLONG MessageId;
|
||
|
|
||
|
//
|
||
|
// General filter-specific buffer data follows...
|
||
|
//
|
||
|
|
||
|
} FILTER_MESSAGE_HEADER, *PFILTER_MESSAGE_HEADER;
|
||
|
|
||
|
typedef struct _FILTER_REPLY_HEADER {
|
||
|
|
||
|
//
|
||
|
// IN.
|
||
|
//
|
||
|
// Status of this reply. This status will be returned back to the filter
|
||
|
// driver who is waiting for a reply.
|
||
|
//
|
||
|
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
//
|
||
|
// IN
|
||
|
//
|
||
|
// Unique Id for this message. This id was returned in the
|
||
|
// FILTER_MESSAGE_HEADER from the kernel message to which we are replying.
|
||
|
//
|
||
|
|
||
|
ULONGLONG MessageId;
|
||
|
|
||
|
//
|
||
|
// General filter-specific buffer data follows...
|
||
|
//
|
||
|
|
||
|
} FILTER_REPLY_HEADER, *PFILTER_REPLY_HEADER;
|
||
|
|
||
|
#endif //FLT_MGR_BASELINE
|
||
|
|
||
|
#endif /* __FLT_USER_STRUCTURES_H__ */
|
||
|
|