/*
 *  ntddtape.h  Tape device I/O control codes
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef _NTDDTAPE_
#define _NTDDTAPE_

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#include <ntddstor.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Tape device name */
#define DD_TAPE_DEVICE_NAME "\\Device\\Tape"

/* Tape device I/O control codes */
#define IOCTL_TAPE_BASE FILE_DEVICE_TAPE
#define IOCTL_TAPE_ERASE \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS | \
    FILE_WRITE_ACCESS )
#define IOCTL_TAPE_PREPARE \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS | \
    FILE_WRITE_ACCESS )
#define IOCTL_TAPE_WRITE_MARKS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | \
    FILE_WRITE_ACCESS )
#define IOCTL_TAPE_GET_POSITION \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_SET_POSITION \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_GET_DRIVE_PARAMS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_SET_DRIVE_PARAMS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | \
    FILE_WRITE_ACCESS )
#define IOCTL_TAPE_GET_MEDIA_PARAMS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_SET_MEDIA_PARAMS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_GET_STATUS \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_CREATE_PARTITION \
    CTL_CODE( IOCTL_TAPE_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS | \
    FILE_WRITE_ACCESS )
#define IOCTL_TAPE_MEDIA_REMOVAL \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_EJECT_MEDIA \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_LOAD_MEDIA \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_RESERVE \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS )
#define IOCTL_TAPE_RELEASE \
    CTL_CODE( IOCTL_TAPE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS )
#if (NTDDI_VERSION < 0x05020000)
    #define IOCTL_TAPE_CHECK_VERIFY \
        CTL_CODE( IOCTL_TAPE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS )
    #define IOCTL_TAPE_FIND_NEW_DEVICES \
        CTL_CODE( IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS )
#endif

/* Tape erase modes */
#define TAPE_ERASE_SHORT    0L
#define TAPE_ERASE_LONG     1L

/* Tape preparation types */
#define TAPE_LOAD       0L
#define TAPE_UNLOAD     1L
#define TAPE_TENSION    2L
#define TAPE_LOCK       3L
#define TAPE_UNLOCK     4L
#define TAPE_FORMAT     5L

/* Tapemark types */
#define TAPE_SETMARKS           0L
#define TAPE_FILEMARKS          1L
#define TAPE_SHORT_FILEMARKS    2L
#define TAPE_LONG_FILEMARKS     3L

/* Tape get position modes */
#define TAPE_ABSOLUTE_POSITION          0L
#define TAPE_LOGICAL_POSITION           1L
#define TAPE_PSEUDO_LOGICAL_POSITION    2L

/* Tape set position modes */
#define TAPE_REWIND                 0L
#define TAPE_ABSOLUTE_BLOCK         1L
#define TAPE_LOGICAL_BLOCK          2L
#define TAPE_PSEUDO_LOGICAL_BLOCK   3L
#define TAPE_SPACE_END_OF_DATA      4L
#define TAPE_SPACE_RELATIVE_BLOCKS  5L
#define TAPE_SPACE_FILEMARKS        6L
#define TAPE_SPACE_SEQUENTIAL_FMKS  7L
#define TAPE_SPACE_SETMARKS         8L
#define TAPE_SPACE_SEQUENTIAL_SMKS  9L

/* Tape drive features (low) */
#define TAPE_DRIVE_FIXED            0x00000001L
#define TAPE_DRIVE_SELECT           0x00000002L
#define TAPE_DRIVE_INITIATOR        0x00000004L
#define TAPE_DRIVE_ERASE_SHORT      0x00000010L
#define TAPE_DRIVE_ERASE_LONG       0x00000020L
#define TAPE_DRIVE_ERASE_BOP_ONLY   0x00000040L
#define TAPE_DRIVE_ERASE_IMMEDIATE  0x00000080L
#define TAPE_DRIVE_TAPE_CAPACITY    0x00000100L
#define TAPE_DRIVE_TAPE_REMAINING   0x00000200L
#define TAPE_DRIVE_FIXED_BLOCK      0x00000400L
#define TAPE_DRIVE_VARIABLE_BLOCK   0x00000800L
#define TAPE_DRIVE_WRITE_PROTECT    0x00001000L
#define TAPE_DRIVE_EOT_WZ_SIZE      0x00002000L
#define TAPE_DRIVE_ECC              0x00010000L
#define TAPE_DRIVE_COMPRESSION      0x00020000L
#define TAPE_DRIVE_PADDING          0x00040000L
#define TAPE_DRIVE_REPORT_SMKS      0x00080000L
#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000L
#define TAPE_DRIVE_GET_LOGICAL_BLK  0x00200000L
#define TAPE_DRIVE_SET_EOT_WZ_SIZE  0x00400000L
#define TAPE_DRIVE_EJECT_MEDIA      0x01000000L
#define TAPE_DRIVE_CLEAN_REQUESTS   0x02000000L
#define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000L

