2016-09-10 15 views
3

hdd 전송 모드 (dma 또는 pio)를 가져 와서 인쇄해야합니다. 스크린 샷의 빨간색 원으로 장치 관리자에서 찾을 수 있습니다. AtaScreenhdd 전송 모드를 얻는 방법?

그래서 저는 programm에서 빨간색 원으로 정보를 얻어야합니다. 나는 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"를 쓸 수 있습니다. 이 솔루션에서 C#에서 .exe를 실행하고 파일에서 읽습니다. C#의 OFC 솔루션은 더 많이 평가 될 것입니다.

+0

영어 버전이 있습니까? 장치 관리자 –

+0

@SimonMourier DeviceManager -> IDE ATA/ATAPI 컨트롤러 -> 드롭 다운에서 채널 정보를 마우스 오른쪽 버튼으로 클릭하고 속성 -> 고급 속성 (두 번째 탭)을 선택하면이 정보가있는 곳을 정확히 이해하는 것은 어렵습니다. Windows 7. – Nikita

+1

STORAGE_ADAPTER_DESCRIPTOR 구조체 (https://msdn.microsoft.com/en-us/library/windows/desktop/ff800832.aspx)에서 AdapterUsesPio를 사용해 보았습니까? 여기 예제를 게시했습니다. http : // pastebin .com/LSHCy08y하지만 IDE 드라이브가 없으므로 테스트 할 수 없습니다. –

답변

1

당신은에서 AdapterUsesPio 멤버를 사용할 수 있습니다 : 당신이 C#으로 AutoIt을 사용하려는 경우

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") 

:

샘플 (다른 Windows 버전과 언어에주의 하시고) 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 및 질문이있는 새로운 jorney를 시작했습니다. http://stackoverflow.com/questions/39544994/how-to-get-hdd-ata-standards-from-c. 너 뭔가 아는 것 있니? – Nikita