[résolu] vista et écriture secteur

paul
[résolu] vista et écriture secteur

Bonjour à tous,
Je suis en train de développer une appli qui doit permettre la lecture et l'écriture de secteur d'un disque physique. Sous 98/ME/2000/XP je n'ai pas de problème pour l'écriture pas contre sous VISTA je ne peux écrire "où" je veux mis à part les premiers secteurs. Le programme a les droits administrateur. En regardant sur MSDN je vois que ce comportement est normal. Le seul moyen serait-il de passer par le ddk de vista ?
Paul

fredericmazue

Quote:
la lecture et l'écriture de secteur d'un disque physique

Quel type de disque ?
Disquette ? Disque dur, Disque externe USB ?

Quote:
Sous 98/ME/2000/XP je n'ai pas de problème

Si tu as un problème. On ne peut pas accéder à un disque "comme ça" depuis qu'on est plus sous DOS. Le problème est même double vu que pour y arriver on ne procède par de la même façon sous un 9x et sous NT, 2000 et suivants. C'est un domaine que je connais bien pour y avoir travaillé plusieurs fois.

Quote:
En regardant sur MSDN je vois que ce comportement est normal

A quel endroit de la MSDN ?

S'il te plait, précise d'abord quel type disque (c'est important), comment la lecture/écriture était faite sous les Windows précédents, à quel article MSDN tu fais allusion et on essayera de t'aider. Je trouve quand même ta question un petit peu bizarre:

Quote:
pour l'écriture pas contre sous VISTA je ne peux écrire "où" je veux mis à part les premiers secteurs.

C'était déjà comme ça sous NT avec les droits administrateur, et c'est pareil sous 2000 et XP.
paul

Bonjour,
Bon je vais être plus explicite. Le support physique peut-être un disque dur interne ou bien connecté en externe en USB. Pour la lecture, je n'ai pas de problème quelque soit la plateforme avec les bons droits. Pour 98/Me j'utilise un script de thunks avzc dll 16 bits, cela marche parfaitement. Pour 2000/XP, CreateFile() et WriteFile() fonctionnent parfaitement.
Le problème c'est vista, pour la lecture c'est bon, j'ai les bons droits, l'UAC est désactivé.
Sous Vista, l'écriture au niveau physique est plus compliqué, un petit extrait d'un article je ne retrouve plus le lien, je le recherche !

A write on a volume handle will succeed if the volume is not mounted by a
file system, or if one of the following conditions is true:
1. The sectors to be written to are boot sectors.
2. The sectors to be written to reside outside of file system space.
3. You have explicitly locked or dismounted the volume by using
FSCTL_LOCK_VOLUME or FSCTL_DISMOUNT_VOLUME.
4 . The volume has no file system. (In other words, it has been mounted
as a RAW volume.)

A write on a disk handle will succeed if one of the following conditions
is true:
1. The sectors to be written to do not fall within a volume's extents.
2. The sectors to be written to fall within a mounted volume, but you
have explicitly locked or dismounted the volume by using FSCTL_LOCK_VOLUME
or FSCTL_DISMOUNT_VOLUME.
3. The sectors to be written to fall within a volume that is not mounted
or has no file system.

L'écriture fonctionne parfaitement jusqu'au secteur 16. Ensuite j'ai toujours le code erreur 5 ("Accès refusé").

Paul

fredericmazue

Quote:
Le support physique peut-être un disque dur interne ou bien connecté en externe en USB

C'est que c'est pas pareil. Ou de moins ça peut ne pas l'être. Bien souvent les disques externes USB sont formatés en FAT32, et là tu ne pourras pas aller lire au-délà des premiers secteurs correspondant aux 4Gb de la taille maxi d'un fichier en FAT32. Enfin la dernière fois que j'ai mis la main dans ce cambouis, c'était comme ça.

Quote:
Pour la lecture, je n'ai pas de problème quelque soit la plateforme avec les bons droits. Pour 98/Me j'utilise un script de thunks avzc dll 16 bits, cela marche parfaitement.

Il y a donc bien deux méthodes différentes, selon la plate-forme, comme je le disais. Il y en a même 3 en fait. Parce que écrire un thunk est tellement épouvantable (et nécessite d'avoir un vieux compilo 16 bits) que je n'ose même pas y faire allusion :D
Sous 9x, il est tellement plus simple d'ouvrir (là aussi avec CreatFile) le driver virtuel vwin32.vxd et d'aller lire/écrire où l'on veut avec DeviceIoControl. Enfin bref, ne nous dispersons pas :)

Quote:
je ne retrouve plus le lien, je le recherche !

Oui ça serait bien, pour qu'on parle bien de la même chose. Ca devait être dans la base connaissance je suppose.
Quote:
L'écriture fonctionne parfaitement jusqu'au secteur 16.

C'est à dire à priori la table de partition. Et la MSDN dit bien pour CreateFile qu'on a accès à ça. Maintenant pour aller au-délà, as tu bien fait en sorte que cette condition
Quote:
2. The sectors to be written to fall within a mounted volume, but you
have explicitly locked or dismounted the volume by using FSCTL_LOCK_VOLUME
or FSCTL_DISMOUNT_VOLUME.

soit remplie ?
paul

Re....Bonjour,
Sous 98/ME j'utilise vwin32.vx et CreateFile pour un accès disque au niveau logique. Pour le "thunk" j'ai utilisé watcom (openwatcom maintenant) qui permet de générer du 16/32 dos et windows; pour le 64 bits peut-être dans la dernière version de OpenWatcom ?
La plateforme 98/Me est une plaie pour la programmation au niveau du disque, même le lecteur de CD a besoin d'un code spécifique pour un accès secteur par secteur. Mais bon mon code fontionne parfaitement sur cette plateforme et je peux accèder à des gros disques secteur par secteur.
Vista c'est autre chose, il faut dire aussi qu'il y a beucoup de changement par rapport au noyau 2000.
Pour l'accès au niveau logique, je fais bien un FSCTL_LOCK_VOLUME avant WriteFile(); cela marche sur tous les secteurs s'il n'y a pas de handle de fichier ouvert dessus ce qui n'est pas forcèment facile à moins de "démonter" le volume mais bon je ne suis pas pour cette solution.
Pour l'accès physique et l'écriture cela bloque au delà du secteur 16 (je vais rechercher l'article). En fouillant dans des forums US, beaucoup de développeurs ont eu ce type de problème. A la base c'est une sécurité pour le système mais bon....
D'après mes recherches, l'unique (???) solution serait d'écrire un driver (génial).
Je vais encore pousser mes recherches....
Cordialement.
Paul

fredericmazue

Quote:
Sous 98/ME j'utilise vwin32.vx

Dans ce cas, tu n'avais pas besoin d'écrire un thunk. Il suffit d'appeler les int13 et int21 avec DeviceIoControl.
Quote:
La plateforme 98/Me est une plaie

Certes :)

Quote:
même le lecteur de CD a besoin d'un code spécifique pour un accès secteur par secteur

Non. DeviceIoControl aussi et, si ma mémoire est bonne, avec cdfs.vxd

Quote:
Pour l'accès au niveau logique, je fais bien un FSCTL_LOCK_VOLUME avant WriteFile(); cela marche sur tous les secteurs [...] Pour l'accès physique et l'écriture cela bloque au delà du secteur 16

Je ne comprends pas bien. Par "ça marche" tu as du vouloir dire en lecture ?
Quoi qu'il soit, je suppose que tu n'essaies pas d'écrire sur le disque sur lequel est installé ton Windows je suppose.
Quote:
fouillant dans des forums US, beaucoup de développeurs ont eu ce type de problème.

Ainsi il y a encore beaucoup de gens qui essaient de faire ces choses d'un autre âge :)
Sans vouloir être trop indiscret, c'est pourquoi faire que tu veux arriver à écrire des secteurs de disque depuis Vista. ? Et aussi:
Quote:
pas forcèment facile à moins de "démonter" le volume mais bon je ne suis pas pour cette solution.

Ecrire directement des secteurs dans un disque non démonté... hum... tu n'as pas peur d'un conflits avec d'éventuels accès disque de la part du système ?
paul

Bonjour,
J'utilise vWin32 sous 98/Me pour une lecture au niveau logique, pour le niveau physique on ne peut pas utiliser Int 13 d'où l'écriture d'un thunk avec dll 16 bits. Un petit extrait d'un article :

DeviceIoControl Int 13h Does Not Support Hard Disks
The information in this article applies to:
Microsoft Win32 Application Programming Interface (API), when used with:
the operating system: Microsoft Windows 95
the operating system: Microsoft Windows 98
the operating system: Microsoft Windows Millennium Edition

¨
Pour le lecteur de CD, au début le code devait aussi tourner sous 95 j'avais donc retenu cette solution (thunk aussi). Pour cdfs.vx, d'après mes souvenirs il concerne surtout les CD audio avec secteur de 2352 octets, il me semble ??

Quote:
Je ne comprends pas bien. Par "ça marche" tu as du vouloir dire en lecture ?
Quoi qu'il soit, je suppose que tu n'essaies pas d'écrire sur le disque sur lequel est installé ton Windows je suppose.

C'est bien en écriture pour le niveau logique, la lecture ne pose pas du tout de problème.
J'utilise une machine de test (!) mais plus sérieusement le programme n'est pas fait pour être utilisé sur le disque système. J'ai déjà testé en écrivant directement sur mon disque système sans aucun problème mais je n'ai pas écrit m'importe où !!
Bref le problème c'est vista....mais je vais trouver une solution y compris développer un driver pour l'écriture physique.

Pour répondre à ta question, le programme sert à faire des analyses secteur par secteur en vue d'expertise (recherche de données, de copyright...), on doit pouvoir atteindre les secteurs en surplus... Ils leur arrivent de "marquer" des secteurs donc il faut pouvoir écrire.
J'ai auss une appli, qui tourne sous 2000,qui écrit directement des données bruts secteur par secteur et il ya relecture sur des postes debian et FreeBsd.

Cordialement.
Paul

fredericmazue

Quote:
DeviceIoControl Int 13h Does Not Support Hard Disks

Certes, c'est pour ça que j'ai parlé *aussi* dans mon post précédent, de int21 que DeviceIoControl supporte pour les disques durs.
C'est absolument certain puisque je l'ai fait et que ça fonctionnait parfaitement.

Quote:
Pour cdfs.vx, d'après mes souvenirs il concerne surtout les CD audio avec secteur de 2352 octets, il me semble ??

Très honnêtement je me souviens plus. J'ai beaucoup moins travaillé avec les CD qu'avec les disques à une époque. Et mon âge avançant je ne me souviens plus très bien.
Par contre pour l'int21 je suis *certain* :) J'ai même retrouvé du vieux code.

Quote:
J'utilise une machine de test (!) mais plus sérieusement le programme n'est pas fait pour être utilisé sur le disque système. J'ai déjà testé en écrivant directement sur mon disque système sans aucun problème mais je n'ai pas écrit m'importe où !!
Bref le problème c'est vista....mais je vais trouver une solution y compris développer un driver pour l'écriture physique.

Je n'ai pas de machine ni même de disque de test pour l'instant, mais le problème m'intrigue et m'intéresse.
Si j'ai du temps demain, je vais essayer avec une clé USB, certes formatée en FAT32, le comportement ne sera peut être pas identique. Mais ça sera déjà un début, pour voir ce qui se passe.
Il y a peut être quand même une solution pour éviter de se plonger dans les drivers... :(
paul

Re...Bonjour,

Quote:
Certes, c'est pour ça que j'ai parlé *aussi* dans mon post précédent, de int21 que DeviceIoControl supporte pour les disques durs.
C'est absolument certain puisque je l'ai fait et que ça fonctionnait parfaitement.

Pour le niveau logique j'utilise bien l'Int 21 et la sous fonction 0x7305 pour l'écriture et la lecture.

Quote:
Et mon âge avançant je ne me souviens plus très bien.

Mais non

Je teste aussi beaucoup avec une clé USB, cela ne change rien sous 2000/XP/Vista du moment que CreateFile(...) renvoit le handle cela n'a pas d'importance que ce soit en Fat16/32/NTFS.

Cordialement.
Paul.

fredericmazue

Quote:
du moment que CreateFile(...) renvoit le handle cela n'a pas d'importance que ce soit en Fat16/32/NTFS.

Ah pas sûr.... Enfin pour l'instant je ne sais pas pour être honnête. Mais je m'était dit naïvement qu'avec Vista il pouvait y avoir des nouveautés au niveaux des droits et du NTFS et que si c'est le cas, on ne retrouvera pas être pas ces nouveautés si le système de fichiers est un FAT32. Enfin c'était juste une hypothèse. Pour l'instant je ne sais pas. Mais puisque tu sembles être un programmeur Windows expérimenté, tu sais bien qu'il faut être très prudent ;)

Donc si je t'ai bien suivi, en l'état actuel de tes travaux, sous Vista et même sur une simple clé en USB en FAT32, tu ne peux pas écrire au delà du 16eme secteur...
Dès que j'ai le temps je fais quelques essais de mon côté.

paul

Pour CreateFile(), je veux dire que WriteFile() utilise le handle et écrit après les droits(...) peuvent bloquer bien entendu mais d'après moi c'est une sécurité implanté sous Vista.
Pour être plus précis pour ma clé usb, en ouvrant au niveau physique je ne peux écrire au dela du 32ième secteur; le 32 correspond au début de ma partition logique . Pour simplifier il ne faut pas que ce soit "l'espace" d'une partition mis à part le secteur de boot et MBR que l'on peut modifier ! Cela varie donc d'un support à l'autre sur un autre disque c'est bien après le 16 ieme.
Cordialement.
Paul.

fredericmazue

Quote:
Pour CreateFile(), je veux dire que WriteFile() utilise le handle et écrit après les droits

Je sais bien... :)

Quote:
Pour être plus précis pour ma clé usb, en ouvrant au niveau physique je ne peux écrire au dela du 32ième secteur; le 32 correspond au début de ma partition logique . Pour simplifier il ne faut pas que ce soit "l'espace" d'une partition mis à part le secteur de boot et MBR que l'on peut modifier ! Cela varie donc d'un support à l'autre sur un autre disque c'est bien après le 16 ieme.

Le comprotement varie donc bien d'un support à l'autre, et ça ne me surprend pas vraiment, Windows oblige :twisted:
Seulement ce que tu dis n'est pas bon signe. Pour la clé USB pour l'instant je ne sais pas comment c'est gaulé. Je n'y ai même pas réfléchi.
Par contre pour le disque et les 16 secteurs, par ce bel après midi alors je taillais ma vigne dans mon jardin, mes pauvres vielilles neurones fatiguées se sont senties régénérés. Il est m'est apparu que j'ai dit une ânerie dans un post précédent: "C'est à dire à priori la table de partition. " à propos des 16 setceurs.
Mais en fait non. Le bon air m'a fait me souvenir que sous Windows, et en héritage d'une connerie de DOS la première piste des disques durs n'est pas utilisée, hormis les secteur 0 et 1 pour le boot.
Donc si on résume, sous Vista tu as le droit d'écrire le boot, c'est relativement normal (quoique...), tu as le droit d'écrire les secteurs inutilisés par le système, c'est moins normal car ça va permettre aux petits malins d'y loger un virus :twisted: et tu n'as donc pas le droit d'écrire sur tout ce qui est utilisé par le système, ce qui pour des raisons évidentes de sécurité de la part d'un système qui se veut plus sécurisé que ses prédécesseurs, se comprend. Donc on dirait que ton affaire se présente mal.

Autre chose. On peut penser que sur le disque où est installé le système l'écriture soit de toute façoninterdite. Parce que sinon ça donnera quand même à totu un chacun l'occasion d'injecter du code subversif via le fichier d'échange :twisted:
Enfin moi si j'étais le concepteur de l'OS, j'interdirai l'écriture

Je vais quand même essayer de voir (quand j'aurai le temps :( )

paul

Bonsoir,

Quote:
Le comprotement varie donc bien d'un support à l'autre, et ça ne me surprend pas vraiment, Windows oblige

Je dirai que cela "suit" l'organisation du disque au niveau des partitions; par exemple sur mon disque système la 1iere commence au secteur 2048. C'est très variable d'un support à l'autre ce qui est normal on a tous plusieurs partitions avec des secteurs relatifs différents.
Bref on ne peut écrire que lorsqu'on est en dehors....
J'ai trouvé une petite "astuce" à partir du secteur physique je calcule le secteur logique dans la bonne partition ce qui permet d'écrire sur le secteur "en mode logique". Pour le moment cela dépanne. Et puis je vais certainement développer un pilote en mode kernel, en regardant de plus près le ddk de Vista j 'ai vu que l'API a l'air bien "foutu" et plus concise que sous 2000.
Quote:
Enfin moi si j'étais le concepteur de l'OS, j'interdirai l'écriture

Je suis de ton avis pour le disque système mais on devrait pouvoir écrire facilement sur les autres (usb...).
Cordialement.
Paul.
fredericmazue

Quote:
J'ai trouvé une petite "astuce" à partir du secteur physique je calcule le secteur logique dans la bonne partition ce qui permet d'écrire sur le secteur "en mode logique". Pour le moment cela dépanne

Je ne comprends pas bien.
Dans ces condition Vista accepte d'écrire au délà du 16 eme secteur ? Je ne vois pas bien pourquoi.

Dis bien que je n'ai encore fait aucun essai :( est-ce que tu pourrais poster ton code qui appelle CreateFile, juste ça et rien de plus. Je suis curieux de voir comment tu ouvres le(s) disque(s).

paul

Quote:
Je ne comprends pas bien.
Dans ces condition Vista accepte d'écrire au délà du 16 eme secteur ? Je ne vois pas bien pourquoi.

Au niveau logique en respectant certaines choses tu peux, il faut faire un lock ( ou dismount que je n'aime pas) et ne pas avoir de fichier d'ouvert sur le lecteur logique (si dismount ->ouvert ou pas). Dans le cas du programme , il n'y aura pas de fichiers d'ouverts puisque c'est une analyse donc cela marche.
Je vais poster un petit bout du code en simplifiant le tout.
Cordialement
Paul
fredericmazue

Quote:
Au niveau logique en respectant certaines choses tu peux

Je te crois sur parole, mais on comprend mal la logique Kro$oft. Tu me dirais que le cas n'est pas unique :twisted:
Quote:
dismount que je n'aime pas

Et pourquoi donc ? Vues les opérations effectués sur le disque, j'aurais volontiers dit que c'est ce qu'il y a de plus sain. Si j'avais eu à travailler sur le problème, je pense que démonter le volume est la première chose que j'aurais faite.

Tiens je pense être tombé sur la page MSDN que tu citais :)
[url]http://msdn2.microsoft.com/en-us/library/aa365748(VS.85).aspx[/url]

paul

J'ai simplifié.... juste l'essentiel. Exemple pour ma clé USB avec ouverture au niveau physique
HANDLE cle=CreateFile("\\\\.\\PHYSICALDRIVE3",GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |FILE_FLAG_NO_BUFFERING,NULL);

if (cle== INVALID_HANDLE_VALUE) { traitement erreur; return false;}
__int64 offset=160071660*512; //secteur 160071660

/*je passe le tout à une structure LARGE_INTEGER*/
LARGE_INTEGER li;
.....
.....

SetFilePointer(cle,li.LowPart,&li.HighPart,FILE_BEGIN); //je teste si erreur ou pas
....
....

/*buffer octet de taille 512 */
if (!WriteFile(cle,octet,512,&BytesEcrits,NULL))
{
/*j'obtiens code erreur 5*/

return false;
}

....
....
....

return true;

paul

Pour le dismount, j'ai eu des problèmes avec certains programmes donc je me limite bien souvent au "LOCK" mais je suis de ton avis le dismount est utile voir nécéssaire dans certains cas.

Pour le lien c'est pas tout à fait celui là, je ne retrouve pas l'article mais il traite tout de même du "probleme".
Cordialement.
Paul

fredericmazue

Rien à redire à ton code. En fait j'ai demandé à le voir, pour savoir si tu avais uilisé un descripteur de sécurité

Bref je viens de faire un essai avec une clé USB. Pour l'occasion je découvre quel est en FAT16 :)
Bref, voilà. J'ai pu tout lire. J'ai pu locker/unlocker, Mais je n'ai *PAS* pu écrire un seul secteur, même pas le zéro.
Pas le temps d'appronfondir pourquoi. Peut être en milieu d'après midi

paul

Je viens de tester sur une carte sd de 128 Mo qui est en FAT16.
En mode logique (avec lock/unlock), si aucun fichier d'ouvert je peux écrire sur tous les secteurs.
En mode physique, je peux écrire du secteur 0 au 95 (]) qui correspond au secteur relatif de début de la partition. Au delà c'est impossible bref le comportement habituel !!!!
Je vais devoir me résoudre à écrire un petit pilote , en attendant je vais utiliser l'astuce de basculer en mode logique.
Cordialement.
Paul

fredericmazue

3 choses

1) Quel con je fais :!: :oops: Tout à l'heure j'ai oublié de passer GENERIC_WRITE à CreateFile alors forcément.... :oops:

2)

