Как получить доступ к скрытым разделам / томам

Я должен написать код для доступа к скрытым разделам диска / томам, используя c # или c ++.
Но не смог найти справочную справку по этому вопросу.

Как скрытый том, он не содержит буквы диска, поэтому вы не можете просто набрать «C: \» и получить к нему доступ.
Примером может служить «раздел восстановления», который поставляется с Windows. Вы не можете увидеть его на проводнике, но он есть.

Мое приложение будет записывать и считывать данные из разделов thoose, и мне нужно найти способ сделать что-то вроде «c: \» для thoose.

Тома 5,6 - это скрытые перегородки

На изображении выше тома 5 и 6 являются скрытыми разделами.
Я нашел эту ссылку на stackoverflow, но это только «список» разделов:
https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx

РЕДАКТИРОВАТЬ

Проблема в том, что даже при использовании WMI, как предполагалось, я не мог найти, как отфильтровать том при поиске файлов.
Пример, select * from win32_DataFile перечислит все файлы в машине.

Я думаю, что должен быть способ фильтрации томов по их идентификатору (или имени).
Что-то вроде:

select * from win32_DataFile
where volumeId = '\\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'

Или более красивый способ, как:

var files = Directory.GetFiles(@"\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");

Кроме того, я нашел отличную новость о разделах и томах (это не одно и то же)
https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen

EDIT2

По словам Гарри, использование «\. \ Volume ….» было хорошим способом восстановления файлов. Но я не смог найти способ написать (создать) новый файл, используя c #.
Наилучшим подходом на данный момент является использование pinvoke для метода / дескриптора c ++ CreateFile.


Любой совет?

1

Решение

API FindFirstVolume () возвращает путь к корню каждого тома в системе.

Например, этот код печатает путь к первому тому и имя первого файла в корневом каталоге этого тома:

    HANDLE h1, h2;
wchar_t volpath[4096];
WIN32_FIND_DATA find_data;

h1 = FindFirstVolume(volpath, _countof(volpath));

printf("%ws\n", volpath);

wcscat_s(volpath, _countof(volpath), L"*.*");

h2 = FindFirstFile(volpath, &find_data);

printf("%ws\n", find_data.cFileName);

(В рабочем коде вам нужно добавить проверку ошибок и т. Д.)

добавление

FindFirstVolume возвращает путь следующим образом: \\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\

Если вы используете Win32 API (CreateFile и т. Д.) В C ++, вы можете использовать этот путь напрямую, но из-за ошибки или ограничения в .NET он не работает с классами управления файлами, такими как Directory.GetFiles (). (Конечно, вы можете использовать P / Invoke для Win32 API, но это неудобно.)

Вместо этого вы можете обойти проблему, заменив знак вопроса, который появляется в начале пути, точкой:

var files = Directory.GetFiles(@"\\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
1

Другие решения

Если ваша программа предназначена для Windows, вы можете работать с WMI. Я много работал с WMI, и это очень удобно — делать какие-либо манипуляции или получать данные о системах Windows.

Прежде всего вы можете скачать wmiexplorer, чтобы увидеть доступные данные и классы. соответствующее пространство имен для вас будет root\cimv, Там вы можете найти различные интересные занятия для вас:

  • Win32_LogicalDisk: Содержит все диски, в том числе скрытые.
  • CIM_Directory: Содержит все каталоги (насколько я знаю также от скрытых дисков)
  • CIM_DataFile: Содержит все файлы (я также думаю, что этот содержит также файлы со скрытых дисков)
  • Есть много других классов, которые вы можете использовать, например. получить права доступа к файлам … У Microsoft довольно неплохо документация об этом

Затем вы можете реализовать желаемые запросы WMI в вашей программе на C # (или VB.NET). Например, этот напечатает все диски:

WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery);

foreach (ManagementObject disk in searcher.Get())
{
Console.WriteLine(disk.ToString());
}

Как вы можете видеть, WMI поддерживает такие запросы, как SQL (хотя он не такой мощный …)

WMI также поддерживает методы для большинства классов ist. Например, вы можете проверить каждый диск на наличие ошибок:

foreach (ManagementObject disk in searcher.Get())
{
if(shouldCheckThisDisk)
disk.Chkdsk();
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector