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

📄 dos.c

📁 Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器
💻 C
字号:
#include <stdio.h>#include "partx.h"#include "dos.h"static intis_extended(int type) {	return (type == 5 || type == 0xf || type == 0x85);}/* assemble badly aligned little endian integer */static inline unsigned intassemble4le(unsigned char *p) {	return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);}static inline unsigned intpartition_start(struct partition *p) {	return assemble4le(&(p->start_sect[0]));}static inline unsigned intpartition_size(struct partition *p) {	return assemble4le(&(p->nr_sects[0]));}static intread_extended_partition(int fd, struct partition *ep,			struct slice *sp, int ns){	struct partition *p;	unsigned long start, here;	unsigned char *bp;	int loopct = 0;	int moretodo = 1;	int i, n=0;	here = start = partition_start(ep);;	while (moretodo) {		moretodo = 0;		if (++loopct > 100)			return n;		bp = getblock(fd, here);		if (bp == NULL)			return n;		if (bp[510] != 0x55 || bp[511] != 0xaa)			return n;		p = (struct partition *) (bp + 0x1be);		for (i=0; i<2; i++, p++) {			if (partition_size(p) == 0 || is_extended(p->sys_type))				continue;			if (n < ns) {				sp[n].start = here + partition_start(p);				sp[n].size = partition_size(p);				n++;			} else {				fprintf(stderr,				    "dos_extd_partition: too many slices\n");				return n;			}			loopct = 0;		}		p -= 2;		for (i=0; i<2; i++, p++) {			if (partition_size(p) != 0 &&			    is_extended(p->sys_type)) {				here = start + partition_start(p);				moretodo = 1;				break;			}		}	}	return n;}static intis_gpt(int type) {	return (type == 0xEE);}intread_dos_pt(int fd, struct slice all, struct slice *sp, int ns) {	struct partition *p;	unsigned long offset = all.start;	int i, n=0;	unsigned char *bp;	bp = getblock(fd, offset);	if (bp == NULL)		return -1;	if (bp[510] != 0x55 || bp[511] != 0xaa)		return -1;	p = (struct partition *) (bp + 0x1be);	for (i=0; i<4; i++) {		if (is_gpt(p->sys_type))			return 0;		p++;	}	p = (struct partition *) (bp + 0x1be);	for (i=0; i<4; i++) {		/* always add, even if zero length */		if (n < ns) {			sp[n].start = partition_start(p);			sp[n].size = partition_size(p);			n++;		} else {			fprintf(stderr,				"dos_partition: too many slices\n");			break;		}		p++;	}	p = (struct partition *) (bp + 0x1be);	for (i=0; i<4; i++) {		if (is_extended(p->sys_type))			n += read_extended_partition(fd, p, sp+n, ns-n);		p++;	}	return n;}

⌨️ 快捷键说明

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