Quote:
En mode physique, je peux écrire du secteur 0 au 95 (]) qui correspond au secteur relatif de début de la partition. Au delà c'est impossible bref le comportement habituel !!!!

Ben j'ai pas ça....
J'ai ouvert ma clé USB avec son nom de volume ( H: ) et là j'ai pu lire et écrire aussi bien le secteur 0 que le secteur 1000...

3) Par contre je ne suis pas arrivé du tout à ouvrir un disque avec CreateFile en donnant \\.\PhysicalDriveX et là je dois dire que je ne vois pas pourquoi. Bon j'ai peut être fait une grosse connerie du genre du GENERIC_WRITE :lol: Mais j'ai quand même pris le temps de regarder et je ne crois pas.
Et là je dois dire que je ne comprends pas du tout ce qui se passe. Nous avons des résultats forts différents là....
Pourquoi est-ce que je peu xlire/écrire partout à partir d'un nom de volume, pourquoi est-ce que je ne peux pas ouvrir un lecteur physique ?
Mon UAC n'est pas désactivée, mais je n'ai pas le sentiment que c'est important, j'ai tort ?

Quote:
Je vais devoir me résoudre à écrire un petit pilote ,

Bon courage.... Mais est-ce bien nécessaire. Tu as essayé avec des noms de volumes ?
paul

