使用 SCSI cmd获得driver信息
主要有下面2个文件:scsi_struct.h
主要有下面2个文件:scsi_struct.h
//
------------------------scsi_struct.h--------------------------------------
#include < windows.h >
// If this was not defined we should also assume that some structs are not defined as well
#ifndef IOCTL_SCSI_PASS_THROUGH_DIRECT
#define IOCTL_SCSI_PASS_THROUGH_DIRECT 0x4D014
#define SCSI_IOCTL_DATA_OUT 0
#define SCSI_IOCTL_DATA_IN 1
#define SCSI_IOCTL_DATA_UNSPECIFIED 2
// Reference [2]
typedef struct _SCSI_PASS_THROUGH_DIRECT
{
USHORT Length;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoLength;
UCHAR DataIn;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
ULONG SenseInfoOffset;
UCHAR Cdb[ 16 ];
} SCSI_PASS_THROUGH_DIRECT, * PSCSI_PASS_THROUGH_DIRECT;
#endif
#pragma pack(1)
/* !
Reference [1] page 528
*/
enum MMC_KEY_FORMAT_CODE_CLASS0
{
KEY_FORMAT_AGID_CSS = 0 ,
KEY_FORMAT_CHAL_KEY = 1 ,
KEY_FORMAT_KEY1 = 2 ,
KEY_FORMAT_TITLE_KEY = 4 ,
KEY_FORMAT_ASF = 5 ,
KEY_FORMAT_RPC_STATE = 8 ,
KEY_FORMAT_AGID_CPRM = 0x11 ,
KEY_FORMAT_NONE = 0x3F
};
/* !
The type code field specifies the current state of regionalization process
Reference [1] Table 524, page 533
*/
enum RPC_STATE_TYPE_CODES
{
// ! No drive region
RPC_STATE_TYPECODE_NONE = 0 ,
// ! Drive region is set
RPC_STATE_TYPECODE_SET = 1 ,
// ! Drive region is set. Additional restrictions required to make changes
RPC_STATE_TYPECODE_LAST_CHANCE = 2 ,
// ! Drive region has been set permamently, but may be reset by vendor
RPC_STATE_TYPECODE_PERM = 3
};
/* !
RPC Scheme specifies the type of Region Playback Controls being used by the Drive
*/
enum RPC_STATE_SCHEMES
{
// !Drive does not enforce Region Playback Controls (RPC)
RPC_STATE_SCHEMES_UNK = 0 ,
/* !
Drive region shall adhere to this standard and all requirements of the CSS
license agreement concerning RPC.
*/
RPC_STATE_SCHEMES_RPC2 = 1
};
/* !
This structure is returned when a REPORT_KEY is executed with key type = 8
Reference [1]p.533
*/
typedef struct _REPORT_KEY_DATA_RPC_STATE
{
char rsvrd1[ 4 ];
//
#include < windows.h >
// If this was not defined we should also assume that some structs are not defined as well
#ifndef IOCTL_SCSI_PASS_THROUGH_DIRECT
#define IOCTL_SCSI_PASS_THROUGH_DIRECT 0x4D014
#define SCSI_IOCTL_DATA_OUT 0
#define SCSI_IOCTL_DATA_IN 1
#define SCSI_IOCTL_DATA_UNSPECIFIED 2
// Reference [2]
typedef struct _SCSI_PASS_THROUGH_DIRECT
{
USHORT Length;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoLength;
UCHAR DataIn;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
ULONG SenseInfoOffset;
UCHAR Cdb[ 16 ];
} SCSI_PASS_THROUGH_DIRECT, * PSCSI_PASS_THROUGH_DIRECT;
#endif
#pragma pack(1)
/* !
Reference [1] page 528
*/
enum MMC_KEY_FORMAT_CODE_CLASS0
{
KEY_FORMAT_AGID_CSS = 0 ,
KEY_FORMAT_CHAL_KEY = 1 ,
KEY_FORMAT_KEY1 = 2 ,
KEY_FORMAT_TITLE_KEY = 4 ,
KEY_FORMAT_ASF = 5 ,
KEY_FORMAT_RPC_STATE = 8 ,
KEY_FORMAT_AGID_CPRM = 0x11 ,
KEY_FORMAT_NONE = 0x3F
};
/* !
The type code field specifies the current state of regionalization process
Reference [1] Table 524, page 533
*/
enum RPC_STATE_TYPE_CODES
{
// ! No drive region
RPC_STATE_TYPECODE_NONE = 0 ,
// ! Drive region is set
RPC_STATE_TYPECODE_SET = 1 ,
// ! Drive region is set. Additional restrictions required to make changes
RPC_STATE_TYPECODE_LAST_CHANCE = 2 ,
// ! Drive region has been set permamently, but may be reset by vendor
RPC_STATE_TYPECODE_PERM = 3
};
/* !
RPC Scheme specifies the type of Region Playback Controls being used by the Drive
*/
enum RPC_STATE_SCHEMES
{
// !Drive does not enforce Region Playback Controls (RPC)
RPC_STATE_SCHEMES_UNK = 0 ,
/* !
Drive region shall adhere to this standard and all requirements of the CSS
license agreement concerning RPC.
*/
RPC_STATE_SCHEMES_RPC2 = 1
};
/* !
This structure is returned when a REPORT_KEY is executed with key type = 8
Reference [1]p.533
*/
typedef struct _REPORT_KEY_DATA_RPC_STATE
{
char rsvrd1[ 4 ];
//