问题描述
正如标题所暗示的,我正在做一些低级别的卷访问(尽可能接近 C 代码)来制作磁盘克隆程序,我想将所有空闲集群设置为零以使用简单的压缩和保持小尺寸。
我一直在努力弄清楚为什么我无法使 FSCTL_GET_VOLUME_BITMAP
函数正常工作......所以如果可能,请不要将我链接到任何外部阅读我可能已经去过那里了,要么是C#
,链接无效,要么没有我正在寻找的解释。
我想了解缓冲区本身而不是实际代码。
我可以问的最简单的方法是从 C/C++
中长度为 [1] 的数组中读取数据的正确方法是什么,例如 VOLUME_BITMAP_BUFFER
?
我什至可以为它分配任何东西的唯一方法是使用我自己的巨大缓冲区重新创建它,即使在恢复模式下锁定卷后,我仍然以错误告终。我确实获得了访问原始磁盘所需的所有权限。
我知道我可能遗漏了 C++ 中的一些基础知识,它们可以让我从存储的内存中读取数据,但我无法在不出错的情况下弄清楚。
如果我碰巧循环遍历导致错误的字节,我添加了我是如何做的......尽管这仍然给我留下了 Buffer 问题。
我知道您可以多次调用,但我必须假设一次不是 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 模块(定义明确)。 - 理查德克里顿”
在我广泛尝试以任何其他方式进行这项工作后,我可以期待的答案是正确的,特别是因为我只能使用标准 C 而不是直接使用 C++ 使我自己的数组工作。
我想关闭这个,因为我的电脑有点闲置了。
如果在我深入研究了一些我最终遇到的 C 中的碎片整理示例后问题仍然存在,我会问一个更直接的问题,并提供完整的代码来支持它。
这个答案足以消除我撞到的墙,让我重新思考。我对此表示感谢。