////////////////////////////////////////////////////////////////////
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
// All rights reserved
// This file was released under the GPLv2 on June 2015.
////////////////////////////////////////////////////////////////////
/*

Module Name:

    udfpubl.h

Abstract:

    This file defines the interface between UDFFS driver & user
    applications | drivers.

Environment:

    NT kernel mode or Win32 app
 */

#ifndef __UDF_PUBL_H__
#define __UDF_PUBL_H__

#pragma pack(push, 8)

#ifndef CTL_CODE
#include "winioctl.h"
#endif

#ifndef IOCTL_UDFFS_BASE
#define IOCTL_UDFFS_BASE        0x00000911
#endif

#ifndef IOCTL_UDF_DISABLE_DRIVER
#define IOCTL_UDF_DISABLE_DRIVER                CTL_CODE(IOCTL_UDFFS_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_ENABLE_DRIVER                 CTL_CODE(IOCTL_UDFFS_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_INVALIDATE_VOLUMES            CTL_CODE(IOCTL_UDFFS_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_GET_RETRIEVAL_POINTERS        CTL_CODE(IOCTL_UDFFS_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_GET_FILE_ALLOCATION_MODE      CTL_CODE(IOCTL_UDFFS_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_SET_FILE_ALLOCATION_MODE      CTL_CODE(IOCTL_UDFFS_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_LOCK_VOLUME_BY_PID            CTL_CODE(IOCTL_UDFFS_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_UNLOCK_VOLUME_BY_PID          CTL_CODE(IOCTL_UDFFS_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_SEND_LICENSE_KEY              CTL_CODE(IOCTL_UDFFS_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_GET_SPEC_RETRIEVAL_POINTERS   CTL_CODE(IOCTL_UDFFS_BASE, 0x000a, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_UDF_GET_VERSION                   CTL_CODE(IOCTL_UDFFS_BASE, 0x000b, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_UDF_SET_NOTIFICATION_EVENT        CTL_CODE(IOCTL_UDFFS_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_UDF_IS_VOLUME_JUST_MOUNTED        CTL_CODE(IOCTL_UDFFS_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_UDF_REGISTER_AUTOFORMAT           CTL_CODE(IOCTL_UDFFS_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_UDF_SET_OPTIONS                   CTL_CODE(IOCTL_UDFFS_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct _UDF_GET_FILE_ALLOCATION_MODE_OUT {

    CHAR  AllocMode; // see definition of ICB_FLAG_AD_XXX in Ecma_167.h

} UDF_GET_FILE_ALLOCATION_MODE_OUT, *PUDF_GET_FILE_ALLOCATION_MODE_OUT;

// setting default AllocMode
//#define ICB_FLAG_AD_DEFAULT_ALLOC_MODE     (UCHAR)(0xff)

typedef UDF_GET_FILE_ALLOCATION_MODE_OUT  UDF_SET_FILE_ALLOCATION_MODE_IN;
typedef PUDF_GET_FILE_ALLOCATION_MODE_OUT PUDF_SET_FILE_ALLOCATION_MODE_IN;

/*typedef struct _RETRIEVAL_POINTERS_BUFFER {
   int a;
} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
*/
typedef struct _UDF_LOCK_VOLUME_BY_PID_IN {
    ULONG  PID; // -1 for current process
} UDF_LOCK_VOLUME_BY_PID_IN, *PUDF_LOCK_VOLUME_BY_PID_IN;

typedef UDF_LOCK_VOLUME_BY_PID_IN  UDF_UNLOCK_VOLUME_BY_PID_IN;
typedef PUDF_LOCK_VOLUME_BY_PID_IN PUDF_UNLOCK_VOLUME_BY_PID_IN;

#define UDF_DOS_FS_NAME L"\\DosDevices\\DwUdf"
#define UDF_WIN_FS_NAME "\\\\.\\DwUdf"

#define UDF_ISO_STREAM_NAME   "UdfIsoBridgeStructure"
#define UDF_ISO_STREAM_NAME_W L"UdfIsoBridgeStructure"

#define UDF_CONFIG_STREAM_NAME   "DvdWriteNow.cfg"
#define UDF_CONFIG_STREAM_NAME_W L"DvdWriteNow.cfg"

#ifdef FSCTL_GET_RETRIEVAL_POINTERS

typedef struct _UDF_GET_SPEC_RETRIEVAL_POINTERS_IN {
    STARTING_VCN_INPUT_BUFFER Standard;
    ULONG                     Special;
} UDF_GET_SPEC_RETRIEVAL_POINTERS_IN, *PUDF_GET_SPEC_RETRIEVAL_POINTERS_IN;

#endif //FSCTL_GET_RETRIEVAL_POINTERS

typedef struct _UDF_GET_VERSION_OUT {
    struct {
        ULONG                     Length;
        ULONG                     DriverVersionMj;
        ULONG                     DriverVersionMn;
        ULONG                     DriverVersionBuild;
    } header;
    ULONG                     FSVersionMj;
    ULONG                     FSVersionMn;
    ULONG                     FSFlags;
    ULONG                     FSCompatFlags;
    ULONG                     FSCfgVersion;
} UDF_GET_VERSION_OUT, *PUDF_GET_VERSION_OUT;

#define UDF_USER_FS_FLAGS_RO             0x0001
#define UDF_USER_FS_FLAGS_RAW            0x0002
#define UDF_USER_FS_FLAGS_OUR_DRIVER     0x0004
#define UDF_USER_FS_FLAGS_FP             0x0008
#define UDF_USER_FS_FLAGS_MEDIA_RO       0x0010
#define UDF_USER_FS_FLAGS_SOFT_RO        0x0020
#define UDF_USER_FS_FLAGS_HW_RO          0x0040
#define UDF_USER_FS_FLAGS_MEDIA_DEFECT_RO 0x0080
#define UDF_USER_FS_FLAGS_PART_RO        0x0100     // partition is r/o
#define UDF_USER_FS_FLAGS_NEW_FS_RO      0x0200

#endif  //IOCTL_UDF_DISABLE_DRIVER

#define         UDF_PART_DAMAGED_RW                 (0x00)
#define         UDF_PART_DAMAGED_RO                 (0x01)
#define         UDF_PART_DAMAGED_NO                 (0x02)

typedef struct _UDF_SET_OPTIONS_IN {
    struct {
        ULONG       HdrLength;
        ULONG       Flags;
    } header;
    UCHAR       Data[1];
} UDF_SET_OPTIONS_IN, *PUDF_SET_OPTIONS_IN;

#define  UDF_SET_OPTIONS_FLAG_TEMPORARY    0x00
#define  UDF_SET_OPTIONS_FLAG_DISK         0x01
#define  UDF_SET_OPTIONS_FLAG_DRIVE        0x02
#define  UDF_SET_OPTIONS_FLAG_GLOBAL       0x03
#define  UDF_SET_OPTIONS_FLAG_MASK         0x03

#pragma pack(pop)

#endif //__UDF_PUBL_H__