今天拿到了 Microsoft Surface 3 ,
测试一个EFI程序的时候总是出问题,
后来查了一下,发现在使用EFI_BLOCK_IO 取得外接USB闪存大小的时候
也就是 BlkIo->Media->LastBlock 取得的大小会比实际的多出来一个
估计是写固件的人理解出了问题。
这里是定义
/**
  Block IO read only mode data and updated only via members of BlockIO
*
*/
typedef struct {
  ///
  
/// The curent media Id. If the media changes, this value is changed.
  
///
  UINT32  MediaId;         
   ///
  
/// TRUE if the media is removable; otherwise, FALSE.
  
///    
  BOOLEAN RemovableMedia;
   ///
  
/// TRUE if there is a media currently present in the device;
  
/// othersise, FALSE. THis field shows the media present status
  
/// as of the most recent ReadBlocks() or WriteBlocks() call.  
  
///
  BOOLEAN MediaPresent;
  ///
  
/// TRUE if LBA 0 is the first block of a partition; otherwise
  
/// FALSE. For media with only one partition this would be TRUE.
  
///
  BOOLEAN LogicalPartition;
   ///
  
/// TRUE if the media is marked read-only otherwise, FALSE.
  
/// This field shows the read-only status as of the most recent WriteBlocks () call.
  
///
  BOOLEAN ReadOnly;
   ///
  
/// TRUE if the WriteBlock () function caches write data.
  
///
  BOOLEAN WriteCaching; 
   ///
  
/// The intrinsic block size of the device. If the media changes, then
  
/// this field is updated.  
  
///
  UINT32  BlockSize; 
   ///
  
/// Supplies the alignment requirement for any buffer to read or write block(s).
  
///
  UINT32  IoAlign; 
   ///
  
/// The last logical block address on the device.
  
/// If the media changes, then this field is updated. 
  
///
  EFI_LBA LastBlock; 
  ///
  
/// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to
  
/// EFI_BLOCK_IO_PROTOCOL_REVISION2. Returns the first LBA is aligned to 
  
/// a physical block boundary. 
  
///
  EFI_LBA LowestAlignedLba;
  ///
  
/// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to
  
/// EFI_BLOCK_IO_PROTOCOL_REVISION2. Returns the number of logical blocks 
  
/// per physical block.
  
///
  UINT32 LogicalBlocksPerPhysicalBlock;
  ///
  
/// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to
  
/// EFI_BLOCK_IO_PROTOCOL_REVISION3. Returns the optimal transfer length
  
/// granularity as a number of logical blocks.
  
///
  UINT32 OptimalTransferLengthGranularity;
} EFI_BLOCK_IO_MEDIA;
其中那个LastBlock是这样说明的
  /// The last logical block address on the device.
所以应该是总的block 数-1.
不知道微软的工程师为什么会有这样的错误
Posted on 2016-06-14 09:28 snowman1101 阅读(462) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理