Windows 上的 DeviceIOControl 返回错误 5

问题描述

我尝试将 cmd8 发送到 emmc/SD,在 createFile 成功后,出现错误 5(访问被拒绝)。我是初学者,从 MSDN 了解 DeviceIOControl,但我不知道如何解决此问题我已经在管理员中运行它并使用 GENERIC_ALL 创建文件。 请帮我!谢谢 !!! CreateFile 成功:

hDevice = CreateFileA(
        "\\\\.\\globalroot\\Device\\00000031",GENERIC_READ | GENERIC_WRITE| FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,NULL,OPEN_EXISTING,NULL
    );

DeviceIOControl:

int read_extcsd(HANDLE hDevice) {
    BOOL bRet = FALSE;

    /*
     * DeviceIoControl Parameter initialization
     */
    int sizeOfInBuffer = sizeof(SFFdisK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR) + 16;
    SFFdisK_DEVICE_COMMAND_DATA* InBuffer = (SFFdisK_DEVICE_COMMAND_DATA *)malloc(sizeOfInBuffer); 

    UINT8 OutBuffer[512]; 
    DWORD ByTesReturned = 0;

    /*
     * InBuffer(SFFdisK_DEVICE_COMMAND_DATA) Parameter initialization
     */
    InBuffer->HeaderSize = sizeof(SFFdisK_DEVICE_COMMAND_DATA);
    InBuffer->Command = SFFdisK_DC_DEVICE_COMMAND;
    InBuffer->ProtocolArgumentSize = sizeof(SDCMD_DESCRIPTOR);

    /*
     * InBuffer->Data(SDCMD_DESCRIPTOR) Parameter initialization
     */
    SDCMD_DESCRIPTOR CMD8;
    CMD8.Cmd = 8;//CMD8
    CMD8.CmdClass = SDCC_STANDARD; // Indicates an SD card command from the standard command set. This command set includes command codes 0 to 63.
    CMD8.TransferDirection = SDTD_READ;
    CMD8.TransferType = SDTT_SINGLE_BLOCK;
    CMD8.ResponseType = SDRT_1;// find in JESD84-B51
    INT sizeofCMD8 = sizeof(CMD8);

    memcpy(&(InBuffer->Data[0]),&CMD8,sizeofCMD8); //save in Data

    InBuffer->DeviceDataBufferSize = sizeofCMD8;

    


    /*
     * DeviceIoControl
     */
    memset(&OutBuffer,sizeof(OutBuffer));
    bRet = DeviceIoControl(hDevice,IOCTL_SFFdisK_DEVICE_COMMAND,&InBuffer,sizeOfInBuffer,&OutBuffer,sizeof(OutBuffer),&ByTesReturned,NULL);
    printf("asdf\n%h",OutBuffer[0]);
    if (bRet == 0)
    {
        return 0;
    }
    else {
        printf("DeviceIoControl CMD8 OK\n");
    }
    return 1;
    
}

解决方法

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

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

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