Deulis Ответов: 1

Windows filewrite терпит неудачу для сектора Тома больше чем 0x1fff


Почему я не могу написать сектор в позиции больше 0x1FFF? Я пытаюсь записать сектор на SD-карту. Следующий код отлично работает для секторов с номером меньше 0x2000, но терпит неудачу для любого сектора больше 0x1FFFF, возвращающего код ошибки № 5. Я не знаю, почему?

Что я уже пробовал:

#include <windows.h>
#include <stdio.h>

int main()
{
    LPCWSTR device_name = L"\\\\.\\PHYSICALDRIVE2";


    int sector = 0x2000;

    //Open the volume
    HANDLE hDisk = CreateFile(device_name, (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hDisk != INVALID_HANDLE_VALUE) 
    {
        DWORD ol = 0;
        //Lock the volume
        if (DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &ol, NULL))
        {
            ol = 0;
            //Dismount the volume
            if (DeviceIoControl(hDisk, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &ol, NULL))
            {
                unsigned char buff[512];

                //Set position at desire sector
                int position = sector * 512;
                DWORD readBytes = 0;
                long moveToHigh = 0;
                SetFilePointer(hDisk, position, &moveToHigh, FILE_BEGIN);

                //Read the sector
                if (ReadFile(hDisk, buff, 512, &readBytes, NULL) && readBytes == 512)
                {
                    //Set the write position
                    DWORD writenBytes = 0;
                    moveToHigh = 0;
                    SetFilePointer(hDisk, position, &moveToHigh, FILE_BEGIN);

                    if (WriteFile(hDisk, buff, 512, &writenBytes, NULL) && writenBytes == 512)
                    {
                        printf("OK for Sector %d \r\n", sector);
                    }
                    else
                    {
                        DWORD dwError = GetLastError();
                        printf("Error Code: %d \r\n", dwError);
                    }
                }
            }
        }

        CloseHandle(hDisk);
    }   
}

Richard MacCutchan

Вы должны проверить возвращаемое значение от вызова до SetFilePointer посмотреть, удастся ли это.

1 Ответов

Рейтинг:
1

Daniel Pfeffer

Проверьте расположение разделов с помощью DISKPART. Windows обычно не позволяет вам получить доступ к разделу с помощью физического диска, потому что чтение его обойдет защиту файлов, а запись может повредить раздел.
Вы можете обойти это, если ваша программа запускается с повышенными привилегиями.