Страницы

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

пятница, 15 февраля 2019 г.

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

Хочу записывать и читать информацию прямиком из сектора диска а не из файла. На С++. Приложите пример по максимуму простой. Или ссылку дайте. Посекторное чтение и запись я полагаю даст мне возможность делать полные посекторные копии нескольких ОС и разделов сразу. Также делать защиту программ от взлома.
вот финальный код ширения основан на ответе.Чтение первого сектора первого диска.
#include #include #include using namespace std;
int win_error() { cout<<"error"<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<'; cout<Визуалку надо от имени админа запускать, проект создавать не консольный а пустой enemy. Буду благодарен если кто то ещё покажет как позицию чтение установить. и записывать в заданную позицию, можно в 32 сектор писать для примера, там никогда ничего важного нет. Благодарен всем участникам.


Ответ

В принципе, если не хотеть странного вроде небуферизованного ввода/вывода, то там все так же, как и для файлов. Диски открываются все той же функцией 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 вернет ошибку.

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

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