Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Запись и чтение Сектора диска С++

#cpp #windows #диск


Хочу записывать и читать информацию прямиком из сектора диска а не из файла. На С++.
Приложите пример по максимуму простой. Или ссылку дайте. Посекторное чтение и запись
я полагаю даст мне возможность делать полные посекторные копии нескольких ОС и разделов
сразу. Также делать защиту программ от взлома.

вот финальный код ширения основан на ответе.Чтение первого сектора первого диска.


#include 
#include 
#include 
using namespace std;

int win_error()
{
    cout<<"error"<


Ответы

Ответ 1



В принципе, если не хотеть странного вроде небуферизованного ввода/вывода, то там все так же, как и для файлов. Диски открываются все той же функцией CreateFile, но для dwShareMode надо обязательно указывать (FILE_SHARE_READ | FILE_SHARE_WRITE), а в dwCreationDisposition должно (естественно) стоять OPEN_EXISTING. В качестве имени должно стоять, например, для физического диска "\\.\PhysicalDrive0", а для логического - "\\.\C:". А дальше все так же, как и для файла - читаем ReadFile, пишем WriteFile, закрываем CloseHandle. В описании CreateFile все это подробно расписано, и если вы действительно будете это делать, читать MSDN вам скорее всего все равно придется. Имейте только ввиду, что начиная с Висты доступ к диску требует поднятия привилегий (elevation). То есть программу нужно 1) запустить с учетки администратора, 2) в манифесте должно стоять требования административных привилегий, и 3) при каждом запуске юзер должен подтверждать, что да, он действительно хочет запустить эту опасную программу (которая у вас, вероятно, даже не подписана сертификатом). Без этого CreateFile будет просто возвращать ошибку ERROR_ACCESS_DENIED. UPD: С утра набросал крохотную демонстрашку, она читает самый первый сектор диска С: (писать туда не стал, но тоже можно:). Исключение win_error только замените на какую-нибудь свою обработку. HANDLE hDisk = ::CreateFile(L"\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error(); BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk); Как уже было сказано, запускать надо командой "Run as Administrator" иначе CreateFile вернет ошибку.

Комментариев нет:

Отправить комментарий