/* Tape drive features (high) */
#define TAPE_DRIVE_LOAD_UNLOAD      0x80000001L
#define TAPE_DRIVE_TENSION          0x80000002L
#define TAPE_DRIVE_LOCK_UNLOCK      0x80000004L
#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008L
#define TAPE_DRIVE_SET_BLOCK_SIZE   0x80000010L
#define TAPE_DRIVE_LOAD_UNLD_IMMED  0x80000020L
#define TAPE_DRIVE_TENSION_IMMED    0x80000040L
#define TAPE_DRIVE_LOCK_UNLK_IMMED  0x80000080L
#define TAPE_DRIVE_SET_ECC          0x80000100L
#define TAPE_DRIVE_SET_COMPRESSION  0x80000200L
#define TAPE_DRIVE_SET_PADDING      0x80000400L
#define TAPE_DRIVE_SET_REPORT_SMKS  0x80000800L
#define TAPE_DRIVE_ABSOLUTE_BLK     0x80001000L
#define TAPE_DRIVE_ABS_BLK_IMMED    0x80002000L
#define TAPE_DRIVE_LOGICAL_BLK      0x80004000L
#define TAPE_DRIVE_LOG_BLK_IMMED    0x80008000L
#define TAPE_DRIVE_END_OF_DATA      0x80010000L
#define TAPE_DRIVE_RELATIVE_BLKS    0x80020000L
#define TAPE_DRIVE_FILEMARKS        0x80040000L
#define TAPE_DRIVE_SEQUENTIAL_FMKS  0x80080000L
#define TAPE_DRIVE_SETMARKS         0x80100000L
#define TAPE_DRIVE_SEQUENTIAL_SMKS  0x80200000L
#define TAPE_DRIVE_REVERSE_POSITION 0x80400000L
#define TAPE_DRIVE_SPACE_IMMEDIATE  0x80800000L
#define TAPE_DRIVE_WRITE_SETMARKS   0x81000000L
#define TAPE_DRIVE_WRITE_FILEMARKS  0x82000000L
#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000L
#define TAPE_DRIVE_WRITE_LONG_FMKS  0x88000000L
#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000L
#define TAPE_DRIVE_FORMAT           0xA0000000L
#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xB0000000L
#define TAPE_DRIVE_HIGH_FEATURES    0x80000000L

/* Tape partition types */
#define TAPE_FIXED_PARTITIONS       0L
#define TAPE_SELECT_PARTITIONS      1L
#define TAPE_INITIATOR_PARTITIONS   2L

/* Tape drive WMI methods */
#define TAPE_QUERY_DRIVE_PARAMETERS     0L
#define TAPE_QUERY_MEDIA_CAPACITY       1L
#define TAPE_CHECK_FOR_DRIVE_PROBLEM    2L
#define TAPE_QUERY_IO_ERROR_DATA        3L
#define TAPE_QUERY_DEVICE_ERROR_DATA    4L

/* Structure used with IOCTL_TAPE_ERASE */
typedef struct _TAPE_ERASE {
    ULONG   Type;
    BOOLEAN Immediate;
} TAPE_ERASE;
typedef TAPE_ERASE  *PTAPE_ERASE;

/* Structure used with IOCTL_TAPE_PREPARE */
typedef struct _TAPE_PREPARE {
    ULONG   Operation;
    BOOLEAN Immediate;
} TAPE_PREPARE;
typedef TAPE_PREPARE    *PTAPE_PREPARE;

/* Structure used with IOCTL_TAPE_WRITE_MARKS */
typedef struct _TAPE_WRITE_MARKS {
    ULONG   Type;
    ULONG   Count;
    BOOLEAN Immediate;
} TAPE_WRITE_MARKS;
typedef TAPE_WRITE_MARKS    *PTAPE_WRITE_MARKS;

