【发布时间】:2021-08-29 17:17:09
【问题描述】:
正如标题所示,我正在做一些低级卷访问(尽可能接近 C 代码)来制作磁盘克隆程序,我想将所有空闲集群设置为零以使用简单的压缩和保持小尺寸。
我一直在拼命想弄清楚为什么我不能让FSCTL_GET_VOLUME_BITMAP 函数正常工作......所以如果可能的话,请不要将我链接到任何外部阅读,因为我'我可能已经去过那里,它要么是 C#、无效链接,要么没有我正在寻找的解释。
比起实际的代码,我更想了解缓冲区本身。
我能问的最简单的方法是从 C/C++ 中长度为 [1] 的数组中读取的正确方法是什么,就像 VOLUME_BITMAP_BUFFER 使用的那样?
我什至可以为其分配任何内容的唯一方法是使用我自己的巨大缓冲区重新创建它,即使在恢复模式下锁定卷后我仍然会出错。我确实获得了访问原始磁盘所需的所有权限。
我知道我可能缺少 C++ 中的一些基础知识,这些基础知识可以让我从存储的内存中读取,但我无法在不出错的情况下弄清楚。
如果我碰巧循环遍历导致我的错误的字节错误,我添加了我是如何做的......尽管这仍然给我留下了缓冲区问题。
我知道你可以调用多次,但我必须假设它一次不是 8 个字节。
类似这样的东西(请原谅我的代码..我在手机上输入了这个,所以它可能有错误)...我尝试添加任何相关的失败原因以防万一,但缓冲区是真正的问题。
#define BYTE_MASK = 0x80;
#define BITS_PER_BYTE = 8;
void function foo() {
const int BUFFER_SIZE = 268435456;
struct {
LARGE_INTEGER StartingLcn;
LARGE_INTEGER BitmapSize;
BYTE Buffer[BUFF_SIZE];
} volBuff;
// I want to use VOLUME_BITMAP_BUFFER
/* Part of a larger loop checking for errors and more data
BYTE Mask = 1;
BOOL b = DeviceIoControl(vol, FSCTL_GET-VOLUME_BITMAP, &lcnStart, sizeof(STARTING_LCN_INPUT_BUFFER), &volBuff, sizeof(volBuff), &dwRet);
*/
for (x = 0; x < (bmpLen / BITS_PER_BYTE;) {
if ((volBuff.Buffer[x] & Mask) != 0) {
NotFree++;
} else {
FreeSpc++;
}
// I did try not dividing the size
if (Mask == BYTE_MASK) {
Mask = 1;
x++;
} else {
Mask = (Mask << 1);
}
}
return;
}
我实际上已经搁置了整个项目,因为我什至不知道在这一点上顽固了多久......而且我找不到任何真正解释缓冲区的答案,忘记其余的过程。
如果有人想更彻底,我不会在我所有尝试之后抱怨,但缓冲区在这一点上让我发疯。
任何帮助将不胜感激。
【问题讨论】:
-
"...长度为 [1]..." 的数组在标准 C++ 中无法访问额外的字节。您可以:(a) 祈祷您的编译器可以做到这一点(通过扩展)或 (b) 编写一个可以从 C++ 调用的
C模块(定义明确)。 -
我知道我要求不提供外部链接,但您是否有一个可以解释我将如何实施这样一个模块的?我从没想过 API 会使用无法通过内存以某种形式访问的东西。您是说我编写自己的缓冲区的方式实际上是唯一的方法之一吗?或者我的缓冲区是否仍会返回错误信息,这似乎是这种情况?
-
更新:我突然想到,在 Windows 运行时我可能无法完全锁定磁盘(在 WinRE 中它甚至无法判断有磁盘),或者可能通过自己覆盖信息,而不是使用 MOVE_FILE 设备控件,在我写的时候信息正在被转移,导致错误。从技术上讲,我在 Visual C++ 中的 .C 文件中执行此操作,使用几乎所有 C 函数并自己定义所有内容(如果有影响的话)。也许我是如何能够使用我自己的数组来代替的。
标签: c++ arrays visual-c++ buffer deviceiocontrol