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

217
31 августа 2018, 19:40

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

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

#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int win_error()
{
    cout<<"error"<<endl;
    return 0;
}
int main()
{

 HANDLE hDisk = ::CreateFile("\\\\.\\PhysicalDrive0", 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);

    ofstream out("1.txt");
    for(int i = 0; i<512;i++)
    {
        char f[3];  itoa(buf[i],f,16);
        out<<i<<"\t"<<f<<"\t"<<buf[i]<<'\n';
        cout<<buf[i];
    }
    out.close();
    system("1.txt");
    //cin.get();
}

Визуалку надо от имени админа запускать, проект создавать не консольный а пустой enemy. Буду благодарен если кто то ещё покажет как позицию чтение установить. и записывать в заданную позицию, можно в 32 сектор писать для примера, там никогда ничего важного нет. Благодарен всем участникам.

Answer 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 вернет ошибку.

READ ALSO
Компилятор не видит реализацию функций C++

Компилятор не видит реализацию функций C++

Пытался собрать проект из основного maincpp, а также заголовочного funcs

160
Qt/Sqlite вствка в БД

Qt/Sqlite вствка в БД

У меня такая проблемаПытаюсь по нажатию кнопки выполнять SQL запрос по добавлению данных в БД, но ничего не выходит, а выводится ошибка:

157
Что представляет из себя функция в c++

Что представляет из себя функция в c++

Я недавно ночью писал код и допустил ошибкуМне нужно было записать в виртуальную память процесса указатель на нужную функцию

177
Найти и описать ошибку в коде с++ [закрыт]

Найти и описать ошибку в коде с++ [закрыт]

у меня есть код на с++, нужно найти в чем заключается ошибка, описать ее, и по возможности исправить:)

155