2016-10-13 11 views
1

私はWindowsにドライバを書いていますが、ディスクドライブのシリアル番号が必要です。ユーザモードでは、this ansverが見つかりました。 私の質問は、上記のコードをカーネルモードに変換することは可能ですか? WMIクエリはフィルタドライバで使用できますか?サンプルコードは大いに役立ちます。フィルタドライバでディスクドライブのシリアル番号を取得するにはどうすればよいですか?

EDIT:

私はこのコードhereを見つけましたが、私は、シリアル番号を取得するために彼を書き換えますか?

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

} 

答えて

1

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

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

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

ただし、カーネルモード:IOCTLから情報を取得する方法についてもヒントを得ています。 IOCTL_SMART_GET_VERSIONはSMART_GET_VERSIONだけで、here's an example: (ユーザモードでは、ZwDeviceIoControlFile()を使用してカーネルモードと同様にできるはずです)が記述されています。シリアル番号を取得するには、別のioctlコマンドSMART_RCV_DRIVE_DATAを使用してください。

はバイトを指定:入力がStorageDevicePropertyに設定STORAGE_PROPERTY_QUERY.PropertyId、その出力がフィールドSerialNumberOffsetを持つSTORAGE_DEVICE_DESCRIPTOR構造になりますと

有望な(そして、より一般的)に聞こえる別のioctlは、IOCTL_STORAGE_QUERY_PROPERTYです構造体の先頭から、デバイスのシリアル番号を含むヌル終端のASCII文字列にオフセットします。デバイスにシリアル番号がない場合、このメンバーはゼロです。

+0

あなたのために働いたのはWMI、SMART_RCV_DRIVE_DATA、IOCTL_STORAGE_QUERY_PROPERTYなのですか? – asynchronos

0

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

ボリュームのハンドルまたはボリューム内のファイル/ディレクトリが必要です。それが実現可能ではないが、DEVICE_OBJECTがある場合は、IRP_MJ_QUERY_VOLUME_INFORMATIONで自分自身のIRPを構築し、IoCallDriver()と一緒に送信してみるとよいかもしれませんが、許可されているかどうかわかりません。 Oマネージャ」を参照してください。

+0

**ディスクドライブ**シリアル番号ではなく**ボリューム**シリアル番号が必要です。 – codeDom

+0

申し訳ありませんあなたは不正確であると思った。 – asynchronos

関連する問題