Winapi 无法从SD卡读取原始扇区,ReadFile()失败,出现错误87
我必须从没有文件系统的SD卡读取原始数据。该数据由嵌入式系统创建 我的代码过去可以工作,但在某个时候它停止了工作,现在ReadFile()失败了(ERROR\u INVALID\u PARAMETER),这一点都没有帮助,因为我传递的参数看起来非常正确。我怀疑是Windows更新造成的,但我不确定 以下是我如何打开卡片: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
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提交、页面读写)