none
Récupérer la taille du secteur physique RRS feed

  • Discussion générale

  • Bonjour

    Je cherche à récupérer la taille du secteur physique de mon disque dur avec le code suivant:

    #include <iostream>
    #include <Windows.h>
    #include <WinIoCtl.h>
    #include <tchar.h>
    
    using namespace std;
    
    int main()
    {
    	HANDLE _h = CreateFile(_T("\\\\.\\PhysicalDrive1"), GENERIC_READ, 0, 
    		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (INVALID_HANDLE_VALUE == _h)
    	{
    		cout << "error in CreateFile " << GetLastError() << endl;
    	}
    	STORAGE_PROPERTY_QUERY _storage;
    	_storage.QueryType = PropertyExistsQuery;
    	DWORD _ulBytesReturned;
    	if (DeviceIoControl(_h, IOCTL_STORAGE_QUERY_PROPERTY, &_storage, sizeof(_storage), NULL, 
    		0, &_ulBytesReturned, NULL))
    	{
    		cout << "error in DeviceIoControl " << GetLastError() << endl;
    	}
    	cout << "number of bytes/physical sector " << _storage.BytesPerPhysicalSector << endl;
    }
    
    mais la structure STORAGE_PROPERTY_QUERY n'est pas trouvée. J'utilise Win7 64 bits avec VisualStudio 2005. Quelqu'un pourrait me dire quel fichier header je dois inclure ?


    bogdan
    • Type modifié Ciprian Duduiala mercredi 28 septembre 2011 06:29 pas de solution
    jeudi 15 septembre 2011 12:48

Toutes les réponses

  • Bonjour,

    Quel est le message d'erreur qui est indiqué par votre compilateur ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    jeudi 15 septembre 2011 20:21
    Modérateur
  • 1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2065: 'STORAGE_PROPERTY_QUERY' : identificateur non déclaré
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur '_storage'
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2065: '_storage' : identificateur non déclaré
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(17) : error C2228: la partie gauche de '.QueryType' doit avoir un class/struct/union
    1>        le type est ''unknown-type''
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(17) : error C2065: 'PropertyExistsQuery' : identificateur non déclaré
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(19) : error C2065: 'IOCTL_STORAGE_QUERY_PROPERTY' : identificateur non déclaré
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(19) : error C2070: ''unknown-type'' : opérande sizeof non conforme
    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(24) : error C2228: la partie gauche de '.BytesPerPhysicalSector' doit avoir un class/struct/union
    1>        le type est ''unknown-type''

    bogdan
    vendredi 16 septembre 2011 07:23
  • Pourquoi ne pas plutot faire appel à IOCTL_DISK_GET_DRIVE_LAYOUT_EX :
    DRIVE_LAYOUT_INFORMATION_EX *ptrInfoDisk;
    DWORD Flag;
    DWORD InfoDisk32bits[32768];
    DeviceIoControl(hDisk, IOCTL_DISK_GET_DRIVE_LAYOUT_EX ,NULL,0,InfoDisk32bits,32768,&Flag,NULL);

    Delphine GARRO
    lundi 19 septembre 2011 08:39
  • Je ne vois pas comment obtenir la taille d'un secteur physique avec IOCTL_DISK_GET_DRIVE_LAYOUT_EX
    bogdan
    mardi 20 septembre 2011 07:40
  • Qu'est ce que vous entendez par secteur physique: la taille d'un secteur du disque de 512 octets ou la taille de la partition ?
    Delphine GARRO
    mardi 20 septembre 2011 08:08
  • A l'ouverture d'un fichier avec CreateFile on peut spécifier le flag d'ouverture FILE_FLAG_NO_BUFFERING. Il existe des contraintes pour les données d'entrée: par exemple, l'adresse du buffer d'entrée quand on écrit/lit doit être un multiple de la taille d'un secteur physique (!= secteur logique). Pour cela je voudrais connaître la taille d'un secteur physique (la taille d'un secteur logique je sais comment la récupérer).

    http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950(v=vs.85).aspx


    bogdan
    mardi 20 septembre 2011 08:35
  • Moi, je suis bête et discipliné. ;-)

    Quand le compilateur ne connait pas un truc, je vais voir dans la doc MSDN à partir de quelle version de Windows le truc est sensé être connu.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ff800840(v=vs.85).aspx

    Donc

    Minimum supported client

    Windows XP

    Minimum supported server

    Windows Server 2003

    Question donc à deux balle : Avez-vous correctement configuré les options de compilation pour que la plateforme cible soit bien égale ou supérieur à ces plateformes "Minimum supported".

     


    Paul Bacelar, Ex - MVP VC++
    vendredi 7 octobre 2011 17:39
    Modérateur
  • Je compile sous Visual Studio 2005, SP2 en 32 bits.
    bogdan
    lundi 10 octobre 2011 08:03
  • La plateforme sur laquelle vous compilez n'a strictement rien à voir avec la plateforme cible du résultat de votre compilation : http://msdn.microsoft.com/en-us/library/aa383745(v=vs.85).aspx#setting_winver_or__win32_winnt
    Paul Bacelar, Ex - MVP VC++
    lundi 10 octobre 2011 08:08
    Modérateur
  • J'utilise les paramètres par défaut pour la plateforme cible: Win32
    bogdan
    lundi 10 octobre 2011 08:31
  • Win32 quoi ?

    Win32s, Win32c, Win32a le version Win2000, WinXP ?

    Win32 n'est pas une plateforme cible, ces constantes de compilation spécifie laquelle de ces plateformes Win32 est la plateforme cible.

    La valeur par défaut de ces constantes est fonction du SDK utilisé. Ce qui ne faut JAMAIS faire.

     

    Vérifiez que vous configurez correctement ces constantes de compilations.

    Une fois que vous avez bien vérifié ces constantes, utilisez l'option /P du compilateur pour savoir pourquoi "STORAGE_PROPERTY_QUERY" n'est pas défini. (si ce n'est pas WIN_NT qui est le problème dans 99% des cas)


    Paul Bacelar, Ex - MVP VC++
    lundi 10 octobre 2011 14:38
    Modérateur
  • Désolé, mais je ne comprends pas trop de quoi on parle. Voici la ligne de commande du compilateur:

    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt

    Où je trouve l'option /P dans les propriétés du projet ?


    bogdan
    lundi 10 octobre 2011 15:07
  • Extrait de la page dont l'URL a été fournie :

     

    Windows Server 2003, Windows XP

    _WIN32_WINNT_WINXP (0x0501)

     

    DONC :

    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_WIN32_WINNT=0x0501" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt


    Paul Bacelar, Ex - MVP VC++
    lundi 10 octobre 2011 17:45
    Modérateur
  • Avec cette ligne des paramètres du compilateur

    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_WIN32_WINNT=0x0501" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt

    même erreur

     

    1>------ Début de la génération : Projet : testPhysicalSectorSize, Configuration : Debug Win32 ------

    1>Compilation en cours...

    1>main.cpp

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2065: 'STORAGE_PROPERTY_QUERY' : identificateur non déclaré

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur '_storage'

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(16) : error C2065: '_storage' : identificateur non déclaré

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(17) : error C2228: la partie gauche de '.QueryType' doit avoir un class/struct/union

    1>        le type est ''unknown-type''

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(17) : error C2065: 'PropertyExistsQuery' : identificateur non déclaré

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(19) : error C2065: 'IOCTL_STORAGE_QUERY_PROPERTY' : identificateur non déclaré

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(19) : error C2070: ''unknown-type'' : opérande sizeof non conforme

    1>c:\users\bogdan\documents\visual studio 2005\projects\testphysicalsectorsize\main.cpp(24) : error C2228: la partie gauche de '.BytesPerPhysicalSector' doit avoir un class/struct/union

    1>        le type est ''unknown-type''

    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Users\BOGDAN\Documents\Visual Studio 2005\Projects\testPhysicalSectorSize\Debug\BuildLog.htm"

    1>testPhysicalSectorSize - 8 erreur(s), 0 avertissement(s)

    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


    bogdan
    mardi 11 octobre 2011 07:12
  • Je n'est pas de DDK/WDK/PlateForme SDK d'installer sur la machine actuelle donc, je n'ai pas le contenue de WinIoCtl.h pour vérifier les conditions d'utilisation de "'STORAGE_PROPERTY_QUERY".

    On va faire simple, vous devez trouver dans quel .h est déclaré "'STORAGE_PROPERTY_QUERY" puis utiliser /P comme option de compilation de votre fichier "main.cpp".

    Sélectionnez le fichier dans l'explorateur de solution -> click droit -> Propriétés -> Propriétés de Configuration -> C/C++ -> Ligne de Commande -> Ajouter /P dans la zone de saisie "options supplémentaires".

    Après cela, Sélectionnez le fichier dans l'explorateur de solution -> click droit -> Compile.

     

    Vous devriez avoir un fichier main.i à coté de votre main.cpp.

    Ce fichier contient le résultat du pre-processing de main.cpp, donc la concaténation des .H et l'expansion en ligne des MACRO.

    Vous devriez comprendre avec le contenu de main.i et des fichiers .h quelle constante de compilation a entrainé la non définition de "STORAGE_PROPERTY_QUERY".

    P.S.: si vous ne trouvez aucun .h avec la déclaration de "STORAGE_PROPERTY_QUERY", c'est que vous avez un plateforme SDK trop vieux et qui faut l'upgrader.

    P.P.S: /P arrête la compilation, donc enlevez cette option dés que vous avez compris où était le problème.


    Paul Bacelar, Ex - MVP VC++
    mardi 11 octobre 2011 09:40
    Modérateur