Чтение ATIP-информации с CD-диска в Delphi/C++.
От: MegaMonster  
Дата: 26.10.04 03:52
Оценка:
Есть острая необходимость в чтении ATIP-информации (Absolute Time In Pre-groove) с CD-диска. Нужно это для создания защиты от копирования. Т.е. чтоб написанная мной программа работала только при наличии диска (в общем, нужно сделать подобие StarForce). Такой курсовой проект.
На каком языке это реализовывать для меня не важно. Хотелось бы только знать какие функции могут это сделать. Ведь есть же функция для чтения серийного номера, а читающую ATIP я не встречал.
Или подкиньте идейку как не сильно сложно сделать не сильно сложную защиту.

Если кто-нибудь сталкивался с подобным вопросом, подскажите хоть что-нибудь.

======

Мои поиски помаленьку привели в Microsoft DDK и структурам:

CDROM_TOC_ATIP_DATA_BLOCK
CDROM_READ_TOC_EX
CDROM_TOC_ATIP_DATA
FEATURE_DATA_CD_READ
IOCTL_CDROM_READ_TOC_EX

Разобраться самому не получается (как из них вытащить информацию?).
Re: Чтение ATIP-информации с CD-диска в Delphi/C++.
От: Patalog Россия  
Дата: 26.10.04 09:49
Оценка:
Здравствуйте, MegaMonster, Вы писали:

хъ

MM>Разобраться самому не получается (как из них вытащить информацию?).


Данные даны по состоянию INF-8090i Rev 5.1
enum format_codes
{
    format_TOC = 0x00,                            /* Returned data - TOC, Track/Session field contains the track number */
    format_session_info = 0x01,            /* Returned data - Session Information, Track/Session field is reserved */
    format_full_TOC = 0x02,                    /* Returned data - Full TOC, Track/Session field contains Session number */
    format_PMA = 0x03,                            /* Returned data - PMA, Track/Session field is reserved */
    format_ATIP = 0x04,                            /* Returned data - ATIP, Track/Session field is reserved */
    format_CDText = 0x05                        /* Returned data - CD-Text, Track/Session field contains Session number */
};

struct atip_A1_data
{
    unsigned char        rec_speed_hight : 4;        /* Highest Usable CLV Recording Speed
                                                                                    000b - Reserved
                                                                                    001b - 2X
                                                                                    010b - 4X
                                                                                    011b - 6X
                                                                                    100b - 8X
                                                                                    101b..111b - Refer to Orange Book
                                                                                    */
    unsigned char        rec_speed_low    : 3;            /* Lowest Usable CLV Recording Speed
                                                                                    000b - Reserved
                                                                                    001b - 2X
                                                                                    010b..111b - Refer to Orange Book
                                                                                    */
    unsigned char        res1                        : 1;        /* Must be set to zero */
    unsigned char        res2                        : 1;
    unsigned char        MPF_value                : 3;        /* Device value of the Modulation/Power function */
    unsigned char        power_factor        : 3;        /* Power Multiplication Factor r */
    unsigned char        res3                        : 1;        /* Must be set to zero */
    unsigned char        res4                        : 4;
    unsigned char        power_ratio            : 3;        /* Recommended Erase/Write Power Ratio (Pe0/We0) */
    unsigned char        res5                        : 1;
};

struct atip_info
{
    unsigned char        data_length[2];                /* The number of bytes to be transferred in response to the command. */
    unsigned char        res1;
    unsigned char        res2;
    
    unsigned char        reference_speed    : 3;    /* Encoded information indicating the recommended write speed for the media.
                                                                                00h = reserved.
                                                                                01h - 2X recording. 
                                                                                Valid only for CD-RW media. */
    unsigned char        res3                        : 1;    
    unsigned char        indicative_DWP    : 3;    /* Encoded information indicating the media’s recommended initial laser power
                                                                                setting. The meaning of these bits varies between CD-R and CD-RW media. */
    unsigned char        res4                        : 1;    /* Must be set to one */

    unsigned char        res5                        : 6;
    unsigned char        URU                            : 1;    /* Unrestricted Use Disc (URU) flag
                                                                                1 - indicates that the mounted CD-R/RW disc is defined for unrestricted use.
                                                                                0 - the mounted CD-R/RW disc is defined for restricted use. 
                                                                                */
    unsigned char        res6                        : 1;    /* Must be set to zero */

