【发布时间】:2015-01-23 03:54:11
【问题描述】:
我正在尝试从特定物理扇区将一些数据写入 SD 卡。我从一家公司收到了执行此操作的代码,他们说它在 windows-xp 上运行良好。这与WriteFile error #5 "denied access" under win Vista/seven的情况相同
这是将数据写入 SD 卡的部分(在我的 cae drv 值是“F”)。从其他人那里阅读,我添加了锁定和拆卸,但锁定失败(也拆卸)。我对windows编程不是很熟悉。谁能告诉我这段代码有什么问题?谢谢你的帮助。 (顺便说一句,我正在锁定 3GiB)
u32 HDD_write(u8 drv, u32 SecAddr, u32 blocks, u8 *buf)
{
u32 ret = 0;
u32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;
char cur_drv[100];
HANDLE g_hDevice;
sprintf(cur_drv, "\\\\.\\%c:",drv); // , (u32)drv);
g_hDevice = CreateFile(cur_drv, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(g_hDevice == INVALID_HANDLE_VALUE)
return 0;
// lock and dismount
ret = LockFile(g_hDevice, 0, 0, 3 * 1023 * 1023 * 1023, 0);
printf("ret = %d", ret);
DeviceIoControl(g_hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL);
printf("error = %d", GetLastError());
ldistanceLow = SecAddr << 9;
ldistanceHigh = SecAddr >> (32-9);
dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);
if(dwpointer != 0xFFFFFFFF) {
bytestoread = blocks * 512;
ret = WriteFile(g_hDevice, buf, bytestoread, (unsigned long *)&numread, NULL);
if(ret) ret = 1;
else {
ret = 0;
printf("error = %d", GetLastError());
}
}
CloseHandle(g_hDevice);
return ret;
}
【问题讨论】:
-
GetLastError()在LockFile()失败时返回什么? -
您是否尝试过使用
DeviceIoControl(g_hDevice, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL);锁定卷? -
@Krister Andersson,对不起,我没有看到你的问题。可能设备忙于锁定,而 WriteFile 的访问被拒绝。我后来也使用了 FSCTL_LOCK_VOLUME。谢谢!