/packages/cdrom/src/wnaspi32.pp

https://github.com/slibre/freepascal · Puppet · 259 lines · 238 code · 21 blank · 0 comment · 2 complexity · 5f1fcbb87af9441a73479e527dc1eb34 MD5 · raw file

  1. unit wnaspi32;
  2. {$mode objfpc}
  3. interface
  4. uses Windows;
  5. type
  6. LPSRB = Pointer;
  7. const
  8. { $packrecords c}
  9. SENSE_LEN = 14; // Default sense buffer length
  10. SRB_DIR_SCSI = $00; // Direction determined by SCSI command
  11. SRB_DIR_IN = $08; // Transfer from SCSI target to host
  12. SRB_DIR_OUT = $10; // Transfer from host to SCSI target
  13. SRB_POSTING = $01; // Enable ASPI posting
  14. SRB_EVENT_NOTIFY = $40; // Enable ASPI event notification
  15. SRB_ENABLE_RESIDUAL_COUNT = $04; // Enable residual byte count reporting
  16. SRB_DATA_SG_LIST = $02; // Data buffer points to scatter-gather list
  17. WM_ASPIPOST = $4D42; // ASPI Post message
  18. { ---------------------------------------------------------------------
  19. ASPI Command Definitions
  20. ---------------------------------------------------------------------}
  21. SC_HA_INQUIRY = $00; // Host adapter inquiry
  22. SC_GET_DEV_TYPE = $01; // Get device type
  23. SC_EXEC_SCSI_CMD = $02; // Execute SCSI command
  24. SC_ABORT_SRB = $03; // Abort an SRB
  25. SC_RESET_DEV = $04; // SCSI bus device reset
  26. SC_GET_DISK_INFO = $06; // Get Disk information
  27. { ---------------------------------------------------------------------
  28. SRB Status
  29. ---------------------------------------------------------------------}
  30. SS_PENDING = $00; // SRB being processed
  31. SS_COMP = $01; // SRB completed without error
  32. SS_ABORTED = $02; // SRB aborted
  33. SS_ABORT_FAIL = $03; // Unable to abort SRB
  34. SS_ERR = $04; // SRB completed with error
  35. SS_INVALID_CMD = $80; // Invalid ASPI command
  36. SS_INVALID_HA = $81; // Invalid host adapter number
  37. SS_NO_DEVICE = $82; // SCSI device not installed
  38. SS_INVALID_SRB = $E0; // Invalid parameter set in SRB
  39. SS_FAILED_INIT = $E4; // ASPI for windows failed init
  40. SS_ASPI_IS_BUSY = $E5; // No resources available to execute cmd
  41. SS_BUFFER_TO_BIG = $E6; // Buffer size to big to handle!
  42. SS_NO_ADAPTERS = $E8; // No adapters.
  43. { ---------------------------------------------------------------------
  44. Host Adapter Status
  45. ---------------------------------------------------------------------}
  46. HASTAT_OK = $00; // Host adapter did not detect an // error
  47. HASTAT_SEL_TO = $11; // Selection Timeout
  48. HASTAT_DO_DU = $12; // Data overrun data underrun
  49. HASTAT_BUS_FREE = $13; // Unexpected bus free
  50. HASTAT_PHASE_ERR = $14; // Target bus phase sequence // failure
  51. HASTAT_TIMEOUT = $09; // Timed out while SRB was waiting to beprocessed.
  52. HASTAT_COMMAND_TIMEOUT = $0B; // While processing the SRB, the adapter timed out.
  53. HASTAT_MESSAGE_REJECT = $0D; // While processing SRB, the // adapter received a MESSAGE // REJECT.
  54. HASTAT_BUS_RESET = $0E; // A bus reset was detected.
  55. HASTAT_PARITY_ERROR = $0F; // A parity error was detected.
  56. HASTAT_REQUEST_SENSE_FAILED = $10; // The adapter failed in issuing
  57. { ---------------------------------------------------------------------
  58. SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY
  59. ---------------------------------------------------------------------}
  60. type
  61. SRB_HAInquiry = record
  62. SRB_Cmd : Byte; // ASPI command code = SC_HA_INQUIRY
  63. SRB_Status : Byte; // ASPI command status byte
  64. SRB_HaId : Byte; // ASPI host adapter number
  65. SRB_Flags : Byte; // ASPI request flags
  66. SRB_Hdr_Rsvd : DWORD; // Reserved, MUST = 0
  67. HA_Count : Byte; // Number of host adapters present
  68. HA_SCSI_ID : Byte; // SCSI ID of host adapter
  69. HA_ManagerId : array[0..15] of Byte; // String describing the manager
  70. HA_Identifier : array[0..15] of Byte; // String describing the host adapter
  71. HA_Unique : array[0..15] of Byte; // Host Adapter Unique parameters
  72. HA_Rsvd1 : Word;
  73. end;
  74. PSRB_HAInquiry = ^SRB_HAInquiry;
  75. TSRB_HAInquiry = SRB_HAInquiry;
  76. { ---------------------------------------------------------------------
  77. SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE
  78. ---------------------------------------------------------------------}
  79. SRB_GDEVBlock = record
  80. SRB_Cmd, // ASPI command code = SC_GET_DEV_TYPE
  81. SRB_Status, // ASPI command status byte
  82. SRB_HaId, // ASPI host adapter number
  83. SRB_Flags : BYTE; // Reserved
  84. SRB_Hdr_Rsvd : DWORD; // Reserved
  85. SRB_Target, // Target's SCSI ID
  86. SRB_Lun, // Target's LUN number
  87. SRB_DeviceType, // Target's peripheral device type
  88. SRB_Rsvd1 : BYTE;
  89. end;
  90. TSRB_GDEVBlock = SRB_GDEVBlock;
  91. PSRB_GDEVBlock = ^SRB_GDEVBlock;
  92. { ---------------------------------------------------------------------
  93. SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD
  94. ---------------------------------------------------------------------}
  95. SRB_ExecSCSICmd = record
  96. SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  97. SRB_Status, // ASPI command status byte
  98. SRB_HaId, // ASPI host adapter number
  99. SRB_Flags : BYTE; // ASPI request flags
  100. SRB_Hdr_Rsvd : DWORD; // Reserved
  101. SRB_Target, // Target's SCSI ID
  102. SRB_Lun : BYTE; // Target's LUN number
  103. SRB_Rsvd1 : WORD; // Reserved for Alignment
  104. SRB_BufLen : DWORD; // Data Allocation Length
  105. SRB_BufPointer : Pointer; // Data Buffer Pointer
  106. SRB_SenseLen, // Sense Allocation Length
  107. SRB_CDBLen, // CDB Length
  108. SRB_HaStat, // Host Adapter Status
  109. SRB_TargStat : BYTE; // Target Status
  110. SRB_PostProc, // Post routine
  111. SRB_Rsvd2 : Pointer; // Reserved
  112. SRB_Rsvd3, // Reserved for alignment
  113. CDBByte : array[0..15] of byte; // SCSI CDB
  114. SenseArea : array[0..SENSE_LEN + 1] of byte; // Request Sense buffer
  115. end;
  116. TSRB_ExecSCSICmd = SRB_ExecSCSICmd;
  117. PSRB_ExecSCSICmd = ^SRB_ExecSCSICmd;
  118. { ---------------------------------------------------------------------
  119. SRB - ABORT AN SRB - SC_ABORT_SRB
  120. ---------------------------------------------------------------------}
  121. SRB_Abort = record
  122. SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  123. SRB_Status, // ASPI command status byte
  124. SRB_HaId, // ASPI host adapter number
  125. SRB_Flags : BYTE; // Reserved
  126. SRB_Hdr_Rsvd : DWORD; // Reserved
  127. SRB_ToAbort : Pointer; // Pointer to SRB to abort
  128. end;
  129. TSRB_Abort = SRB_Abort;
  130. PSRB_Abort = ^SRB_Abort;
  131. { ---------------------------------------------------------------------
  132. SRB - BUS DEVICE RESET - SC_RESET_DEV
  133. ---------------------------------------------------------------------}
  134. SRB_BusDeviceReset = record
  135. SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  136. SRB_Status, // ASPI command status byte
  137. SRB_HaId, // ASPI host adapter number
  138. SRB_Flags : BYTE; // Reserved
  139. SRB_Hdr_Rsvd : DWORD; // Reserved
  140. SRB_Target, // Target's SCSI ID
  141. SRB_Lun : BYTE; // Target's LUN number
  142. SRB_Rsvd1 : array[0..11] of byte; // Reserved for Alignment
  143. SRB_HaStat, // Host Adapter Status
  144. SRB_TargStat : BYTE; // Target Status
  145. SRB_PostProc, // Post routine
  146. SRB_Rsvd2 : Pointer; // Reserved
  147. SRB_Rsvd3, // Reserved
  148. CDBByte : array[0..15] of byte; // SCSI CDB
  149. end;
  150. TSRB_BusDeviceReset = SRB_BusDeviceReset;
  151. PSRB_BusDeviceReset = ^SRB_BusDeviceReset;
  152. { ---------------------------------------------------------------------
  153. SRB - GET DISK INFORMATION - SC_GET_DISK_INFO
  154. ---------------------------------------------------------------------}
  155. SRB_GetDiskInfo = record
  156. SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD
  157. SRB_Status, // ASPI command status byte
  158. SRB_HaId, // ASPI host adapter number
  159. SRB_Flags : BYTE; // Reserved
  160. SRB_Hdr_Rsvd : DWORD; // Reserved
  161. SRB_Target, // Target's SCSI ID
  162. SRB_Lun, // Target's LUN number
  163. SRB_DriveFlags, // Driver flags
  164. SRB_Int13HDriveInfo, // Host Adapter Status
  165. SRB_Heads, // Preferred number of heads translation
  166. SRB_Sectors : BYTE; // Preferred number of sectors translation
  167. SRB_Rsvd1 : array[0..9] of byte; // Reserved
  168. end;
  169. TSRB_GetDiskInfo = SRB_GetDiskInfo;
  170. PSRB_GetDiskInfo = ^SRB_GetDiskInfo;
  171. type
  172. TSendASPI32Command = function( LPSRB : Pointer ) : DWORD; cdecl;
  173. TGetASPI32SupportInfo = function : DWORD; cdecl;
  174. Const
  175. SendASPI32Command : TSendASPI32Command = nil;
  176. GetASPI32SupportInfo : TGetASPI32SupportInfo = nil;
  177. Function ASPILoaded : Boolean;
  178. Procedure CheckASPI;
  179. procedure UnloadASPI;
  180. implementation
  181. const
  182. HWNASPI : THandle = 0;
  183. WNASPI : pchar = 'wnaspi32.dll';
  184. Function ASPILoaded : Boolean;
  185. begin
  186. Result:=HWNASPI<>0;
  187. end;
  188. Procedure CheckASPI;
  189. begin
  190. HWNASPI:=LoadLibrary(WNASPI);
  191. if (HWNASPI<>0) then
  192. begin
  193. SendASPI32Command:=TSendASPI32Command(GetProcAddress(HWNASPI,'SendASPI32Command'));
  194. GetASPI32SupportInfo:=TGetASPI32SupportInfo(GetProcAddress(HWNASPI,'GetASPI32SupportInfo'));
  195. end
  196. end;
  197. procedure UnloadASPI;
  198. begin
  199. if (HWNASPI<>0) then
  200. begin
  201. FreeLibrary(HWNASPI);
  202. HWNASPI:=0;
  203. SendASPI32Command:=nil;
  204. GetASPI32SupportInfo:=nil;
  205. end;
  206. end;
  207. initialization
  208. CheckAspi;
  209. finalization
  210. UnloadASPI;
  211. end.