了解實模式編程的朋友都知道,可以利用BiOS的INT 13中斷來進行磁盤的絕對讀寫,但在NT環境下,卻不能使用INT 13中斷來直接讀寫硬盤.在這裡,我們可以利用CreateFile並將路徑名設為".X:"來打開邏輯盤,並進行讀寫.在進裡X為盤符.
CreateFile函數原型如下:
HANDLE CreateFile(LPCTSTR lpFileName, DWord dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWord dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: 要打開的文件的名字
dwDesiredAccess: 如果為 GENERIC_READ 表示允許對設備進行讀訪問;如果為 GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果為零,表示只允許獲取與一個設備有關的信息.
dwShareMode: 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允許對文件進行共享訪問
lpSecurityAttributes: 指向一個SECURITY_ATTRIBUTES結構的指針,定義了文件的安全特性
dwCreationDistribution: 建立方式
dwFlagsAndAttributes: 其它屬性
hTemplateFile: 如果不為零,則指定一個文件句柄。新文件將從這個文件中復制擴展屬性
下面的例子在Windows XP下編譯通過, 其實現的功能為讀取C盤的引導扇區,並將讀出的數據顯示出來.
program ReadDisk;
uses
SysUtils,
Windows;
var
Buf: array [0..511] of Byte; //數據緩沖區
ShowText, TmpStr: string;
FileHandle: THandle;
ReadCount, i: Cardinal;
begin
//打開磁盤
FileHandle := CreateFile('.C:', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if FileHandle = INVALID_HANDLE_VALUE then
begin
MessageBox(GetDesktopWindow, '打開磁盤失敗', 'ERROR', MB_OK);
ExitProcess(0);
end;
//讀出引導扇區數據
if ReadFile(FileHandle, Buf, 512, ReadCount, nil) then
begin
SetLength(ShowText, Length(Buf) * 3);
//將數據轉為字串
for i := Low(Buf) to High(Buf) do
begin
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
end;
end;
MessageBox(GetDesktopWindow, PChar(ShowText), '引導扇區', MB_OK);
CloseHandle(FileHandle);
ExitProcess(0);
end.