2020-09-30 16:53:49 +02:00

245 lines
8.5 KiB
C++

/***************************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: MSCplus.h
*
* VERSION: 1.0
*
* AUTHOR: PoYuan
*
* DATE: 3 Nov, 2000
*
* DESCRIPTION:
* Class definition for MSC+ functionalities.
* 11/03/2000 - First revision finished and unitested on a limited number of functions.
*
****************************************************************************************/
#ifndef __MSCPLUS_H__
#define __MSCPLUS_H__
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <devioctl.h>
#include <ntddscsi.h>
#include <stddef.h>
#pragma intrinsic(memcmp)
typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS {
SCSI_PASS_THROUGH spt;
ULONG Filler; // realign buffers to double word boundary
UCHAR ucSenseBuf[32];
UCHAR ucDataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS;
typedef struct _SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER {
SCSI_PASS_THROUGH_DIRECT sptd;
ULONG Filler; // realign buffer to double word boundary
UCHAR ucSenseBuf[32];
} SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER;
//
// Command Descriptor Block constants.
//
const UCHAR CDB6GENERIC_LENGTH = 6;
const UCHAR CDB10GENERIC_LENGTH = 10;
const UCHAR SCSI_MIN_CDB_LENGTH = 6;
const UCHAR SCSI_MAX_CDB_LENGTH = 12;
//
// SCSI CDB operation codes
//
const UCHAR SCSIOP_TEST_UNIT_READY = 0x00;
const UCHAR SCSIOP_INQUIRY = 0x12;
const UCHAR SCSIOP_SEND_DIAGNOSTIC = 0x1D;
const UCHAR SCSIOP_REQUEST_SENSE = 0x03;
// The following are MSCPlus specific definitions
const UCHAR SCSIOP_READ_INFO = 0xE0;
const UCHAR SCSIOP_WRITE_INFO = 0xE1;
const UCHAR SCSIOP_START_STOP_CAPTURE = 0xE2;
const UCHAR SCSIOP_RESET_DEVICE = 0xDF;
const UCHAR SCSI_DTC_IMAGE = 0x00;
const UCHAR SCSI_DTC_DEVICE_INFO = 0x80;
const UCHAR SCSI_DTC_DEV_PROP_DESC = 0x81;
const UCHAR SCSI_DTC_DEV_PROP_VALUE = 0x82;
const UCHAR CAPTURE_TYPE_SINGLE = 0x00;
const UCHAR CAPTURE_TYPE_OPEN_CAP = 0x01;
const UCHAR CAPTURE_TYPE_STOP_CAP = 0x02;
#define DEFAULT_DATA_BUFFER_SIZE 224
#define DEFAULT_VENDOR_STRING_LENGTH 8
#define DEFAULT_PRODUCT_STRING_LENGTH 16
#define DEFAULT_VERSION_STRING_LENGTH 4
#define CHECK_MSCPLUS_INITIALIZATION(b) if(!b){return ERROR_INVALID_ACCESS;}
// ResponseCodes
#define RESPCODE_OK 0x2001
#define RESPCODE_GENERALERROR 0x2002
#define RESPCODE_OPERATIONNOTSUPPORTED 0x2005
#define RESPCODE_PARAMETERNOTSUPPORTED 0x2006
#define RESPCODE_DEVICEPROPNOTSUPPORTED 0x200A
#define RESPCODE_STORAGEFULL 0x200C
#define RESPCODE_ACCESSDENIED 0x200F
#define RESPCODE_SELFTESTFAILED 0x2011
#define RESPCODE_INVALIDCODEFORMAT 0x2016
#define RESPCODE_CAPTUREALREADYTERMINATED 0x2018
#define RESPCODE_DEVICEBUSY 0x2019
#define RESPCODE_INVALIDDEVICEPROPFORMAT 0x201B
#define RESPCODE_INVALIDDEVICEPROPVALUE 0x201C
#define RESPCODE_INVALIDPARAMETER 0x201D
// DataTypeCodes
#define DTCODE_UNDEFINED 0x0000
#define DTCODE_INT8 0x0001
#define DTCODE_UINT8 0x0002
#define DTCODE_INT16 0x0003
#define DTCODE_UINT16 0x0004
#define DTCODE_INT32 0x0005
#define DTCODE_UINT32 0x0006
#define DTCODE_INT64 0x0007
#define DTCODE_UINT64 0x0008
#define DTCODE_INT128 0x0009
#define DTCODE_UINT128 0x000A
#define DTCODE_AINT8 0x4001
#define DTCODE_AUINT8 0x4002
#define DTCODE_AINT16 0x4003
#define DTCODE_AUINT16 0x4004
#define DTCODE_AINT32 0x4005
#define DTCODE_AUINT32 0x4006
#define DTCODE_AINT64 0x4007
#define DTCODE_AUINT64 0x4008
#define DTCODE_AINT128 0x4009
#define DTCODE_AUINT128 0x400A
#define DTCODE_STR 0xFFFF
#define DTCODE_REAL 0x8001
#define DTCODE_DSDEVINFO 0x8002
#define DTCODE_DSPROPDESC 0x8003
// DevicePropCodes
#define PROPCODE_UNDEFINED 0x5000
#define PROPCODE_BATTERYLEVEL 0x5001
#define PROPCODE_FUNCTIONALMODE 0x5002
#define PROPCODE_IMAGESIZE 0x5003
#define PROPCODE_COMPRESSIONSETTING 0x5004
#define PROPCODE_WHITEBALANCE 0x5005
#define PROPCODE_RGBGAIN 0x5006
#define PROPCODE_FNUMBER 0x5007
#define PROPCODE_FOCALLENGTH 0x5008
#define PROPCODE_FOCUSDISTANCE 0x5009
#define PROPCODE_FOCUSMODE 0x500A
#define PROPCODE_EXPOSUREMETERINGMODE 0x500B
#define PROPCODE_FLASHMODE 0x500C
#define PROPCODE_EXPOSURETIME 0x500D
#define PROPCODE_EXPOSUREPROGRAMMODE 0x500E
#define PROPCODE_EXPOSUREINDEX 0x500F
#define PROPCODE_EXPOSUREBIASCOMPENSATION 0x5010
#define PROPCODE_DATETIME 0x5011
#define PROPCODE_CAPTUREDELAY 0x5012
#define PROPCODE_STILLCAPTUREMODE 0x5013
#define PROPCODE_CONTRAST 0x5014
#define PROPCODE_SHARPNESS 0x5015
#define PROPCODE_DIGITALZOOM 0x5016
#define PROPCODE_EFFECTMODE 0x5017
#define PROPCODE_BURSTNUMBER 0x5018
#define PROPCODE_BURSTINTERVAL 0x5019
#define PROPCODE_TIMELAPSENUMBER 0x501A
#define PROPCODE_TIMELAPSEINTERVAL 0x501B
#define PROPCODE_FOCUSMETERINGMODE 0x501C
#define PROPCODE_UPLOADURL 0x501D
#define PROPCODE_ARTIST 0x501E
#define PROPCODE_COPYRIGHTINFO 0x501F
class CMSCplus {
private:
BYTE *m_pDataBuffer;
BYTE m_ucInquiryBuffer[DEFAULT_DATA_BUFFER_SIZE];
DWORD m_dwInquiryDataLength;
CHAR *m_szCreateFileName;
BOOL m_bInitialized;
UCHAR m_ucScsiStatus; // stores ResponseCode of last operation
UCHAR m_SCSIPathId;
UCHAR m_SCSITargetId;
UCHAR m_SCSILun;
private:
DWORD m_utilIssueSimpleSCSICDB(UCHAR *pCDB, UCHAR ucSize, UCHAR ucDirection);
DWORD m_utilSCSIGetInquiryBuffer(UCHAR ucCDB1=0, UCHAR ucCDB2=0);
WORD m_LookupDTCodeFromPropCode(WORD wPropCode);
public:
// Functions related to SCSI Command Test Unit Ready (00H)
BOOL IsDeviceReady(void);
// Functions related to SCSI Command Send Diagnostic (1DH)
DWORD SelfTest(BYTE *pParamBuffer=NULL, DWORD dwBufSize=NULL);
// Functions related to SCSI Command Inquiry (12H)
// reuse Inquiry Buffer to reduce traffic
DWORD GetStandardInquiryBuffer(LPBYTE pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
DWORD GetManufacturer(BYTE *pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
DWORD GetProductName(BYTE *pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
DWORD GetProductVersion(BYTE *pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
DWORD GetVendorSpecificInfo(BYTE *pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
DWORD GetDeviceSerialNumber(BYTE *pBuffer, DWORD *pdwBufSize, BOOL bNoReuseIB=FALSE);
// Functions related to SCSI Command READ INFO
DWORD GetDeviceInfo(LPBYTE pDeviceInfo, DWORD dwDeviceInfoBufferLength);
DWORD GetDevicePropDesc(WORD wPropCode, LPBYTE pPropDesc, DWORD dwPropDescLength);
DWORD GetDevicePropValue(WORD wPropCode, LPBYTE pPropValue, DWORD dwPropValueLength);
// Functions related to SCSI Command WRITE INFO
DWORD SetDevicePropValue(WORD wPropCode, LPBYTE pValue, DWORD dwValueLength);
DWORD ResetDevicePropValue(WORD wPropCode);
// Functions related to SCSI Command START STOP CAPTURE
DWORD InitiateCapture(WORD wFormateCode=0, BYTE *pParamBuffer=NULL, DWORD dwBufSize=0);
DWORD TerminateOpenCapture(void);
DWORD InitiateOpenCapture(WORD wFormatCode=0, BYTE *pParamBuffer=NULL, DWORD dwBufSize=0);
// Functions related to SCSI RESET DEVICE
DWORD ResetDevice(void);
// Basic functions
BOOL Initialize(WCHAR wcDriveLetter);
WORD GetScsiStatus() { return m_ucScsiStatus; };
BOOL IsMSCplusDevice(DWORD *pdwError, BOOL bNoReuseIB=FALSE);
CMSCplus()
{
m_bInitialized=FALSE;
m_ucScsiStatus=0;
};
~CMSCplus()
{
if( m_bInitialized )
{
delete [] m_szCreateFileName;
}
};
};
#endif // __MSCPLUS_H__