2016-09-10 4 views
3

J'ai besoin d'obtenir le mode de transfert hdd (dma ou pio) et l'imprimer, vous pouvez le trouver dans le gestionnaire de périphériques (en cercle rouge dans la capture d'écran). Donc, j'ai besoin d'obtenir l'information dans le cercle rouge du programme. J'ai essayé d'utiliser les classes wmi, mais Win32_DiskDrive, Win32_IDEController et d'autres ne fournissent pas les informations dont j'ai besoin. Le plus proche de la fenêtre de propriétés du gestionnaire de périphériques était Win32_IDEController, le champ Win32_IDEController ["Nom"] renvoie la chaîne ATA Channel 1.Comment obtenir le mode de transfert hdd?

J'ai également trouvé ce https://msdn.microsoft.com/en-us/library/windows/hardware/ff550142(v=vs.85).aspx, mais il utilise irb.h, qui fait partie de ddk (wdk) et je ne l'ai jamais utilisé auparavant, donc je ne sais même pas comment utiliser cette fonction. Maintenant j'apprends le WDK) Toute solution dans n'importe quelle langue sera bonne, dans le projet j'emploie C#, mais si la solution sera dans une autre langue je peux écrire "DMA" ou "PIO" dans un dossier dans cette solution, exécutez-le .exe à partir de C# et lisez à partir du fichier. La solution OFC en C# sera plus appréciée.

+0

Avez-vous une version anglaise? il est difficile de comprendre exactement où réside cette information dans le gestionnaire de périphériques –

+0

@SimonMourier DeviceManager -> Contrôleurs IDE ATA/ATAPI -> liste déroulante, faites un clic droit sur celui du canal et choisissez Propriétés - Propriétés avancées (second onglet). Windows 7. – Nikita

+1

Avez-vous essayé AdapterUsesPio à partir de la structure STORAGE_ADAPTER_DESCRIPTOR (https://msdn.microsoft.com/en-us/library/windows/desktop/ff800832.aspx), j'ai posté un exemple ici: http: // pastebin .com/LSHCy08y mais je ne peux pas tester puisque je n'ai pas de disques IDE. –

Répondre

1

Vous pouvez utiliser le membre AdapterUsesPio de la STORAGE_ADAPTER_DESCRIPTOR structure. Voici un exemple C++ qui montre comment interroger un disque pour cela:

#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

Bonjour, J'ai commencé un nouveau jorney avec beaucoup de google, msdn et des questions sur les forums http://stackoverflow.com/questions/39544994/how-to-get-hdd-ata-standards-from-c. Peut-être que vous connaissez quelque chose? – Nikita

3

Vous pouvez utiliser autoit (https://www.autoitscript.com) pour le lire directement à partir de l'interface graphique.

Sample (Attention avec les différentes versions de Windows et de langues différentes):

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

Si vous souhaitez utiliser Autoit en C#:

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