/*++

Copyright (c) Microsoft Corporation. All rights reserved.

Module Name:

    ntddsnap.h

Abstract:

    This header file defines the public interface for the volume snapshot
    driver.

Author:

    Norbert P. Kusters  (norbertk)  30-July-1999

Notes:

Revision History:

    Adi Oltean          (aoltean)   08-May-2001 - Added Application Info GUID for Client accessible snapshots

--*/

#ifndef _NTDDSNAP_
#define _NTDDSNAP_

#define VOLSNAPCONTROLTYPE  ((ULONG) 'S') // ntifs

//
// The following IOCTLs are intended for proper volumes.
//

#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES         CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // ntifs
#define IOCTL_VOLSNAP_RELEASE_WRITES                CTL_CODE(VOLSNAPCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_PREPARE_FOR_SNAPSHOT          CTL_CODE(VOLSNAPCONTROLTYPE, 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_ABORT_PREPARED_SNAPSHOT       CTL_CODE(VOLSNAPCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_COMMIT_SNAPSHOT               CTL_CODE(VOLSNAPCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_END_COMMIT_SNAPSHOT           CTL_CODE(VOLSNAPCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_QUERY_NAMES_OF_SNAPSHOTS      CTL_CODE(VOLSNAPCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLSNAP_CLEAR_DIFF_AREA               CTL_CODE(VOLSNAPCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_ADD_VOLUME_TO_DIFF_AREA       CTL_CODE(VOLSNAPCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_QUERY_DIFF_AREA               CTL_CODE(VOLSNAPCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLSNAP_SET_MAX_DIFF_AREA_SIZE        CTL_CODE(VOLSNAPCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_QUERY_DIFF_AREA_SIZES         CTL_CODE(VOLSNAPCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLSNAP_DELETE_OLDEST_SNAPSHOT        CTL_CODE(VOLSNAPCONTROLTYPE, 12, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_AUTO_CLEANUP                  CTL_CODE(VOLSNAPCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VOLSNAP_DELETE_SNAPSHOT               CTL_CODE(VOLSNAPCONTROLTYPE, 14, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

//
// The following IOCTLs are intended for volume snapshots.
//

#define IOCTL_VOLSNAP_QUERY_ORIGINAL_VOLUME_NAME    CTL_CODE(VOLSNAPCONTROLTYPE, 100, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLSNAP_QUERY_CONFIG_INFO             CTL_CODE(VOLSNAPCONTROLTYPE, 101, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_VOLSNAP_SET_APPLICATION_INFO          CTL_CODE(VOLSNAPCONTROLTYPE, 102, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_VOLSNAP_QUERY_APPLICATION_INFO        CTL_CODE(VOLSNAPCONTROLTYPE, 103, METHOD_BUFFERED, FILE_READ_ACCESS)

//
// Input buffer for IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES.
//

typedef struct _VOLSNAP_FLUSH_AND_HOLD_INPUT {
    GUID    InstanceId;
    ULONG   NumberOfVolumesToFlush;
    USHORT  SecondsToHoldFileSystemsTimeout;    // 60 seconds recommended.
    USHORT  SecondsToHoldIrpsTimeout;           // 10 seconds recommended.
} VOLSNAP_FLUSH_AND_HOLD_INPUT, *PVOLSNAP_FLUSH_AND_HOLD_INPUT;

//
// Input buffer for IOCTL_VOLSNAP_PREPARE_FOR_SNAPSHOT.
//

#define VOLSNAP_ATTRIBUTE_PERSISTENT    (0x1)
#define VOLSNAP_ALL_ATTRIBUTES          (0x1)

typedef struct _VOLSNAP_PREPARE_INFO {
    ULONG       Attributes;
    ULONG       Reserved;                   // Must be 0.
    LONGLONG    InitialDiffAreaAllocation;  // 100 MB recommended.
} VOLSNAP_PREPARE_INFO, *PVOLSNAP_PREPARE_INFO;

//
// Output buffer for IOCTL_VOLSNAP_END_COMMIT_SNAPSHOT.
// Input buffer for IOCTL_VOLSNAP_ADD_VOLUME_TO_DIFF_AREA.
// Output buffer for IOCTL_VOLSNAP_QUERY_ORIGINAL_VOLUME_NAME.
// Input buffer for IOCTL_VOLSNAP_DELETE_SNAPSHOT.
//

typedef struct _VOLSNAP_NAME {
    USHORT  NameLength;
    WCHAR   Name[1];
} VOLSNAP_NAME, *PVOLSNAP_NAME;

//
// Input buffer for IOCTL_VOLSNAP_SET_DIFF_AREA.
// Output buffer for IOCTL_VOLSNAP_QUERY_NAMES_OF_SNAPSHOTS and
// IOCTL_VOLSNAP_QUERY_DIFF_AREA.
//

typedef struct _VOLSNAP_NAMES {
    ULONG   MultiSzLength;
    WCHAR   Names[1];
} VOLSNAP_NAMES, *PVOLSNAP_NAMES;

//
// Output buffer for IOCTL_VOLSNAP_QUERY_DIFF_AREA_SIZES.
// Input buffer for IOCTL_VOLSNAP_SET_MAX_DIFF_AREA_SIZE.
//

typedef struct _VOLSNAP_DIFF_AREA_SIZES {
    LONGLONG    UsedVolumeSpace;        // This value is ignored on a SET call.
    LONGLONG    AllocatedVolumeSpace;
    LONGLONG    MaximumVolumeSpace;     // A value of 0 indicates no maximum.
} VOLSNAP_DIFF_AREA_SIZES, *PVOLSNAP_DIFF_AREA_SIZES;

//
// Output buffer for IOCTL_VOLSNAP_QUERY_CONFIG_INFO.
//

typedef struct _VOLSNAP_CONFIG_INFO {
    ULONG           Attributes;
    ULONG           Reserved;
    LARGE_INTEGER   SnapshotCreationTime;
} VOLSNAP_CONFIG_INFO, *PVOLSNAP_CONFIG_INFO;

//
// Input buffer for IOCTL_VOLSNAP_END_COMMIT_SNAPSHOT.
// Input buffer for IOCTL_VOLSNAP_SET_APPLICATION_INFO.
// Output buffer for IOCTL_VOLSNAP_QUERY_APPLICATION_INFO.
//

typedef struct _VOLSNAP_APPLICATION_INFO {
    ULONG   InformationLength;
    UCHAR   Information[1];
    //
    // It is highly recommended that the first 16 bytes from the 
    // Application Info should be a unique GUID indentifying the 
    // unique structure layout of the subsequent Application Info.
    //
} VOLSNAP_APPLICATION_INFO, *PVOLSNAP_APPLICATION_INFO;


#ifdef DEFINE_GUID

//
// This GUID denotes the first 16 bytes from the Application 
// Info structure associated with Client accessible snapshots.  
//
// {E5DE7D45-49F2-40a4-817C-7DC82B72587F}
DEFINE_GUID(VOLSNAP_APPINFO_GUID_CLIENT_ACCESSIBLE, 
0xe5de7d45, 0x49f2, 0x40a4, 0x81, 0x7c, 0x7d, 0xc8, 0x2b, 0x72, 0x58, 0x7f);

#endif // DEFINE_GUID


#endif