Quote:
Quel con je fais Tout à l'heure j'ai oublié de passer GENERIC_WRITE à CreateFile alors forcément...

Cela ne pouvait pas marcher :)

Quote:
J'ai ouvert ma clé USB avec son nom de volume ( H: ) et là j'ai pu lire et écrire aussi bien le secteur 0 que le secteur 1000...

Tu as ouvert au niveau logique c'est normal avec lock/unlock on peut écrire; si pas de fichier ouvert.

Quote:
) Par contre je ne suis pas arrivé du tout à ouvrir un disque avec CreateFile en donnant \\.\PhysicalDriveX

Il faut doubler les \ , cela donne \\\\.\\PHYSICALDRIVEX enfin pour un code c/c++.
I faut avoir les droits administrateurs mais si tu passes à ton programme les bons droist "Exécuter en tant que...", cela doit marcher.

Quote:
Mais est-ce bien nécessaire. Tu as essayé avec des noms de volumes

Lorsque j'ouvre en logique par exemple pour C on a un path égal à "\\\\.\\c:"

Je vais leur conseiller de ne pas utiliser leur poste sous Vista :wink: , il va tout de même falloir que j'en écrive un petit. En attendant je vais faire une "conversion" du numéro de secteur physique en logique et réouvrir en logique pour l'écriture....

