C 如何在筛选器驱动程序中获取磁盘驱动器序列号?

C 如何在筛选器驱动程序中获取磁盘驱动器序列号?,c,driver,wmi,kernel-mode,filter-driver,C,Driver,Wmi,Kernel Mode,Filter Driver,我在windows中编写了一个驱动程序,我需要磁盘驱动器序列号,用于我找到的ansver的用户模式。 我的问题是,是否可以将上述代码转换为内核模式,以及如何转换?WMI查询在筛选器驱动程序中可用吗?示例代码可以提供很大帮助 编辑: 我找到了这段代码,但我怎么重写他的序列号呢 void GetSmbios() { NTSTATUS status; GUID smbiosGUID = SMBIOS_DATA_GUID; // defined in wmiguid.h PVO

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

编辑:

我找到了这段代码,但我怎么重写他的序列号呢

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;
    }

}
包含字段
VolumeSerialNumber
。可以使用检索此数据结构


这需要卷的句柄或卷中的文件/目录。如果这不可行,但您有一个
设备\u对象
,您可以尝试使用构建自己的IRP并发送它,尽管我不知道这是否得到批准--文档说这样的请求“由I/O管理器发送。”

分配内存后,我相信您需要再次调用
IoWMIQueryAllData()
,这次是通过数据缓冲

SMBIOS似乎与磁盘驱动器无关,因此您需要将不同的GUID传递到
IoWMIOpenBlock()
。也许(
{BF253431-1E4D-4F57-00E7-64B2CACC801E}
),因为您的用户模式示例和查询Win32_PhysicalMedia以获取序列号

但是,引用的DLL(可能是用户模式)是Win32_PhysicalMedia的提供程序。因此,在内核模式下,这可能无法访问

但它也给出了如何从内核模式获取信息的提示:IOCTLs。它提到IOCTL_SMART_GET_版本,它应该是SMART_GET_版本,并且: (在用户模式下,但您应该能够使用
ZwDeviceIoControlFile()
在内核模式下执行类似操作)。注意,它接着执行另一个ioctl命令,SMART\u RCV\u DRIVE\u DATA,以获取序列号

另一个听起来很有希望(更一般)的ioctl是ioctl_STORAGE_QUERY_属性,输入STORAGE_PROPERTY_QUERY.PropertyId设置为StorageDeviceProperty,因此输出将是一个STORAGE_DEVICE_描述符结构,它具有字段serialnumberofset:

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


我需要磁盘驱动器序列号而不是卷序列号。对不起!我还以为你不准确呢。这真的为我省下了时间!哪个对你有用:WMI、SMART\u RCV\u驱动器\u数据、IOCTL\u存储\u查询\u属性或其他什么?