Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - DeviceIoControl(). Вместо реального CID SD-карты получаю массив нулей

Ответить
Настройки темы
C/C++ - DeviceIoControl(). Вместо реального CID SD-карты получаю массив нулей

Новый участник


Сообщения: 29
Благодарности: 3

Профиль | Отправить PM | Цитировать


Изменения
Автор: RedScorpio
Дата: 12-01-2017
Пытаюсь прочитать из 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. Проверил другие команды - то же самое (нулевой ответ).

Отправлено: 18:34, 12-01-2017

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - DeviceIoControl(). Вместо реального CID SD-карты получаю массив нулей

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Медиа - Копирование фоток с фотоаппарата через буфер - вместо .jpg получаю .bmp CyraxZ Microsoft Windows 2000/XP 6 15-02-2014 11:35
[решено] При установке звуковой карты получаю Checking NVRAM Forest Gump Непонятные проблемы с Железом 7 22-08-2012 17:45
Flash - Разбивка SD-карты на несколько разделов Alex NSK Накопители (SSD, HDD, USB Flash) 4 23-07-2012 23:02
Flash - [решено] Перепрошивка SD-карты treehel Накопители (SSD, HDD, USB Flash) 19 22-06-2011 22:10
Flash - Копирование защищенных данных с SD карты Xi2 Накопители (SSD, HDD, USB Flash) 10 24-09-2008 17:36




 
Переход