Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему в моей программе результат записи в сектор зависит от номера сектора?

5.1K
14 ноября 2011 года
tumanovalex
39 / / 21.11.2005
Windows 7, VS 2008 Pro, отформатированная в FAT32 флэшка 4 ГГб . Параметры флэш, полученные с помощью GetDiskFreeSpace:
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). Подскажите, пожалуйста, в чем может быть дело.
77K
24 ноября 2011 года
salaoshi
2 / / 08.11.2011
Может сектор в FAT помечен как BAD?
5.1K
25 ноября 2011 года
tumanovalex
39 / / 21.11.2005
Да нет, посмотрел сектор в редакторе, все нормально.
14
25 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Оформи код. Писать в сектор нужно из под рута и из начала страницы памяти, а не там где выделит malloc.
5.1K
26 ноября 2011 года
tumanovalex
39 / / 21.11.2005
Я вхожу администратором (видимо, то же, что и root в Linux). А что значит: "Писать в сектор нужно из под рута и из начала страницы памяти"?
7
26 ноября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Про рута верно понял,а запись в сектор должна вестись с адреса,выровненного по размеру страницы(так надо)
5.1K
26 ноября 2011 года
tumanovalex
39 / / 21.11.2005
А как в моем случае запись в сектор вести с адреса, выровненного по размеру страницы? Подскажите, пожалуйста, как это сделать, раньше с этим не встречался.
41K
27 ноября 2011 года
kisssko
108 / / 28.10.2010
Цитата: 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;


А вот если выравнивать по размеру страницы - то для x86 это 4096 байт, вроде.
7
27 ноября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Зачём такой изврат?:) Используй VirtualAlloc же
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог