ibmpartitiontableentry.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 159 行

JAVA
159
字号
/*
 * $Id: IBMPartitionTableEntry.java,v 1.6 2004/01/24 23:43:40 gbin Exp $
 */
package org.jnode.fs.partitions.ibm;

import org.jnode.fs.partitions.PartitionTableEntry;
import org.jnode.fs.util.CHS;
import org.jnode.fs.util.DosUtils;
import org.jnode.util.NumberUtils;

/**
 * @author epr
 */
public class IBMPartitionTableEntry implements PartitionTableEntry {
	

	//private final int partNr;
	private final byte[] bs;
	private final int ofs;
	
	public IBMPartitionTableEntry(byte[] bs, int partNr) {
		this.bs = bs;
		//this.partNr = partNr;
		this.ofs = 446 + (partNr*16);
		// THIS CHANGE BROKE THE BUILD. RUNNING IN VMWARE BROKE!
		//this.ofs = 494 - (partNr*16);
	}
	
	public boolean isValid() {
		return !isEmpty();
	}
	
	public boolean isEmpty() {
		return (getSystemIndicator() == IBMPartitionTypes.PARTTYPE_EMPTY);
	}
	

	public boolean isExtended() {
		final int id = getSystemIndicator();
		//pgwiasda
		//there are more than one type of extended Partitions
		return (id == IBMPartitionTypes.PARTTYPE_WIN95_FAT32_EXTENDED ||
				id == IBMPartitionTypes.PARTTYPE_LINUX_EXTENDED ||
				id == IBMPartitionTypes.PARTTYPE_DOS_EXTENDED);
	}
	
	public boolean getBootIndicator() {
		return (DosUtils.get8(bs, ofs+0) == 0x80);
	}

	public void setBootIndicator(boolean active) {
		DosUtils.set8(bs, ofs+0, (active) ? 0x80 : 0);
	}

	public CHS getStartCHS() {
		int v1 = DosUtils.get8(bs, ofs+1);
		int v2 = DosUtils.get8(bs, ofs+2);
		int v3 = DosUtils.get8(bs, ofs+3);
		/*
		 * h = byte1;
		 * s = byte2 & 0x3f;
		 * c = ((byte2 & 0xc0) << 2) + byte3;
		 */ 
		return new CHS(((v2 & 0xc0) << 2) + v3, v1, v2 & 0x3f);
	}

	public void setStartCHS(CHS chs) {
		DosUtils.set8(bs, ofs+1, Math.min(1023, chs.getHead()));
		DosUtils.set8(bs, ofs+2, ((chs.getCylinder() >> 2) & 0xC0) + (chs.getSector() & 0x3f));
		DosUtils.set8(bs, ofs+3, chs.getCylinder() & 0xFF);
	}

	public int getSystemIndicator() {
		return DosUtils.get8(bs, ofs+4);
	}

	public void setSystemIndicator(int v) {
		DosUtils.set8(bs, ofs+4, v);
	}

	public CHS getEndCHS() {
		int v1 = DosUtils.get8(bs, ofs+5);
		int v2 = DosUtils.get8(bs, ofs+6);
		int v3 = DosUtils.get8(bs, ofs+7);
		/*
		 * h = byte1;
		 * s = byte2 & 0x3f;
		 * c = ((byte2 & 0xc0) << 2) + byte3;
		 */ 
		return new CHS(((v2 & 0xc0) << 2) + v3, v1, v2 & 0x3f);
	}

	public void setEndCHS(CHS chs) {
		DosUtils.set8(bs, ofs+5, chs.getHead());
		DosUtils.set8(bs, ofs+6, ((chs.getCylinder() >> 2) & 0xC0) + (chs.getSector() & 0x3f));
		DosUtils.set8(bs, ofs+7, chs.getCylinder() & 0xFF);
	}

	public long getStartLba() {
		return DosUtils.get32(bs, ofs+8);
	}

	public void setStartLba(long v) {
		DosUtils.set32(bs, ofs+8, v);
	}

	public long getNrSectors() {
		return DosUtils.get32(bs, ofs+12);
	}

	public void setNrSectors(long v) {
		DosUtils.set32(bs, ofs+12, v);
	}
	
	public void clear() {
		for (int i = 0; i < 16; i++) {
			DosUtils.set8(bs, ofs+i, 0);
		}		
	}
	
	public String dump() {
		StringBuffer b = new StringBuffer();
		for (int i = 0; i < 16; i++) {
			b.append(NumberUtils.hex(DosUtils.get8(bs, ofs+i),2));
			b.append(' ');
		}
		return b.toString();
	}
	/**
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		StringBuffer b = new StringBuffer();
		
		b.append('[');
		
		b.append(getBootIndicator() ? "A" : " ");
		b.append(' ');
		b.append(NumberUtils.hex(getSystemIndicator(), 2));
		b.append(' ');
		b.append("s:"+getStartLba());
		b.append(' ');
		long tmp = getStartLba() + getNrSectors();
		b.append("e:"+ tmp);
		//b.append(NumberUtils.hex(getStartLba(), 8));
		//b.append('+');
		//b.append(NumberUtils.hex(getNrSectors(), 8));
		//b.append(' ');
		//b.append(getStartCHS());
		//b.append('-');
		//b.append(getEndCHS());
		
		b.append(']');
		
		return b.toString();
	}

}

⌨️ 快捷键说明

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