Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   DeviceIoControl(). Вместо реального CID SD-карты получаю массив нулей (http://forum.oszone.net/showthread.php?t=322696)

RedScorpio 12-01-2017 18:34 2702989

DeviceIoControl(). Вместо реального CID SD-карты получаю массив нулей
 
Пытаюсь прочитать из SD-карты CID, но получаю массив нулей

1. Сначала открываю карту (для упрощения - через букву)
Код:

    sprintf(cBuff, "\\\\.\\%s:", "G");
    hDisk = CreateFile(cBuff,
                      GENERIC_READ | GENERIC_WRITE,
                      FILE_SHARE_READ | FILE_SHARE_WRITE,
                      NULL,
                      OPEN_EXISTING,
                      0,
                      NULL);

2. Если открытие успешно - инициализирую данные для команды
Код:

        iCmdDatSize = sizeof(SFFDISK_DEVICE_COMMAND_DATA) + sizeof(SDCMD_DESCRIPTOR) + 512; /// Временно, возможно увеличим буфер потом
        psCommandData = malloc(iCmdDatSize);
// ToDo Проверка выделения
/// Инициализация pCommandData
        memset(psCommandData, 0, iCmdDatSize);     
        psCommandData->HeaderSize        = sizeof(SFFDISK_DEVICE_COMMAND_DATA);
        psCommandData->Command            = SFFDISK_DC_DEVICE_COMMAND;
        psCommandData->ProtocolArgumentSize    = sizeof(SDCMD_DESCRIPTOR);
        psCommandData->DeviceDataBufferSize    = 512; /// см.выше
        psCommandData->Information        = info;
/// Инициализация sCmdDescriptor
        sCmdDescriptor.Cmd            = 10; // CMD10
        sCmdDescriptor.CmdClass            = SDCC_STANDARD;
        sCmdDescriptor.TransferDirection    = SDTD_READ;
        sCmdDescriptor.TransferType        = SDTT_CMD_ONLY;
        sCmdDescriptor.ResponseType        = SDRT_2;     
/// Переносим sCmdDescriptor в sCommandData
        memcpy((char *)(&(psCommandData->Data[0])), &sCmdDescriptor, sizeof(SDCMD_DESCRIPTOR));

3. Выполняю DeviceIoControl
Код:

        iRet = DeviceIoControl(hDisk,
                              IOCTL_SFFDISK_DEVICE_COMMAND,
                              psCommandData,
                              iCmdDatSize,
                              psCommandData,
                              iCmdDatSize,
                              &iBytesReturned,
                              NULL
                              );

Выполняется без ошибки, в iBytesReturned размер возвращенных данных точно такой же, как и отправленных, но содержимое никак не изменяется (т.е. CID - нули). Проверял на нескольких рабочих картах.

В чем моя ошибка?

UPD. Проверил другие команды - то же самое (нулевой ответ).


Время: 22:34.

Время: 22:34.
© OSzone.net 2001-