Cordialement.
Paul

fredericmazue

Quote:
Il faut doubler les \ , cela donne \\\\.\\PHYSICALDRIVEX enfin pour un code c/c++.

:lol:
Rassure moi, tu me prends pas pour une buse quand même ?
Quote:
I faut avoir les droits administrateurs mais si tu passes à ton programme les bons droist "Exécuter en tant que...", cela doit marcher.

Ah lol :lol:
Décidément.... J'essayais sous Visual Studio et j'étais convaincu que j'avais lancé celui-ci avec les droits administrateur, mais non. j'ai du être dérangé pour la millième fois et j'ai zappé le truc à l'insu de mon plein gré :( Donc oui ça ouvre bien.
Et tant que j'y étais j'ai vérifié. j'ai bien le même comportement que toi sur les disques montés. Par contre, sur une machine, dual boot, j'ai essayé sur un disque Linux, donc non monté par Vista. Pas de problème, on peut écrire où on veut.
On dirait bien que c'est le nouveau comportement sous Vista. J'ai appris quelque chose et je suis assez content de ça. Et je trouve plutôt normal de faire des écritures à bas niveau sur un périphérique démonté.

Quote:
Lorsque j'ouvre en logique par exemple pour C on a un path égal à "\\\\.\\c:"

Oui oui oui et re oui.
Même que quand j'ai dit avoir essayé avec H: je le disais en m'adressant d'égal à égal avec mon interlocuteur. Je vois que j'aurais dire dire, j'ai essayé avec \\\\.\\H: avec 4 puis deux petites barres et tout et tout.
:P

Bon comme je suis un peu buse, je pense que ne vais pas perdre inutilement mon temps à essayer de résoudre le problème d'écrire sur un disque monté :P J'ai voulu aider alors que j'ai du taf par dessus la tête, j'aurais peut être pas du :lol:

paul

Quote:
Rassure moi, tu me prends pas pour une buse quand même ?

Mais non, rassure toi, j'ai dis cela car en "testant'" vite on peut faire des erreurs bêtes. Pour te dire, la semaine dernière je travaillais sur un projet à rendre rapidement donc je travaillais très très tard bref dans une classe j'inclus un fichier tout simplement en faisant #include "tools.cpp" et bien j'ai seulement trouvé mon erreur le lendemain.....bref à partir de 23h00 ON DORT :D
Quote:
Oui oui oui et re oui.
Même que quand j'ai dit avoir essayé avec H: je le disais en m'adressant d'égal à égal avec mon interlocuteur

Je ne souligner pas le \\\\.\\ mais le fait que j'ai testé en logique.

Quote:
On dirait bien que c'est le nouveau comportement sous Vista

Je le pense aussi mais c'est un peu génant ...... je sais que certaines personnes on essayé de faire un service , je vais essayer cela on verra bien, je n'y croit pas trop mais bon...

Pour finir, c'est sympa d'avoir essayé de "dépatouiller" le problème avec moi. Et non je ne te prends pas pour une buse, ce n'est pas mon style. Le respect est primordial !!

Cordialement.
Paul

dbobby

Bonjour
Une question svp; moi aussi i y'a a peu pres 20 ans je m'amusé de faire ce type d'exercise du genre copier de diskettes 720 ko sur des 360 . c'etait vraiment amusant.
Au jour d'hui je me rappel plus tellement, seulement y'a une chose qui m'intrigue. Si vista ou autres systemes ne permet pas ce genre de manipulation, alors comment fonctione au jour d'hui un simple programme de formatage ?
A bientot et merci
dbobby

paul

Bonjour,
"Seulement" Vista bloque l'écriture physqiue des secteurs lorsqu'on est sur "l'espace" d'une partition.
Pour les programmes de formatage, celui de Vista n'a pas de problème, il n'est pas bloqué :)
Pour les autres, il y a des tas de différence, sous 98 tu as des programmes 16 bits, d'autres utilisent des pilotes.... Si le sujet t'intéresse tu peux consulter des tas de sources fdisk(...) en regardant les projets GNU.

