⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readraw.c

📁 将用户指定的符合iso-9660标准的文件的信息dump出来。
💻 C
字号:
/* *	read raw cd data track (test) * *	with ide-cd.c v4.54 *	(grep IDECD_VERSION /usr/src/linux/drivers/block/ide-cd.c) *	this program only works with the patch ide-cd.c-v4.54.diff *//* *	$Id: readraw.c,v 1.7 2000-09-13 00:40:29 solyga Exp $ */#include	"../isodump.h"#include	<linux/cdrom.h>#include	<sys/ioctl.h>#define	DEBUG#undef	DEBUG#define	RETVAL_MALLOC	6#define	LBA2MSF( LBA0, LBA1, MSF )	\	MSF.cdmsf_min0= (LBA0+CD_MSF_OFFSET) / (CD_SECS*CD_FRAMES); \	MSF.cdmsf_sec0= ((LBA0+CD_MSF_OFFSET) % (CD_SECS*CD_FRAMES)) / CD_FRAMES; \	MSF.cdmsf_frame0= (LBA0+CD_MSF_OFFSET) % CD_FRAMES; \	MSF.cdmsf_min1= (LBA1+CD_MSF_OFFSET) / (CD_SECS*CD_FRAMES); \	MSF.cdmsf_sec1= ((LBA1+CD_MSF_OFFSET) % (CD_SECS*CD_FRAMES)) / CD_FRAMES; \	MSF.cdmsf_frame1= (LBA1+CD_MSF_OFFSET) % CD_FRAMES#define	MSF2LBA( LBA0, LBA1, MSF ) \	LBA0= ( MSF.cdmsf_min0 * CD_SECS + MSF.cdmsf_sec0 ) * CD_FRAMES + \		MSF.cdmsf_frame0 - CD_MSF_OFFSET; \	LBA1= ( MSF.cdmsf_min1 * CD_SECS + MSF.cdmsf_sec1 ) * CD_FRAMES + \		MSF.cdmsf_frame1 - CD_MSF_OFFSETchar*basename( char* name ) {/* strip directory from name *//* basename("/usr/bin/") == "" -- basename(1) would return "bin" !! */  char* p= name;  while( *p != '\0' ) p++;  while( p > name ) {    if( *(p-1) == '/' ) break;    else p--;  }  return( p );}intmain(int argc, char** argv) {  char* fpn= *argv;  char* pn= basename( fpn );  int retval= RETVAL_OK;  int verbose= 2;  char default_cd_fn[]= DEFAULT_INPUT_FILE;  char* cd_fn= default_cd_fn;  int cd_fd;  struct cdrom_tochdr header;  int trk0= 0;		/* first track */  int trk1= 0;		/* last track +1 (leadout) */  int trks= 0;		  int trk= 0;  int ti= 0;		/* track index */  int blk0= 0;		/* index of fist block */  int blk1= 0;		/* index of last block +1 */  int blks= 0;  int blk;  struct cdrom_tocentry* entry= NULL;  int i;  UCHAR buf[CD_FRAMESIZE_RAW];  struct cdrom_msf msf;#ifdef	DEBUG    fprintf( DEBUG_CHANNEL, "DEBUG: sizeof(struct cdrom_read)= %d bytes\n", sizeof(struct cdrom_read) );    fprintf( DEBUG_CHANNEL, "DEBUG: sizeof(struct cdrom_msf)= %d bytes\n", sizeof(struct cdrom_msf) );    fprintf( DEBUG_CHANNEL, "DEBUG: sizeof(int)= %d bytes\n", sizeof(int) );    fprintf( DEBUG_CHANNEL, "DEBUG: sizeof(caddr_t)= %d bytes\n", sizeof(caddr_t) );    fprintf( DEBUG_CHANNEL, "DEBUG: &buf= %08x\n", buf );#endif/* open input */  if( optind < argc ) cd_fn= argv[optind];  if( (cd_fd=open(cd_fn,O_RDONLY,0|O_NONBLOCK)) == -1 ) {    fprintf( ERROR_CHANNEL, "%s: Couldn't open `%s' for reading. %s.\n",             pn, cd_fn, sys_errlist[errno] );    retval= RETVAL_ERROR; goto DIE_NOW;  }/* get toc header */  if( verbose >= 2 )    fprintf( VERBOSE_CHANNEL, "%s: Reading table of contents.\n", pn );  if( ioctl(cd_fd,CDROMREADTOCHDR,&header) == -1 ) {    fprintf( ERROR_CHANNEL, "%s: Couldn't get toc header. %s.\n",             pn, sys_errlist[errno] );    retval= RETVAL_ERROR; goto DIE_NOW;  }  trk0= (int) header.cdth_trk0;  trk1= (int) header.cdth_trk1 + 1;  trks= trk1 - trk0;  if( verbose >= 2 )    fprintf( VERBOSE_CHANNEL, "%s: Cd contains tracks [%d,%d)\n",             pn, trk0, trk1 );/* get toc entries */  if( (entry=malloc((trks+1)*sizeof(struct cdrom_tocentry))) == NULL ) {    fprintf( ERROR_CHANNEL, "%s: Couldn't read toc. %s.\n",             pn, sys_errlist[errno] );    retval= RETVAL_MALLOC; goto DIE_NOW;  }  for( ti=0; ti<=trks; ti++ ) {    entry[ti].cdte_track= ti<trks ? trk0+ti : CDROM_LEADOUT;    entry[ti].cdte_format = CDROM_LBA;    if( ioctl(cd_fd,CDROMREADTOCENTRY,&entry[ti]) == -1 ) {      fprintf( ERROR_CHANNEL, "%s: Couldn't read toc. %s.\n",               pn, sys_errlist[errno] );      retval= RETVAL_ERROR; goto DIE_NOW;    }  }/* set track index ti and block indices blk0, blk1 */  trk= trk0;  trk=27;  if( verbose )    fprintf( VERBOSE_CHANNEL, "%s: Trying to raw read track %d.\n", pn, trk );  for( ti=0; ti<=trks; ti++ )    if( entry[ti].cdte_track == trk ) break;  if( ti >= trks ) {    fprintf( ERROR_CHANNEL, "%s: CD doesn't contain track %d.\n", pn, trk );    retval= RETVAL_ERROR; goto DIE_NOW;  }  blk0= entry[ti  ].cdte_addr.lba;  blk1= entry[ti+1].cdte_addr.lba;/* check for trk beeing data track */  if( ! (entry[ti].cdte_ctrl & CDROM_DATA_TRACK) ) {    fprintf( ERROR_CHANNEL, "%s: Warning: Track %d is not a data track!\n",             pn, trk );/*    retval= RETVAL_ERROR; goto DIE_NOW;*/  }/* raw copy blocks */  for( blk=blk0; blk<blk1; blk++ ) {    int lba0= blk;    int lba1= 0;    LBA2MSF( lba0, lba1, msf );    memcpy( buf, &msf, sizeof(msf) );    if( ioctl(cd_fd,CDROMREADRAW,buf) == -1 ) {/*      int try= 5;      fprintf( ERROR_CHANNEL, "%s: Problem with block %d. %s\n",               pn, blk, sys_errlist[errno] );      while( try > 0 ) {        if( ioctl(cd_fd,CDROMREADRAW,&arg) != -1 ) break;        try--;      }      if( try == 0 ) {*/        fprintf( ERROR_CHANNEL, "%s: Cannot read block %d. %s\n",                 pn, blk, sys_errlist[errno] );        retval= RETVAL_ERROR; goto DIE_NOW;/*      }*/    }    /* don't skip the control bytes, maybe we're reading audio... *//*    write( STDOUT_FILENO, buf, CD_FRAMESIZE_RAW );*/    /* skip control bytes */    /* this works fine for CD+ */    write( STDOUT_FILENO, buf+CD_XA_SYNC_HEAD, CD_FRAMESIZE );  }DIE_NOW:  exit( retval );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -