{$IFNDEF FPC_DOTTEDUNITS}
unit cdromioctl;
{$ENDIF FPC_DOTTEDUNITS}
{$mode objfpc}
interface

{$IFDEF FPC_DOTTEDUNITS}
uses WinApi.Windows;
{$ELSE FPC_DOTTEDUNITS}
uses windows;
{$ENDIF FPC_DOTTEDUNITS}

{
  Automatically converted by H2Pas 0.99.15 from cdromioctl.h
  The following command line parameters were used:
    cdromioctl.h
}

{$PACKRECORDS C}

  {
     distilled information from various header files from Microsoft's
     DDK for Windows NT 4.0
  }

  type

     SCSI_PASS_THROUGH = record
          Length : USHORT;
          ScsiStatus : UCHAR;
          PathId : UCHAR;
          TargetId : UCHAR;
          Lun : UCHAR;
          CdbLength : UCHAR;
          SenseInfoLength : UCHAR;
          DataIn : UCHAR;
          DataTransferLength : ULONG;
          TimeOutValue : ULONG;
          DataBufferOffset : ULONG;
          SenseInfoOffset : ULONG;
          Cdb : array[0..15] of UCHAR;
       end;
     PSCSI_PASS_THROUGH = ^SCSI_PASS_THROUGH;

     SCSI_PASS_THROUGH_DIRECT = record
          Length : USHORT;
          ScsiStatus : UCHAR;
          PathId : UCHAR;
          TargetId : UCHAR;
          Lun : UCHAR;
          CdbLength : UCHAR;
          SenseInfoLength : UCHAR;
          DataIn : UCHAR;
          DataTransferLength : ULONG;
          TimeOutValue : ULONG;
          DataBuffer : PVOID;
          SenseInfoOffset : ULONG;
          Cdb : array[0..15] of UCHAR;
       end;
     PSCSI_PASS_THROUGH_DIRECT = ^SCSI_PASS_THROUGH_DIRECT;

     SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record
          spt : SCSI_PASS_THROUGH_DIRECT;
          Filler : ULONG;
          ucSenseBuf : array[0..31] of UCHAR;
       end;
     PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = ^SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
  {
     method codes
    }

  const
     METHOD_BUFFERED = 0;
     METHOD_IN_DIRECT = 1;
     METHOD_OUT_DIRECT = 2;
     METHOD_NEITHER = 3;
  {
     file access values
    }
     FILE_ANY_ACCESS = 0;
     FILE_READ_ACCESS = $0001;
     FILE_WRITE_ACCESS = $0002;
     IOCTL_CDROM_BASE = $00000002;
     IOCTL_SCSI_BASE = $00000004;
  {
     constants for DataIn member of SCSI_PASS_THROUGH  structures
    }
     SCSI_IOCTL_DATA_OUT = 0;
     SCSI_IOCTL_DATA_IN = 1;
     SCSI_IOCTL_DATA_UNSPECIFIED = 2;

    {
     Standard IOCTL define
    }

    Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint;
    function IOCTL_CDROM_READ_TOC : Longint;
    function IOCTL_CDROM_GET_LAST_SESSION : longint;
    function IOCTL_SCSI_PASS_THROUGH : longint;
    function IOCTL_SCSI_MINIPORT : longint;
    function IOCTL_SCSI_GET_INQUIRY_DATA : longint;
    function IOCTL_SCSI_GET_CAPABILITIES : longint;
    function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint;
    function IOCTL_SCSI_GET_ADDRESS : longint;


implementation

    { was #define dname def_expr }
    function IOCTL_CDROM_GET_LAST_SESSION : longint;
        { return type might be wrong }
        begin
           IOCTL_CDROM_GET_LAST_SESSION:=CTL_CODE(IOCTL_CDROM_BASE,$000E,METHOD_BUFFERED,FILE_READ_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_PASS_THROUGH : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_PASS_THROUGH:=CTL_CODE(IOCTL_SCSI_BASE,$0401,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_MINIPORT : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_MINIPORT:=CTL_CODE(IOCTL_SCSI_BASE,$0402,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_GET_INQUIRY_DATA : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_GET_INQUIRY_DATA:=CTL_CODE(IOCTL_SCSI_BASE,$0403,METHOD_BUFFERED,FILE_ANY_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_GET_CAPABILITIES : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_GET_CAPABILITIES:=CTL_CODE(IOCTL_SCSI_BASE,$0404,METHOD_BUFFERED,FILE_ANY_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_PASS_THROUGH_DIRECT:=CTL_CODE(IOCTL_SCSI_BASE,$0405,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS);
        end;

    { was #define dname def_expr }
    function IOCTL_SCSI_GET_ADDRESS : longint;
        { return type might be wrong }
        begin
           IOCTL_SCSI_GET_ADDRESS:=CTL_CODE(IOCTL_SCSI_BASE,$0406,METHOD_BUFFERED,FILE_ANY_ACCESS);
        end;

Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint;

begin
    Result:= (ADevType shl 16 )
             Or (AAccess shl 14)
             Or (AFunction SHL 2)
             Or AMethod;
end;

function IOCTL_CDROM_READ_TOC : Longint;

begin
  Result:=CTL_CODE(IOCTL_CDROM_BASE, 0, METHOD_BUFFERED, FILE_READ_ACCESS )
end;


end.
