Les amis qui connaissent la programmation en mode réel savent que vous pouvez utiliser l'interruption INT 13 du BIOS pour effectuer une lecture et une écriture absolues du disque, mais dans l'environnement NT, vous ne pouvez pas utiliser l'interruption INT 13 pour lire et écrire directement le disque dur. Ici, nous pouvons utiliser CreateFile et définir le nom du chemin sur "//./X:" pour ouvrir le disque logique et effectuer la lecture et l'écriture. X est la lettre du lecteur.
Le prototype de la fonction CreateFile est le suivant :
HANDLE CreateFile (LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName : le nom du fichier à ouvrir
dwDesiredAccess : S'il s'agit de GENERIC_READ, cela signifie que l'accès en lecture au périphérique est autorisé ; s'il s'agit de GENERIC_WRITE, cela signifie que l'accès en écriture au périphérique est autorisé (peut être utilisé en combinaison ; s'il est égal à zéro, cela signifie que uniquement) ; les informations relatives à un appareil peuvent être obtenues.
dwShareMode : zéro signifie aucun partage ; FILE_SHARE_READ et/ou FILE_SHARE_WRITE signifie autoriser l'accès partagé au fichier ;
lpSecurityAttributes : pointeur vers une structure SECURITY_ATTRIBUTES qui définit les attributs de sécurité du fichier
dwCreationDistribution : méthode de création
dwFlagsAndAttributes : Autres attributs
hTemplateFile : s'il est différent de zéro, spécifie un descripteur de fichier. Le nouveau fichier copiera les attributs étendus de ce fichier
L'exemple suivant est compilé et passé sous Windows XP. La fonction qu'il implémente est de lire le secteur de démarrage du lecteur C et d'afficher les données lues.
Programme ReadDisk ;
utilise
SysUtils,
Fenêtres ;
var
Buf : tableau [0..511] d'octets //tampon de données
ShowText, TmpStr : chaîne ;
Descripteur de fichier : THandle ;
ReadCount, je : Cardinal ;
commencer
//ouvrir le disque
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ ou FILE_SHARE_WRITE,
nul, OPEN_EXISTING, 0, 0);
si FileHandle = INVALID_HANDLE_VALUE alors
commencer
MessageBox (GetDesktopWindow, 'Échec de l'ouverture du disque', 'ERREUR', MB_OK);
Processus de sortie (0);
fin;
//Lire les données du secteur de démarrage
si ReadFile (FileHandle, Buf, 512, ReadCount, nul) alors
commencer
SetLength(ShowText, Longueur(Buf) * 3);
//Convertir les données en chaîne
pour i := Low(Buf) à High(Buf) faire
commencer
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory (@ShowText[i*3+1], @TmpStr[1], 3);
fin;
fin;
MessageBox (GetDesktopWindow, PChar (ShowText), 'Secteur de démarrage', MB_OK);
CloseHandle(FileHandle);
Processus de sortie (0);
fin.