Amigos que conhecem programação em modo real sabem que você pode usar a interrupção INT 13 do BIOS para realizar leitura e gravação absoluta do disco, mas no ambiente NT você não pode usar a interrupção INT 13 para ler e gravar diretamente no disco rígido. Aqui, podemos usar CreateFile e definir o nome do caminho como "//./X:" para abrir o disco lógico e realizar a leitura e gravação de X é a letra da unidade.
O protótipo da função CreateFile é o seguinte:
HANDLE CreateFile (LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: o nome do arquivo a ser aberto
dwDesiredAccess: Se for GENERIC_READ, significa que o acesso de leitura ao dispositivo é permitido; se for GENERIC_WRITE, significa que o acesso de gravação ao dispositivo é permitido (pode ser usado em combinação, se for zero, significa que apenas); informações relacionadas a um dispositivo podem ser obtidas.
dwShareMode: Zero significa nenhum compartilhamento FILE_SHARE_READ e/ou FILE_SHARE_WRITE significa permitir acesso compartilhado ao arquivo;
lpSecurityAttributes: ponteiro para uma estrutura SECURITY_ATTRIBUTES que define os atributos de segurança do arquivo
dwCreationDistribution: método de criação
dwFlagsAndAttributes: Outros atributos
hTemplateFile: se for diferente de zero, especifica um identificador de arquivo. O novo arquivo copiará os atributos estendidos deste arquivo
O exemplo a seguir é compilado e passado no Windows XP. A função que ele implementa é ler o setor de inicialização da unidade C e exibir os dados lidos.
Programa ReadDisk;
usa
SysUtils,
Windows;
var
Buf: array [0..511] de Byte; //buffer de dados;
ShowText, TmpStr: string;
FileHandle: THandle;
ReadCount, i: Cardeal;
começar
//abre o disco
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ ou FILE_SHARE_WRITE,
nulo, OPEN_EXISTING, 0, 0);
se FileHandle = INVALID_HANDLE_VALUE então
começar
MessageBox(GetDesktopWindow, 'Falha ao abrir disco', 'ERRO', MB_OK);
SairProcesso(0);
fim;
//Lê os dados do setor de inicialização
se ReadFile(FileHandle, Buf, 512, ReadCount, nil) então
começar
SetLength(ShowText, Comprimento(Buf) * 3);
//Converte dados em string
para i := Baixo (Buf) para Alto (Buf) faça
começar
TmpStr := Formato('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
fim;
fim;
MessageBox(GetDesktopWindow, PChar(ShowText), 'Setor de inicialização', MB_OK);
CloseHandle(FileHandle);
SairProcesso(0);
fim.