如何使用IOCTL_STORAGE_QUERY_PROPERTY获取属性存在状态

时间:2018-02-08 00:11:06

标签: winapi ioctl

我找不到任何关于这个电话的解释:

DeviceIoControl( aHANDLE, 
        IOCTL_STORAGE_QUERY_PROPERTY,
        & aSTORAGE_PROPERTY_QUERY, 
       ... etc.)

应该在aSTORAGE_PROPERTY_QUERY.QueryType时有用 设置为PropertyExistsQuery

这是某种方式应该告诉我是否属性, 由aSTORAGE_PROPERTY_QUERY.PropertyId指定, 可以从aHANDLE找到的对象获得。

此外,它特别不会在输出缓冲区中返回任何信息(在QueryType时返回信息 设置为PropertyStandardQuery)。

我通过反复试验发现DeviceIoControl()的返回值仍然表示函数调用成功/失败,并且不指示属性的可用性。

那么,这是如何工作的?

1 个答案:

答案 0 :(得分:0)

  

此外,它特别不会在输出缓冲区中返回任何信息(当QueryType设置为PropertyStandardQuery时会返回信息)。

IOCTRL_STORAGE_QUERY_PROPERTYSTORAGE_PROPERTY_QUERY文件中明确说明了这一点:

  

通过lpOutBuffer参数返回的可选输出缓冲区可以是几种结构之一,具体取决于PropertyId指向的STORAGE_PROPERTY_QUERY结构的lpInBuffer成员的值参数。这些值由STORAGE_PROPERTY_ID枚举枚举。 如果QueryType的{​​{1}}成员设置为STORAGE_PROPERTY_QUERY,则不会返回任何结构

  

通过IOCTL_STORAGE_QUERY_PROPERTY控制代码的PropertyExistsQuery参数返回的可选输出缓冲区可以是几种结构之一,具体取决于lpOutBuffer成员的值。 如果PropertyId成员设置为QueryType,则不会返回任何结构

PropertyExistsQuery文档还明确说明了以下内容:

  

nOutBufferSize

     

输出缓冲区的大小,以字节为单位。 在不检索其数据的情况下确定属性是否存在可以为零。为此,请将此参数设置为零(0)并将IOCTRL_STORAGE_QUERY_PROPERTY输入结构的QueryType成员设置为STORAGE_PROPERTY_QUERY(1)。如果对PropertyExistsQuery的调用返回非零值,则属性存在

这与你对DeviceIoControl的回报价值没有告诉你你在寻找什么的说法相矛盾。

然而,似乎是PropertyExistsQuery is not reliable on all systems and devices!它有时会报告错误的结果(同样,在检索属性的STORAGE_DESCRIPTOR_HEADER时,也会报告错误的DeviceIoControl()值)。

链接文章的作者继续展示他如何采用不仅要求财产存在,还要查询其标题和数据,然后证实结果。

代码在VB中,但可以翻译成C / C ++。