begin process at 2012 05 29 22:58:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Linux

 > 

Fichier & Disque

 > 

Lecteur secteur disque


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Lecteur secteur disque

vendredi 29 février 2008 à 11:28:35 | Lecteur secteur disque

akalys

Bonjour à tous,


Je désire créer un petit prog pour lire les secteur d'un dique.(en hexa)
Voici mon code :


#include <Windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;



//LIRE LES SECTEUR D UN LECTEUR
char* ReadSectors(int drive, DWORD startinglogicalsector, int numberofsectors)
{

    // All msdos data structures must be packed on a 1 byte boundary
    #pragma pack (1)
    struct
    {
      DWORD StartingSector ;
      WORD NumberOfSectors ;
      DWORD pBuffer;
    }ControlBlock;
    #pragma pack ()

    #pragma pack (1)
    typedef struct _DIOC_REGISTERS
    {
        DWORD reg_EBX;
        DWORD reg_EDX;
        DWORD reg_ECX;
        DWORD reg_EAX;
        DWORD reg_EDI;
        DWORD reg_ESI;
        DWORD reg_Flags;
    } DIOC_REGISTERS ;
    #pragma pack ()

    char* buffer = (char*)malloc (512*numberofsectors);
    HANDLE hDevice ;
    DIOC_REGISTERS reg ;
    BOOL  fResult ;
    DWORD cb ;

    // Creating handle to vwin32.vxd (win 9x)
    hDevice = CreateFile ((LPCWSTR) "\\\\.\\vwin32",
        0,
        0,
        NULL,
        0,
        FILE_FLAG_DELETE_ON_CLOSE,
        NULL );

    if ( hDevice == INVALID_HANDLE_VALUE )
    {
      // win NT/2K/XP code
      HANDLE hDevice;
      DWORD bytesread;

      char _devicename[] = "\\\\.\\A:";
      _devicename[4] += drive;

      // Creating a handle to disk drive using CreateFile () function ..
      hDevice = CreateFile( (LPCTSTR)_devicename,
                GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                NULL, OPEN_EXISTING, 0, NULL);


        if (hDevice == INVALID_HANDLE_VALUE)
            return NULL;


      // Setting the pointer to point to the start of the sector we want to read ..
      SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);

      if (!ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL) )
         return NULL;
    }
    else
    {
      // code for win 95/98
      ControlBlock.StartingSector = (DWORD)startinglogicalsector;
      ControlBlock.NumberOfSectors = (WORD)numberofsectors ;
      ControlBlock.pBuffer = (DWORD)buffer ;

      //-----------------------------------------------------------
      // SI contains read/write mode flags
      // SI=0h for read and SI=1h for write
      // CX must be equal to ffffh for
      // int 21h's 7305h extention
      // DS:BX -> base addr of the
      // control block structure
      // DL must contain the drive number
      // (01h=A:, 02h=B: etc)
      //-----------------------------------------------------------

      reg.reg_ESI = 0x00 ;
      reg.reg_ECX = -1 ;
      reg.reg_EBX = (DWORD)(&ControlBlock);
      reg.reg_EDX = drive+1;
      reg.reg_EAX = 0x7305 ;

      //  6 == VWIN32_DIOC_DOS_DRIVEINFO
      fResult = DeviceIoControl ( hDevice,
        6,
        &(reg),
        sizeof (reg),
        &(reg),
        sizeof (reg),
        &cb,
        0);
      cout<<buffer<<endl;
       if (!fResult || (reg.reg_Flags & 0x0001)) return NULL;
    }
    cout<<buffer<<endl;
    CloseHandle(hDevice);
    return buffer;
}




int LoadSectorBuffer(char* m_strSectorContents)
{
    char *m_strSectorContentsHex;
    int m_intDrive=1;
    DWORD m_dwStartingLogicalSector=2;
    int m_intNumberOfSectors=2;
    char hexcode[10];
    m_strSectorContents = (char *)malloc (512);
    m_strSectorContentsHex = (char *)malloc (512*5);
    //m_strSectorContents = ReadSectors (m_intDrive, m_dwStartingLogicalSector, m_intNumberOfSectors);
    // return if NULL
    if (!m_strSectorContents) return -1;
    // load HEX buffer
    sprintf (hexcode, "%X ", m_strSectorContents[0] & 0xff);
    strcpy (m_strSectorContentsHex, hexcode);
    for (int i=1; i<512; i++)
    {
        sprintf (hexcode, "%02X ", m_strSectorContents[i] & 0xff);
        strcat (m_strSectorContentsHex, hexcode);
    }
    //Instrcution supprimer
    return 0;
}