    unsigned char        valid_A3                : 1;    /* 1 - A3 field is valid. */
    unsigned char        valid_A2                : 1;    /* 1 - A2 field is valid. */
    unsigned char        valid_A1                : 1;    /* 1 - A1 field is valid. */
    unsigned char        disk_subtype        : 3;    /* Reports the following value according to the Orange Book Part 2 or Part 3 (B1,B2,B3).
                                                                                000b - Normal Rewritable (CLV) Media
                                                                                001b - High speed Rewritable (CLV/CAV) Media
                                                                                010b - Medium type A, low Beta category (A-)
                                                                                011b - Medium type A, high Beta category (A+)
                                                                                100b - Medium type B, low Beta category (B-)
                                                                                101b - Medium type B, high Beta category (B+)
                                                                                110b - Medium type C, low Beta category (C-)
                                                                                111b - Medium type C, high Beta category (C+)
                                                                                */
    unsigned char        disk_type                : 1;    /* 0 - CD-R, 1 - CD-RW */
    unsigned char        res7                        : 1;    /* Must be set to one */

    unsigned char        res8;
    
                                                                                /* The start time of the lead-in. The value is read from ATIP and returned in hex format.
                                                                                Legal values for the M field are 50h through 63h. */
    unsigned char        leadin_start_time_M;    /* ... (Min.). */
    unsigned char        leadin_start_time_S;    /* ... (Sec.) */
    unsigned char        leadin_start_time_F;    /* ... (Frame.) */
    
    unsigned char        res9;

                                                                                /* The last possible start time of lead-out. The value is read from ATIP and returned in hex format.
                                                                                Valid values for the M field are 0 through 4Fh. */
    unsigned char        leadout_start_time_M;    /* ... (Min.) */
    unsigned char        leadout_start_time_S;    /* ... (Sec.) */
    unsigned char        leadout_start_time_F;    /* ... (Frame.) */
    
    unsigned char        res10;
    
    atip_A1_data        A1_value;

    unsigned char        res11;

    unsigned char        A2_value[3];                    /* Reserved */

    unsigned char        res12;

    unsigned char        A3_value[3];                    /* Reserved */
    unsigned char        res13;
};
Почетный кавалер ордена Совка.
Re[2]: Чтение ATIP-информации с CD-диска в Delphi/C++.
От: MegaMonster  
Дата: 29.10.04 04:14
Оценка:
Здравствуйте, Patalog, спасибо за ответ, Вы писали:

MM>>Разобраться самому не получается (как из них вытащить информацию?).


P>Данные даны по состоянию INF-8090i Rev 5.1

P>
P>enum format_codes
P>{
P>    format_TOC = 0x00,                            /* Returned data - TOC, Track/Session field contains the track number */
P>    format_session_info = 0x01,            /* Returned data - Session Information, Track/Session field is reserved */
P>    format_full_TOC = 0x02,                    /* Returned data - Full TOC, Track/Session field contains Session number */
P>    format_PMA = 0x03,                            /* Returned data - PMA, Track/Session field is reserved */
P>    format_ATIP = 0x04,                            /* Returned data - ATIP, Track/Session field is reserved */
P>    format_CDText = 0x05                        /* Returned data - CD-Text, Track/Session field contains Session number */
P>};

P>struct atip_A1_data
P>{
P>    unsigned char        rec_speed_hight : 4;        /* Highest Usable CLV Recording Speed
.
.
.
P>    unsigned char        A2_value[3];                    /* Reserved */

P>    unsigned char        res12;

P>    unsigned char        A3_value[3];                    /* Reserved */
P>    unsigned char        res13;
P>};
P>


Я честно скажу, не знаю что с этим текстом делать .

Пытаясь найти решение своей задачи получилось:
1) Могу считать к примеру SectorsPerTrack используя IOCTL_DISK_GET_DRIVE_GEOMETRY или кол-во треков на аудио диске;
2) В msdn-е нашел, как читать диск посекторно. Т.е. вся инф-я сохраняется в файле. Так может через этот метод найти ATIP? Как я понял она находится не в начальных секторах, а в другом месте... может вы знаете в каких нужно конкретно читать секторах, чтоб считать ATIP?
Или всетаки подкините кусочек кода, как это сделать по нормальному.
Re[3]: Чтение ATIP-информации с CD-диска в Delphi/C++.
От: Patalog Россия  
Дата: 29.10.04 05:49
Оценка:
Здравствуйте, MegaMonster, Вы писали:

[]

MM>Я честно скажу, не знаю что с этим текстом делать .


Хм, я по твоим
CDROM_TOC_ATIP_DATA_BLOCK
CDROM_READ_TOC_EX
CDROM_TOC_ATIP_DATA
FEATURE_DATA_CD_READ
IOCTL_CDROM_READ_TOC_EX

