1

Windowsでドライバーを作成しましたが、ユーザーモード用にディスクドライブのシリアル番号が必要です。この回答を見つけまし。私の質問は、上記のコードをカーネル モードに変換することは可能ですか? また、その方法を教えてください。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;
    }

}
4

2 に答える 2

1

メモリを割り当てた後、もう一度呼び出す必要があると思いますIoWMIQueryAllData()。今回は dataBuffer を渡します。

SMBIOS はディスク ドライブに関連していないように見えるため、別の GUID を に渡す必要がありますIoWMIOpenBlock()。おそらくこれ( {BF253431-1E4D-4F57-00E7-64B2CACC801E}) です。これは、ユーザー モードの例とのユーザーが Win32_PhysicalMedia にクエリを実行して SerialNumber を取得しているためです。

ただし、これは Win32_PhysicalMedia のプロバイダーである (おそらくユーザー モードの) DLL を参照します。したがって、これはカーネルモードではアクセスできない場合があります。

ただし、カーネルモードから情報を取得する方法のヒントも提供します: IOCTLs. IOCTL_SMART_GET_VERSION について言及されていますが、これは単に SMART_GET_VERSION である必要があります。以下に例を示します: (ユーザー モードでは、を使用してカーネル モードから同様のことができるはずですZwDeviceIoControlFile())。シリアル番号を取得するために、別の ioctl コマンド SMART_RCV_DRIVE_DATA を使用することに注意してください。

有望に聞こえる (そしてより一般的な) ioctl は IOCTL_STORAGE_QUERY_PROPERTY で、入力 STORAGE_PROPERTY_QUERY.PropertyId が StorageDeviceProperty に設定されているため、出力はフィールド SerialNumberOffset を持つ STORAGE_DEVICE_DESCRIPTOR 構造になります。

構造体の先頭から、デバイスのシリアル番号を含む null で終わる ASCII 文字列までのバイト オフセットを指定します。デバイスにシリアル番号がない場合、このメンバーはゼロです。

于 2016-10-14T05:38:55.410 に答える
1

FILE_FS_VOLUME_INFORMATIONフィールドが含まれていますVolumeSerialNumber。このデータ構造は で取得できますZwQueryVolumeInformationFile(... FileFsVolumeInformation)

これには、ボリュームまたはボリューム内のファイル/ディレクトリへのハンドルが必要です。それが実現不可能であるが、 を持っている場合は、DEVICE_OBJECTで独自の IRP を構築してIRP_MJ_QUERY_VOLUME_INFORMATIONで送信することを試みることができますが、それIoCallDriver()が認可されているかどうかはわかりません。 "

于 2016-10-13T20:05:04.953 に答える