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

📄 apple_driver.c

📁 创建一个符合iso-9660标准的iso文件系统
💻 C
字号:
/***	apple_driver.c: extract Mac partition label, maps and boot driver****	Based on Apple_Driver.pl, part of "mkisofs 1.05 PLUS" by Andy Polyakov**	<appro@fy.chalmers.se> (I don't know Perl, so I rewrote it C ...)**	(see http://fy.chalmers.se/~appro/mkisofs_plus.html for details)****	usage: apple_driver CDROM_device > HFS_driver_file**	**	The format of the HFS driver file:****	HFS CD Label Block				512 bytes**	Driver Partition Map (for 2048 byte blocks)	512 bytes**	Driver Partition Map (for 512 byte blocks)	512 bytes**	Empty						512 bytes**	Driver Partition				N x 2048 bytes**	HFS Partition Boot Block			1024 bytes****	By extracting a driver from an Apple CD, you become liable to obey**	Apple Computer, Inc. Software License Agreements.****	James Pearson 17/5/98*/#include <config.h>#include <mkisofs.h>#include <mac_label.h>#include <standard.h>#include <schily.h>EXPORT	int	get_732	__PR((char *p));EXPORT	int	get_722	__PR((char *p));EXPORT	int	main	__PR((int argc, char **argv));EXPORT intget_732(p)	char	*p;{	return ((p[3] & 0xff)	     | ((p[2] & 0xff) << 8)	     | ((p[1] & 0xff) << 16)	     | ((p[0] & 0xff) << 24));}EXPORT intget_722(p)	char	*p;{	return ((p[1] & 0xff)	     | ((p[0] & 0xff) << 8));}EXPORT intmain(argc, argv)	int	argc;	char	**argv;{	FILE		*fp;	MacLabel	*mac_label;	MacPart		*mac_part;	unsigned char	Block0[HFS_BLOCKSZ];	unsigned char	block[SECTOR_SIZE];	unsigned char	bootb[2*HFS_BLOCKSZ];	unsigned char	pmBlock512[HFS_BLOCKSZ];	unsigned int	sbBlkSize;	unsigned int	pmPyPartStart;	unsigned int	pmPartStatus;	unsigned int	pmMapBlkCnt;	int		have_boot = 0, have_hfs = 0;	int		hfs_start;	int		i, j;	save_args(argc, argv);	if (argc != 2)	    comerrno(EX_BAD, "Usage: %s device-path", argv[0]);	if ((fp = fopen(argv[1], "rb")) == NULL)	    comerr("Can't open '%s'.", argv[1]);	if (fread(Block0, 1, HFS_BLOCKSZ, fp) != HFS_BLOCKSZ)	    comerr("Can't read '%s'.", argv[1]);	mac_label = (MacLabel *)Block0;	mac_part = (MacPart *)block;		sbBlkSize = get_722((char *)mac_label->sbBlkSize);	if (! IS_MAC_LABEL(mac_label) || sbBlkSize != SECTOR_SIZE)	    comerrno(EX_BAD, "%s is not a bootable Mac disk", argv[1]);	i = 1;	do {	    if (fseek(fp, i * HFS_BLOCKSZ, 0) != 0)		comerr("Ccan't seek %s", argv[1]);	    if (fread(block, 1, HFS_BLOCKSZ, fp) != HFS_BLOCKSZ)		comerr("Can't read '%s'.", argv[1]);	    pmMapBlkCnt = get_732((char *)mac_part->pmMapBlkCnt);	    if (!have_boot && !strncmp((char *)mac_part->pmPartType, pmPartType_2, 12)) {		hfs_start = get_732((char *)mac_part->pmPyPartStart);		fprintf(stderr, "%s: found 512 driver partition (at block %d)\n", argv[0], hfs_start);		memcpy(pmBlock512, block, HFS_BLOCKSZ);		have_boot = 1;	    }	    if (!have_hfs && !strncmp((char *)mac_part->pmPartType, pmPartType_4, 9)) {		hfs_start = get_732((char *)mac_part->pmPyPartStart);		if (fseek(fp, hfs_start*HFS_BLOCKSZ, 0) != 0)		    comerr("Can't seek '%s'.", argv[1]);		if (fread(bootb, 2, HFS_BLOCKSZ, fp) != HFS_BLOCKSZ)		    comerr("Can't read '%s'.", argv[1]);		if (get_722((char *)bootb) == 0x4c4b) {		    fprintf(stderr, "%s: found HFS partition (at blk %d)\n", argv[0], hfs_start);		    have_hfs = 1;		}	    }	} while (i++ < pmMapBlkCnt);	if (!have_hfs || !have_boot)	    comerrno(EX_BAD, "%s is not a bootable Mac disk", argv[1]);	i = 1;	do {	    if (fseek(fp, i*sbBlkSize, 0) != 0)		comerr("Can't seek '%s'.", argv[1]);	    if (fread(block, 1, HFS_BLOCKSZ, fp) != HFS_BLOCKSZ)		comerr("Can't read '%s'.", argv[1]);	    pmMapBlkCnt = get_732((char *)mac_part->pmMapBlkCnt);	    if (!strncmp((char *)mac_part->pmPartType, pmPartType_2, 12)) {		int	start, num;		fprintf(stderr, "%s: extracting %s ", argv[0], mac_part->pmPartType);		start = get_732((char *)mac_part->pmPyPartStart);		num = get_732((char *)mac_part->pmPartBlkCnt);		fwrite(Block0, 1, HFS_BLOCKSZ, stdout);		fwrite(block, 1, HFS_BLOCKSZ, stdout);		fwrite(pmBlock512, 1, HFS_BLOCKSZ, stdout);		memset(block, 0, HFS_BLOCKSZ);		fwrite(block, 1, HFS_BLOCKSZ, stdout);		if (fseek(fp, start*sbBlkSize, 0) != 0)		    comerr("Can't seek '%s'.", argv[1]);		for (j=0;j<num;j++) {		    if (fread(block, 1, sbBlkSize, fp) != sbBlkSize)			comerr("Can't read '%s'.", argv[1]);		    fwrite(block, 1, sbBlkSize, stdout);		    fprintf(stderr, ".");		}		fprintf(stderr, "\n");		fwrite(bootb, 2, HFS_BLOCKSZ, stdout);		fclose(fp);		exit (0);	    }	    if (! IS_MAC_PART(mac_part) )		comerrno(EX_BAD, "Unable to find boot partition", 0);	} while (i++ < pmMapBlkCnt);	return (0);}

⌨️ 快捷键说明

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