Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
}
/* Формируем команду READ CD */
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
memset(blk_buff, 0, sizeof(blk_buff));
cgc.cmd[0] = GPCMD_READ_CD;
cgc.cmd[1] = 0; // считывать сектор любого типа
cgc.cmd[8] = 1; // считывать один сектор
cgc.cmd[9] = 0xF8; // из сектора считывать все данные (табл.99 INF-8010i)
cgc.cmd[10] = 2; // считывать данные Q-субканала в общем потоке данных
printf("lba - %d ", lba);
lba = __swab32(lba);
memcpy((cgc.cmd + 2), (void *)&lba, 4);
// направление данных – от устройства
cgc.data_direction = CGC_DATA_READ;
cgc.buffer = blk_buff; // указатель на буфер для данных
cgc.buflen = CD_FRAMESIZE_RAW + QSCH_LEN; // размер буфера
cgc.sense = &sense;
/* Отправляем устройству команду */
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x ", sense.sense_key);
printf("ASC - 0x%02x ", sense.asc);
printf("ASCQ - 0x%02x ", sense.ascq);
return -1;
}
/* Записываем в файл sector данные основного канала */
out_f = open("sector", O_CREAT|O_RDWR, 0600);
write(out_f, blk_buff, CD_FRAMESIZE_RAW);
/* В файл qsch - данные Q-субканала */
out_f = open("qsch", O_CREAT|O_RDWR, 0600);
write(out_f, blk_buff + CD_FRAMESIZE_RAW, QSCH_LEN);
/* Отобразим координаты сектора, находящиеся в заголовке Header */
printf("Minute - %x ", blk_buff[CD_SYNC_SIZE]);
printf("Second - %x ", blk_buff[CD_SYNC_SIZE + 1]);
printf("Frame - %x ", blk_buff[CD_SYNC_SIZE + 2]);
printf("Mode - %d ", blk_buff[CD_SYNC_SIZE + 3]);
close(fd); close(out_f);
return 0;
}
Полный листинг программы чтения RAW-секторов компакт-диска с использованием системного вызова IOCTL находится в файле IOCTL/read_sector.c.
После запуска на выполнение программа сохранит данные основного канала в файле sector, данные Q-субканала – в файле qsch и выведет значения координат сектора в MSF формате, считанные из поля Header. Для сектора номер 1001 получим следующий результат:
Minute - 0
Second - 15
Frame - 26
Результаты чтения данных Q-субканала программой read_sector зависят от используемой модели CD-ROM. Для сравнения посмотрим на результаты чтения приводами TEAC и MITSUMI Q-субканала сектора номер 1001.
TEAC: 41 01 01 00 13 27 00 00 15 26 5D 57 00 00 82 00
MITSUMI: 41 01 01 00 13 27 00 00 15 27 5D 57 00 00 82 00