mimikatz/inc/fltUserStructures.h

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__ */