يعرف الأصدقاء الذين يعرفون برمجة الوضع الحقيقي أنه يمكنك استخدام مقاطعة INT 13 لنظام BIOS لإجراء القراءة والكتابة المطلقة للقرص، ولكن في بيئة 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 وعرض بيانات القراءة.
برنامج قراءة القرص؛
الاستخدامات
سيسوتيلس,
نوافذ؛
فار
Buf: صفيف [0..511] من البايت؛
ShowText، TmpStr: سلسلة؛
مقبض الملف: Thandle؛
ريدكونت، ط: الكاردينال؛
يبدأ
//فتح القرص
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ أو FILE_SHARE_WRITE,
لا شيء، OPEN_EXISTING، 0، 0)؛
إذا FileHandle = INVALID_HANDLE_VALUE ثم
يبدأ
messageBox(GetDesktopWindow, 'فشل في فتح القرص', 'ERROR', MB_OK);
ExitProcess(0);
نهاية؛
// قراءة بيانات قطاع التمهيد
إذا ReadFile(FileHandle, Buf, 512, ReadCount, nil) ثم
يبدأ
SetLength(ShowText, Length(Buf) * 3);
// تحويل البيانات إلى سلسلة
لأني := منخفض(Buf) إلى مرتفع(Buf) افعل
يبدأ
TmpStr := Format('%2.2x', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
نهاية؛
نهاية؛
messageBox(GetDesktopWindow, PChar(ShowText), 'Boot Sector', MB_OK);
CloseHandle(FileHandle);
ExitProcess(0);
نهاية.