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

📄 dvd+rw-booktype.cpp

📁 最新的linux下dvd刻录软件,支持DVD+RW、DVD-RW光盘刻录。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#if 0## Utility for manipulating Book Type Field of Physical Format Descriptor# located in lead-in of DVD+RW media. This is 9th version. 2nd version# added initial support for 2nd generation DVD+RW drives. 3rd version# adds support for DVD+R unit settings. 4th version checks if the unit# is of RICOH design and reliably recognizes drive generation. 5th# version adds support for Benq derivatives. 6th version fixes problem# with USB connected units? 7th version adds support for BTC units.# 8th version fixes typos in BTC support, adds support for fraudulent# NEC firmwares and Lite-On based units. 9th version adds support for# LG, Plextor and dual-format and double-layer Benq units. Keep in mind# that booktyping support might appear in certain firmware revisions,# not necessarily all.## The code is in public domain.## See http://www.dvdplusrw.org/resources/bitsettings.html# for further details.#/bin/sh << EOSMODNAME=\`expr "/$0" : '\(.*[^/]\)/*$' : '.*/\(..*\)' : '\(.*\)\..*$'\`case "`uname -s`" inSunOS)	(set -x; g++ -fno-exceptions -O -o \$MODNAME "$0" -lvolmgt) ;;*)	(set -x; g++ -fno-exceptions -O -o \$MODNAME "$0") ;;esacEOSexit#endif#include <stdio.h>#include <stddef.h>#include <stdlib.h>#include <string.h>#include "transport.hxx"#define OPT_MEDIA	0x01#define OPT_UNIT	0x02#define OPT_UNITRW	0x03#define OPT_UNITR	0x04#define OPT_MASK	0x0F#define OPT_INQ		0x10#define INTERNAL_RELOAD	0x20unsigned short profile;const char    *dev;const char *bookname (unsigned char book,char *unknown=NULL){ const char *ret;    switch(book&0xF0)    {	case 0x00:	ret="-ROM";	break;	case 0x10:	ret="-RAM";	break;	case 0x20:	ret="-R";	break;	case 0x30:	ret="-RW";	break;	case 0x90:	ret="+RW";	break;	case 0xA0:	ret="+R";	break;	case 0xE0:	ret="+R DL";	break;	default:	ret=NULL;			if (unknown)	sprintf (unknown,"?%02X",book&0xFF);			break;    }  return ret;}int mediainfo (Scsi_Command &cmd){ unsigned char buf[8],book;  const char *brand;  int err;    cmd[0]=0xAD;	// READ DVD STRUCTURE    cmd[9]=sizeof(buf);    cmd[11]=0;    if ((err=cmd.transport(READ,buf,sizeof(buf))))    {	sperror ("READ DVD STRUCTURE#0",err);	return 1;    }    book=buf[4];    brand=bookname (book);    printf ("Current media Book Type Field is %02xh: ",book);    if (brand)  printf ("DVD%s specification [revision %d]\n",			brand,book&0xF);    else	printf ("unrecognized value\n");  return 0;}int ricoh (Scsi_Command &cmd,int action,int book,int gen=2){ int err,cnt=0;  unsigned char buf[6];  const char *brand;  char unknown [16]="?unknown";    switch (action)    {	case OPT_INQ|OPT_MEDIA:		break;	case OPT_INQ:	case OPT_INQ|OPT_UNIT:		if (gen==1)	goto inq_unitrw;		cmd[0]=0xFA;		cmd[1]=0x10;		cmd[8]=sizeof(buf);		cmd[11]=0;		if (!cmd.transport(READ,buf,sizeof(buf)))		{   brand = bookname (buf[4],unknown),		    printf ("The unit will brand DVD+R media as DVD%s\n",			    brand?brand:unknown),		    cnt++;		}	case OPT_INQ|OPT_UNITRW:	inq_unitrw:		cmd[0]=0xFA;		cmd[1]=0x00;		cmd[8]=sizeof(buf);		cmd[11]=0;		if (!cmd.transport(READ,buf,sizeof(buf)))		{   brand = bookname (buf[4],unknown),		    printf ("The unit will format DVD+RW media as DVD%s\n",			    brand?brand:unknown),		    cnt++;		}		if (cnt==0)		    printf ("Unable to determine unit settings. "			    "Default settings vary from\n"			    "firmware to firmware. Set "			    "explicitly to be certain.\n");		break;	case OPT_INQ|OPT_UNITR:		if (gen==1)		{   fprintf (stderr,":-( not applicable to 1st gen unit\n");		    return 1;		}		cmd[0]=0xFA;		cmd[1]=0x10;		cmd[8]=sizeof(buf);		cmd[11]=0;		if (!cmd.transport(READ,buf,sizeof(buf)))		{   brand = bookname (buf[4],unknown),		    printf ("The unit will brand DVD+R media as DVD%s\n",			    brand?brand:unknown);		}		break;	case OPT_MEDIA:		if (profile!=0x1A)		{   fprintf (stderr,":-( action is applicable to DVD+RW only\n");		    break;		}		if (book != 0x92 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0xF9;		cmd[1]=0x02;		cmd[2]=book;		cmd[3]=(gen==1?0:0xFF);		cmd[11]=0;		if ((err=cmd.transport()))		    return sperror("RICOH_F9h(2)",err),1;		else		    return mediainfo(cmd);		break;	case OPT_UNIT:		if (profile==0x1B || profile==0x2B) goto set_unitr;	case OPT_UNITRW:		if (book != 0x92 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0xF9;		cmd[1]=(gen==1?0x01:0x0C);		cmd[2]=book;		cmd[3]=(gen==1?0:0xFF);		cmd[11]=0;		if ((err=cmd.transport()))		    sperror (gen==1?"RICOH(1)":"RICOH(0Ch)",err);		else		    printf ("Unit was instructed to format DVD+RW as DVD%s\n",			    book==0x01?"-ROM":"+RW");		break;	case OPT_UNITR:	set_unitr:		if (gen==1)		{   fprintf (stderr,":-( not applicable to 1st gen unit\n");		    return 1;		}		if (book != 0xA1 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0xF9;		cmd[1]=0x14;		cmd[2]=book;		cmd[3]=0xFF;		cmd[11]=0;		if ((err=cmd.transport()))		    sperror ("RICOH(14h)",err);		else		    printf ("Unit was instructed to brand DVD+R as DVD%s\n",			    book==0x01?"-ROM":"+R");		break;	default:		break;    }  return 0;}int benq (Scsi_Command &cmd,int action,int book,int gen=2){ int err;  unsigned char word[2];  const char *brand;  char unknown [16]="?unknown";    switch (action)    {	case OPT_INQ|OPT_MEDIA:		break;	case OPT_INQ:	case OPT_INQ|OPT_UNIT:		cmd[0]=0xFF;		cmd[1]=0x10;		cmd[11]=0;		if ((err=cmd.transport(READ,word,sizeof(word))))		    sperror ("BENQ_FFh(10h)",err);		else		{   brand = bookname (word[0],unknown),		    printf ("The unit will brand DVD+R media as DVD%s\n",			    brand?brand:unknown);		}	case OPT_INQ|OPT_UNITRW:		cmd[0]=0xFF;		cmd[1]=0x00;		cmd[11]=0;		if ((err=cmd.transport(READ,word,sizeof(word))))		    sperror ("BENQ_FFh(00h)",err);		else		{   brand = bookname (word[0],unknown),		    printf ("The unit will format DVD+RW media as DVD%s\n",			    brand?brand:unknown);		}		break;	case OPT_INQ|OPT_UNITR:		cmd[0]=0xFF;		cmd[1]=0x10;		cmd[11]=0;		if ((err=cmd.transport(READ,word,sizeof(word))))		    sperror ("BENQ_FFh(10h)",err);		else		{   brand = bookname (word[0],unknown),		    printf ("The unit will brand DVD+R media as DVD%s\n",			    brand?brand:unknown);		}		if (gen<3)	break;		cmd[0]=0xFF;		cmd[1]=0x10;		cmd[2]=0x01;		cmd[11]=0;		if ((err=cmd.transport(READ,word,sizeof(word))))		    sperror ("BENQ_FFh(10h,1)",err);		else		{   brand = bookname (word[0],unknown),		    printf ("The unit will brand DVD+R DL meda as DVD%s\n",			    brand?brand:unknown);		}		break;	case OPT_MEDIA:		if (profile!=0x1A)		{   fprintf (stderr,":-( action is applicable to DVD+RW only\n");		    break;		}		if (book != 0x92 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}#if 0		cmd[0]=0x1E;	// PREVENT/ALLOW MEDIA REMOVAL		cmd[4]=1;	// "Prevent"		cmd[5]=0;		if ((err=cmd.transport()))		{   sperror ("PREVENT MEDIA REMOVAL",err);		    break;		}#endif		cmd[0]=0xFE;		cmd[1]=2;		cmd[2]=book;		cmd[11]=0;		if ((err=cmd.transport()))		    sperror ("BENQ_FEh(2)",err);		else		    action = INTERNAL_RELOAD;		break;	case OPT_UNIT:		if (profile==0x1B || profile==0x2B) goto set_unitr;	case OPT_UNITRW:		if (book != 0x92 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0xFE;		cmd[1]=4;		cmd[2]=book;		cmd[11]=0;		if ((err=cmd.transport()))		    sperror ("BENQ_FEh(4)",err);		else		    printf ("Unit was instructed to format DVD+RW as DVD%s\n",			    book==0x01?"-ROM":"+RW");		break;	case OPT_UNITR:	set_unitr:		if (book != 0xA1 && book != 0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0xFE;		cmd[1]=5;		cmd[2]=book;		cmd[11]=0;		if ((err=cmd.transport()))		    sperror ("BENQ_FEh(5)",err);		else		    printf ("Unit was instructed to brand DVD+R as DVD%s\n",			    book==0x01?"-ROM":"+R");		if (gen<3)	break;		cmd[0]=0xFE;		cmd[0]=5;		cmd[2]=book==0x01?0x01:0xE1;		cmd[3]=1;		cmd[11]=0;		if ((err=cmd.transport()))		    sperror ("BENQ_FEh(5,1)",err);		else		    printf ("Unit was instructed to brand DVD+R DL as DVD%s\n",			    book==0x01?"-ROM":"+R DL");		break;	default:		break;    }    cmd[0]=0xFD;    cmd[1]=0xF2;    cmd[2]='B';    cmd[3]='E';    cmd[4]='N';    cmd[5]='Q';    cmd[11]=0;    if ((err=cmd.transport()))	sperror ("BENQ_FDh(F2h)",err);    if (action!=INTERNAL_RELOAD)	return 0;    cmd[0]=0x1E;	// PREVENT/ALLOW MEDIA REMOVAL    cmd[5]=0;    if ((err=cmd.transport()))	return sperror ("ALLOW MEDIA REMOVAL",err),1;    cmd[0]=0x1B;	// START/STOP UNIT    cmd[4]=0x2;		// "Eject"    cmd[5]=0;    if ((err=cmd.transport()))	return sperror ("EJECT",err),1;    cmd[0]=0x1B;	// START/STOP UNIT    cmd[4]=0x3;		// "Load"    cmd[5]=0;    if ((err=cmd.transport()))	return sperror ("LOAD TRAY",err),1;    if (wait_for_unit (cmd))	return 1;  return mediainfo (cmd);}int btc (Scsi_Command &cmd,int action,int book,int gen=0){ int err,obligatory=0;  const char *brand="";    switch (action)    {	case OPT_INQ|OPT_MEDIA:		break;	case OPT_INQ:	case OPT_INQ|OPT_UNIT:	case OPT_INQ|OPT_UNITRW:	case OPT_INQ|OPT_UNITR:		fprintf (stderr,":-( Can't inquiry unit settings, "				"you have to set booktype prior every "				"recording to be sure.\n");		return 1;		break;	case OPT_MEDIA:		if (profile!=0x1A && profile!=0x14 && profile!=13)		{   fprintf (stderr,":-( action is applicable to DVD盧W only\n");		    break;		}		obligatory = (profile==0x1A)?0x92:0x32;		if (book!=obligatory && book!=0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    break;		}		cmd[0]=0x1E;	// PREVENT/ALLOW MEDIA REMOVAL		cmd[4]=1;	// "Prevent"		cmd[5]=0;		if ((err=cmd.transport()))		{   sperror ("PREVENT MEDIA REMOVAL",err);		    break;

⌨️ 快捷键说明

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