Как получить режим передачи HDD?

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

Поэтому мне нужно получить информацию в красном круге из программы. Я пытался использовать классы 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 # будет оценено больше.

2

Решение

Вы можете использовать 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;
}
1

Другие решения

Вы можете использовать autoit (https://www.autoitscript.com) читать прямо из GUI.

Пример (будьте осторожны с разными версиями 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/

3

По вопросам рекламы [email protected]