تفشل قراءة جذر وحدة تخزين NTFS إلا إذا كان حجم المخزن المؤقت مضاعفًا لـ 512

StackOverflow https://stackoverflow.com//questions/23032976

سؤال

أنا ألعب مع MFT، بدءًا من قراءة جذر C:القيادة باستخدام مكالمات P/Invoc.باستخدام الكود أدناه، أحصل على النتائج المتوقعة إذا كان حجم المخزن المؤقت مضاعفًا لـ 512، ولكن بخلاف ذلك تفشل القراءة مع ERROR_INVALID_PARAMETER.هل هذا له علاقة بحجم الكتلة؟يبدو هذا غير مرجح لأن حجم الكتلة لدي يبلغ 4 كيلو بايت.من الواضح أنه يمكنني فقط استخدام مضاعف 512 ولكن يبدو لي أن هذا قد لا يكون محمولاً، وبالطبع أود أن أفهم سبب ذلك.

    public void Test()
    {
        string driveRoot = @"\\.\" + "C:";

        IntPtr hRoot = MFT.CreateFile(
            driveRoot,
            MFT.GENERIC_READ | MFT.GENERIC_WRITE,
            MFT.FILE_SHARE_READ | MFT.FILE_SHARE_WRITE,
            IntPtr.Zero,
            MFT.OPEN_EXISTING,
            MFT.FILE_ATTRIBUTE_NORMAL,
            IntPtr.Zero);

        if (hRoot.ToInt32() == MFT.INVALID_HANDLE_VALUE)
            throw new IOException(string.Format("CreateFile() returned invalid handle [Win32 error {0}]", Marshal.GetLastWin32Error()));

        // TODO why does this fail unless buffer size is a multiple of 512? Is it to do with cluster size?
        UInt32 numBytesToRead = 512;
        byte[] buffer = new byte[numBytesToRead];
        if (ReadFileFromHandleSync(hRoot, buffer, numBytesToRead))
            Debug.WriteLine("OK " + i);
    }


    public bool ReadFileFromHandleSync(IntPtr handle, byte[] buffer, UInt32 numBytesToRead)
    {
        UInt32 numBytesRead;

        NativeOverlapped overlapped = new NativeOverlapped();

        bool readOK = ReadFile(handle, buffer, numBytesToRead, out numBytesRead, ref overlapped);

        return readOK;
    }
}
هل كانت مفيدة؟

المحلول

للوصول المباشر إلى وحدة التخزين، يجب عليك القراءة والكتابة بمضاعفات طول القطاع، والبدء من الإزاحات المحاذية.هذا هو الموقف يجب أن يكون مضاعفًا لطول القطاع.

ستحتاج إلى الاستعلام عن الحجم لمعرفة طول القطاع.يستخدم GetDiskFreeSpace أو IOCTL_DISK_GET_DRIVE_GEOMETRY_EX لهذا.

أرى أنك تطلب حق الوصول للكتابة وتعمل على محرك الأقراص C المحلي لديك.هل أنت متأكد من أن هذا هو الحكمة؟زلة واحدة وقمت بغسل نظامك.ربما تعمل في جهاز افتراضي أو مجلد سيكون من دواعي سرورك أن تفقده.

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