WriteFile 到 SD 卡物理硬盘失败并显示 ERROR_ACCESS_DENIED (0x5)

问题描述

我正在尝试使用 Windows API 直接写入物理硬盘(SD 卡/fat32):WriteFile() 但它总是失败并显示 ERROR_ACCESS_DENIED (0x5)。我尝试了其他一些帖子建议的许多选项,例如 unmount/lock,但似乎没有任何效果

有没有人更清楚造成这种情况的根本原因是什么?我们如何直接从 Windows API 访问物理驱动器?

这是我正在使用的示例代码

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <windows.h>

DWORD lastError;

int main (void) {
  uint16_t x,y;
  uint8_t  buffer[512];
  DWORD    bytesWritten,status;

  HANDLE sdCardHandle = CreateFile("\\\\.\\PhysicalDrive2",GENERIC_READ    | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_norMAL,NULL);

  if(sdCardHandle == INVALID_HANDLE_VALUE) {
    CloseHandle(sdCardHandle);
    return -1;
  }
  
  for (y = 1; y < 10001; y++) { 
    memset(buffer,y,sizeof(buffer));
    if (WriteFile(sdCardHandle,buffer,sizeof(buffer),&bytesWritten,NULL) == 0) {
      lastError = GetLastError();
      printf("WriteFile error: 0x%X\n",lastError);
      CloseHandle(sdCardHandle);
      return -2;
    }
    printf("%d\n",y);
  }

  CloseHandle(sdCardHandle);
  return 0;
}

谢谢!

解决方法

感谢大家的评论。

所以我想出了一种方法来解决这个问题(在 Windows 10 中)。 解决方法锁定、卸载和创建磁盘作为 GPT 以使 Windows 认为它​​是未分配的磁盘。无论出于何种原因,如果它被格式化为 FAT/FAT32,我就无法将文件写入卡。

以下是对我有用的示例代码:

    const signUpApi = (data) =>{
    fetch(GlobalConstants.apiUrl+'v1/users',{ 
        method: 'POST',headers: new Headers({
            'Content-Type': 'application/json',}),body :JSON.stringify(data),})
        .then((res) => res.json())               << this was missing
        .then((res) => apiResponseCheck(res))
        .catch((e) => console.log(e))
       .done()
}

同样,这只是我发现对我有用的一种解决方法,但我还不知道确切的原因是什么。如果有人知道根本原因并愿意分享,那就太好了。