Frédéric, j'ai testé un service en C# pour l'écriture. J'ai fait au plus simple avec un service au démarrage manuel et j'ai un évenement sur "démarrer" qui lance l'écriture, j'obtiens le même comportement avec une écriture possible sur le secteur 1 et pas possible lorsque je suis "sur" une partition. J'ai même testé en passant par scsi.

Je suis retombé sur des articles sur le sujet, l'écriture en mode user est impossible il faut passer par le Kernel. Il y a sujet bien fait sur la sécurité de Vista dans le numéro 93 de Programmez, je suis tombé dessus par hasard !!

Cordialement.
Paul

fredericmazue

Quote:
Frédéric, j'ai testé un service en C# pour l'écriture. J'ai fait au plus simple avec un service au démarrage manuel et j'ai un évenement sur "démarrer" qui lance l'écriture, j'obtiens le même comportement avec une écriture possible sur le secteur 1 et pas possible lorsque je suis "sur" une partition. J'ai même testé en passant par scsi.

Intéressant à savoir.

Quote:
Je suis retombé sur des articles sur le sujet, l'écriture en mode user est impossible il faut passer par le Kernel. Il y a sujet bien fait sur la sécurité de Vista dans le numéro 93 de Programmez, je suis tombé dessus par hasard !!

Tout le monde devrait toujours lire Programmez!, moi y compris :lol:
Hier soir j'ai un peu hanté le Net et je suis tombé sur un forum où un type disait que l'écriture marchait avec Vista RC1 et que ça n'a plus marché avec Vista RC2 ....
J'ai paumé le lien par contre
paul

