IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[C/Win32] écrire sur un disque physique


Sujet :

Windows

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut [C/Win32] écrire sur un disque physique
    Bonjour à tous,

    Dans le cadre d'une création de bootloader, je voudrais tester celui-ci via une image de disquette. J'ai crée cette image, je l'ai monté et jusque là tout va bien.

    Le truc c'est que maintenant je voudrais aller écrire mon bootloader dedans (cad sur le premier secteur (0). Ne trouvant pas d'outils pour le faire (je suis sous windows 10 64 bits, du coup on oublie les debug.exe, ...) et je ne sais pour quel raison, Copypart ne fonctionne pas (dés que je met A: dans la destination celui-ci me renvoie une erreur comme quoi il ne peut créer le fichier de destination ... normal c'est pas un fichier ... bref). Du coup je me suis dit, ben ok je vais écrire le code en C++.

    Alors autant pour écrire sur un disque comme le C: ça va nickel car je connais sont chemin physique à savoir \\.\PhysicalDrive0, mais comment connaitre celui du disk A: ?? (car un CreateFile sur \\.\A: me donne accès au drive logique). la commande wmic ne renvoie pas ce disque.

    Merci d'avance pour votre retour.

    Exemple qui fonctionne pour écrire sur un secteur du disque C: (dans mon cas) :

    donc si _dsk = \\.\PhysicalDrive0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    
    BOOL WriteSect
    (const char *_dsk,
    	BYTE ** _mbr,
    	unsigned int _nsect  // sector number, starting with 0
    )
    {
    	DWORD dwWritten;
    	HANDLE hDisk = CreateFile(_dsk
    		, GENERIC_WRITE
    		, FILE_SHARE_READ | FILE_SHARE_WRITE
    		, 0
    		, OPEN_EXISTING
    		, 0
    		, 0);
    
    	if (hDisk == INVALID_HANDLE_VALUE) // this may happen if another program is already reading from disk
    	{
    		return FALSE;
    	}
    	SetFilePointer(hDisk, _nsect * 512, 0, FILE_BEGIN);
    
    	if (WriteFile(hDisk, _mbr, 512, &dwWritten, 0) == FALSE)
    	{
    		CloseHandle(hDisk);
    		return FALSE;
    	}
    
    	CloseHandle(hDisk);
    
    	return TRUE;
    }
    J'espère avoir été claire :s

    Merci d'avance pour vos retours.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    As-tu essayé, comme la doc de CreateFile() le conseille, DeviceIoControl() avec IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Oui oui j'ai essayé.

    Si je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    char drv[] = "\\\\.\\A:";
    	char dsk[PHYSICAL_STRING_LEN];
    	int sector = 0;
    	MBR mbr;
    
    	HANDLE hLogicalDrive;
    
    	VOLUME_DISK_EXTENTS vde;
    	OVERLAPPED overlapped;
    	DWORD dwWritten;
    	BOOL boReturn;
    	int iErrorReturn;
    
    	short nExtents;
    
    	hLogicalDrive = CreateFile(drv
    		, 0
    		, FILE_SHARE_READ | FILE_SHARE_WRITE
    		, NULL
    		, OPEN_EXISTING
    		, 0
    		, NULL);
    
    	if (hLogicalDrive == INVALID_HANDLE_VALUE)
    	{
    		return 1;
    	}
    
    	
    	boReturn = DeviceIoControl(hLogicalDrive
    		, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
    		, NULL
    		, 0
    		, &vde
    		, sizeof(vde)
    		, &dwWritten
    		, (LPOVERLAPPED) NULL);
    
    	if (boReturn == FALSE)
    	{
    		CloseHandle(hLogicalDrive);
    		iErrorReturn = GetLastError();
    		return iErrorReturn;
    	}
    donc je récupère un handle sur A: et ensuite j'appel DeviceIoControl, GetLastError me renvoie 1 :

    ERROR_INVALID_FUNCTION

    1 (0x1)

    Incorrect function.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    En effet, je reproduis l'erreur également avec un lecteur CD-ROM (y compris quand il est plein).

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Oui , alors même si je viens de trouver une solution pour contourner le problème (je monte l'image avec ImDisk et écrit avec SecEdit, je démonte ensuite l'image et la charge dans Boshs ... la fête) j'aimerai quand même trouver pourquoi ça ne fonctionne pas.

    Ben par exemple là le programme SecEdit (http://www.roadkil.net/program.php?P...loadVersion=12) c'est ce qu'il fait, il écrit sur le volume physique ... c'est dommage que le source ne soit pas dispo.

    Donc je vais continuer a chercher car ça m'énerve de pas savoir le faire

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Bon alors on s'approche :


    char szDrv[] = "A:";
    char szBuffTPath[MAX_PATH];
    DWORD dwBuffSize = MAX_PATH;

    QueryDosDevice(szDrv, szBuffTPath, dwBuffSize);

    Permet de récupérer le win32 device name. Dans mon cas \\Device\\ImDisk0 . Mais créer un handle avec CreateFile sur ce nom me génère une erreur 3 (PATH_NOT_FOUND)... damn it !

  7. #7
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    un CreateFile sur \\.\A: me donne accès au drive logique
    Effectivement.
    Mais pourquoi avez-vous rejeté cette solution ?

    Utiliser \\.\PhysicalDrive0 permet d’accéder au secteur 0 du 1er disque dur, alors qu'utiliser \\.\C: permet d’accéder au secteur 0 du disque C:.

    Le secteur 0 d'un disque dur, c'est le mbr ( master boot record ), qui donne des informations sur le partitionnement du disque dur.
    Le secteur 0 d'un disque logique, c'est le boot sector, qui donne des informations sur ce disque logique et permet éventuellement de charger un système d'exploitation.
    ( voir : https://en.wikipedia.org/wiki/Master_boot_record )

    Dans votre post initial, vous parlez d'une création de bootloader.
    C'est donc le secteur 0 du disque logique qui vous intéresse et non le secteur 0 du disque physique.

    De toute façon, il n'y a pas de mbr sur une disquette ...

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Hello,

    C'est ce que j'allai poster avec \\A:\ ça passe Autant pour moi je pensai qu'il y avait une séparation claire.

    Du coup j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    BOOL WriteSect
    (const char *_dsk,
    	BYTE * _mbr,
    	unsigned int _nsect  // sector number, starting with 0
    )
    {
    	DWORD dwWritten;
    	HANDLE hDisk = CreateFile(_dsk
    		, GENERIC_WRITE
    		, FILE_SHARE_READ | FILE_SHARE_WRITE
    		, 0
    		, OPEN_EXISTING
    		, 0
    		, 0);
    
    	if (hDisk == INVALID_HANDLE_VALUE)
    	{
    		return FALSE;
    	}
    	SetFilePointer(hDisk, _nsect * 512, 0, FILE_BEGIN);
    
    	if (WriteFile(hDisk, _mbr, 512, &dwWritten, 0) == FALSE)
    	{
    		CloseHandle(hDisk);
    		return FALSE;
    	}
    
    	CloseHandle(hDisk);
    
    	return TRUE;
    }
    
    BYTE mbr_[512] = { 0 } ;
    WriteSect("\\\\.\\A:", mbr_, 0);
    J'ai bien que des 0 dans les 512 premiers bytes de mon disque A:

    Ben il y en a un si tu en mets un pour en faire une disquette bootable ce que je suis occupé à faire.

    Merci à tous , bonne journée :p

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multiboot sur plusieurs disques physiques
    Par nodarp dans le forum Windows 8
    Réponses: 12
    Dernier message: 22/02/2013, 18h12
  2. [Session Trop Lourde] Peut on l'écrire sur le disque plutot qu'en mémoire?
    Par Spiff__ dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 30/03/2009, 17h27
  3. Détachement de base et répartition physique sur le disque
    Par Rodrigue688094 dans le forum Administration
    Réponses: 1
    Dernier message: 02/07/2008, 11h36
  4. MSSQL2005 - Mettre les index sur un autre disque physique
    Par davidkungfu dans le forum Administration
    Réponses: 1
    Dernier message: 16/06/2008, 12h09
  5. Organisation physique de 2 bases sur 3 disques
    Par wazar dans le forum Oracle
    Réponses: 7
    Dernier message: 05/02/2005, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo