我必须从没有文件系统的SD卡读取原始数据。此数据由嵌入式系统创建。
我的代码曾经工作过,但是在某些时候它停止了工作,现在ReadFile()失败了,error 87(ERROR_INVALID_PARAMETER)完全没用,因为我传递的参数看起来非常正确。我怀疑Windows更新导致了这种情况,但我不确定。
以下是我打开卡片的方式:
HANDLE memCard = CreateFile("\\\\.\\G:", GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(memCard == INVALID_HANDLE_VALUE)
Logger::Error("Cannot open drive G:");
在我的系统上,SD卡是G:。 HANDLE不是INVALID_HANDLE_VALUE,因此调用看起来很好。
但ReadFile()失败,错误87:
unsigned long nbRead;
unsigned char sector[512];
if(!ReadFile(memCard, sector, 512, &nbRead, NULL) || nbRead != 512)
Logger::Error("Error %u", GetLastError());
我已经使用调试器检查过:ReadFile()返回0,nbRead也是0。
我已经阅读了CreateFile()文档中的“物理磁盘和卷”部分,但它没有帮助,在我看来,我正在做的是预期的。
另外我很确定扇区大小是512字节,因为当我插入卡时我的Linux盒子报告的内容。我甚至尝试了以下无效:
bool ok = false;
unsigned long nbRead;
unsigned char sector[8192];
for(int i=1; i<=8192; ++i)
{
if(ReadFile(memCard, sector, i, &nbRead, NULL) && nbRead == i)
{
ok = true;
Logger::Error("%u worked", i);
}
}
if(!ok)
Logger::Error("None worked");
你猜对了,没有人奏效。所以现在我几乎陷入困境,我也尝试了各种CreateFile()标志,例如FILE_FLAG_NO_BUFFERING。
顺便说一下,我以管理员用户身份执行应用程序(我得到了最初的“你想允许以下程序...”弹出窗口。)
有什么想法吗?