Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10653
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3992
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2050
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1797
Дата выхода:19.11.2013, 21:30
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:66 / 49
Вопросов / ответов:1 / 1

Консультация # 187617: Здравствуйте, уважаемые эксперты! Ситуация такая, опираясь на статью http://www.manhunter.ru/software/588_kak_razbit_fleshku_na_neskolko_razdelov.html разбил свою флешку на 2 раздела: активный и скрытый. Есть утилита под Linux, gparted, у которой есть возможность отключать и включать разделы на дисках ставя галочку на против пункта hidden. Эт...


Консультация # 187617:

Здравствуйте, уважаемые эксперты!
Ситуация такая, опираясь на статью http://www.manhunter.ru/software/588_kak_razbit_fleshku_na_neskolko_razdelov.html разбил свою флешку на 2 раздела: активный и скрытый.
Есть утилита под Linux, gparted, у которой есть возможность отключать и включать разделы на дисках ставя галочку на против пункта hidden. Эта утилита позволяет заблокировать раздел на диске и никакая система (штатными средствами) не может получить к ней доступ. Вопрос такой, как это реализовать средствами Visual Studia C++ для Windows? Мне нужно включать и отключать "Скрытый" раздел

Полагаю, что для этого нужно вносить изменения в MBR. Нашел код на Visual C++, который собирает информацию о MBR

Код :
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

#pragma pack(push, 1)
typedef struct PART
{
  BYTE  ActFlag;
  BYTE  Begin_Hd;
  WORD  Begin_SecTrk;
  BYTE  SysCode;
  BYTE  End_Hd;
  WORD  End_SecTrk;
  DWORD RelSec; 
  DWORD Size;
};

typedef struct MBR
{
  BYTE        LoadCode[0x1BE];
  struct PART rt[4];
  WORD        EndFlag;
};
#pragma pack(pop)

int main(void)
{
  HANDLE hDrive = CreateFile(L"\\\\.\\PhysicalDrive1",
	                GENERIC_READ, 
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
					0,
                    OPEN_EXISTING,
					FILE_ATTRIBUTE_NORMAL,
					0);
  if (INVALID_HANDLE_VALUE == hDrive)
    fprintf(stderr, "CreateFile failed 0x%08X\n", GetLastError());
  else
  {
    struct MBR mbr;
    DWORD      NumberOfBytesRead = 0;

    RtlZeroMemory(&mbr, sizeof(mbr));
    if (0 == ReadFile(hDrive, &mbr, sizeof(mbr), &NumberOfBytesRead, 0))
      fprintf(stderr, "ReadFile failed 0x%08X\n", GetLastError());
    else if (sizeof(mbr) != NumberOfBytesRead)
      fprintf(stderr, "sizeof(mbr) = 0x%08X, ReadFile read 0x%08X\n",
        sizeof(mbr), NumberOfBytesRead);
    else
    {
      int j;
  
      for (j = 0; j < 4; j++)
        fprintf(stdout, "Partition %d\n"
                        "  ActFlag      = 0x%02X\n"
                        "  Begin_Hd     = 0x%02X\n"
                        "  Begin_SecTrk = 0x%04X\n"
                        "  SysCode      = 0x%02X\n"
                        "  End_Hd       = 0x%02X\n"
                        "  End_SecTrk   = 0x%04X\n"
                        "  RelSec       = 0x%08X\n"
                        "  Size         = 0x%08X\n\n",
          j,
          mbr.rt[j].ActFlag,
          mbr.rt[j].Begin_Hd,
          mbr.rt[j].Begin_SecTrk,
          mbr.rt[j].SysCode,
          mbr.rt[j].End_Hd,
          mbr.rt[j].End_SecTrk,
          mbr.rt[j].RelSec, 
          mbr.rt[j].Size);
    }

    CloseHandle(hDrive);
  }

  system("pause");
  return 0;
}


Когда я блокирую и разблокировываю раздел на диске, меняется значения SysCode на 6 и на 16.

Дата отправки: 11.11.2013, 21:03
Вопрос задал: Игорь (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует coremaster1 (Профессор):

Здравствуйте, Игорь!

Вы правильно полагаете, для этой задачи нужно модифицировать поле PartitionType (оно же SysCode) соответсвующей записи в таблице разделов MBR (или расширенной таблице в общем случае). Конкретные значения должны быть согласованы с типом файловой системы скрытого раздела, см http://en.wikipedia.org/wiki/Partition_type.
После изменения таблицы разделов нужно уведомить систему. Например, с помощью запроса IOCTL_DISK_UPDATE_PROPERTIES. На первых порах можно использовать кнопку Rescan в панели Disk Management.
При скрытии раздела желательно его заблокировать с помощью FSCTL_LOCK_VOLUME, чтобы убедиться в отсутствии открытых файлов и исключить потерю несохранённых данных пользователя.

Общая схема действий такова:

1) Попытаться заблокировать раздел с помощью FSCTL_LOCK_VOLUME, если не получается, то отменяем все шаги.
Для посылки этого запроса надо открыть том по имени вида "\\.\X:"

2) Модифицикация поля Part itionType в MBR, соответствующего разделу.
Заменять значения так:
- Прочитать первые 512 байт с диска, как в исходном примере
- Убедиться, что байт со смещением 1BEh + x*10h + 4h имеет ожидаемое значение (т.е. 6 или 16h для FAT16)
- Заменить в буфере значение
- Записать получившиеся 512 байт на диск по нулевому смещению
Для работы с диском на блочном уровне целесообразно завести две функци ReadSector и WriteSector.
Перед выполнением операций не забыть установить текущую позицию на нужный сектор с помощью SetFilePointerEx

3) Уведомляем систему с помощью IOCTL_DISK_UPDATE_PROPERTIES

Удачи!

Консультировал: coremaster1 (Профессор)
Дата отправки: 19.11.2013, 11:49
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное