Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Байты 7, 8 и 9 содержат координаты сектора в MSF-формате. Если пересчитать этот адрес в формат LBA, то получится, что TEAC считывает «родной» Q-субканал сектора, а MITSUMI читает Q-субканал соседа, 1002 сектора.
Для изучения следующего примера понадобится компакт-диск, на котором записано несколько сессий. Наша задача – прочитать содержимое TOC этого диска при условии, что поле Format содержит значение 10b. Формат данных TOC при Format Field = 10b представлен на рис.13. Следующая структура описывает формат записи TOC при Format = 10b:
struct toc {
__u8 snum; // номер сессии
__u8 ctrl :4; // Control
__u8 adr :4; // ADR
__u8 tno; // номер трека (всегда 0)
__u8 point; // POINT
__u8 min; // AMIN
__u8 sec; // ASEC
__u8 frame; // AFRAME
__u8 zero; // 0
__u8 pmin; // PMIN
__u8 psec; // PSEC
__u8 pframe; // PFRAME
} __attribute__ ((packed));
Поле point определяет тип информации, которую содержит запись TOC. Значение этого поля определяет назначение остальных полей, таких как min, sec, frame, pmin, psec, pframe.
Считывание TOC выполняет функция read_toc():
int read_toc()
{
int i = 1;
// буфер для хранения результатов чтения TOC
__u8 *data_buff;
/* Задаем размер области памяти для хранения данных ТОС. Т.к. заранее объем данных нам не известен,
* то зададим маскимальное значение - 64 Кб
*/
__u16 buff_size = 0xFFFF;
__u16 toc_data_length = 0; // длина записей TOC
__u32 lba;
int toc_entries = 0; // число записей в TOC
struct cdrom_generic_command cgc;
struct request_sense sense;
struct toc *t;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
/* Выделяем память для содержимого TOC */
data_buff = (__u8 *)malloc(buff_size);
memset(data_buff, 0, buff_size);
/* Формируем пакетную команду для чтения TOC */
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[2] = 2; // поле Format Field = 10b
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_READ;
cgc.buffer = data_buff;
cgc.buflen = buff_size;
buff_size = __swab16(buff_size);
memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2);
/* Посылаем командный пакет устройству */