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

Winapi 无法从SD卡读取原始扇区,ReadFile()失败,出现错误87,winapi,readfile,sd-card,createfile,Winapi,Readfile,Sd Card,Createfile,我必须从没有文件系统的SD卡读取原始数据。该数据由嵌入式系统创建 我的代码过去可以工作,但在某个时候它停止了工作,现在ReadFile()失败了(ERROR\u INVALID\u PARAMETER),这一点都没有帮助,因为我传递的参数看起来非常正确。我怀疑是Windows更新造成的,但我不确定 以下是我如何打开卡片: HANDLE memCard = CreateFile("\\\\.\\G:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE

我必须从没有文件系统的SD卡读取原始数据。该数据由嵌入式系统创建

我的代码过去可以工作,但在某个时候它停止了工作,现在ReadFile()失败了(ERROR\u INVALID\u 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:。句柄不是无效的\u句柄\u值,因此调用看起来很正常

但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

我已经阅读了文档中的“物理磁盘和卷”部分,但没有帮助,在我看来,我正在做我想做的事情

另外,我非常确定扇区大小是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");
bool ok=false;
无符号长nbRead;
无符号字符扇区[8192];

对于(int i=1;i您是否尝试过以独占模式打开驱动器,即将共享模式设置为0?仅在文件
fou NO\u INTERMEDIATE\u BUFFERING
的情况下检查读取缓冲区大小-如果您使用
文件标志\u NO\u BUFFERING
打开驱动器。在这种情况下,还检查了缓冲区(
代码中的扇区
)对齐(如果设备对象有特殊的
AlignmentRequirement
-您可以通过)或(支持所有win版本)进行检查。但这仅在
文件\u标志\u否\u缓冲的情况下才是io管理器的常规检查。当然,具体设备可以进行更多检查,并根据自身原因返回无效参数。这里的问题(不简单)-io管理器出错(看起来不能)或设备我首先确定-是来自io管理器或设备的错误。为此,可以使用事件。在信号状态下创建手动重置,并将其以重叠方式传递到
ReadFile
。失败后检查事件状态。如果它处于信号状态-来自io管理器的错误。如果处于非信号状态-来自设备使用
VirtualAlloc
到alloc I/O buffer.
void*buffer=VirtualAlloc(0,乘以扇区大小、MEM\u提交、页面读写)