เพื่อนที่รู้จักการเขียนโปรแกรมในโหมดจริงจะรู้ดีว่าคุณสามารถใช้ INT 13 Interrupt ของ BIOS เพื่ออ่านและเขียนดิสก์ได้อย่างสมบูรณ์ แต่ในสภาพแวดล้อม NT คุณจะไม่สามารถใช้ INT 13 Interrupt เพื่ออ่านและเขียนฮาร์ดดิสก์ได้โดยตรง ที่นี่เราสามารถใช้ CreateFile และตั้งชื่อเส้นทางเป็น "//./X:" เพื่อเปิดดิสก์แบบลอจิคัลและดำเนินการอ่านและเขียน X คืออักษรระบุไดรฟ์
ต้นแบบฟังก์ชัน CreateFile มีดังนี้:
จัดการ CreateFile (LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, จัดการ hTemplateFile);
lpFileName: ชื่อของไฟล์ที่จะเปิด
dwDesiredAccess: หากเป็น GENERIC_READ หมายความว่าอนุญาตให้อ่านอุปกรณ์ได้ หากเป็น GENERIC_WRITE หมายความว่าอนุญาตให้เขียนอุปกรณ์ได้ (สามารถใช้ร่วมกันได้) หากเป็นศูนย์ หมายความว่าเท่านั้น อนุญาตให้รับข้อมูลที่เกี่ยวข้องกับอุปกรณ์หนึ่งเครื่องได้
dwShareMode: ศูนย์หมายถึงไม่มีการแชร์ FILE_SHARE_READ และ/หรือ FILE_SHARE_WRITE หมายถึงอนุญาตให้แชร์ไฟล์ได้
lpSecurityAttributes: ตัวชี้ไปยังโครงสร้าง SECURITY_ATTRIBUTES ที่กำหนดคุณลักษณะความปลอดภัยของไฟล์
dwCreationDistribution: วิธีการสร้าง
dwFlagsAndAttributes: คุณลักษณะอื่นๆ
hTemplateFile: หากไม่เป็นศูนย์ ให้ระบุตัวจัดการไฟล์ ไฟล์ใหม่จะคัดลอกแอตทริบิวต์เพิ่มเติมจากไฟล์นี้
ตัวอย่างต่อไปนี้ถูกคอมไพล์และส่งผ่านภายใต้ Windows xp ฟังก์ชั่นที่ใช้คือการอ่านเซกเตอร์สำหรับบูตของไดรฟ์ C และแสดงข้อมูลที่อ่าน
โปรแกรม ReadDisk;
การใช้งาน
SysUtils,
หน้าต่าง;
var
Buf: อาร์เรย์ [0..511] ของ Byte; //data buffer
ShowText, TmpStr: สตริง;
FileHandle: THandle;
ReadCount, i: พระคาร์ดินัล;
เริ่ม
//เปิดดิสก์
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ หรือ FILE_SHARE_WRITE,
ไม่มี OPEN_EXISTING, 0, 0);
ถ้า FileHandle = INVALID_HANDLE_VALUE แล้ว
เริ่ม
MessageBox(GetDesktopWindow, 'ไม่สามารถเปิดดิสก์', 'ข้อผิดพลาด', MB_OK);
ออกจากกระบวนการ(0);
จบ;
//อ่านข้อมูลบูตเซกเตอร์
ถ้า ReadFile(FileHandle, Buf, 512, ReadCount, nil) แล้ว
เริ่ม
SetLength(ShowText, ความยาว(Buf) * 3);
//แปลงข้อมูลเป็นสตริง
สำหรับฉัน := ต่ำ(Buf) ถึงสูง(Buf) ทำ
เริ่ม
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
จบ;
จบ;
MessageBox(GetDesktopWindow, PChar(ShowText), 'บูตเซกเตอร์', MB_OK);
CloseHandle(ตัวจัดการไฟล์);
ออกจากกระบวนการ(0);
จบ.