Los amigos que conocen la programación en modo real saben que puede usar la interrupción INT 13 del BIOS para realizar lectura y escritura absolutas en el disco, pero en el entorno NT, no puede usar la interrupción INT 13 para leer y escribir directamente en el disco duro. Aquí, podemos usar CreateFile y establecer el nombre de la ruta en "//./X:" para abrir el disco lógico y realizar lectura y escritura. X es la letra de la unidad.
El prototipo de la función CreateFile es el siguiente:
HANDLE CreateFile(LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: el nombre del archivo que se abrirá
dwDesiredAccess: si es GENERIC_READ, significa que se permite el acceso de lectura al dispositivo; si es GENERIC_WRITE, significa que se permite el acceso de escritura al dispositivo (se puede usar en combinación, si es cero, significa que solo); Se permite obtener información relacionada con un dispositivo.
dwShareMode: Cero significa que no se puede compartir FILE_SHARE_READ y/o FILE_SHARE_WRITE significa que se permite el acceso compartido al archivo;
lpSecurityAttributes: puntero a una estructura SECURITY_ATTRIBUTES que define los atributos de seguridad del archivo
dwCreationDistribution: método de creación
dwFlagsAndAttributes: Otros atributos
hTemplateFile: si es distinto de cero, especifica un identificador de archivo. El nuevo archivo copiará los atributos extendidos de este archivo.
El siguiente ejemplo se compila y se pasa en Windows XP. La función que implementa es leer el sector de arranque de la unidad C y mostrar los datos leídos.
Programa ReadDisk;
usos
SysUtils,
ventanas;
var
Buf: matriz [0..511] de Byte //búfer de datos;
MostrarTexto, TmpStr: cadena;
Mango de archivo: THandle;
ReadCount, i: Cardenal;
comenzar
//abrir disco
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ o FILE_SHARE_WRITE,
nulo, OPEN_EXISTING, 0, 0);
si FileHandle = INVALID_HANDLE_VALUE entonces
comenzar
MessageBox(GetDesktopWindow, 'Error al abrir el disco', 'ERROR', MB_OK);
Proceso de salida(0);
fin;
//Leer datos del sector de arranque
si ReadFile(FileHandle, Buf, 512, ReadCount, nil) entonces
comenzar
EstablecerLongitud(MostrarTexto, Longitud(Buf) * 3);
//Convierte datos a cadena
para i: = Bajo (Buf) a Alto (Buf) hacer
comenzar
TmpStr := Formato('%2.2x ', [Buf[i]]);
CopiarMemoria(@ShowText[i*3+1], @TmpStr[1], 3);
fin;
fin;
MessageBox(GetDesktopWindow, PChar(ShowText), 'Sector de arranque', MB_OK);
CloseHandle(FileHandle);
Proceso de salida(0);
fin.