2016-09-10 16 views
3

Мне нужно получить режим передачи hdd (dma или pio) и распечатать его, вы можете найти его в диспетчере устройств (в красном круге на скриншоте). AtaScreenКак получить режим передачи hdd?

Поэтому мне нужно получить информацию в красном круге из программы. Я пытался использовать классы wmi, но Win32_DiskDrive, Win32_IDEController и другие не предоставляют необходимую мне информацию. Наиболее близким к окну свойств из диспетчера устройств был Win32_IDEController, поле Win32_IDEController ["Name"] возвращает строку ATA Channel 1.

Также я нашел это https://msdn.microsoft.com/en-us/library/windows/hardware/ff550142(v=vs.85).aspx, но он использует irb.h, то есть часть ddk (wdk), и я никогда не использовал его раньше, поэтому я даже не знаю, как использовать эту функцию.

Теперь я изучаю WDK) Любое решение на любом языке будет хорошо, в проекте я использую C#, но если решение будет на другом языке, я могу записать «DMA» или «PIO» в файл в этом решении выполните его .exe с C# и прочитайте из файла. Решение OFC в C# будет оценено больше.

+0

У вас есть английская версия? трудно точно понять, где находится эта информация в диспетчере устройств. –

+0

@SimonMourier DeviceManager -> выпадающий список IDE ATA/ATAPI ->, щелкните правой кнопкой мыши по каналу и выберите «свойства» -> расширенные свойства (вторая вкладка). Windows 7. – Nikita

+1

Вы пробовали AdapterUsesPio из структуры STORAGE_ADAPTER_DESCRIPTOR (https://msdn.microsoft.com/en-us/library/windows/desktop/ff800832.aspx), я разместил здесь пример: http: // pastebin .com/LSHCy08y, но я не могу протестировать, так как у меня нет IDE-дисков. –

ответ

1

Вы можете использовать AdapterUsesPio элемент из STORAGE_ADAPTER_DESCRIPTOR структура. Вот пример C++, который демонстрирует, как запросить диск для него:

#include "stdafx.h" 

int main() 
{ 
    wchar_t path[1024]; 
    wsprintf(path, L"\\\\?\\C:"); // or L"\\\\.\\PhysicalDrive0" 

    // note we use 0, not GENERIC_READ to avoid the need for admin rights 
    // 0 is ok if you only need to query for characteristics 
    HANDLE device = CreateFile(path, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); 
    if (device == INVALID_HANDLE_VALUE) 
     return 0; 

    STORAGE_PROPERTY_QUERY query = {}; 
    query.PropertyId = StorageAdapterProperty; 
    query.QueryType = PropertyStandardQuery; 

    STORAGE_ADAPTER_DESCRIPTOR descriptor = {}; 

    DWORD read; 
    if (!DeviceIoControl(device, IOCTL_STORAGE_QUERY_PROPERTY, 
     &query, 
     sizeof(query), 
     &descriptor, 
     sizeof(descriptor), 
     &read, 
     NULL 
     )) 
    { 
     wprintf(L"DeviceIoControl error: %i\n", GetLastError()); 
    } 
    else 
    { 
     wprintf(L"AdapterUsesPio: %i\n", descriptor.AdapterUsesPio); 
    } 

    CloseHandle(device); 
    return 0; 
} 
+0

Привет, я начал новый юрист с большим количеством google, msdn и вопросов на форумах http://stackoverflow.com/questions/39544994/how-to-get-hdd-ata-standards-from-c. Может быть, вы что-то знаете? – Nikita

3

Вы можете использовать autoit (https://www.autoitscript.com), чтобы читать его прямо из графического интерфейса.

Sample (будьте осторожны с различными версиями Windows, и на разных языках):

Run ("mmc c:\windows\system32\devmgmt.msc") 
    WinWaitActive ("Device Manager") 
    send("{tab}{down}{down}{down}{down}{down}{down}{down}{NUMPADADD}{down}!{enter}") 
    WinWaitActive ("Primary IDE Channel Properties") 
    send("^{tab}") 
    $drivemode = ControlGetText("Primary IDE Channel Properties", "", "Static4") 
    ControlClick("Primary IDE Channel Properties","Cancel","Button6") 
    WinKill ("Device Manager") 

Если вы хотите использовать AutoIt в C#:

https://www.autoitscript.com/forum/topic/177167-using-autoitx-from-c-net/