cs_alain34270
Messages postés85Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention18 septembre 2005
-
21 févr. 2003 à 17:58
cs_alain34270
Messages postés85Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention18 septembre 2005
-
24 févr. 2003 à 04:31
alain
Bonjour,
Voilà. J'ai un problème avec mon disque dur. je voudrais lire les secteurs physiques de mon disque dur, si possible à partir de visual C++, afin de récupérer des données suite au plantage d'une installation.
Pour cela, je pourrais utiliser l'int 13h du bios, mais je n'ai pas envie d'écrire tout le programme en assembleur. Je pourrais lancer un petit programme à partir du c qui lit le secteur voulu et le met dans un fichier, mais l'exécution serait longue (sans parler des problèmes de synchro).
Quelqu'un pourrait il me dire comment je peux lancer l'int 13h directement à partir du visual C++ (si c'est possible ?) ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 févr. 2003 à 18:34
Salut,
en VC++ tu fais une func en asm pur sans probleme
exemple, on fait a = a + b * -1:
__declspec(naked) void __stdcall MaFunc(DWORD *a, DWORD b)
{
__asm {
mov eax, [esp+8] ; b
mov ecx, [esp+4]
neg eax
inc eax
add [ecx], eax
ret 8
}
}
bien sur toi tu feras un truc utile, juste pour montrer.
Avec __declspec(naked) devant func le compilo n'y fout pas ses pattes donc tu fais ce que tu veux.
Tout le code doit se trouver dans un bloc __asm {}, ne pas oublier le ret nbr en finale, en somme de l'asm normal. C'est a toi de sauver et restaurer tout registre autre que eax, ecx et edx. Si tu veux retourner une valeur, dans eax comme d'hab.
Fais gaffe que sur noyau NT, system va bloquer ton prog si tu essaies d'acceder au disque en direct. Soit on ecrit un driver ou on se sert de DeviceIoControl.
ciao...
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDernière intervention 6 octobre 20084 21 févr. 2003 à 19:14
-------------------------------
Réponse au message : Hello BruNews. Tu as l'air de mastériser l'interfaçage ASM-VC++ et moi je lutte un peu... A quoi sert le "8" après le ret ? Sinon j'ai pigé merci ! Pratik la méthode du complément à 2 pour trouver l'opposé de b :-p
Il est par contre impossible à ma connaissance de lancer une int 16 bit (13h,21h,10h) depuis VC++ qui est 32 bits. Il faut utiliser DJGPP.
-------------------------------
> Salut,
> en VC++ tu fais une func en asm pur sans probleme
> exemple, on fait a = a + b * -1:
> __declspec(naked) void __stdcall MaFunc(DWORD *a, DWORD b)
> {
> __asm {
> mov eax, [esp+8] ; b
> mov ecx, [esp+4]
> neg eax
> inc eax
> add [ecx], eax
> ret 8
> }
> }
> bien sur toi tu feras un truc utile, juste pour montrer.
> Avec __declspec(naked) devant func le compilo n'y fout pas ses pattes donc tu fais ce que tu veux.
> Tout le code doit se trouver dans un bloc __asm {}, ne pas oublier le ret nbr en finale, en somme de l'asm normal. C'est a toi de sauver et restaurer tout registre autre que eax, ecx et edx. Si tu veux retourner une valeur, dans eax comme d'hab.
> Fais gaffe que sur noyau NT, system va bloquer ton prog si tu essaies d'acceder au disque en direct. Soit on ecrit un driver ou on se sert de DeviceIoControl.
> ciao...
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > alain
> >
> > Bonjour,
> >
> > Voilà. J'ai un problème avec mon disque dur. je voudrais lire les secteurs physiques de mon disque dur, si possible à partir de visual C++, afin de récupérer des données suite au plantage d'une installation.
> >
> > Pour cela, je pourrais utiliser l'int 13h du bios, mais je n'ai pas envie d'écrire tout le programme en assembleur. Je pourrais lancer un petit programme à partir du c qui lit le secteur voulu et le met dans un fichier, mais l'exécution serait longue (sans parler des problèmes de synchro).
> >
> > Quelqu'un pourrait il me dire comment je peux lancer l'int 13h directement à partir du visual C++ (si c'est possible ?) ?
> >
> > Merci d'avance !
> >
> > alain
> >
>
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 févr. 2003 à 19:49
le 8 apres ret est le nombre d'octets qui ont ete "pushes" par l'appelant.
Il y avait dans exemple 2 params donc 8 octets.
Donc ret 8 fera:
mov eip, [esp]
add esp, 8
Ce ret est obligatoire cause __declspec(naked) qui interdit toute instruction C du genre return etc...
Le nbr pour ret cause __stdcall, donc a l'appele de remonter ESP.
la prochaine adr instruction est toujours mise en ESP. C'est pour cela qu'on recup le 1er param en [esp+4] etc..
le prog peut continuer car il a recup adr next instruction.
Tu peux mettre int value sans probleme, a toi de coder value correctement.
ciao...
cs_alain34270
Messages postés85Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention18 septembre 2005 22 févr. 2003 à 17:40
alain
Salut.
Maintenant, j'arrive sans problème à mettre de l'asm dans un programme C (merci beaucoup).
Mon (autre) problème, c'est que je dois lire des secteurs qui ne font partie d'aucune partition (puisqu'elle n'existe plus :-( ).
Je dois donc utiliser l'int 13h étendu.
Or, le DAP de l'int 13 étendu n'accepte que des adressages 16 bits (à ma connaissance).
Y'aurait pas moyen de créer un petit environnement 16 bits en C ? ou
Y'aurait-il une autre solution simple ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 févr. 2003 à 17:57
si tu as encore un compilo C 16 bits alors oui sinon neni.
Solution envisageable (et meme preconisee pas MS si si), tu fais une dll ou un exe 16 bits avec masm (ou autre) et tu peux le charger depuis ton prog 32 bits. Moi je prefere exe mais c'est selon, exe aura avantage de tourner en processus separe et pas risque de planter prog appelant.
ciao...