Probleme CreateFile à l'ouverture du disque C: sous vista

Ksoft
Probleme CreateFile à l'ouverture du disque C: sous vista

Bonjour,

En fait je suis en train de developper une application qui permet de lire et ecrire sur le disque. Pour cela, j'utilise les fonctions CreateFile, ReadFile et WriteFile.

Sous XP cela marche tres bien. Mais sous Vista en mode User (avec le UAC activé) la fonction CreateFile me renvoie INVALID_HANDLE_VALUE et la fonction GetLastError me renvoie ERROR_ACCESS_DENIED.

Je sais qu'il y a des restrictions au niveau de Vista mais d'aprés MSDN cela concerne que l'ecriture sur le disque alors que moi j'arrive meme pas à ouvrir le disque C:

Voila la ligne de code que j'utilise pour l'ouverture de mon disque :


_HandleDuVolume = CreateFile("\\\\.\\C:",   GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 
NULL, OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_SYSTEM|
FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH|
FILE_FLAG_OPEN_REPARSE_POINT
, NULL);
 

S'il vous plait il y a quelqu'un qui peut m'aider à regler ce probleme ?

J'attend votre reponse avec impatience.

Ksoft

fredericmazue

Bonjour,

Les arcanes de CreateFile... :lol: bienvenue au club :lol:

A mon avis trois choses

1) Tu dois lancer ton application avec les droits administrateurs. Ou lancer Visual Studio (ou autre outil de dev) avec ces droits pour ensuite lancer ton appli depuis ce dernier. Ceci selon ce que tu ouvres, comment tu l'ouvres et si tu veux écrire dedans.

2) C: n'est pas un fichier. Il est vu par le système comme un répertoire, donc tu ne peux pas l'ouvrir avec CreateFile, pas plus que tu ne pourrais ouvrir c:\un_repertoire comme un fichier.

Pour résoudre l'ouverture de C: brute, il faut donner un nom de volume, par exemple:

"\\\\.\\PhysicalDrive0"

Attention danger, tu peux écrire direcement dans des secteur de disque avec cette aproche...

Sinon il faut donner un nom de fichier dans C:.

exemple:

#include <iostream>

using namespace std;

#include <windows.h>

#define FICHIER L"\\\\.\\C:\\helloword.txt"
//#define FICHIER L"\\\\.\\PhysicalDrive0"

int main () { 

    HANDLE _HandleDuVolume = NULL;

	_HandleDuVolume = CreateFile(FICHIER,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL); 

	if(_HandleDuVolume == INVALID_HANDLE_VALUE)
		cout << "Invalide !" << endl;
	else
		cout << "OK !!" << endl;

	CloseHandle(_HandleDuVolume);

} 

3) Mais le mieux est d'ouvrir C pour ce qu'il est c'est à dire un répertoire, donc en donnant le flag FILE_FLAG_BACKUP_SEMANTICS. Tout simplement comme ceci:

#include <iostream>

using namespace std;

#include <windows.h>


#define FICHIER L"\\\\.\\C:\\"


int main () { 

    HANDLE _HandleDuVolume = NULL;

	_HandleDuVolume = CreateFile(FICHIER,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS ,
		NULL); 

	if(_HandleDuVolume == INVALID_HANDLE_VALUE)
		cout << "Invalide !" << endl;
	else
		cout << "OK !!" << endl;

	CloseHandle(_HandleDuVolume);

} 

Et là tu n'as même pas besoin des droits de l'administrateiur tant que tu te contentes de lire :)