如何访问隐藏 partitions/volumes
How to access hidden partitions/volumes
我必须使用 C# 或 C++ 编写代码来访问隐藏磁盘 partitions/volumes。
但是找不到任何关于此事的帮助参考。
作为隐藏卷,它不包含 "Disk Letter",因此您不能只键入 "C:\" 并访问它。
一个例子是 Windows 附带的 "recovery partition"。你在资源管理器上看不到它,但它就在那里。
我的应用程序将从这些分区写入和读取数据,我必须找到一种方法来为这些分区执行类似 "c:\" 的操作。
在上图中,卷5和卷6是隐藏分区。
我在 Whosebug 上发现了这个 link 但它只 "list" de 分区:
https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx
编辑
问题是:即使按照建议使用 WMI,我也找不到在查找文件时如何过滤卷。
例如,select * from win32_DataFile
将列出机器中的所有文件。
我认为应该是一种使用卷的 ID(或名称)过滤卷的方法。
类似于:
select * from win32_DataFile
where volumeId = '\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'
或者像这样更漂亮的方式:
var files = Directory.GetFiles(@"\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
此外,我在关于分区和卷(它们不是一回事)中找到了一个优秀的 awenser
https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen
EDIT2
正如 Harry 所说,使用“\.\Volume....”是恢复文件的好方法。但是我找不到使用 C# 编写(创建)新文件的方法。
迄今为止最好的方法是使用 pinvoke 到 c++ CreateFile method/handle.
有什么建议吗?
FindFirstVolume() API returns 系统上每个卷的根路径。
例如,此代码打印第一个卷的路径,以及该卷根目录中第一个文件的名称:
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 returns 这样的路径:\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\
如果您在 C++ 中使用 Win32 API(CreateFile 等),您可以直接使用该路径,但由于 .NET 中的错误或限制,它不适用于文件管理类 例如 Directory.GetFiles()。 (当然,您可以 P/Invoke 到 Win32 API,但这很尴尬。)
相反,您可以通过将出现在路径开头的问号替换为点来解决此问题:
var files = Directory.GetFiles(@"\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
如果您的程序是 Windows 特定的,您可以使用 WMI。我经常使用 WMI,进行任何类型的操作或获取有关 Windows 系统的数据都非常方便。
首先你可以下载wmiexplorer查看可用数据类。与您相关的命名空间将是 root\cimv
。在那里你可以找到各种有趣的类给你:
- Win32_LogicalDisk: 包含所有磁盘,也包括隐藏的磁盘。
- CIM_Directory:包含所有目录(据我所知还来自隐藏磁盘)
- CIM_DataFile:包含所有文件(我也认为这个也包含来自隐藏磁盘的文件)
- 还有更多 类 您可以使用,例如检索文件权限...微软对此有很好的 documentation
接下来,您可以将所需的 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();
}
我必须使用 C# 或 C++ 编写代码来访问隐藏磁盘 partitions/volumes。 但是找不到任何关于此事的帮助参考。
作为隐藏卷,它不包含 "Disk Letter",因此您不能只键入 "C:\" 并访问它。 一个例子是 Windows 附带的 "recovery partition"。你在资源管理器上看不到它,但它就在那里。
我的应用程序将从这些分区写入和读取数据,我必须找到一种方法来为这些分区执行类似 "c:\" 的操作。
在上图中,卷5和卷6是隐藏分区。 我在 Whosebug 上发现了这个 link 但它只 "list" de 分区: https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx
编辑
问题是:即使按照建议使用 WMI,我也找不到在查找文件时如何过滤卷。
例如,select * from win32_DataFile
将列出机器中的所有文件。
我认为应该是一种使用卷的 ID(或名称)过滤卷的方法。 类似于:
select * from win32_DataFile
where volumeId = '\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'
或者像这样更漂亮的方式:
var files = Directory.GetFiles(@"\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
此外,我在关于分区和卷(它们不是一回事)中找到了一个优秀的 awenser https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen
EDIT2
正如 Harry 所说,使用“\.\Volume....”是恢复文件的好方法。但是我找不到使用 C# 编写(创建)新文件的方法。 迄今为止最好的方法是使用 pinvoke 到 c++ CreateFile method/handle.
有什么建议吗?
FindFirstVolume() API returns 系统上每个卷的根路径。
例如,此代码打印第一个卷的路径,以及该卷根目录中第一个文件的名称:
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 returns 这样的路径:\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\
如果您在 C++ 中使用 Win32 API(CreateFile 等),您可以直接使用该路径,但由于 .NET 中的错误或限制,它不适用于文件管理类 例如 Directory.GetFiles()。 (当然,您可以 P/Invoke 到 Win32 API,但这很尴尬。)
相反,您可以通过将出现在路径开头的问号替换为点来解决此问题:
var files = Directory.GetFiles(@"\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
如果您的程序是 Windows 特定的,您可以使用 WMI。我经常使用 WMI,进行任何类型的操作或获取有关 Windows 系统的数据都非常方便。
首先你可以下载wmiexplorer查看可用数据类。与您相关的命名空间将是 root\cimv
。在那里你可以找到各种有趣的类给你:
- Win32_LogicalDisk: 包含所有磁盘,也包括隐藏的磁盘。
- CIM_Directory:包含所有目录(据我所知还来自隐藏磁盘)
- CIM_DataFile:包含所有文件(我也认为这个也包含来自隐藏磁盘的文件)
- 还有更多 类 您可以使用,例如检索文件权限...微软对此有很好的 documentation
接下来,您可以将所需的 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();
}