понял, что ты уже разобрался как прочитать ATIP и проблема только с интерпретацией информации, посему решил, что инфа в MSDN по поводу CDROM_TOC_ATIP_DATA_BLOCK тебя не удовлетворила и скинул тебе описание оной из MMC.

А в чем сосбт. проблема то? Делаешь DeviceIoControl c IOCTL_CDROM_READ_TOC_EX и CDROM_READ_TOC_EX (Format CDROM_READ_TOC_EX_FORMAT_ATIP) и получаешь CDROM_TOC_ATIP_DATA.
Почетный кавалер ордена Совка.
Re[4]: Чтение ATIP-информации с CD-диска в Delphi/C++.
От: MegaMonster  
Дата: 30.10.04 03:47
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, MegaMonster, Вы писали:


P>[]


MM>>Я честно скажу, не знаю что с этим текстом делать .


P>Хм, я по твоим

P>понял, что ты уже разобрался как прочитать ATIP и проблема только с интерпретацией информации, посему решил, что инфа в MSDN по поводу CDROM_TOC_ATIP_DATA_BLOCK тебя не удовлетворила и скинул тебе описание оной из MMC.

P>А в чем сосбт. проблема то? Делаешь DeviceIoControl c IOCTL_CDROM_READ_TOC_EX и CDROM_READ_TOC_EX (Format CDROM_READ_TOC_EX_FORMAT_ATIP) и получаешь CDROM_TOC_ATIP_DATA.


Да, проблема в том что я не могу запустить пр-му с CDROM_TOC_ATIP_DATA или IOCTL_CDROM_READ_TOC_EX.
Вот что работает:

P>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
//atexit (Cleanup);
OpenCdRom();
ReadToc();

Edit1->Text=IntToStr(toc.BytesPerSector);
}
//---------------------------------------------------------------------------

void OpenCdRom (void)
 {

hCD=CreateFile("\\\\.\\F:",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
 }

void ReadToc (void)
 {
 DWORD dwBytes;

//DeviceIoControl(hCD,IOCTL_CDROM_READ_TOC,NULL,0,&toc,sizeof(CDROM_TOC),&dwBytes,NULL);
DeviceIoControl(hCD,IOCTL_CDROM_GET_DRIVE_GEOMETRY,NULL,0,&toc,sizeof(CDROM_TOC),&dwBytes,NULL);
 }
P>



1) Какая стр-ра содержит ATIP? Что конкретно подставлять?
2) Как это подставит? .
Re[5]: Чтение ATIP-информации с CD-диска в Delphi/C++.
От: Patalog Россия  
Дата: 30.10.04 09:28
Оценка:
Здравствуйте, MegaMonster, Вы писали:

[]

MM>Да, проблема в том что я не могу запустить пр-му с CDROM_TOC_ATIP_DATA или IOCTL_CDROM_READ_TOC_EX.

MM>Вот что работает:

P>>

MM>void ReadToc (void)
MM> {
MM> DWORD dwBytes;

MM>//DeviceIoControl(hCD,IOCTL_CDROM_READ_TOC,NULL,0,&toc,sizeof(CDROM_TOC),&dwBytes,NULL);
MM>DeviceIoControl(hCD,IOCTL_CDROM_GET_DRIVE_GEOMETRY,NULL,0,&toc,sizeof(CDROM_TOC),&dwBytes,NULL);
MM> }
P>>


Хмм, похоже ты не совсем понимаешь как работает DeviceIoControl. 3-й и 4-й параметры ф-й — это входные данные, 5-й и 6-й — выходные. Для того чтобы получить необходимые выходные данные, необходимо задать во входных что именно ты хочешь получить. Ты же в качестве входных указываешь 0. Нужно так:
CDROM_READ_TOC_EX cd_toc = { 0 };
cd_toc.Format = CDROM_READ_TOC_EX_FORMAT_ATIP; //Query the device for absolute time in pregroove (ATIP) data. 
cd_toc.Msf = 1; //Msf member must be set to 1.
CDROM_TOC_ATIP_DATA atip_data = { 0 };
res = DeviceIoControl(cd_device, IOCTL_CDROM_READ_TOC_EX, &cd_toc, sizeof(cd_toc), &atip_data, sizeof(atip_data), &bytes_returned, NULL);
CDROM_TOC_ATIP_DATA_BLOCK* atip_block = &atip_data.Descriptors[0];


Хотя, честно говоря, я не совсем понимаю, как информация из ATIP поможет тебе в твоей задаче. К тому же у меня такое впечатление, что сия команда (CDROM_READ_TOC_EX_FORMAT_ATIP)
несколько глючит.
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.