Bonjour,

Quote:
Hier soir j'ai un peu hanté le Net et je suis tombé sur un forum où un type disait que l'écriture marchait avec Vista RC1 et que ça n'a plus marché avec Vista RC2 ....
J'ai paumé le lien par contre

Je vais rechercher aussi....
De toute manière je vais tester un petit pilote en fin de semaine si j'ai le temps, en attendant la société uilisera ses postes 2000/XP.

Cordialement collègue (suite à mon message d'hier soir)
Paul

fredericmazue

Quote:
Cordialement collègue (suite à mon message d'hier soir)

Pas de problème :)
fredericmazue

Hello Paul :)

Lors de ma méditation matinale, j'ai eu l'intuition de la solution.
Pas besoin d'écrire de driver. On peut écrire dans un PhysicalDrive où l'on veut :)

fredericmazue

Et dès que j'ai un moment, je t'explique comment. Aujourd'hui promis :)

paul

Bonjour Frederic,
Par exemple si je fais un CreateFile(...) avec \\.\PHYSICALDRIVE3 (ma clé) , j'ai toujours le même problème si je suis dans l'espace d'une partition j'ai un code d'erreur 5 avec WriteFile(....). Tu pensais à cela ? Je pense que d'après la doc l'écriture en mode USER est impossible. J'ai essayé avec une structure scsi...
J'ai commencé à regarder pour un pilote en écrivant un petit peu de code, je peux l'installer et le désinstaller à la volée, le démarrer avec du code ou bien tout simplement dans une console NET START pilote. En fin de semaine je vais faire un "squelette" de pilote....
Cordialement.
Paul

