【发布时间】:2023-03-15 15:08:01
【问题描述】:
我正在尝试使用 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;
}
谢谢!
【问题讨论】:
-
您是否正在运行提升的进程(具有管理员权限)?
-
我确实尝试使用管理员运行此代码的 .exe,但没有成功
-
我怀疑
FILE_SHARE_READ | FILE_SHARE_WRITE在请求访问物理驱动器时是否有效。 -
试试
FSCTL_LOCK_VOLUME,FSCTL_DISMOUNT_VOLUME。它应该在没有FILE_FLAG_NO_BUFFERING的情况下工作,但谁知道呢。缓冲区也应该在 512 或 4096 字节边界上对齐
标签: c windows winapi writefile