今天拿到了 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.
不知道微软的工程师为什么会有这样的错误