IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> STORAGE_DEVICE_ID_DESCRIPTOR数据结构解析 -> 正文阅读

[数据结构与算法]STORAGE_DEVICE_ID_DESCRIPTOR数据结构解析

获取磁盘的序列号或者厂商号的时候,发现了IOCTL_STORAGE_QUERY_PROPERTY的请求可以设置Property参数,

    // ==================STORAGE_DEVICE_ID_DESCRIPTOR====================
	pPropertyQuery->PropertyId = STORAGE_PROPERTY_ID::StorageDeviceIdProperty;
	STORAGE_DEVICE_ID_DESCRIPTOR* pDeviceIdDescriptor = (STORAGE_DEVICE_ID_DESCRIPTOR*)new BYTE[sizeof(STORAGE_DEVICE_ID_DESCRIPTOR) + 400];
	status = DeviceIoControl(hDevice,
		IOCTL_STORAGE_QUERY_PROPERTY,
		pPropertyQuery,
		sizeof(STORAGE_PROPERTY_QUERY),
		pDeviceIdDescriptor,
		sizeof(STORAGE_DEVICE_ID_DESCRIPTOR) + 400,
		&returned,
		FALSE);
    //=====STORAGE_DEVICE_UNIQUE_IDENTIFIER包含STORAGE_DEVICE_ID_DESCRIPTOR========
	pPropertyQuery->PropertyId = STORAGE_PROPERTY_ID::StorageDeviceUniqueIdProperty;
	STORAGE_DEVICE_UNIQUE_IDENTIFIER* pDeviceUniqueId = (STORAGE_DEVICE_UNIQUE_IDENTIFIER*)new BYTE[sizeof(STORAGE_DEVICE_UNIQUE_IDENTIFIER) + 500];
	memset(pDeviceUniqueId, 0, sizeof(STORAGE_DEVICE_UNIQUE_IDENTIFIER) + 500);
	status = DeviceIoControl(hDevice,
		IOCTL_STORAGE_QUERY_PROPERTY,
		pPropertyQuery,
		sizeof(STORAGE_PROPERTY_QUERY),
		pDeviceUniqueId,
		sizeof(STORAGE_DEVICE_UNIQUE_IDENTIFIER) + 500,
		&returned,
		FALSE);
    
    STORAGE_DEVICE_ID_DESCRIPTOR* pDeviceID = (STORAGE_DEVICE_ID_DESCRIPTOR*)((char*)pDeviceUniqueId + pDeviceUniqueId->StorageDeviceIdOffset);

如上两种方式都可以获得STORAGE_DEVICE_ID_DESCRIPTOR,但是微软官方并没有这个结构里面Identifiers的解释。

STORAGE_DEVICE_ID_DESCRIPTOR - Win32 apps | Microsoft Docs

经过google百度的查询得知Identifiers是一个buffer,里面存储了NumberOfIdentifiers个数据结构。

?从微软官方定义的结构看

typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
  DWORD Version;
  DWORD Size;
  DWORD NumberOfIdentifiers;
  BYTE  Identifiers[1];
} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;

0-3Bytes,4个字节,表示Version,值为0x00000010

4-7Bytes,4个字节,表示Size,值为0x00000064,也就是整个结构的大小

8-11Bytes,4个字节,表示NumberOfIdentifiers,值是0x00000001,也就是Identifiers对应的数据只包含一个数据结构

根据微软官方的提示,这个结构式SCSI的vpd数据,

参考如下资源

https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CSVP/%5BMS-CSVP%5D-140213.doc

如果失效,可以前往CSDN下载,0积分

https://download.csdn.net/download/youyudexiaowangzi/84213040

此文件在msdn上 有如下下载链接,但是前往下载提示游客没有访问权限

[MS-CSVP]: SCSI-3 Persistent Reservations | Microsoft Docs

章节2.2.9

?章节2.2.10

?文章中对应SPC-3是SCSC Primary Command - 3,下载连接如下:

https://www.t10.org/ftp/t10/document.08/08-309r0.pdfyy

如果失效,可以前往CSDN下载,0积分

https://download.csdn.net/download/youyudexiaowangzi/84213161

对应的7.6.3.1章节CODE SET field described

?DENTIFIER TYPE field described

?再次分析

12-15Bytes,表示Code Set,值为0x02,也就是The IDENTIFIER field shall contain ASCII printable characters
(i.e., code values 20h through 7Eh)

表示的类型是可读的ascii字符串

16-19Bytes,表示Type,值为0x01,也就是T10 vendor ID based,表示本结构显示的是Vendor ID信息

20-21Bytes,表示IdentifierSize ,值为0x44,也就是本结构里面Identifier 的长度,本结构除了Identifier 以外的长度是CodeSet+Type+IdentifierSize+NextOffset+Association一共16字节,本结构大小为0x44 + 16 = 68 + 16 = 84个字节,算上STORAGE_DEVICE_ID_DESCRIPTOR除Identifiers以外的大小,也就是84+12=96个字节,后面的四个字节是全0

22-23Bytes,表示NextOffset ,也就死下一个结构的偏移,本结构的偏移是0,下一个结构的偏移是0x58,算上STORAGE_DEVICE_ID_DESCRIPTOR除Identifiers以外的大小,也就是0x58+12=88+12=100,也就是超过了整个STORAGE_DEVICE_ID_DESCRIPTOR结构,正好印证了STORAGE_DEVICE_ID_DESCRIPTOR只有一个结构

24-27Bytes,表示Association,值为0,暂时不用管

28 - ...表示Identifier,长度为IdentifierSize也就是0x44,也就是ATA开始的字符和空格

 A T A
          H o o d i s k   S S D
                          K B T M
   C G C 2 1 2 3 6 2 2 0

解析完发现只是一个合并了多种信息的字符串。不足以作为硬盘的唯一标识,但是这个结构被微软定义了却没有在MSDN中定义SCSI的细节,于是只能自己去晚上慢慢摸索。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:28:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:31:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码