如何写入 SD 卡的扇区 0 (MBR)? 视窗

问题描述

我想将数据写入 SD 卡的扇区 0 (MBR),而不是 SD 卡中的分区。 为此,我尝试打开 SD 卡的物理驱动器,成功了。 但是当我调用 WriteFile() 写入 SD 卡时,它返回错误 5 (ERROR_ACCESS_DENIED)。

以下是我使用的示例代码。 有人可以帮我解决我在这段代码中遗漏的问题吗? (我也试过在管理员模式下执行这段代码,但没有成功。)

int sd_card_open(char *drive_name) 
{
    char   dev_name[64];
    BOOL   bResult;
    HANDLE hDevice;
    DWORD  BytesReturned;
    VOLUME_DISK_EXTENTS vde;

    // drive_name example : "D:"

    sprintf(dev_name,"\\\\.\\%s",drive_name);
    hDevice = CreateFile(dev_name,// Drive to open
                         GENERIC_READ | GENERIC_WRITE,// Access to the drive
                         FILE_SHARE_READ | FILE_SHARE_WRITE,// Share mode
                         NULL,// Security
                         OPEN_EXISTING,// Disposition
                         0,// no file attributes
                         NULL);

    if (hDevice == INVALID_HANDLE_VALUE) {
        printf("Can't open the drive %s (err = %d).\n",drive_name,GetLastError());
        return(-1);
    }

    bResult = DeviceIoControl(hDevice,IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,NULL,&vde,sizeof(vde),&BytesReturned,NULL);
    if (!bResult) {
        printf("Failed to get physical disk name (err = %d).\n",GetLastError());
        return(-1);
    }
    
    CloseHandle(hDevice);
    sprintf(dev_name,"\\\\.\\PhysicalDrive%d",vde.Extents[0].DiskNumber);
    
    hDevice = CreateFile(dev_name,// no file attributes
                         NULL);

    if (hDevice == INVALID_HANDLE_VALUE) {
        printf("Can't open the disk %s (err = %d).\n",dev_name,FSCTL_LOCK_VOLUME,NULL);
    if (!bResult) {
        printf("Failed to lock volume (err = %d).\n",FSCTL_DISMOUNT_VOLUME,NULL);
    if (!bResult) {
        printf("Failed to dismount volume (err = %d).\n",GetLastError());
        return(-1);
    }
    
    return(0);
}

int sd_card_write(unsigned int sec,unsigned int num_secs,unsigned char *buf)
{
    LARGE_INTEGER pos;
    DWORD         cnt,wcnt;
    BOOL          bResult;
    
    pos.QuadPart = ((LONGLONG) sec)   << 9;     // assume 512-byte sector
    cnt          = ((DWORD) num_secs) << 9;
    
    bResult = SetFilePointerEx(hDevice,pos,FILE_BEGIN);
    if (!bResult) {
        printf("SetFilePointerEx() failed (err = %d).\n",GetLastError());
        return(-1);
    }

    bResult = WriteFile(hDevice,buf,cnt,&wcnt,NULL);
    if (!bResult || cnt != wcnt) {
        printf("WriteFile() failed (err = %d).\n",GetLastError());
        return(-1);
    }
    
    return(0);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...