wnaspi32.pp 10 KB

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