Почему в моей программе результат записи в сектор зависит от номера сектора?
8 SectorPerCluster
512 BytesPerSector
1010943 FreeClustersForUser
1010944 ClustersForUser
8087544 FreeSectorForUser
8087552 SectorForUser
4140826624 BytesForUser
Фрагмент программы:
LONGLONG nSectorForWork = 500;
LARGE_INTEGER offset, res;
offset.QuadPart = nSectorForWork * (LONGLONG)nBytesPerSector;
if(SetFilePointerEx(pdev, offset, &res, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
free(dev);
CloseHandle(pdev);
printf("\n--- Ошибка %i при позиционировании данных ---\n", GetLastError());
_getch();
exit(1);
}
printf("\nЗапись информации - сектор %Li диска %s\n", nSectorForWork, sDisk);
char *buf = (char*)malloc(nBytesPerSector);
buf[0] = 0;
strcat(buf, "Test disk 4");
DWORD nBytes;
if(WriteFile(pdev, buf, nBytesPerSector, &nBytes, NULL)==0)
{
free(dev);
CloseHandle(pdev);
printf("\n--- Ошибка %i при записи данных ---\n", GetLastError());
_getch();
exit(1);
}
Попробовал значения nSectorForWork 500 и 1000. При 500 данные в сектор записываются (проверял редактором), а при 1000 - получаю ошибку GetLastError дает ошибку 5
(ERROR_ACCESS_DENIED). Подскажите, пожалуйста, в чем может быть дело.
Может сектор в FAT помечен как BAD?
Да нет, посмотрел сектор в редакторе, все нормально.
Оформи код. Писать в сектор нужно из под рута и из начала страницы памяти, а не там где выделит malloc.
Я вхожу администратором (видимо, то же, что и root в Linux). А что значит: "Писать в сектор нужно из под рута и из начала страницы памяти"?
Про рута верно понял,а запись в сектор должна вестись с адреса,выровненного по размеру страницы(так надо)
А как в моем случае запись в сектор вести с адреса, выровненного по размеру страницы? Подскажите, пожалуйста, как это сделать, раньше с этим не встречался.
Цитата: tumanovalex
А как в моем случае запись в сектор вести с адреса, выровненного по размеру страницы? Подскажите, пожалуйста, как это сделать, раньше с этим не встречался.
Ну как... Выделить память с запасом. Например, если надо выровнять на 8 байт, соответственно, и памяти выделить на 8 байт -1 больше.
Дальше отступить от начала выделенного блока настолько, чтобы адрес был выровнен (по модулю 8 был 0). Выравнивать в сторону увеличения.
Далее с этим указателем работать. Старый не терять. Считается как то так:
Код:
#define MEMALIGN 8
#define BUFSIZE 512
void *aligned_addr;
void *real_addr;
real_addr=(void*)malloc(BUFSIZE+MEMALIGN-1);
// Вот здесь, собственно, вычисляется.
aligned_addr=(real_addr%MEMALIGN)?(real_addr&(!(MEMALIGN-1)))+MEMALIGN:real_addr;
#define BUFSIZE 512
void *aligned_addr;
void *real_addr;
real_addr=(void*)malloc(BUFSIZE+MEMALIGN-1);
// Вот здесь, собственно, вычисляется.
aligned_addr=(real_addr%MEMALIGN)?(real_addr&(!(MEMALIGN-1)))+MEMALIGN:real_addr;
А вот если выравнивать по размеру страницы - то для x86 это 4096 байт, вроде.
Зачём такой изврат?:) Используй VirtualAlloc же