| Server IP : 209.209.40.120 / Your IP : 216.73.217.112 Web Server : Microsoft-IIS/10.0 System : Windows NT NEWWWW 10.0 build 17763 (Windows Server 2019) i586 User : NEWWWW$ ( 0) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/shared/ |
Upload File : |
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
ntddvol.h
Abstract:
This module contains type and function definitions for NT volumes.
This module may contain definitions that are exposed in public
kit headers.
--*/
#ifndef _NTDDVOL_
#define _NTDDVOL_
#if _MSC_VER > 1000
#pragma once
#endif
#include <winapifamily.h>
#if _MSC_VER >= 1200
#pragma warning(push)
#pragma warning(disable:4820) /* padding added after data member */
#endif
#ifdef __cplusplus
extern "C" {
#endif
#pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#ifndef IOCTL_VOLUME_BASE
// begin_winioctl
#define IOCTL_VOLUME_BASE 0x00000056 // 'V'
#if (NTDDI_VERSION >= NTDDI_WIN2K)
//
// IOCTL to obtain the physical location of
// the specified volume on one or more disks.
//
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type VOLUME_DISK_EXTENTS
//
typedef struct _DISK_EXTENT {
//
// Specifies the storage device number of
// the disk on which this extent resides.
//
ULONG DiskNumber;
//
// Specifies the offset and length of this
// extent relative to the beginning of the
// disk.
//
LARGE_INTEGER StartingOffset;
LARGE_INTEGER ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;
typedef struct _VOLUME_DISK_EXTENTS {
//
// Specifies one or more contiguous range
// of sectors that make up this volume.
//
ULONG NumberOfDiskExtents;
DISK_EXTENT Extents[ANYSIZE_ARRAY];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
//
// IOCTLs to transition the specified volume
// between r/w and non r/w modes.
//
#define IOCTL_VOLUME_ONLINE CTL_CODE(IOCTL_VOLUME_BASE, 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLUME_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_VOLUME_ONLINE
// IOCTL_VOLUME_OFFLINE
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
#endif // NTDDI_VERSION >= NTDDI_WIN2K
#if (NTDDI_VERSION >= NTDDI_WINXP)
//
// IOCTL to determine whether the specified
// volume resides on a disk that is an online
// cluster resource or not.
//
#define IOCTL_VOLUME_IS_CLUSTERED CTL_CODE(IOCTL_VOLUME_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_IS_CLUSTERED
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
//
// IOCTL to query the attributes on volumes.
//
#define IOCTL_VOLUME_GET_GPT_ATTRIBUTES CTL_CODE(IOCTL_VOLUME_BASE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_GET_GPT_ATTRIBUTES
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type VOLUME_GET_GPT_ATTRIBUTES_INFORMATION
//
typedef struct _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION {
//
// Specifies all the attributes
// associated with this volume.
//
ULONGLONG GptAttributes;
} VOLUME_GET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION;
#endif // NTDDI_VERSION >= NTDDI_WINXP
// end_winioctl
#endif // IOCTL_VOLUME_BASE
#if (NTDDI_VERSION >= NTDDI_WIN2K)
//
// Legacy IOCTLs that were used to support
// clustering.
//
#define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLUME_IS_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLUME_IS_IO_CAPABLE CTL_CODE(IOCTL_VOLUME_BASE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLUME_QUERY_FAILOVER_SET CTL_CODE(IOCTL_VOLUME_BASE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE
// IOCTL_VOLUME_IS_OFFLINE
// IOCTL_VOLUME_IS_IO_CAPABLE
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
//
// IOCTL_VOLUME_QUERY_FAILOVER_SET
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type VOLUME_FAILOVER_SET
//
typedef struct _VOLUME_FAILOVER_SET {
//
// Specifies all of the disks that are
// part of the pack that this volume is
// part of.
//
ULONG NumberOfDisks;
ULONG DiskNumbers[ANYSIZE_ARRAY];
} VOLUME_FAILOVER_SET, *PVOLUME_FAILOVER_SET;
//
// IOCTL to obtain general information about
// the specified volume.
//
#define IOCTL_VOLUME_QUERY_VOLUME_NUMBER CTL_CODE(IOCTL_VOLUME_BASE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL CTL_CODE(IOCTL_VOLUME_BASE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL CTL_CODE(IOCTL_VOLUME_BASE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_QUERY_VOLUME_NUMBER
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type VOLUME_NUMBER
//
typedef struct _VOLUME_NUMBER {
//
// Specifies the number associated
// with this volume for the current
// session.
//
ULONG VolumeNumber;
//
// Specifies the name of the volume
// manager driver. If this is less
// than 8, it is padded with blanks.
//
WCHAR VolumeManagerName[8];
} VOLUME_NUMBER, *PVOLUME_NUMBER;
//
// IOCTL_VOLUME_LOGICAL_TO_PHYSICAL
//
// Input Buffer:
// Structure of type VOLUME_LOGICAL_OFFSET
//
// Output Buffer:
// Structure of type VOLUME_PHYSICAL_OFFSETS
//
typedef struct _VOLUME_LOGICAL_OFFSET {
//
// Specifies the logical location
// that needs to be translated to
// a physical location.
//
LONGLONG LogicalOffset;
} VOLUME_LOGICAL_OFFSET, *PVOLUME_LOGICAL_OFFSET;
typedef struct _VOLUME_PHYSICAL_OFFSET {
//
// Specifies the physical location
// that needs to be translated to
// a logical location.
//
ULONG DiskNumber;
LONGLONG Offset;
} VOLUME_PHYSICAL_OFFSET, *PVOLUME_PHYSICAL_OFFSET;
typedef struct _VOLUME_PHYSICAL_OFFSETS {
//
// Specifies one or more physical
// locations on which the logical
// location resides.
//
ULONG NumberOfPhysicalOffsets;
VOLUME_PHYSICAL_OFFSET PhysicalOffset[ANYSIZE_ARRAY];
} VOLUME_PHYSICAL_OFFSETS, *PVOLUME_PHYSICAL_OFFSETS;
//
// IOCTL_VOLUME_PHYSICAL_TO_LOGICAL
//
// Input Buffer:
// Structure of type VOLUME_PHYSICAL_OFFSET
//
// Output Buffer:
// Structure of type VOLUME_LOGICAL_OFFSET
//
#endif // NTDDI_VERSION >= NTDDI_WIN2K
#if (NTDDI_VERSION >= NTDDI_WINXP)
//
// IOCTL to determine whether the volume
// is suitable for OS installation or not.
//
#define IOCTL_VOLUME_IS_PARTITION CTL_CODE(IOCTL_VOLUME_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_IS_PARTITION
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
//
// IOCTL to perform a read operation from
// the specified plex of a mirrored volume.
//
#define IOCTL_VOLUME_READ_PLEX CTL_CODE(IOCTL_VOLUME_BASE, 11, METHOD_OUT_DIRECT, FILE_READ_ACCESS)
//
// IOCTL_VOLUME_READ_PLEX
//
// Input Buffer:
// Structure of type VOLUME_READ_PLEX_INPUT
//
// Output Buffer:
// None
//
typedef struct _VOLUME_READ_PLEX_INPUT {
//
// Specifies the offset within the
// volume from where to read data.
//
LARGE_INTEGER ByteOffset;
//
// Specifies the amount of data in
// bytes to be read in.
//
ULONG Length;
//
// Specifies the plex from which the
// data is to be read in.
//
ULONG PlexNumber;
} VOLUME_READ_PLEX_INPUT, *PVOLUME_READ_PLEX_INPUT;
//
// IOCTL to modify the attributes on volumes.
//
#define IOCTL_VOLUME_SET_GPT_ATTRIBUTES CTL_CODE(IOCTL_VOLUME_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_SET_GPT_ATTRIBUTES
//
// Input Buffer:
// Structure of type VOLUME_SET_GPT_ATTRIBUTES_INFORMATION
//
// Output Buffer:
// None
//
typedef struct _VOLUME_SET_GPT_ATTRIBUTES_INFORMATION {
//
// Specifies the attributes that
// are to be applied to the volume
//
ULONGLONG GptAttributes;
//
// Indicates whether this is to be
// undone when the handle is closed
//
BOOLEAN RevertOnClose;
//
// Indicates whether the attributes
// apply to all the volumes on the
// disk that this volume resides on
// Required if the disk layout is MBR
//
BOOLEAN ApplyToAllConnectedVolumes;
//
// For alignment purposes.
//
USHORT Reserved1;
ULONG Reserved2;
} VOLUME_SET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_SET_GPT_ATTRIBUTES_INFORMATION;
#endif // NTDDI_VERSION >= NTDDI_WINXP
#if (NTDDI_VERSION >= NTDDI_VISTA)
//
// IOCTLs for bandwidth contracts
// on volumes.
//
#define IOCTL_VOLUME_GET_BC_PROPERTIES CTL_CODE(IOCTL_VOLUME_BASE, 15, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLUME_ALLOCATE_BC_STREAM CTL_CODE(IOCTL_VOLUME_BASE, 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLUME_FREE_BC_STREAM CTL_CODE(IOCTL_VOLUME_BASE, 17, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLUME_BC_VERSION 1
//
// IOCTL_VOLUME_GET_BC_PROPERTIES
//
// Input Buffer:
// Structure of type VOLUME_GET_BC_PROPERTIES_INPUT
//
// Output Buffer:
// Structure of type VOLUME_GET_BC_PROPERTIES_OUTPUT
//
typedef struct _VOLUME_GET_BC_PROPERTIES_INPUT {
//
// Specifies the corresponding structure
// version.
//
ULONG Version;
//
// For alignment purposes.
//
ULONG Reserved1;
//
// Specifies the lowest byte offset of
// the file that is to be streamed.
//
ULONGLONG LowestByteOffset;
//
// Specifies the highest byte offset of
// the file that is to be streamed.
//
ULONGLONG HighestByteOffset;
//
// Indicates whether requests shall be
// comprised of reads, writes or both.
//
ULONG AccessType;
//
// Indicates whether the Io requests to
// the file will be sequential or not.
//
ULONG AccessMode;
} VOLUME_GET_BC_PROPERTIES_INPUT, *PVOLUME_GET_BC_PROPERTIES_INPUT;
typedef struct _VOLUME_GET_BC_PROPERTIES_OUTPUT {
//
// Specifies the maximum number of requests
// that can be scheduled per period of time.
//
ULONG MaximumRequestsPerPeriod;
//
// Specifies the minimum period that the
// device uses when scheduling requests.
//
ULONG MinimumPeriod;
//
// Specifies the maximum transfer size supported
// for bandwidth contracts on this device. To
// achieve the highest level of performance, all
// requests should be of this size.
//
ULONGLONG MaximumRequestSize;
//
// Specifies the estimated time taken to
// perform an Io operation. This field
// is for informational purposes only.
//
ULONG EstimatedTimePerRequest;
//
// Specifies the number of requests that should be
// kept outstanding. This helps keep the device
// device busy and thus obtain maximum throughput
// This will only be filled in if the target file
// has an outstanding contract.
//
ULONG NumOutStandingRequests;
//
// Specifies the required size of requests in this
// stream. This will only be filled in if the
// target file has an outstanding contract.
//
ULONGLONG RequestSize;
} VOLUME_GET_BC_PROPERTIES_OUTPUT, *PVOLUME_GET_BC_PROPERTIES_OUTPUT;
//
// IOCTL_VOLUME_ALLOCATE_BC_STREAM
//
// Input Buffer:
// Structure of type VOLUME_ALLOCATE_BC_STREAM_INPUT
//
// Output Buffer:
// Structure of type VOLUME_ALLOCATE_BC_STREAM_OUTPUT
//
typedef struct _VOLUME_ALLOCATE_BC_STREAM_INPUT {
//
// Specifies the corresponding structure
// version.
//
ULONG Version;
//
// Specifies the number of requests that
// need to complete per period of time.
//
ULONG RequestsPerPeriod;
//
// Specifies the period of time wherein the
// above number of requests must complete.
//
ULONG Period;
//
// Indicates whether failures should be
// be retried or not.
//
BOOLEAN RetryFailures;
//
// Indicates whether reqests that miss
// their deadline should be discarded
// or not.
//
BOOLEAN Discardable;
//
// For alignment purposes.
//
BOOLEAN Reserved1[2];
//
// Specifies the lowest byte offset of
// the file that is to be streamed.
//
ULONGLONG LowestByteOffset;
//
// Specifies the highest byte offset of
// the file that is to be streamed.
//
ULONGLONG HighestByteOffset;
//
// Indicates whether requests shall be
// comprised of reads, writes or both.
//
ULONG AccessType;
//
// Indicates whether the Io requests to
// the file will be sequential or not.
//
ULONG AccessMode;
} VOLUME_ALLOCATE_BC_STREAM_INPUT, *PVOLUME_ALLOCATE_BC_STREAM_INPUT;
typedef struct _VOLUME_ALLOCATE_BC_STREAM_OUTPUT {
//
// Specifies the required size
// of requests in this stream.
//
ULONGLONG RequestSize;
//
// Specifies the number of requests that should be
// kept outstanding. This helps keep the device
// device busy and thus obtain maximum throughput.
//
ULONG NumOutStandingRequests;
} VOLUME_ALLOCATE_BC_STREAM_OUTPUT, *PVOLUME_ALLOCATE_BC_STREAM_OUTPUT;
//
// IOCTL_VOLUME_FREE_BC_STREAM
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
//
// IOCTL to differentiate between basic and
// dynamic volumes.
//
#define IOCTL_VOLUME_IS_DYNAMIC CTL_CODE(IOCTL_VOLUME_BASE, 18, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_IS_DYNAMIC
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type BOOLEAN
//
//
// IOCTL to inform the storage stack of
// runs that contain a special file.
//
#define IOCTL_VOLUME_PREPARE_FOR_CRITICAL_IO CTL_CODE(IOCTL_VOLUME_BASE, 19, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_VOLUME_PREPARE_FOR_CRITICAL_IO
//
// Input Buffer:
// Structure of type VOLUME_CRITICAL_IO
//
// Output Buffer:
// None
//
typedef struct _FILE_EXTENT {
ULONGLONG VolumeOffset;
ULONGLONG ExtentLength;
} FILE_EXTENT, *PFILE_EXTENT;
typedef struct _VOLUME_CRITICAL_IO {
//
// Indicates whether requests shall be
// comprised of reads, writes or both.
//
ULONG AccessType;
//
// Count of the number of extents that
// are contained within this structure.
//
ULONG ExtentsCount;
//
// Specifies the extents along which
// the critical Io will be performed.
//
FILE_EXTENT Extents[ANYSIZE_ARRAY];
} VOLUME_CRITICAL_IO, *PVOLUME_CRITICAL_IO;
//
// IOCTL to provide hints to the file system
// as to where to place new file allocations.
//
#define IOCTL_VOLUME_QUERY_ALLOCATION_HINT CTL_CODE(IOCTL_VOLUME_BASE, 20, METHOD_OUT_DIRECT, FILE_READ_ACCESS)
//
// IOCTL_VOLUME_QUERY_ALLOCATION_HINT
//
// Input Buffer:
// Structure of type VOLUME_ALLOCATION_HINT_INPUT
//
// Output Buffer:
// Structure of type VOLUME_ALLOCATION_HINT_OUTPUT
//
typedef struct _VOLUME_ALLOCATION_HINT_INPUT {
//
// Specifies the granularity of
// the bitmap being requested.
//
ULONG ClusterSize;
//
// Specifies the count of bits
// that are being requested.
//
ULONG NumberOfClusters;
//
// Specifies the first cluster
// that is to be evaluated.
//
LONGLONG StartingClusterNumber;
} VOLUME_ALLOCATION_HINT_INPUT, *PVOLUME_ALLOCATION_HINT_INPUT;
typedef struct _VOLUME_ALLOCATION_HINT_OUTPUT {
//
// Specifies the bits, 1 per cluster
// indicating all of the good places
// where file data may be allocated
// These bits are represented by a 0.
//
ULONG Bitmap[ANYSIZE_ARRAY];
} VOLUME_ALLOCATION_HINT_OUTPUT, *PVOLUME_ALLOCATION_HINT_OUTPUT;
//
// IOCTL to inform the storage stack to
// discard and re-query any information
// about the specified volume that might
// have been cached.
//
#define IOCTL_VOLUME_UPDATE_PROPERTIES CTL_CODE(IOCTL_VOLUME_BASE, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_UPDATE_PROPERTIES
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
//
// IOCTLs to coordinate a shrink operation
// with the drivers in the storage stack.
//
#define IOCTL_VOLUME_QUERY_MINIMUM_SHRINK_SIZE CTL_CODE(IOCTL_VOLUME_BASE, 22, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLUME_PREPARE_FOR_SHRINK CTL_CODE(IOCTL_VOLUME_BASE, 23, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_VOLUME_QUERY_MINIMUM_SHRINK_SIZE
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type VOLUME_SHRINK_INFO
//
//
// IOCTL_VOLUME_PREPARE_FOR_SHRINK
//
// Input Buffer:
// Structure of type VOLUME_SHRINK_INFO
//
// Output Buffer:
// None
//
typedef struct _VOLUME_SHRINK_INFO {
//
// Specifies the size in bytes to
// which the volume can be or is
// going to be reduced down to.
//
ULONGLONG VolumeSize;
} VOLUME_SHRINK_INFO, *PVOLUME_SHRINK_INFO;
#endif // NTDDI_VERSION >= NTDDI_VISTA
#if (NTDDI_VERSION >= NTDDI_WIN8)
//
// IOCTL to differentiate between regular and
// csv volumes.
//
#define IOCTL_VOLUME_IS_CSV CTL_CODE(IOCTL_VOLUME_BASE, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTL_VOLUME_IS_CSV
//
// Input Buffer:
// None
//
// Output Buffer:
// Structure of type BOOLEAN
//
#define IOCTL_VOLUME_POST_ONLINE CTL_CODE(IOCTL_VOLUME_BASE, 25, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_VOLUME_POST_ONLINE
//
// Input Buffer:
// None
//
// Output Buffer:
// None
//
#define IOCTL_VOLUME_GET_CSVBLOCKCACHE_CALLBACK CTL_CODE(IOCTL_VOLUME_BASE, 26, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#ifdef _KERNEL_MODE
typedef struct _CSV_FILECACHE_CONTEXT {
union {
struct {
//
// IO Status
//
IO_STATUS_BLOCK IoStatus;
//
// Fields from IRP
// Flags
ULONG IrpFlags;
//
// Major/minor functions from IRP
//
UCHAR MajorFunction;
UCHAR MinorFunction;
//
// The flags associated with operations.
// The IO_STACK_LOCATION.Flags field in the old model (SL_* flags)
//
UCHAR OperationFlags;
//
// IO Parameters
//
ULONG Length; // Length of IO transfer
ULONG Key;
LARGE_INTEGER ByteOffset; // Offset to read/write from
PVOID MdlAddress; // Mdl address for the buffer
} ReadWrite;
struct {
ULONGLONG Length; // Length of data to purge
LARGE_INTEGER ByteOffset; // Offset to purge from
} Purge;
} Parameters;
GUID StreamId; // Id unique per file-stream
PVOID CsvIoContext; // Internal context used by Csv.
PVOID DriverContext; // Drivers can save their context here.
} CSV_FILECACHE_CONTEXT, *PCSV_FILECACHE_CONTEXT;
// cache callbacks
typedef
_Function_class_(CSV_BLOCKCACHE_PURGE_CACHE)
_IRQL_requires_max_(PASSIVE_LEVEL)
void (*CSV_BLOCKCACHE_PURGE_CACHE) (_Inout_ PVOID CallbackContext,
_In_ ULONGLONG Offset,
_In_ ULONGLONG Length);
typedef
_Function_class_(CSV_BLOCKCACHE_DISABLE_CACHE)
_IRQL_requires_max_(PASSIVE_LEVEL)
void (*CSV_BLOCKCACHE_DISABLE_CACHE) (_Inout_ PVOID CallbackContext);
typedef
_Function_class_(CSV_BLOCKCACHE_ENABLE_CACHE)
_IRQL_requires_max_(PASSIVE_LEVEL)
LONG (*CSV_BLOCKCACHE_ENABLE_CACHE) (_Inout_ PVOID CallbackContext);
// V2 Callbacks
typedef
_Function_class_(CSV_FILECACHE_PURGE_RDCACHE)
_IRQL_requires_max_(PASSIVE_LEVEL)
void (*CSV_FILECACHE_PURGE_RDCACHE) (_Inout_ PVOID CallbackContext,
_In_ PCSV_FILECACHE_CONTEXT CSVContext);
typedef
_Function_class_(CSV_FILECACHE_HANDLE_CACHE_IO)
_IRQL_requires_max_(PASSIVE_LEVEL)
LONG (*CSV_FILECACHE_HANDLE_CACHE_IO) (_Inout_ PVOID CallbackContext,
_Inout_ PCSV_FILECACHE_CONTEXT CSVContext);
typedef
_Function_class_(CSV_FILECACHE_COMPLETE_CACHE_MISS)
_IRQL_requires_max_(DISPATCH_LEVEL)
void (*CSV_FILECACHE_COMPLETE_CACHE_MISS) (_Inout_ PVOID CallbackContext,
_Inout_ PCSV_FILECACHE_CONTEXT CSVContext);
// Callback Provided by Csvfs
typedef
_Function_class_(CSV_FILECACHE_HANDLE_CACHE_MISS)
_IRQL_requires_max_(PASSIVE_LEVEL)
LONG (*CSV_FILECACHE_HANDLE_CACHE_MISS) (_Inout_ PCSV_FILECACHE_CONTEXT CSVContext);
typedef
_Function_class_(CSV_FILECACHE_COMPLETE_CACHE_IO)
_IRQL_requires_max_(DISPATCH_LEVEL)
void (*CSV_FILECACHE_COMPLETE_CACHE_IO) (_Inout_ PCSV_FILECACHE_CONTEXT CSVContext);
//
// IOCTL_VOLUME_GET_CSVBLOCKCACHE_CALLBACK
//
// Input Buffer:
// Structure of type CSV_FILECACHE_CALLBACKS
//
// Output Buffer:
#define CSV_BLOCK_CACHE_CALLBACK_VERSION 01
#define CSV_BLOCK_AND_FILE_CACHE_CALLBACK_VERSION 02
typedef struct _CSV_BLOCKCACHE_CALLBACK {
ULONG Version;
CSV_BLOCKCACHE_PURGE_CACHE PurgeCache;
CSV_BLOCKCACHE_ENABLE_CACHE CacheEnable;
CSV_BLOCKCACHE_DISABLE_CACHE CacheDisable;
PVOID CallbackContext;
} CSV_BLOCKCACHE_CALLBACK, *PCSV_BLOCKCACHE_CALLBACK;
#pragma warning( push )
#pragma warning( disable : 4201 ) // error C4201: nonstandard extension used : nameless struct/union
#ifdef __cplusplus
typedef struct _CSV_CACHE_CALLBACK_V2_OUTPUT : public CSV_BLOCKCACHE_CALLBACK {
#else
typedef struct _CSV_CACHE_CALLBACK_V2_OUTPUT
{
CSV_BLOCKCACHE_CALLBACK;
#endif
CSV_FILECACHE_HANDLE_CACHE_IO HandleCacheIo;
CSV_FILECACHE_COMPLETE_CACHE_MISS CompleteCacheMiss;
CSV_FILECACHE_PURGE_RDCACHE PurgeFileCache;
} CSV_CACHE_CALLBACK_V2_OUTPUT, *PCSV_CACHE_CALLBACK_V2_OUTPUT,
CSV_CACHE_CALLBACK, *PCSV_CACHE_CALLBACK;
#pragma warning( pop )
typedef struct _CSV_CACHE_CALLBACK_V2_INPUT {
CSV_FILECACHE_HANDLE_CACHE_MISS HandleCacheMiss;
CSV_FILECACHE_COMPLETE_CACHE_IO CompleteCacheIo;
} CSV_CACHE_CALLBACK_V2_INPUT, *PCSV_CACHE_CALLBACK_V2_INPUT,
CSV_CACHE_CALLBACK_INPUT, *PCSV_CACHE_CALLBACK_INPUT;
// Define V3 Contexts here for now.
typedef enum _CSV_FILECACHE_IO_TYPE
{
CSV_FILECACHE_IO_TYPE_READWRITE = 0,
CSV_FILECACHE_IO_TYPE_PURGE = 1,
} CSV_FILECACHE_IO_TYPE;
typedef struct _CSV_FILECACHE_IO_CONTEXT
{
CSV_FILECACHE_IO_TYPE Type;
union
{
struct
{
IRP *m_pIrp;
IO_STACK_LOCATION *m_pStackLocation;
} ReadWrite;
struct
{
LARGE_INTEGER StartOffset;
LARGE_INTEGER EndOffset;
BOOLEAN fHard;
} Purge;
} Parameters;
VOID *m_pFileContext;
ULONGLONG m_ExtraContext[1];
} CSV_FILECACHE_IO_CONTEXT, *PCSV_FILECACHE_IO_CONTEXT;
typedef struct _CSV_FILECACHE_IO_RANGE
{
ULONGLONG Offset;
ULONG Length;
} CSV_FILECACHE_IO_RANGE;
// Callback Provided by Csvfs
typedef
_Function_class_(CSV_FILECACHE_HANDLE_CACHE_MISS_V2)
_IRQL_requires_max_(PASSIVE_LEVEL)
void(*CSV_FILECACHE_HANDLE_CACHE_MISS_V2) (_Inout_ PCSV_FILECACHE_IO_CONTEXT pContext, ULONG cRanges, CSV_FILECACHE_IO_RANGE const * pNotRequiredRanges);
typedef
_Function_class_(CSV_FILECACHE_COMPLETE_CACHE_IO_V2)
_IRQL_requires_max_(DISPATCH_LEVEL)
void(*CSV_FILECACHE_COMPLETE_CACHE_IO_V2) (_Inout_ PCSV_FILECACHE_IO_CONTEXT pContext);
typedef struct _CSV_CACHE_CALLBACK_V3_INPUT {
CSV_FILECACHE_HANDLE_CACHE_MISS_V2 HandleCacheMiss;
CSV_FILECACHE_COMPLETE_CACHE_IO_V2 CompleteCacheIo;
} CSV_CACHE_CALLBACK_V3_INPUT, *PCSV_CACHE_CALLBACK_V3_INPUT;
//CSV_CACHE_CALLBACK_INPUT, *PCSV_CACHE_CALLBACK_INPUT;
typedef struct _CSV_FILECACHE_FILE_CONTEXT_EXTENSION
CSV_FILECACHE_FILE_CONTEXT_EXTENSION, *PCSV_FILECACHE_FILE_CONTEXT_EXTENSION;
typedef GUID FILE_SIG_T;
typedef GUID VOLUME_SIG_T;
typedef NTSTATUS(*CSV_FILECACHE_FILE_CREATE) (PVOID pRegContext, VOLUME_SIG_T const * volSig, FILE_SIG_T const * fileSig, PVOID * ppContext);
typedef void(*CSV_FILECACHE_FILE_CLOSE) (PVOID pRegContext, PVOID pContext);
typedef void(*CSV_FILECACHE_HANDLE_CACHE_IO_V2) (PVOID pRegContext, PCSV_FILECACHE_IO_CONTEXT pContext);
typedef void(*CSV_FILECACHE_COMPLETE_CACHE_MISS_V2) (PVOID pRegContext, PCSV_FILECACHE_IO_CONTEXT pContext);
typedef PCSV_FILECACHE_FILE_CONTEXT_EXTENSION (*CSV_FILECACHE_FILE_SET_EXTENSION) (PVOID pRegContext, PCSV_FILECACHE_IO_CONTEXT pContext, PCSV_FILECACHE_FILE_CONTEXT_EXTENSION pExtension);
typedef PCSV_FILECACHE_FILE_CONTEXT_EXTENSION (*CSV_FILECACHE_FILE_GET_EXTENSION) (PVOID pRegContext, PCSV_FILECACHE_IO_CONTEXT pContext);
typedef
_Function_class_(CSV_FILECACHE_CLEANUP_CACHE)
_IRQL_requires_max_(PASSIVE_LEVEL)
void (*CSV_FILECACHE_CLEANUP_CACHE) (_Inout_ PVOID pRegContext);
#pragma warning( push )
#pragma warning( disable : 4201 ) // error C4201: nonstandard extension used : nameless struct/union
#ifdef __cplusplus
typedef struct _CSV_CACHE_CALLBACK_V3_OUTPUT : public CSV_BLOCKCACHE_CALLBACK {
#else
typedef struct _CSV_CACHE_CALLBACK_V3_OUTPUT
{
CSV_BLOCKCACHE_CALLBACK;
#endif
PVOID FileCacheCallbackContext;
ULONG IoContextBytesRequired;
CSV_FILECACHE_CLEANUP_CACHE CacheCleanup;
CSV_FILECACHE_FILE_CREATE FileCreate;
CSV_FILECACHE_FILE_CLOSE FileClose;
CSV_FILECACHE_HANDLE_CACHE_IO_V2 HandleCacheIo;
CSV_FILECACHE_COMPLETE_CACHE_MISS_V2 CompleteCacheMiss;
CSV_FILECACHE_FILE_SET_EXTENSION FileSetExtension;
CSV_FILECACHE_FILE_GET_EXTENSION FileGetExtension;
} CSV_CACHE_CALLBACK_V3_OUTPUT, *PCSV_CACHE_CALLBACK_V3_OUTPUT;
//CSV_CACHE_CALLBACK, *PCSV_CACHE_CALLBACK;
#pragma warning( push )
#endif // KERNEL_MODE
#endif // NTDDI_VERSION >= NTDDI_WIN8
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#ifdef __cplusplus
}
#endif
#if _MSC_VER >= 1200
#pragma warning(pop)
#endif
#endif // _NTDDVOL_