#ifndef _WINIOCTL_H_ #define _WINIOCTL_H_ #include "commdef.h" #include "interface.h" #include #include #include #include #include #include #include #define FILE_DEVICE_CONTROLLER 0x00000004 #define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) //0x0004D008 see NTDDSCSI.H for definition #define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define ARCMSR_IOCTL_READ_RQBUFFER 0x90002004 #define ARCMSR_IOCTL_WRITE_WQBUFFER 0x90002008 #define ARCMSR_IOCTL_CLEAR_RQBUFFER 0x9000200C #define ARCMSR_IOCTL_CLEAR_WQBUFFER 0x90002010 #define ARCMSR_IOCTL_CLEAR_ALLQBUFFER 0x90002014 #define ARCMSR_IOCTL_RETURN_CODE_3F 0x90002018 #define ARCMSR_IOCTL_SAY_HELLO 0x9000201C // return code #define SRB_STATUS_SUCCESS 0x01 #define SRB_STATUS_INVALID_REQUEST 0x06 typedef struct _SRB_IO_CONTROL { ULONG HeaderLength; UCHAR Signature[8]; ULONG Timeout; ULONG ControlCode; ULONG ReturnCode; ULONG Length; }sSRB_IO_CONTROL, *pSRB_IO_CONTROL; typedef struct _SRB_BUFFER { sSRB_IO_CONTROL srbioctl; UCHAR ioctldatabuffer[1032]; }sSRB_BUFFER, *pSRB_BUFFER; class ARCLIB_API WinIoctlInterface : public ArcInterface { friend class CArclib; public: WinIoctlInterface(); ~WinIoctlInterface(); bool init(const int nScsiPort); int send(sIF_CMD_BLOCK *ifData); int recv(sIF_CMD_BLOCK *ifData); int syncSend(sIF_CMD_BLOCK *ifData); int getMTU(); void *getDeviceHandle(); void requirelock(); void releaselock(); private: BOOL ClearReadBuffer(); BOOL ClearWriteBuffer(); BOOL ClearReadWriteBuffer(); HANDLE m_hScsi; HANDLE m_hSyncIm; PSECURITY_DESCRIPTOR pSD; }; #endif