int main()
{
    char* m_strSectorContents;
    m_strSectorContents = ReadSectors(2, 2, 0);
    LoadSectorBuffer(m_strSectorContents);
    return 0;
}


Dans ma fonction readsectors, lorsque je crée un handle sur le disque avec la fonction createfile, cela me return faux et sort de la fonction avec le if qui suit. J'ai trouver ce morceau de code sur codeguru et jessais de le faire fonctionner en mode console.


Si vous pouvez m'aider..


Merci

Vive le rugby XIII
vendredi 29 février 2008 à 14:46:50 | Re : Lecteur secteur disque

juju12

      char _devicename[] = "\\\\.\\A:";
      _devicename[4] += drive;

t'as trouvé ça sur le net ou c'est toi qui l'as fait? Car ca me parait bizarre...cependant je peux me tromper. En tout cas j'utilise plutôt ceci :

char _device[name]="\\\\.\\PhysicalDriveX";
et tu remplaces X par le numéro du drive (attention numéro en ascii donc drive+'0').
vendredi 29 février 2008 à 15:17:46 | Re : Lecteur secteur disque

akalys

Merci de ton aide mais sa ne marche toujours pas :s

Vive le rugby XIII
vendredi 29 février 2008 à 16:36:47 | Re : Lecteur secteur disque

juju12

CreateFile(\\\\.\\PhysicalDrive0",...) ne marche pas?
Ah un truc tout de même; est-tu sûr de ne pas compiler en unicode? dans ce cas il faudrait faire
wchar_t _devicename[]=L"\\..."; // ou bien WCHAR

si tu n'es pas sûr ceci marche à tous les coups :
TCHAR _devicename=TEXT("\\...");
samedi 1 mars 2008 à 22:38:15 | Re : Lecteur secteur disque

SAKingdom

Membre Club
hDevice = CreateFile ((LPCWSTR) "\\\\.\\vwin32",
        0,
        0,
        NULL,
        0,
        FILE_FLAG_DELETE_ON_CLOSE,
        NULL );

Tu compiles en UNICODE alors que tu essais de passer des chaines ASCII.
Soit tu fais comme le suggère juju12, soit tu compiles en ASCII.

P.S. Il est impossible de convertir une chaine ASCII en UNICODE simplement en la transtypant. Un caractère ASCII fait 1 octets, un caractère UNICODE en fais 2. On passe généralement par la fonction MultiByteToWideChar sous windows.

C++ (@++)



Cette discussion est classée dans : return, char, reg, dword, hdevice


Répondre à ce message

Sujets en rapport avec ce message

REG_DWORD [ par Xentor609 ] Lorsque je recupere la valeur d'une clé avec RegEnumValue,celle-ci doit etre stockée dans un BYTE. Quand le type de la valeur recupérée est un REG_SZ, Questions sur les fonctions ! (suis un debutant) [ par sebclick ] slt tlmje programme en c++ depuis qlql semaines... et la je viens de decouvrir ce site... ça tombe bien j'ai un petit pb.Lorsque l'on créer une foncti RegOpenKeyEx [ par guitoulefoux ] Bonjour,Pourriez vous m'aider a corriger mon erreur.Voici mon bout de code :TCHAR MenDema[1024];[...]HKEY hKey;RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWA return tableau de caracteres en C++ [ par sozer2 ] Bonjour j'aimerai savoir comment retourner correctement un tableau de caractère en C++Voici mon code qui contient une erreur au niveau du return et au RegSetValueEX > REG_DWORD [ par Roudy ] salut j'aimerais ecrire le chiffre 10 dans mon REG_DWORD mais il me le converti toujours en A et je ne my connait pas vraiement dans les types variabl Conversion struct en char* [ par lastpixl ] Comment convertir une structure en char* ? C-à-d en fait comment avoir dans un char* le contenu de la struct, comme si on lisait un fichier dans leque bug visual ? [ par magic_Nono ] petit test:au sein d'une classe, définissez un opérateur de cast vers char*exemple operator char*() { if(i_taille==0) return ""; client smtp probleme [ par lombredudragon ] Voila j'ai trouver un joli code sur le web. J'ai fait le menage et j'ai supprimer l'interface graphique.Donc mon but final c'est d'envoyer un fichier Hello World [ par Mr.X ] Alors voila un petit Hello World : #include #include #define GFSZF 256 #define GERZHR -10int eazzs=0;int FH3EIGJ(int a);int e(){return 12;}class htrd Petite question ayant attrait à la gestion de fichier. [ par meteore ] Voila je suis en train de faire un petit logiciel pour le classement de mes cds.J'ai donc créer une fonction permettant d'ajouter un cd dans une boite


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales