//---------------------------------------------------
// Registerdefinition des ATA-Controllers laut Windows-Schnittstelle
// aus DDK-Headerfile ntdddisk.h bernommen

typedef struct {
	UCHAR bFeaturesReg;
	UCHAR bSectorCountReg;
	UCHAR bSectorNumberReg;
	UCHAR bCylLowReg;
	UCHAR bCylHighReg;
	UCHAR bDriveHeadReg;
	UCHAR bCommandReg;
	UCHAR bReserved;
} IDEREGS, *PIDEREGS;


// Definitionen fr Windows NT sowie 2000 und XP 

#define FILE_DEVICE_CONTROLLER      0x00000004
#define IOCTL_SCSI_BASE             FILE_DEVICE_CONTROLLER
#define FILE_READ_ACCESS            0x0001
#define FILE_WRITE_ACCESS           0x0002
#define FILE_ANY_ACCESS             0
#define METHOD_BUFFERED             0
#define CTL_CODE(DeviceType, Function, Method, Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))

//---------------------------------------------------
// Windows NT 


// dokumentierter Funktionscode fr SCSI
#define IOCTL_SCSI_PASS_THROUGH     CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define CDB10GENERIC_LENGTH         10
#define SCSI_IOCTL_DATA_OUT          0
#define SCSI_IOCTL_DATA_IN           1
#define SCSI_IOCTL_DATA_UNSPECIFIED  2

// undokomentierter Pseudo-SCSI-Befehl
#define SCSIOP_ATA_PASSTHROUGH      0xCC

// Datenstruktur fr SCSI-Befehle
typedef struct {
	USHORT Length;
	UCHAR  ScsiStatus;
	UCHAR  PathId;
	UCHAR  TargetId;
	UCHAR  Lun;
	UCHAR  CdbLength;
	UCHAR  SenseInfoLength;
	UCHAR  DataIn;
	UCHAR  _pad[3];
	ULONG  DataTransferLength;
	ULONG  TimeOutValue;
#if (_WIN32_WINNT >= 0x0500)
	ULONG_PTR DataBufferOffset;
#else
	ULONG  DataBufferOffset;
#endif
	ULONG  SenseInfoOffset;
	UCHAR  Cdb[16];
} SCSI_PASS_THROUGH;

// Datenstruktur fr SCSI-Befehl mit Daten

typedef struct {
	SCSI_PASS_THROUGH spt;
	ULONG             Filler;
	UCHAR             ucSenseBuf[32];
	UCHAR             ucDataBuf[2 * 1024];
} SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS;


//---------------------------------------------------
// Definitionen und Datenstruktur fr Windows 2000 und XP

#define IOCTL_IDE_PASS_THROUGH  CTL_CODE(IOCTL_SCSI_BASE, 0x040A, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_SCSI_RESCAN_BUS   CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct
{
	IDEREGS IdeReg;
	ULONG   DataBufferSize;
	UCHAR   DataBuffer[1];
} ATA_PASS_THROUGH;