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

📄 dvd+rw-booktype.cpp

📁 最新的linux下dvd刻录软件,支持DVD+RW、DVD-RW光盘刻录。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}		cmd[0]=0xFA;		cmd[2]=book;		cmd[10]=0xAA;		cmd[11]=0xFF;		if ((err=cmd.transport()))		    sperror ("BTC_FAh[2]",err);		else		    wait_for_unit (cmd);		cmd[0]=0x1E;	// PREVENT/ALLOW MEDIA REMOVAL		cmd[5]=0;		if ((err=cmd.transport()))		    return sperror ("ALLOW MEDIA REMOVAL",err),1;		break;	case OPT_UNIT:		if (profile==0x1B || profile==0x2B || profile==0x11)		    goto set_unitr;	case OPT_UNITRW:		fprintf (stderr,":-( Can't set RW unit settings, "				"manipulate media.\n");		return 1;		break;	case OPT_UNITR:	set_unitr:		// unit requires media in, so we can rely on profile...		if (profile==0x1B)	obligatory=0xA1, brand="+R";		else if (profile==0x2B)	obligatory=0xE1, brand="+R DL";		else			obligatory=0x20, brand="-R";		if (book!=obligatory && book!=0x01)		{   fprintf (stderr,":-( BookType#%02x is not applicable\n",book);		    return 1;		}		cmd[0]=0xFA;		cmd[3]=book;		cmd[4]=book==0x01?0:1;		cmd[10]=0xAA;		cmd[11]=0xFF;		if ((err=cmd.transport()))		    return sperror ("BTC_FAh[3]",err),1;		else		    printf ("Unit was instructed to brand DVD%s as DVD%s\n",			    brand,book==0x01?"-ROM":brand);		return 0;		break;	default:		break;    }  return mediainfo (cmd);}int liteon (Scsi_Command &cmd,int action,int book,unsigned char *buf=NULL){ int err;    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:		if (buf==NULL || buf[0]==0)		{   printf ("Unit will brand DVD+plus media with "			    "corresponding booktype, e.g. DVD+R as DVD+R...\n");		    return buf==NULL?1:0;		}		if (buf[0]==1)		    printf ("Unit will brand DVD+plus media as DVD-ROM\n");		else if (buf[0]==2)		    printf ("Unit will format DVD+RW media as DVD+RW\n");		else		    fprintf (stderr,":-? Insane unit setting %02x\n",buf[0]);		return buf[0]==1?0:1;		break;	case OPT_MEDIA:		fprintf (stderr,":-( Direct DVD+RW media manipulations "				"are not supported.\n"				"    Use -unit flag instead and apply "				"-dvd-compat recordinging procedure.\n");		return 1;		break;	case OPT_UNIT:	case OPT_UNITRW:	case OPT_UNITR:		cmd[0]=0xDF;		cmd[2]=0x0F;		cmd[3]=1;		cmd[4]=book==0x01?1:0;		cmd[11]=0;		if ((err=cmd.transport()))		    return sperror ("LITEON_DFh[1]",err),1;		if (book==0x01)		    printf ("Unit was instructed to brand DVD+plus media "			    "as DVD-ROM\n");		else		    printf ("Unit was instructed to brand DVD+plus media with "			    "corresponding booktype, e.g. DVD+R as DVD+R...\n");		return 0;		break;	default:		break;    }  return mediainfo (cmd);}// As per http://www-user.tu-chemnitz.de/~noe/Bitsetting/int plextor (Scsi_Command &cmd,int action,int book,int gen=2){ int err;  unsigned char vector[8];    switch (action)    {	case OPT_INQ|OPT_MEDIA:		break;	case OPT_INQ|OPT_UNITRW:	case OPT_UNITRW:	case OPT_MEDIA:		fprintf (stderr,":-( DVD+RW booktyping is not supported\n");		return 1;		break;	case OPT_INQ:	case OPT_INQ|OPT_UNIT:	case OPT_INQ|OPT_UNITR:		cmd[0] = 0xE9;		cmd[2] = 0x22;		cmd[3] = 0x0A;		cmd[9] = sizeof(vector);		cmd[11] = 0;		if ((err=cmd.transport(READ,vector,sizeof(vector))))		    return sperror ("PLEXTOR_E9h(A)",err),1;		printf ("Unit will brand DVD+R media as DVD%s\n",			vector[2]?"-ROM":"+R");		if (gen<3)	return 0;		cmd[0] = 0xE9;		cmd[2] = 0x22;		cmd[3] = 0x0E;		cmd[9] = sizeof(vector);		cmd[11] = 0;		if ((err=cmd.transport(READ,vector,sizeof(vector))))		    return sperror ("PLEXTOR_E9h(E)",err),1;		printf ("Unit will brand DVD+R DL media as DVD%s\n",			vector[2]?"-ROM":"+R DL");		return 0;		break;	case OPT_UNIT:	case OPT_UNITR:		cmd[0] = 0xE9;		cmd[1] = 0x10;		cmd[2] = 0x22;		cmd[3] = 0x0A;		cmd[5] = book&0xF0?0:1;		cmd[9] = sizeof(vector);		cmd[11] = 0;		if ((err=cmd.transport(READ,vector,sizeof(vector))))		    return sperror ("PLEXTOR_E9h(A)",err),1;		printf ("Unit was instructed to brand DVD+R media as DVD%s\n",			book&0xF0?"+R":"-ROM");		if (gen<3)	return 0;		cmd[0] = 0xE9;		cmd[1] = 0x10;		cmd[2] = 0x22;		cmd[3] = 0x0E;		cmd[5] = book&0xF0?0:1;		cmd[9] = sizeof(vector);		cmd[11] = 0;		if ((err=cmd.transport(READ,vector,sizeof(vector))))		    return sperror ("PLEXTOR_E9h(E)",err),1;		printf ("Unit was instructed to brand DVD+R DL media as DVD%s\n",			book&0xF0?"+R DL":"-ROM");		return 0;		break;	default:		break;    }  return mediainfo (cmd);}int lg (Scsi_Command &cmd,int action,int book){ int err;  unsigned char vector[4];    switch (action)    {	case OPT_INQ|OPT_MEDIA:		break;	case OPT_INQ|OPT_UNITRW:	case OPT_UNITRW:	case OPT_MEDIA:		fprintf (stderr,":-( DVD+RW booktyping is not supported\n");		return 1;		break;	case OPT_INQ:	case OPT_INQ|OPT_UNIT:	case OPT_INQ|OPT_UNITR:		cmd[0] = 0xFA;		cmd[8] = sizeof(vector);		cmd[9] = 0;		if ((err=cmd.transport(READ,vector,sizeof(vector))))		    return sperror ("LG_FAh",err),1;		printf ("Unit will brand DVD+R media as DVD%s\n",			vector[0]&0xF0?"+R":"-ROM");		printf ("Unit will brand DVD+R DL media as DVD%s\n",			vector[1]&0xF0?"+R DL":"-ROM");		return 0;		break;	case OPT_UNIT:	case OPT_UNITR:		memset (vector,0,sizeof(vector));		if (book&0xF0)		    vector[0] = 0xA0,	// DVD+R		    vector[1] = 0xE0;	// DVD+R DL		cmd[0] = 0xFC;		cmd[2] = '+';		cmd[3] = 'R';		cmd[4] = 'T';		cmd[5] = 'B';		cmd[8] = sizeof(vector);		cmd[9] = 0;		if ((err=cmd.transport(WRITE,vector,sizeof(vector))))		    return sperror ("LG_FCh",err),1;		printf ("Unit was instructed to brand DVD+R media as DVD%s\n",			book&0xF0?"+R":"-ROM");		return 0;		break;	default:		break;    }  return mediainfo (cmd);}int main(int argc,char *argv[]){ Scsi_Command  cmd;  unsigned char buf[128];  int book=0,action=0;  int plusgeneration=0,dashcapable=0,ramcapable=0;  int i,err,hp=0,plx=0;    for(dev=NULL,i=1;i<argc;i++)    {	if	(!strncmp (argv[i],"-dvd-rom",7))   book=0x01;	else if (!strncmp (argv[i],"-dvd+rw",7))    book=0x92;	else if (!strncmp (argv[i],"-dvd+r",6))     book=0xA1;	else if (!strncmp (argv[i],"-dvd-rw",7))    book=0x32;	else if (!strncmp (argv[i],"-dvd-r",6))     book=0x20;	else if (!strncmp (argv[i],"-inq",4))       book=0xFF, action|=OPT_INQ;	else if (!strncmp (argv[i],"-unit+rw",8))   action&=~OPT_MASK, action|=OPT_UNITRW;	else if (!strncmp (argv[i],"-unit+r",7))    action&=~OPT_MASK, action|=OPT_UNITR;	else if (!strncmp (argv[i],"-unit",3))      action&=~OPT_MASK, action|=OPT_UNIT;	else if (!strncmp (argv[i],"-media",3))     action&=~OPT_MASK, action|=OPT_MEDIA;	else					    dev=argv[i];    }    if (!(dev && book && action))    {	fprintf (stderr,"Usage: %s "			"[-dvd-rom-spec|-dvd+rw-spec|-dvd+r-spec|-inq] \\\n"			"       [-media|-unit|-unit+rw|-unit+r] "#if defined(_WIN32)			"d:\n",argv[0]),	fprintf (stderr,"For further information see http://"			"www.dvdplusrw.org/resources/bitsettings.html\n");#else			"/dev/dvd\n",argv[0]);#endif	return 1;    }    if (!cmd.associate(dev))    {	fprintf (stderr,"%s: unable to open: ",dev), perror (NULL);	return 1;    }    cmd[0] = 0x12;	// INQUIRY    cmd[4] = 36;    cmd[5] = 0;    if ((err=cmd.transport(READ,buf,36)))    {	sperror ("INQUIRY",err);	return 1;    }    if ((buf[0]&0x1F) != 5)    {	fprintf (stderr,":-( not an MMC unit!\n");	return 1;    }    hp =       !memcmp (buf+8,"HP      ",8);    hp = hp || !memcmp (buf+8,"_NEC    ",8);    plx =      !memcmp (buf+8,"PLEXTOR ",8);    cmd[0]=0x46;	// GET CONFIGURATION    cmd[1]=2;    cmd[8]=8;    cmd[9]=0;    if ((err=cmd.transport(READ,buf,8)))    {	sperror ("GET CONFIGURATION",err);	return 1;    }    // See if it's 2 gen drive by checking if DVD+R profile is an option.    // Catch dual- and triple-format units as well...    {	int len=4+(buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3]);	if (len>264)	{   fprintf (stderr,":-( insane profile list length [%d]\n",len);	    return 1;	}	unsigned char *list=new unsigned char[len];	cmd[0]=0x46;	// GET CONFIGURATION	cmd[1]=2;	cmd[7]=len>>8;	cmd[8]=len;	cmd[9]=0;	if ((err=cmd.transport(READ,list,len)))	    return sperror("GET CONFIGURATION",err),1;	for (plusgeneration=1,i=12;i<list[11];i+=4)	{   switch (list[i]<<8|list[i+1])	    {	case 0x1B:	// DVD+R supported			plusgeneration=2;	break;		case 0x2B:	// DVD+R DL supported			plusgeneration=3;	break;		case 0x11:	// DVD-R supported			dashcapable=1;		break;		case 0x12:	// DVD-RAM supported			ramcapable=1;		break;	    }	}	delete list;    }    profile=buf[6]<<8|buf[7];    if (action==(OPT_INQ|OPT_MEDIA))    { int ret=1;	if (profile&0x10 || profile==0x2B)	ret=mediainfo (cmd);	else if (profile==0)	fprintf (stderr,":-( no media mounted\n");	else			fprintf (stderr,":-( non-DVD media\n");	return ret;    }    if (!dashcapable || hp)    {	// See if it's a RICOH design...	cmd[0]=0x5A;	// MODE SENSE	cmd[1]=0x08;	// "Disable Block Descriptors"	cmd[2]=0x30;	// RICOH specific page	cmd[8]=12;	cmd[9]=0;	if (!(err=cmd.transport(READ,buf,12)) && buf[8] == 0x30)	    return ricoh (cmd,action,book,plusgeneration);	goto benq;    }    else if (plx)	// Plextor doesn't seem to re-badge their units...	return plextor (cmd,action,book,plusgeneration);    else if (ramcapable) // LG is the only one we know...	return lg (cmd,action,book);    else    {	// See if it's BTC design...	cmd[0]=0xFA;	cmd[4]=1;	cmd[10]=0xAA;	cmd[11]=0xFF;	if (!(err=cmd.transport()) || ASC(err)==0x24)	    return btc (cmd,action,book);	else if (ASC(err)==0x3A)	    return fprintf (stderr,":-( BTC_FAh: no media mounted\n"),1;	// See if it's LITE-ON design...	unsigned char buf[0x80];	cmd[0]=0xDF;	cmd[2]=0x0F;	cmd[7]=sizeof(buf);	cmd[11]=0;	if (!(err=cmd.transport(READ,buf,sizeof(buf))))	    return liteon (cmd,action,book,buf);    benq:	// See if it's BENQ design...	cmd[0]=0xFD;	cmd[1]=0xF1;	cmd[2]='B';	cmd[3]='E';	cmd[4]='N';	cmd[5]='Q';	cmd[11]=0;	if (!(err=cmd.transport()))	    return benq (cmd,action,book,plusgeneration);    }    fprintf (stderr,"This program targets units of "		    "RICOH, BENQ, BTC, LITE-ON, LG and PLEXTOR designs.\n"		    "%s doesn't appear to be one. Exiting.\n",		    dev);  return 1;}

⌨️ 快捷键说明

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