磁盤的絕對讀寫(轉貼出處不明)

瞭解實模式編程的朋友都知道,可以利用BIOS的INT 13中斷來進行磁盤的絕對讀寫,但在NT環境下,卻不能使用INT 13中斷來直接讀寫硬盤.在這裏,我們可以利用CreateFile並將路徑名設爲":"來打開邏輯盤,並進行讀寫.在進裏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. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章