Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
memcpy((void *)t, (data_buff + 4), toc_length);
free(data_buff);
/* Отобразим результаты */
for(i = 0; i < total_tracks; i++)
printf("track: %d lba: %u ", (i + 1), __swab32((t + i)->lba));
return 0;
}
Полный листинг программы чтения TOC приведен в файле RAW/read_toc1.c.
Рассмотрим ещё один пример чтения TOC. Для хранения содержимого TOC организуем односвязный список структур следующего вида:
struct toc {
__u8 res;
__u8 adr_cntl;
__u8 trk_num;
__u8 res1;
__u32 lba;
struct toc *next; // указатель на следующий элемент списка
};
Здесь struct toc *next – указатель на следующий элемент списка. Формирование этого списка будет выполнять рекурсивная функция read_toc( ):
struct toc * read_toc()
{
#define READ_TOC 0x43
static int i = 1;
int n;
__u8 cmd_buff[12];
__u8 data_buff[12];
/* При каждом обращении к диску мы считываем 12 байт – 4 байта заголовка и 8 байт дескриптора трека,
* номер которого задан в поле Starting Track
*/
__u16 buff_size = 12, a;
struct toc *t;
/* Если номер трека превысил 0xAA, выполнение функции прекращается */
if(i > 0xAA) return NULL;
/* Выделяем память для дескриптора трека */
t = (struct toc *)malloc(sizeof(struct toc));
/* Формируем пакетную команду */
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = READ_TOC;
/* Поле Starting Track содержит номер трека. Этот номер увеличивается при каждом вызове функции */
cmd_buff[6] = i;
/* Размер считываемых данных */
buff_size = __swab16(buff_size);
memcpy((void *)(cmd_buff + 7), (void *)&buff_size, 2);
/* Посылаем устройству пакетную команду */
if(send_packet_data_command(buff_size, cmd_buff) < 0) {
printf("Error read TOC ");
request_sense();
exit(-1);