无法从SD卡读取原始扇区,ReadFile()失败,错误87

时间:2018-03-16 10:36:02

标签: winapi readfile sd-card createfile

我必须从没有文件系统的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。

顺便说一下,我以管理员用户身份执行应用程序(我得到了最初的“你想允许以下程序...”弹出窗口。)

有什么想法吗?

0 个答案:

没有答案