paul

Quote:
Et dès que j'ai un moment, je t'explique comment. Aujourd'hui promis

Nos messages se croisent, j'attends de voir ta solution....
Cordialement.
Paul
fredericmazue

Quote:
\\.\PHYSICALDRIVE3 (ma clé)

Tiens la mienne est là aussi :)

Quote:
d'erreur 5

ACCESS DENIED :)

Quote:
Tu pensais à cela ?

Non :)

Quote:
Je pense que d'après la doc l'écriture en mode USER est impossible

C'est possible puisque je viens de le faire ;)

Quote:
J'ai commencé à regarder pour un pilote

Ne pers pas ton temps.
Là je suis en train de técrire la soluce. Bon je vais être moult fois dérangé, mais je poste le plus tôt possible :)
fredericmazue

Donc c'est tout simple. Je me suis dit qu'il n'y avait pas de raisons que l'écriture dans un disque soit interdite du point de vue de la sécurité, vu que quand on peut écrire dans un volume, on peut largement faire des dégâts :)
D'un autre côté j'ai pu écrire sur un disque Linux donc non monté ni vu comme contenant des volumes par Vista.
Alors je ne sais pas si c'est voulu ou un bug de Vista, mais j'ai eu l'intuition que Vista applique la politique de la ceinture et des bretelles pour sécurisé le pantalon :lol: Avec cette politique, un lock sur le disque ne suffit pas. La solution consiste donc à ouvrir le disque et le locker, et AUSSI ouvrir les partitions sur le dit disque et les locker. Ceci étant fait, tu peux écrire où tu veux avec le HANDLE du *disque* passé à WriteFile. Je dis bien le disque.
Ci-dessous le code que j'ai bricolé à partir de mes essais d'hier. Il ouvre ma clé USB connecté en PhycisalDrive3 et comportant une seule partition montée en H: et il *écrit* dans le secteur 100, ce qui était impossible avant. Tu adapteras tout ça à ton cas. Regarde pas trop le code. Il n'est pas beau, construit à coups de copier/coller et surtout mal organisé, puisque je l'ai bricolé, mais il présente quand même l'intérêt majeur de fonctionner. :D

#include <windows.h>

#include <iostream>

using namespace std;

const DWORD sector_size = 512;
const char* volume_name = "\\\\.\\H:";
const char* disk_name = "\\\\.\\PhysicalDrive3"; // clé USB "H:"
const int target_sector = 100;

