Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.97] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток. Столкнулся с проблемой, по которой уже неделю ищу информацию. Найти ничего толкового так и не удалось, поэтому пробую написать сюда, может быть здесь кто-то с подобным сталкивался.
Суть проблемы состоит в том, что существует необходимость записи некоторого буфера данных на жесткий диск напрямую, использую функции WINAPI. Открываю том следующим образом. HANDLE hDev = INVALID_HANDLE_VALUE; hDev = CreateFile(L"\\\\.\\\D:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDev == INVALID_HANDLE_VALUE) { CloseHandle(hDev); free(Path); free(R); return ERROR_INVALID_HANDLE; } Далее считываю с тома информацию о количестве байт на сектор и количестве секторов в кластере. Перемножив значение получаю размер кластера = 4096 Далее с помощью функции получаю список кластеров конкретного файла на диске D: И пытаюсь в эти кластеры записать необходимую информацию из переменной Buffer: for (ULONG i = 0; i < ClustersCount; i++) if (Clusters[i]) { Offset.QuadPart = ClusterSize * Clusters[i]; SetFilePointer(hDev, Offset.LowPart, &Offset.HighPart, FILE_BEGIN); WriteFile(hDev, Buffer, ClusterSize, &Bytes, (LPOVERLAPPED)NULL); if(Bytes != ClusterSize) { CloseHandle(hDev); return ERROR_ACCESS_DENIED; } } В результате попытки записи возникает ошибка с кодом 5. Отказано в доступе. Чтение производилось при помощи ReadFile(...); и считалось все удачно. Поискав информацию наткнулся на то, что перед записью в кластер нужно демонтировать том при помощи DeviceIoControl(); с управляющим кодом FSCTL_DISMOUNT_VOLUME. Но из этого выходить лишь только зависание самой студии и её принудительный перезапуск. |
Сообщ.
#2
,
|
|
|
Могу конечно ошибаться, в пользовательском режиме тебе система не даст напрямую перезаписать системную область, надо это делать в режиме ядра, т.е. в режиме драйвера (своего), к которому ты обращаешься из пользовательского режима.
|
Сообщ.
#3
,
|
|
|
Цитата ter_nk_ @ Могу конечно ошибаться, в пользовательском режиме тебе система не даст напрямую перезаписать системную область, надо это делать в режиме ядра, т.е. в режиме драйвера (своего), к которому ты обращаешься из пользовательского режима. Да, возможно это и так, однако, я находил в интернете примеры, где WriteFile в сектор на диске корректно работал. Тем более, что у меня получается перезаписать 1 кластер, а во время записи во второй происходит сбой в студии и она перезапускается. |
Сообщ.
#4
,
|
|
|
Я думаю если диск будет другой, подключенный, проблем не будет. DebugView не пробовал запустить от админа со всеми логами, может что путное скажет?
|
Сообщ.
#5
,
|
|
|
Цитата ter_nk_ @ Я думаю если диск будет другой, подключенный, проблем не будет. DebugView не пробовал запустить от админа со всеми логами, может что путное скажет? Нет не пробовал. Даже не знаю, что это такое, сейчас почитаю и, может, правда найду там что-то интересное. Спасибо |
Сообщ.
#6
,
|
|
|
ос какая?
Добавлено запускаешь с админскими правами? |
Сообщ.
#7
,
|
|
|
Цитата shm @ запускаешь с админскими правами? Админские права тут не помогут. |
Сообщ.
#8
,
|
|
|
Вряд ли это правильно:
if (hDev == INVALID_HANDLE_VALUE) { CloseHandle(hDev); ... Если так сделать в Линуксе, приложение, скорее всего, рухнет. Виндус такое вытерпит, но всё равно не надо так. |
Сообщ.
#9
,
|
|
|
Цитата ter_nk_ @ Админские права тут не помогут. Может и не помогут, но без прав не заработает 100%, по крайней мере начиная с Висты. |
Сообщ.
#10
,
|
|
|
Читаем условия
https://msdn.microsoft.com/en-us/library/wi...8(v=vs.85).aspx А здесь продолжения условий. https://support.microsoft.com/en-us/help/94...restrict-direct помимо прочего есть ещё API для дефрагментации диска. Цитата linuxoid @ Поискав информацию наткнулся на то, что перед записью в кластер нужно демонтировать том при помощи DeviceIoControl(); с управляющим кодом FSCTL_DISMOUNT_VOLUME. Но из этого выходить лишь только зависание самой студии и её принудительный перезапуск. Венчал надо закрыть все программы которые работают с диском D. А во вторых после размонтирования хэндел уже будет не действительным, поэтому писать через него вы не сможете. После этого Вы должны будете для записи открывать не том, а целиком жёсткий диск. Так как студиа скорее всего параллельно мониторит, то куда вы пишете, то после размонтирования она тоже зависнет так что такой трюк надо проделывать без отладчика. А так как перемонтировать тома может любая программа. То лучше сменить тип файловой системы на RAW. И только после внесения изменений вернуть обратно нужную файловую систему. А так как во время записи вашу программу могут грохнуть то это не хорошо. Так что лучше вначале попробовать залочить том и если это не удасться то пробовать с RAW. |
Сообщ.
#11
,
|
|
|
Цитата shm @ ос какая? Win8. Запускаю с правами администратора Добавлено Цитата ЫукпШ @ Вряд ли это правильно: if (hDev == INVALID_HANDLE_VALUE) { CloseHandle(hDev); ... Если так сделать в Линуксе, приложение, скорее всего, рухнет. Виндус такое вытерпит, но всё равно не надо так. Да, спасибо что заметили. Понял свою ошибку. Добавлено Цитата Pavia @ Читаем условия https://msdn.microsoft.com/en-us/library/wi...8(v=vs.85).aspx А здесь продолжения условий. https://support.microsoft.com/en-us/help/94...restrict-direct помимо прочего есть ещё API для дефрагментации диска. Цитата linuxoid @ Поискав информацию наткнулся на то, что перед записью в кластер нужно демонтировать том при помощи DeviceIoControl(); с управляющим кодом FSCTL_DISMOUNT_VOLUME. Но из этого выходить лишь только зависание самой студии и её принудительный перезапуск. Венчал надо закрыть все программы которые работают с диском D. А во вторых после размонтирования хэндел уже будет не действительным, поэтому писать через него вы не сможете. После этого Вы должны будете для записи открывать не том, а целиком жёсткий диск. Так как студиа скорее всего параллельно мониторит, то куда вы пишете, то после размонтирования она тоже зависнет так что такой трюк надо проделывать без отладчика. А так как перемонтировать тома может любая программа. То лучше сменить тип файловой системы на RAW. И только после внесения изменений вернуть обратно нужную файловую систему. А так как во время записи вашу программу могут грохнуть то это не хорошо. Так что лучше вначале попробовать залочить том и если это не удасться то пробовать с RAW. Спасибо за подсказки. Я не думал, что чтение будет простым, а запись такой сложной. |
Сообщ.
#12
,
|
|
|
Может быть кто-нибудь подскажет как можно записать информацию в кластеры другим способом или функцией?
|
Сообщ.
#13
,
|
|
|
Создать загрузочный диск, только вряд ли подойдет.
|
Сообщ.
#14
,
|
|
|
Всем спасибо за помощь. Тема закрыта.
|