问题描述
我正在尝试使用 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()
}
同样,这只是我发现对我有用的一种解决方法,但我还不知道确切的原因是什么。如果有人知道根本原因并愿意分享,那就太好了。