سؤال

في لغة C، باستخدام واجهة برمجة تطبيقات Windows القياسية، ما هي أفضل طريقة لقراءة قرص غير منسق؟وعلى وجه التحديد، لدي إم إم سي أو بطاقة الذاكرة مع البيانات، ولكن لا يوجد نظام ملفات (ليس FAT16، وليس FAT32، فقط بيانات أولية).إذا كانت هناك طريقة بسيطة لفتح البطاقة بأكملها للوصول الثنائي بايت بايت، فسيكون ذلك أمرًا رائعًا.

شكرًا!

هل كانت مفيدة؟

المحلول

سأذهب مع

HANDLE drive = CreateFile(_T("\\.\PhysicalDrive0"), GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
// error handling
DWORD br = 0;
DISK_GEOMETRY dg;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_GEOMETRY, 0, 0, &dg, sizeof(dg), &br, 0);
//
LARGE_INTEGER pos;
pos.QuadPart = static_cast<LONGLONG>(sectorToRead) * dg.BytesPerSector;
SetFilePointerEx(drive, pos, 0, FILE_BEGIN);
const bool success = ReadFile(drive, sectorData, dg.BytesPerSector, &br) && br == dg.BytesPerSector;
//
CloseHandle(drive);

يرجى ملاحظة أنه من أجل التحقق من أنك قد قرأت قطاعًا بنجاح، يجب عليك التحقق من أن عدد البايتات المقروءة يتوافق مع عدد البايتات التي تريد قراءتها، أي.في تجربتي، يمكن لـ ReadFile() على القرص الفعلي إرجاع TRUE حتى في حالة عدم قراءة أي بايت (أو ربما لدي برنامج تشغيل عربات التي تجرها الدواب).

المشكلة المتبقية هي تحديد رقم محرك الأقراص الخاص بك (0 كما هو مستخدم في المثال الخاص بي يشير إلى C:وهو على الأرجح ليس ما تريده).لا أعرف كيفية القيام بذلك، ولكن إذا كان لديك محرك أقراص واحد متصل فقط وغير مهيأ، فمن المفترض أن يكون ذلك ممكنًا عن طريق استدعاء فتح كل PhysicalDrive بالترتيب واستدعاء DeviceIOControl() مع IOCTL_DISK_GET_DRIVE_LAYOUT_EX كأمر:

DRIVE_LAYOUT_INFORMATION_EX dl;
DeviceIOControl(drive, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, &dl, sizeof(dl), &br, 0);
if(dl.PartitionStyle == PARTITION_STYLE_RAW)
{
  // found correct disk
}

ولكن هذا مجرد تخمين.

نصائح أخرى

مرجع وظيفة CreateFile على MSDN

قم بالتمرير لأسفل إلى "الأقراص ووحدات التخزين الفعلية" - لاحظ أن القيود الأمنية في نظام التشغيل Vista لا تنطبق على وحدات التخزين التي لا تحتوي على نظام ملفات، لذا ستكون بخير حتى على نظام التشغيل Vista بموجب الشروط التي قدمتها.

يجب عليك فتح ملف الجهاز باستخدام إنشاء ملف ثم استخدم إقرا الملف/readFileEx.ولا تنسى إغلاق الملف بـ CloseHandle

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top