Запись на логический диск WriteFile() == ERROR_ACCESS_DENIED
От: zaza1  
Дата: 01.10.07 16:12
Оценка:
Доброго дня!

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

пишу элементарный код:

HANDLE h=CreateFileW(L"\\\\.\\D:",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,0);
SetFilePointer(h,0x80000000-0x400,0,FILE_BEGIN);
GetLastError();
VOID *a=VirtualAlloc(0,512,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
DWORD dwBytes;
WriteFile(h,a,512,&dwBytes,0);
GetLastError();

CreateFile проходит успешно, SetFilePointer тоже.. а вот WriteFile возвращает ERROR_ACCESS_DENIED. При этом, если установить SetFilePointer ближе к началу диска запись может пройти успешно, хотя по моим наблюдениям тоже не всегда.. если открыть диск в WinHex ситуация аналогичная, что и не удивительно ибо механизм такой же. на форумах msdn нашел топики с аналогичной проблемой
https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=891426&SiteID=1
https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1581337&SiteID=1&pageid=0

Решения однако нет. собственно мои изыскания приводят вот к чему.. удалось выяснить что если убить на диске файловую систему, то проблема решается и все работает отлично — запись проходит. Анализировав работу NtCreateFile сделал вывод что такую ошибку (STATUS_ACCESS_DENIED) судя по всему дает вызов IoCallDriver, т.е. низлежащий драйвер.. разобраться дальше не хватает опыта/мозгов.. под вистой ядро отлаживать очень паршиво — пользую Syser — постоянные бсоды и подвисания отладчика (какие то косяки с выводом на экран помоему..). ощущение такое, что какая то служба или драйвер блокирует запись на диск "напрямую так сказать". зачем — для меня загадка, видимо какая то особенность политики безопасности.. вобщем я в замешательстве, кто что знает подскажите плиз?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.