我找不到任何关于这个电话的解释:
DeviceIoControl( aHANDLE,
IOCTL_STORAGE_QUERY_PROPERTY,
& aSTORAGE_PROPERTY_QUERY,
... etc.)
应该在aSTORAGE_PROPERTY_QUERY.QueryType
时有用
设置为PropertyExistsQuery
。
这是某种方式应该告诉我是否属性,
由aSTORAGE_PROPERTY_QUERY.PropertyId
指定,
可以从aHANDLE
找到的对象获得。
此外,它特别不会在输出缓冲区中返回任何信息(在QueryType
时返回信息
设置为PropertyStandardQuery
)。
我通过反复试验发现DeviceIoControl()
的返回值仍然表示函数调用成功/失败,并且不指示属性的可用性。
那么,这是如何工作的?
答案 0 :(得分:0)
此外,它特别不会在输出缓冲区中返回任何信息(当QueryType设置为PropertyStandardQuery时会返回信息)。
IOCTRL_STORAGE_QUERY_PROPERTY
和STORAGE_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 ++。