首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在过滤器驱动程序中获取磁盘驱动器序列号?

如何在过滤器驱动程序中获取磁盘驱动器序列号?
EN

Stack Overflow用户
提问于 2016-10-13 08:39:30
回答 2查看 1.4K关注 0票数 1

我在windows中编写了一个驱动程序,我需要磁盘驱动器序列号,对于用户模式,我找到了转换程序。我的问题是,能否将上述代码转换为内核模式,以及如何实现?WMI查询在筛选器驱动程序中可用吗?示例代码可以提供很大帮助。

编辑:

我找到了这里这段代码,但是我是如何重写他以获得序列号的呢?

代码语言:javascript
运行
复制
void GetSmbios()
{

    NTSTATUS status;
    GUID smbiosGUID = SMBIOS_DATA_GUID; // defined in wmiguid.h
    PVOID wmiObject = NULL;
    PWNODE_ALL_DATA dataBuffer;

    ULONG bufferSize;
    int TAG_SMBIOS = 'smbi';
    //
    // Get a WMI block handle to the SMBIOS_DATA_GUID
    //
    status = IoWMIOpenBlock((GUID *)&smbiosGUID, WMIGUID_QUERY,
        &wmiObject);
    if (!NT_SUCCESS(status)) 
    {
        return status;
    }

    //
    // Determine how much space is required for the data
    //
    status = IoWMIQueryAllData(wmiObject, &bufferSize, NULL);
    if (status != STATUS_BUFFER_TOO_SMALL) 
    {
        ObDereferenceObject(wmiObject);
        return status;
    }

    //
    // Allocate the necessary storage. This space must come out of NP-pool
    //
    dataBuffer = ExAllocatePoolWithTag(
        NonPagedPool,
        bufferSize,
        TAG_SMBIOS);

    if (dataBuffer == NULL) 
    {
        ObDereferenceObject(wmiObject);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-14 05:38:55

在分配内存之后,我相信您需要再次调用IoWMIQueryAllData(),这一次是传递dataBuffer。

SMBIOS似乎与磁盘驱动器无关,因此您需要将不同的GUID传递给IoWMIOpenBlock()。也许是这一个 ({BF253431-1E4D-4F57-00E7-64B2CACC801E}),因为您的用户模式示例和其他查询Win32_PhysicalMedia来获取SerialNumber.

但是,引用了一个(想必是用户模式的) DLL,它是Win32_PhysicalMedia的提供程序。因此,这在内核模式下可能是不可访问的。

但它也提示了如何从内核模式:IOCTL获取信息。它提到了IOCTL_SMART_GET_VERSION (应该是SMART_GET_VERSION )和下面是一个例子:(在用户模式下,但是您应该能够使用ZwDeviceIoControlFile()从内核模式进行类似的操作)。注意,它后面是另一个ioctl命令SMART_RCV_DRIVE_DATA,以获取序列号。

另一个听起来很有前途的ioctl是IOCTL_STORAGE_QUERY_PROPERTY,它将输入STORAGE_PROPERTY_QUERY.PropertyId设置为StorageDeviceProperty,因此输出将是一个STORAGE_DEVICE_DESCRIPTOR结构,其中有字段SerialNumberOffset:

指定从结构开始到包含设备序列号的以空结尾的ASCII字符串的字节偏移量。如果设备没有序列号,则此成员为零。

票数 1
EN

Stack Overflow用户

发布于 2016-10-13 20:05:04

FILE_FS_VOLUME_INFORMATION包含字段VolumeSerialNumber。可以使用ZwQueryVolumeInformationFile(... FileFsVolumeInformation)检索此数据结构。

这需要卷的句柄或卷中的文件/目录。如果这不可行,但您有一个DEVICE_OBJECT,您可以尝试使用IRP_MJ_QUERY_VOLUME_INFORMATION构建自己的IRP,并使用IoCallDriver()发送它,尽管我不知道这是否被批准--医生说这样的请求是由I/O管理器发送的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40016137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档