BOOL SeekSector(HANDLE disk, int sector)
{
	DWORD result = 0;
	result = ::SetFilePointer(disk,
		sector * sector_size, // Attention aux débordements!
		0, // paresse de ma part: seul les secteurs des 4 premiers Go sont accessibles
		FILE_BEGIN);
	if(result == INVALID_SET_FILE_POINTER)
	{
		cerr << "Impossible de pointer sur le secteur " << sector << endl;
		return FALSE;
	}
	return TRUE;
}


BOOL ReadSector(HANDLE disk, int sector, void* buffer)
{
	DWORD nb_read;
	BOOL result;

	SeekSector(disk, sector);
	result = ::ReadFile(disk, buffer, sector_size, &nb_read, NULL);
	if(!result)
	{
		cerr << "Impossible de lire le secteur " << sector << endl;
		return FALSE;
	}
	if(nb_read != sector_size)
	{
		cerr << "Probleme, secteur " << sector << " pas lu completement" << endl;
		return FALSE;
	}
	return TRUE;
}

BOOL WriteSector(HANDLE disk, int sector, void* buffer)
{
	DWORD nb_written;
	BOOL result;

	SeekSector(disk, sector);
	result = ::WriteFile(disk, buffer, sector_size, &nb_written, NULL);
	if(!result)
	{
		cerr << "Impossible d'ecrire le secteur " << sector << endl;
		return FALSE;
	}
	if(nb_written != sector_size)
	{
		cerr << "Probleme, secteur " << sector << " pas ecrit completement" << endl;
		return FALSE;
	}
	return TRUE;
}

int main()
{
	HANDLE disk=0;
	HANDLE volume=0;
	BOOL result;
	DWORD error;
	char* buffer[sector_size];
	
	::ZeroMemory(buffer, sector_size);
	disk = ::CreateFile(disk_name, 
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL, // Security descriptor
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_OPEN_REPARSE_POINT,
		NULL);

	if(disk == INVALID_HANDLE_VALUE)
	{
		cerr << "Echec ouverture: " << disk_name <<endl;
		return 1;
	}

	volume = ::CreateFile(volume_name, 
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL, // Security descriptor
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_OPEN_REPARSE_POINT,
		NULL);


	cout << "Ouverture: " << disk_name <<endl;
	
	result = ReadSector(disk, target_sector, buffer);
	if(result)
	{
		DWORD returned;
		result = ::DeviceIoControl(disk, 
			FSCTL_LOCK_VOLUME,
			NULL,
			0,
			NULL,
			0,
			&returned,
			NULL);

		if(!result)
		{
			cerr << "Impossible de verrouiller " << disk_name << endl;
		}

		result = ::DeviceIoControl(volume, 
			FSCTL_LOCK_VOLUME,
			NULL,
			0,
			NULL,
			0,
			&returned,
			NULL);

		if(!result)
		{
			cerr << "Impossible de verrouiller " << disk_name << endl;
		}

		
		result = WriteSector(disk, target_sector, buffer);
		if(!result)
		{
			cerr << "Ecriture du secteur " << target_sector << " impossible" << endl;
			error = GetLastError();
		}

		result = ::DeviceIoControl(volume, 
			FSCTL_UNLOCK_VOLUME,
			NULL,
			0,
			NULL,
			0,
			&returned,
			NULL);

		result = ::DeviceIoControl(disk, 
			FSCTL_UNLOCK_VOLUME,
			NULL,
			0,
			NULL,
			0,
			&returned,
			NULL);

		if(!result)
		{
			cerr << "Impossible de deverrouiller " << disk_name << endl;
		}
		
	}

	result = ::CloseHandle(volume);
	result = ::CloseHandle(disk);
	if(!result)
	{
		return 1;

	}
	return 0;
}
paul

Ok j'attends ta méthode, je suis curieux de voir cela :)
Cordialement
Paul

paul

Quote:
mais il présente quand même l'intérêt majeur de fonctionner.

Parfait, je vais tester cela......j'avais envisagé cela au début mais j'ai trop vite conclu que cela ne marcherait pas :( . Merci de ta solution je vais faire un essai grandeur nature et je te tiens au courant.
Cordialement.
Paul
paul

J'ai testé cela marche, je vais testé sur un disque avec 3 partitions logiques. Dans mon cas, il n'y aura jamais de fichier ouvert sur le support donc le LOCK n'échouera quasiment jamais si oui je fais un DISMOUNT.
Finalement c'est encore plus rapide que ma petite astuce de convertir le numéro de secteur physique en logique et de faire l'écriture en ouvrant le volume.
Pour le pilote cela sera pour moi par la suite, pour le côté technique.....
Cordialement.
Paul.

fredericmazue

Quote:
J'ai testé cela marche

J'espère bien ;)

Quote:
Dans mon cas, il n'y aura jamais de fichier ouvert

Condition sine qua non en effet.

Ah au fait... qui c'est le meilleur ? ;)
:lol: