wnaspi32.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:14k
源码类别:

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: wnaspi32
  3.  Author:    Unknown
  4.  Purpose:
  5.  History:
  6. -----------------------------------------------------------------------------}
  7. unit wnaspi32;
  8. interface
  9. uses Windows;
  10. type
  11.   LPSRB = Pointer;
  12. const
  13.   SENSE_LEN = 14; // Default sense buffer length
  14.   SRB_DIR_SCSI = $00; // Direction determined by SCSI command
  15.   SRB_DIR_IN = $08; // Transfer from SCSI target to host
  16.   SRB_DIR_OUT = $10; // Transfer from host to SCSI target
  17.   SRB_NODIR = $00; // No data I/O is performed
  18.   SRB_POSTING = $01; // Enable ASPI posting
  19.   SRB_EVENT_NOTIFY = $40; // Enable ASPI event notification
  20.   SRB_ENABLE_RESIDUAL_COUNT = $04; // Enable residual byte count reporting
  21.   SRB_DATA_SG_LIST = $02; // Data buffer points to scatter-gather list
  22.   WM_ASPIPOST = $4D42; // ASPI Post message
  23.   //***************************************************************************
  24.   //  %%% ASPI Command Definitions %%%
  25.   //***************************************************************************
  26.   SC_HA_INQUIRY = $00; // Host adapter inquiry
  27.   SC_GET_DEV_TYPE = $01; // Get device type
  28.   SC_EXEC_SCSI_CMD = $02; // Execute SCSI command
  29.   SC_ABORT_SRB = $03; // Abort an SRB
  30.   SC_RESET_DEV = $04; // SCSI bus device reset
  31.   SC_GET_DISK_INFO = $06; // Get Disk information
  32.   //***************************************************************************
  33.   //   %%% SRB Status %%%
  34.   //***************************************************************************
  35.   SS_PENDING = $00; // SRB being processed
  36.   SS_COMP = $01; // SRB completed without error
  37.   SS_ABORTED = $02; // SRB aborted
  38.   SS_ABORT_FAIL = $03; // Unable to abort SRB
  39.   SS_ERR = $04; // SRB completed with error
  40.   SS_INVALID_CMD = $80; // Invalid ASPI command
  41.   SS_INVALID_HA = $81; // Invalid host adapter number
  42.   SS_NO_DEVICE = $82; // SCSI device not installed
  43.   SS_INVALID_SRB = $E0; // Invalid parameter set in SRB
  44.   SS_BUFFER_ALIGN = $E1; // Buffer not aligned (replaces OLD_MANAGER in Win32)
  45.   SS_ILLEGAL_MODE = $E2; // Unsupported Windows mode
  46.   SS_NO_ASPI = $E3; // No ASPI managers resident
  47.   SS_FAILED_INIT = $E4; // ASPI for windows failed init
  48.   SS_ASPI_IS_BUSY = $E5; // No resources available to execute cmd
  49.   SS_BUFFER_TO_BIG = $E6; // Buffer size to big to handle!
  50.   SS_MISMATCHED_COMPONENTS = $E7; // The DLLs/EXEs of ASPI don't version check
  51.   SS_NO_ADAPTERS = $E8; // No host adapters to manage
  52.   SS_INSUFFICIENT_RESOURCES = $E9; // Couldn't allocate resources needed to init
  53.   SS_ASPI_IS_SHUTDOWN = $EA; // Call came to ASPI after PROCESS_DETACH
  54.   SS_BAD_INSTALL = $EB; // The DLL or other components are installed wrong
  55.   //***************************************************************************
  56.   // %%% Host Adapter Status %%%
  57.   //***************************************************************************
  58.   HASTAT_OK = $00; // Host adapter did not detect an  // error
  59.   HASTAT_SEL_TO = $11; // Selection Timeout
  60.   HASTAT_DO_DU = $12; // Data overrun data underrun
  61.   HASTAT_BUS_FREE = $13; // Unexpected bus free
  62.   HASTAT_PHASE_ERR = $14; // Target bus phase sequence  // failure
  63.   HASTAT_TIMEOUT = $09;
  64.   // Timed out while SRB was  waiting to beprocessed.
  65.   HASTAT_COMMAND_TIMEOUT = $0B; // While processing the SRB, the
  66.   HASTAT_BUFFER_ALIGN = $E1;
  67.   // Buffer not aligned (replaces OLD_MANAGER in Win32)
  68. // adapter timed out.
  69.   HASTAT_MESSAGE_REJECT = $0D;
  70.   // While processing SRB, the  // adapter received a MESSAGE  // REJECT.
  71.   HASTAT_BUS_RESET = $0E; // A bus reset was detected.
  72.   HASTAT_PARITY_ERROR = $0F; // A parity error was detected.
  73.   HASTAT_REQUEST_SENSE_FAILED = $10; // The adapter failed in issuing
  74.   //   REQUEST SENSE.
  75. type
  76.   PscsiSenseInfo = ^TscsiSenseInfo;
  77.   TscsiSenseInfo = array[0..127] of BYTE;
  78.   TAspiDeviceIDflag = (ADIDmodeSense6, ADIDmodeSenseDBD);
  79. type
  80.   TScsiDeviceType = (TSDDisk, TSDTape, TSDPrinter, TSDProcessor,
  81.     TSDWORM, TSDCDROM, TSDScanner, TSDOptical,
  82.     TSDChanger, TSDCommunication,
  83.     TSDInvalid, TSDAny, TSDOther);
  84. type
  85.   TScsiHAinfo = packed record
  86.     ScsiId: BYTE; // SCSI Id of selected host adapter
  87.     MaxTargetCount: BYTE; // Max target count for selected HA
  88.     ResidualSupport: BOOLEAN; // True if HA supports residual I/O
  89.     MaxTransferLength: DWORD; // Max transfer length in bytes
  90.     BufferAlignMask: WORD; // Buffer for data I/O must be aligned by:
  91.     // 0=byte, 1=word, 3=dword, 7=8-byte, etc. 65536 bytes max
  92.     ScsiManagerId, // MustBe = 'ASPI for WIN32'
  93.     HostAdapterId: string[16]; // String describing selected HA
  94.   end;
  95.   //***************************************************************************
  96.   //  %%% SRB - Get Type of Device - SRB_GetDeviceType %%%
  97.   //***************************************************************************
  98. type
  99.   SRB_GetDeviceType = packed record
  100.     SRB_Cmd: BYTE; // ASPI command code = 1 = SC_GET_DEV_TYPE
  101.     SRB_Status: BYTE; // ASPI command status byte
  102.     SRB_HaId: BYTE; // ASPI host adapter number
  103.     SRB_Flags: BYTE; // Reserved
  104.     SRB_Hdr_Rsvd: DWORD; // Reserved
  105.     SRB_Target: BYTE; // Target number for specified HA
  106.     SRB_Lun: BYTE; // Logical unit number of selected target
  107.     SRB_DeviceType: BYTE; // Selected HA/Target/Lun device type
  108.     SRB_Rsvd: BYTE; // Reserved for alignment
  109.   end;
  110.   //***************************************************************************
  111.   //  %%% SRB - Interupt 13 Info - SRB_Int13info %%%
  112.   //***************************************************************************
  113. type
  114.   SRB_Int13info = packed record
  115.     SRB_Cmd: BYTE; // ASPI command code=6=SC_GET_DISK_INFO
  116.     SRB_Status: BYTE; // ASPI command status byte
  117.     SRB_HaId: BYTE; // ASPI host adapter number
  118.     SRB_Flags: BYTE; // Reserved
  119.     SRB_Hdr_Rsvd: DWORD; // Reserved
  120.     SRB_Target: BYTE; // Target's SCSI ID
  121.     SRB_Lun: BYTE; // Target's LUN number
  122.     SRB_DriveFlags: BYTE; // Driver flags
  123.     SRB_Int13Drive: BYTE; // Host Adapter Status
  124.     SRB_Heads: BYTE; // Preferred number of heads translation
  125.     SRB_Sectors: BYTE; // Preferred number of sectors translation
  126.     SRB_Rsvd: array[0..9] of BYTE; // Reserved
  127.   end;
  128.   //***************************************************************************
  129.   //  %%% SRB - INQUIRY - SC_INQUIRY %%%
  130.   //***************************************************************************
  131. type
  132.   SRB_Inquiry = packed record
  133.     SRB_Cmd: BYTE; // ASPI command code = 0 = SC_HA_INQUIRY
  134.     SRB_Status: BYTE; // ASPI command status byte
  135.     SRB_HaId: BYTE; // ASPI host adapter number
  136.     SRB_Flags: BYTE; // Reserved
  137.     SRB_Hdr_Rsvd: DWORD; // Reserved
  138.     SRB_HA_Count: BYTE; // same as in GetASPIsupportInfo
  139.     SRB_HA_SCSIID: BYTE; // SCSI Id of selected host adapter
  140.     SRB_ManagerID, // MustBe = 'ASPI for WIN32'
  141.     SRB_AdapterID: array[0..15] of char; // String describing selected HA
  142.     SRB_BufAlign: WORD; // Buffer alignment mask: 0=byte, 1=word,
  143.     // 3=dword, 7=8-byte, etc. 65536 bytes max
  144.     SRB_Residual: BYTE; // Bit1 = residual count support flag
  145.     SRB_Targets: BYTE; // Max target count for selected HA
  146.     SRB_TransfLen: DWORD; // Max transfer length in bytes
  147.     SRB_Rsvd: array[0..9] of byte;
  148.   end;
  149.   //***************************************************************************
  150.   //  %%% SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY %%%
  151.   //***************************************************************************
  152. type
  153.   SRB_HAInquiry = record
  154.     SRB_Cmd, // ASPI command code = SC_HA_INQUIRY
  155.     SRB_Status, // ASPI command status byte
  156.     SRB_HaId, // ASPI host adapter number
  157.     SRB_Flags: BYTE; // ASPI request flags
  158.     SRB_Hdr_Rsvd: DWORD; // Reserved, MUST = 0
  159.     HA_Count, // Number of host adapters present
  160.     HA_SCSI_ID: byte; // SCSI ID of host adapter
  161.     HA_ManagerId, // String describing the manager
  162.     HA_Identifier, // String describing the host adapter
  163.     HA_Unique: array[0..15] of Char; // Host Adapter Unique parameters
  164.     HA_Rsvd1: WORD;
  165.   end;
  166.   PSRB_HAInquiry = ^SRB_HAInquiry;
  167.   TSRB_HAInquiry = SRB_HAInquiry;
  168.   //***************************************************************************
  169.   //   %%% SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE %%%
  170.   //***************************************************************************
  171. type
  172.   SRB_GDEVBlock = record
  173.     SRB_Cmd, // ASPI command code = SC_GET_DEV_TYPE
  174.     SRB_Status, // ASPI command status byte
  175.     SRB_HaId, // ASPI host adapter number
  176.     SRB_Flags: BYTE; // Reserved
  177.     SRB_Hdr_Rsvd: DWORD; // Reserved
  178.     SRB_Target, // Target's SCSI ID
  179.     SRB_Lun, // Target's LUN number
  180.     SRB_DeviceType, // Target's peripheral device type
  181.     SRB_Rsvd1: BYTE;
  182.   end;
  183.   TSRB_GDEVBlock = SRB_GDEVBlock;
  184.   PSRB_GDEVBlock = ^SRB_GDEVBlock;
  185.   //***************************************************************************
  186.   //   %%% SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD %%%
  187.   //***************************************************************************
  188. type
  189.   SRB_ExecSCSICmd = packed record
  190.     SRB_Cmd: BYTE; // ASPI command code= 2 =SC_EXEC_SCSI_CMD
  191.     SRB_Status: BYTE; // ASPI command status byte
  192.     SRB_HaId: BYTE; // ASPI host adapter number
  193.     SRB_Flags: BYTE; // ASPI request flags
  194.     SRB_Hdr_Rsvd: DWORD; // Reserved
  195.     SRB_Target: BYTE; // Target's SCSI ID
  196.     SRB_Lun: BYTE; // Target's LUN number
  197.     SRB_Rsvd1: WORD; // Reserved for Alignment
  198.     SRB_BufLen: DWORD; // Data Allocation Length
  199.     SRB_BufPtr: POINTER; // Data Buffer Pointer
  200.     SRB_SenseLen: BYTE; // Sense Allocation Length
  201.     SRB_CDBLen: BYTE; // CDB Length
  202.     SRB_HaStat: BYTE; // Host Adapter Status
  203.     SRB_TargStat: BYTE; // Target Status
  204.     SRB_PostProc: THandle; // Post routine
  205.     SRB_Rsvd2: POINTER; // Reserved
  206.     SRB_Rsvd3: array[0..15] of BYTE; // Reserved for alignment
  207.     SRB_CDBByte: array[0..15] of BYTE; // SCSI CDB
  208.     SRB_Sense: TscsiSenseInfo; // Request Sense buf
  209.   end;
  210.   //***************************************************************************
  211.   //   %%% SRB - ABORT AN SRB - SC_ABORT_SRB %%%
  212.   //***************************************************************************
  213. type
  214.   SRB_Abort = packed record
  215.     SRB_Cmd: BYTE; // ASPI command code = 3 = SC_ABORT_SRB
  216.     SRB_Status: BYTE; // ASPI command status byte
  217.     SRB_HaId: BYTE; // ASPI host adapter number
  218.     SRB_Flags: BYTE; // Reserved
  219.     SRB_Hdr_Rsvd: DWORD; // Reserved
  220.     SRB_ToAbort: pointer; // Pointer to SRB to abort
  221.   end;
  222.   TSRB_Abort = SRB_Abort;
  223.   PSRB_Abort = ^SRB_Abort;
  224.   //***************************************************************************
  225.   // %%% SRB - BUS DEVICE RESET - SC_RESET_DEV %%%
  226.   //***************************************************************************
  227.   SRB_BusDeviceReset = record
  228.     SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  229.     SRB_Status, // ASPI command status byte
  230.     SRB_HaId, // ASPI host adapter number
  231.     SRB_Flags: BYTE; // Reserved
  232.     SRB_Hdr_Rsvd: DWORD; // Reserved
  233.     SRB_Target, // Target's SCSI ID
  234.     SRB_Lun: BYTE; // Target's LUN number
  235.     SRB_Rsvd1: array[0..11] of byte; // Reserved for Alignment
  236.     SRB_HaStat, // Host Adapter Status
  237.     SRB_TargStat: BYTE; // Target Status
  238.     SRB_PostProc, // Post routine
  239.     SRB_Rsvd2: Pointer; // Reserved
  240.     SRB_Rsvd3, // Reserved
  241.     CDBByte: array[0..15] of byte; // SCSI CDB
  242.   end;
  243.   TSRB_BusDeviceReset = SRB_BusDeviceReset;
  244.   PSRB_BusDeviceReset = ^SRB_BusDeviceReset;
  245.   //***************************************************************************
  246.   // %%% SRB - GET DISK INFORMATION - SC_GET_DISK_INFO %%%
  247.   //***************************************************************************
  248.   SRB_GetDiskInfo = record
  249.     SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  250.     SRB_Status, // ASPI command status byte
  251.     SRB_HaId, // ASPI host adapter number
  252.     SRB_Flags: BYTE; // Reserved
  253.     SRB_Hdr_Rsvd: DWORD; // Reserved
  254.     SRB_Target, // Target's SCSI ID
  255.     SRB_Lun, // Target's LUN number
  256.     SRB_DriveFlags, // Driver flags
  257.     SRB_Int13HDriveInfo, // Host Adapter Status
  258.     SRB_Heads, // Preferred number of heads translation
  259.     SRB_Sectors: BYTE; // Preferred number of sectors translation
  260.     SRB_Rsvd1: array[0..9] of byte; // Reserved
  261.   end;
  262.   TSRB_GetDiskInfo = SRB_GetDiskInfo;
  263.   PSRB_GetDiskInfo = ^SRB_GetDiskInfo;
  264.   //*****************************************************************************
  265.   //          %%% ASPIBUFF - Structure For Controllng I/O Buffers %%%
  266.   //*****************************************************************************
  267.   ASPI32BUFF = record // Offset
  268.     // HX/DEC
  269.     AB_BufPointer: Byte; // 00/000 Pointer to the ASPI allocated buffer
  270.     AB_BufLen, // 04/004 Length in bytes of the buffer
  271.     AB_ZeroFill, // 08/008 Flag set to 1 if buffer should be zeroed
  272.     AB_Reserved: DWord // 0C/012 Reserved
  273.   end;
  274.   TASPI32BUFF = ASPI32BUFF;
  275.   PASPI32BUFF = ^ASPI32BUFF;
  276. type
  277.   TSendASPI32Command = function(LPSRB: Pointer): DWORD; cdecl;
  278.   TGetASPI32SupportInfo = function: DWORD; cdecl;
  279. var
  280.   WNASPI_Loaded: Boolean = FALSE;
  281.   SendASPI32Command: TSendASPI32Command = nil;
  282.   GetASPI32SupportInfo: TGetASPI32SupportInfo = nil;
  283. implementation
  284. const
  285.   WNASPI = 'WNASPI32.dll';
  286. var
  287.   WNASPI_HInst: THandle = 0;
  288. initialization
  289.   WNASPI_HInst := LoadLibrary(PChar(WNASPI));
  290.   if WNASPI_HInst <> 0 then
  291.   begin
  292.     @SendASPI32Command := GetProcAddress(WNASPI_HInst, 'SendASPI32Command');
  293.     @GetASPI32SupportInfo := GetProcAddress(WNASPI_HInst, 'GetASPI32SupportInfo'
  294.       );
  295.     WNASPI_Loaded := TRUE
  296.   end
  297.   else
  298.     WNASPI_Loaded := FALSE;
  299. finalization
  300.   if WNASPI_Loaded then
  301.   begin
  302.     WNASPI_Loaded := FreeLibrary(WNASPI_HInst);
  303.     WNASPI_HInst := 0;
  304.     @SendASPI32Command := nil;
  305.     @GetASPI32SupportInfo := nil;
  306.   end;
  307. end.