2016-10-13 17 views
1

Windows에서 드라이버를 작성하고 사용자 드라이브 모드에서 디스크 드라이브 일련 번호가 필요합니다. this ansver입니다. 내 질문에 위의 코드를 커널 모드로 변환 할 수 있습니까? 필터 드라이버에서 WMI 쿼리를 사용할 수 있습니까? 샘플 코드가 크게 도움이 될 수 있습니다.필터 드라이버에서 디스크 드라이브 일련 번호를 얻으려면 어떻게해야합니까?

는 편집 :

나는 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_STORAGE_QUERY_PROPERTY가 유망 (더 일반적인) 사운드 다른 IOCTL은 :

바이트를 지정 구조의 시작 부분에서 장치의 일련 번호가 들어있는 널 종료 ASCII 문자열로 오프셋됩니다. 장치에 일련 번호가 없으면이 구성원은 0입니다.

+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()과 함께 보내보십시오. 허용되는지는 잘 모르겠지만 의사는 그러한 요청이 I/O 관리자. "

+0

** 디스크 드라이브 ** 일련 번호가 아닙니다 ** 볼륨 ** 일련 번호가 필요합니다. – codeDom

+0

죄송합니다! 네가 부정확하다고 생각 했어. – asynchronos