/* Structure used with IOCTL_TAPE_GET_POSITION */
typedef struct _TAPE_GET_POSITION {
    ULONG           Type;
    ULONG           Partition;
    LARGE_INTEGER   Offset;
} TAPE_GET_POSITION;
typedef TAPE_GET_POSITION   *PTAPE_GET_POSITION;

/* Structure used with IOCTL_TAPE_SET_POSITION */
typedef struct _TAPE_SET_POSITION {
    ULONG           Method;
    ULONG           Partition;
    LARGE_INTEGER   Offset;
    BOOLEAN         Immediate;
} TAPE_SET_POSITION;
typedef TAPE_SET_POSITION   *PTAPE_SET_POSITION;

/* Structure used with IOCTL_TAPE_GET_DRIVE_PARAMETERS */
typedef struct _TAPE_GET_DRIVE_PARAMETERS {
    BOOLEAN ECC;
    BOOLEAN Compression;
    BOOLEAN DataPadding;
    BOOLEAN ReportSetmarks;
    ULONG   DefaultBlockSize;
    ULONG   MaximumBlockSize;
    ULONG   MinimumBlockSize;
    ULONG   MaximumPartitionCount;
    ULONG   FeaturesLow;
    ULONG   FeaturesHigh;
    ULONG   EOTWarningZoneSize;
} TAPE_GET_DRIVE_PARAMETERS;
typedef TAPE_GET_DRIVE_PARAMETERS   *PTAPE_GET_DRIVE_PARAMETERS;

/* Structure used with IOCTL_TAPE_SET_DRIVE_PARAMETERS */
typedef struct _TAPE_SET_DRIVE_PARAMETERS {
    BOOLEAN ECC;
    BOOLEAN Compression;
    BOOLEAN DataPadding;
    BOOLEAN ReportSetmarks;
    ULONG   EOTWarningZoneSize;
} TAPE_SET_DRIVE_PARAMETERS;
typedef TAPE_SET_DRIVE_PARAMETERS   *PTAPE_SET_DRIVE_PARAMETERS;

/* Structure used with IOCTL_TAPE_GET_MEDIA_PARAMETERS */
typedef struct _TAPE_GET_MEDIA_PARAMETERS {
    LARGE_INTEGER   Capacity;
    LARGE_INTEGER   Remaining;
    ULONG           BlockSize;
    ULONG           PartitionCount;
    BOOLEAN         WriteProtected;
} TAPE_GET_MEDIA_PARAMETERS;
typedef TAPE_GET_MEDIA_PARAMETERS   *PTAPE_GET_MEDIA_PARAMETERS;

/* Structure used with IOCTL_TAPE_SET_MEDIA_PARAMETERS */
typedef struct _TAPE_SET_MEDIA_PARAMETERS {
    ULONG   BlockSize;
} TAPE_SET_MEDIA_PARAMETERS;
typedef TAPE_SET_MEDIA_PARAMETERS   *PTAPE_SET_MEDIA_PARAMETERS;

/* Structure used with IOCTL_TAPE_CREATE_PARTITION */
typedef struct _TAPE_CREATE_PARTITION {
    ULONG   Method;
    ULONG   Count;
    ULONG   Size;
} TAPE_CREATE_PARTITION;
typedef TAPE_CREATE_PARTITION   *PTAPE_CREATE_PARTITION;

/* Structure used with WMI for tape drives */
typedef struct _TAPE_WMI_OPERATIONS {
    ULONG   Method;
    ULONG   DataBufferSize;
    PVOID   DataBuffer;
} TAPE_WMI_OPERATIONS;
typedef TAPE_WMI_OPERATIONS *PTAPE_WMI_OPERATIONS;

/* Tape drive problem types */
typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
    TapeDriveProblemNone,
    TapeDriveReadWriteWarning,
    TapeDriveReadWriteError,
    TapeDriveReadWarning,
    TapeDriveWriteWarning,
    TapeDriveReadError,
    TapeDriveWriteError,
    TapeDriveHardwareError,
    TapeDriveUnsupportedMedia,
    TapeDriveScsiConnectionError,
    TapeDriveTimetoClean,
    TapeDriveCleanDriveNow,
    TapeDriveMediaLifeExpired,
    TapeDriveSnappedTape
} TAPE_DRIVE_PROBLEM_TYPE;

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _NTDDTAPE_ */
