读取光驱driver信息 的方法

本文介绍如何通过SCSI_PASS_THROUGH_DIRECT结构和DeviceIoControl API来读取光驱的驱动信息,包括Vendor ID、Product ID、Product Revision Level以及区域控制信息。示例代码展示了查询和打印设备信息的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 SCSI cmd获得driver信息
主要有下面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 ];
  
  
//
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值