亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rarvm.java

?? 這是架包java-unrar-0.2.jar的源碼
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/*
 * Copyright (c) 2007 innoSysTec (R) GmbH, Germany. All rights reserved.
 * Original author: Edmund Wagner
 * Creation date: 31.05.2007
 *
 * Source: $HeadURL$
 * Last changed: $LastChangedDate$
 * 
 * the unrar licence applies to all junrar source and binary distributions 
 * you are not allowed to use this source to re-create the RAR compression algorithm
 * 
 * Here some html entities which can be used for escaping javadoc tags:
 * "&":  "&" or "&"
 * "<":  "&#060;" or "&lt;"
 * ">":  "&#062;" or "&gt;"
 * "@":  "&#064;" 
 */
package de.innosystec.unrar.unpack.vm;

import java.util.List;
import java.util.Vector;

import de.innosystec.unrar.crc.RarCRC;
import de.innosystec.unrar.io.Raw;

/**
 * DOCUMENT ME
 * 
 * @author $LastChangedBy$
 * @version $LastChangedRevision$
 */
public class RarVM extends BitInput {

	public static final int VM_MEMSIZE = 0x40000;

	public static final int VM_MEMMASK = (VM_MEMSIZE - 1);

	public static final int VM_GLOBALMEMADDR = 0x3C000;

	public static final int VM_GLOBALMEMSIZE = 0x2000;

	public static final int VM_FIXEDGLOBALSIZE = 64;

	private static final int regCount = 8;

	private static final long UINT_MASK = 0xffffFFFF;//((long)2*(long)Integer.MAX_VALUE);

	private byte[] mem;

	private int[] R = new int[regCount];

	private int flags;

	private int maxOpCount = 25000000;

	private int codeSize;

	private int IP;

	public RarVM() {
		mem = null;
	}

	public void init() {
		if (mem == null) {
			mem = new byte[VM_MEMSIZE + 4];
		}
	}

	private boolean isVMMem(byte[] mem) {
		return this.mem == mem;
	}

	private int getValue(boolean byteMode, byte[] mem, int offset) {
		if (byteMode) {
			if (isVMMem(mem)) {
				return (mem[offset]);
			} else {
				return (mem[offset] & 0xff);
			}
		} else {
			if (isVMMem(mem)) {
				//little
				return Raw.readIntLittleEndian(mem, offset);
			} else
				//big endian
				return Raw.readIntBigEndian(mem, offset);
		}
	}

	private void setValue(boolean byteMode, byte[] mem, int offset, int value) {
		if (byteMode) {
			if (isVMMem(mem)) {
				mem[offset] = (byte) value;
			} else {
				mem[offset] = (byte) ((mem[offset] & 0x00) | (byte) (value & 0xff));
			}
		} else {
			if (isVMMem(mem)) {
				Raw.writeIntLittleEndian(mem, offset, value);
//				mem[offset + 0] = (byte) value;
//				mem[offset + 1] = (byte) (value >>> 8);
//				mem[offset + 2] = (byte) (value >>> 16);
//				mem[offset + 3] = (byte) (value >>> 24);
			} else {
				Raw.writeIntBigEndian(mem, offset, value);
//				mem[offset + 3] = (byte) value;
//				mem[offset + 2] = (byte) (value >>> 8);
//				mem[offset + 1] = (byte) (value >>> 16);
//				mem[offset + 0] = (byte) (value >>> 24);
			}

		}
		// #define SET_VALUE(ByteMode,Addr,Value) SetValue(ByteMode,(uint
		// *)Addr,Value)
	}

	public void setLowEndianValue(byte[] mem, int offset, int value) {
		Raw.writeIntLittleEndian(mem, offset, value);
//		mem[offset + 0] = (byte) (value&0xff);
//		mem[offset + 1] = (byte) ((value >>> 8)&0xff);
//		mem[offset + 2] = (byte) ((value >>> 16)&0xff);
//		mem[offset + 3] = (byte) ((value >>> 24)&0xff);
	}
	public void setLowEndianValue(Vector<Byte> mem, int offset, int value) {
		mem.set(offset + 0, Byte.valueOf((byte) (value&0xff))) ;
		mem.set(offset + 1, Byte.valueOf((byte) ((value >>> 8)&0xff))); 
		mem.set(offset + 2, Byte.valueOf((byte) ((value >>> 16)&0xff) )); 
		mem.set(offset + 3, Byte.valueOf((byte) ((value >>> 24)&0xff))) ;
	}
	private int getOperand(VMPreparedOperand cmdOp) {
		int ret = 0;
		if (cmdOp.getType() == VMOpType.VM_OPREGMEM) {
			int pos = (cmdOp.getOffset() + cmdOp.getBase()) & VM_MEMMASK;
			ret = Raw.readIntLittleEndian(mem, pos);
		} else {
			int pos = cmdOp.getOffset();
			ret = Raw.readIntLittleEndian(mem, pos);
		}
		return ret;
	}

	public void execute(VMPreparedProgram prg) {
		for (int i = 0; i < prg.getInitR().length; i++) // memcpy(R,Prg->InitR,sizeof(Prg->InitR));
		{
			R[i] = prg.getInitR()[i];
		}

		long globalSize = Math
				.min(prg.getGlobalData().size(), VM_GLOBALMEMSIZE) & 0xffFFffFF;
		if (globalSize != 0) {
			for (int i = 0; i < globalSize; i++) // memcpy(Mem+VM_GLOBALMEMADDR,&Prg->GlobalData[0],GlobalSize);
			{
				mem[VM_GLOBALMEMADDR + i] = prg.getGlobalData().get(i);
			}

		}
		long staticSize = Math.min(prg.getStaticData().size(), VM_GLOBALMEMSIZE
				- globalSize) & 0xffFFffFF;
		if (staticSize != 0) {
			for (int i = 0; i < staticSize; i++) // memcpy(Mem+VM_GLOBALMEMADDR+GlobalSize,&Prg->StaticData[0],StaticSize);
			{
				mem[VM_GLOBALMEMADDR + (int) globalSize + i] = prg
						.getStaticData().get(i);
			}

		}
		R[7] = VM_MEMSIZE;
		flags = 0;

		List<VMPreparedCommand> preparedCode = prg.getAltCmd().size() != 0 ? prg
				.getAltCmd()
				: prg.getCmd();

		if (!ExecuteCode(preparedCode, prg.getCmdCount())) {
			preparedCode.get(0).setOpCode(VMCommands.VM_RET);
		}
		int newBlockPos = getValue(false, mem, VM_GLOBALMEMADDR + 0x20)
				& VM_MEMMASK;
		int newBlockSize = getValue(false, mem, VM_GLOBALMEMADDR + 0x1c)
				& VM_MEMMASK;
		if ((newBlockPos + newBlockSize) >= VM_MEMSIZE) {
			newBlockPos = 0;
			newBlockSize = 0;
		}

		prg.setFilteredDataOffset(newBlockPos);
		prg.setFilteredDataSize(newBlockSize);

		prg.getGlobalData().clear();

		int dataSize = Math.min(getValue(false, mem, VM_GLOBALMEMADDR + 0x30),
				VM_GLOBALMEMSIZE - VM_FIXEDGLOBALSIZE);
		if (dataSize != 0) {
			prg.getGlobalData().setSize(dataSize + VM_FIXEDGLOBALSIZE);
			// ->GlobalData.Add(dataSize+VM_FIXEDGLOBALSIZE);

			for (int i = 0; i < dataSize + VM_FIXEDGLOBALSIZE; i++) // memcpy(&Prg->GlobalData[0],&Mem[VM_GLOBALMEMADDR],DataSize+VM_FIXEDGLOBALSIZE);
			{
				prg.getGlobalData().set(i, mem[VM_GLOBALMEMADDR + i]);
			}
		}
	}

	public byte[] getMem()
	{
		return mem;
	}

	private boolean setIP(int ip) {
		if ((ip) >= codeSize) {
			return (true);
		}

		if (--maxOpCount <= 0) {
			return (false);
		}

		IP = ip;
		return true;
	}

	private boolean ExecuteCode(List<VMPreparedCommand> preparedCode,
			int cmdCount) {

		maxOpCount = 25000000;
		this.codeSize = cmdCount;
		this.IP = 0;
		
		while (true) {
			VMPreparedCommand cmd = preparedCode.get(IP);
			int op1 = getOperand(cmd.getOp1());
			int op2 = getOperand(cmd.getOp2());
			switch (cmd.getOpCode()) {
			case VM_MOV:
				setValue(cmd.isByteMode(), mem, op1, getValue(cmd.isByteMode(),
						mem, op2)); // SET_VALUE(Cmd->ByteMode,Op1,GET_VALUE(Cmd->ByteMode,Op2));
				break;
			case VM_MOVB:
				setValue(true, mem, op1, getValue(true, mem, op2));
				break;
			case VM_MOVD:
				setValue(false, mem, op1, getValue(false, mem, op2));
				break;

			case VM_CMP: {
				int value1 = getValue(cmd.isByteMode(), mem, op1);
				int result = value1 - getValue(cmd.isByteMode(), mem, op2);

				if (result == 0) {
					flags = VMFlags.VM_FZ.getFlag();
				} else {
					flags = (result > value1) ? 1 : 0 | (result & VMFlags.VM_FS
							.getFlag());
				}
			}
				break;

			case VM_CMPB: {
				int value1 = getValue(true, mem, op1);
				int result = value1 - getValue(true, mem, op2);
				if (result == 0) {
					flags = VMFlags.VM_FZ.getFlag();
				} else {
					flags = (result > value1) ? 1 : 0 | (result & VMFlags.VM_FS
							.getFlag());
				}
			}
				break;
			case VM_CMPD: {
				int value1 = getValue(false, mem, op1);
				int result = value1 - getValue(false, mem, op2);
				if (result == 0) {
					flags = VMFlags.VM_FZ.getFlag();
				} else {
					flags = (result > value1) ? 1 : 0 | (result & VMFlags.VM_FS
							.getFlag());
				}
			}
				break;

			case VM_ADD: {
				int value1 = getValue(cmd.isByteMode(), mem, op1);
				int result = (int) ((((long) value1 + (long) getValue(cmd
						.isByteMode(), mem, op2))) & 0xffffffff);
				if (cmd.isByteMode()) {
					result &= 0xff;
					flags = (result < value1) ? 1
							: 0 | (result == 0 ? VMFlags.VM_FZ.getFlag()
									: ((result & 0x80) != 0) ? VMFlags.VM_FS
											.getFlag() : 0);
					// Flags=(Result<Value1)|(Result==0 ? VM_FZ:((Result&0x80) ?
					// VM_FS:0));
				} else
					flags = (result < value1) ? 1
							: 0 | (result == 0 ? VMFlags.VM_FZ.getFlag()
									: (result & VMFlags.VM_FS.getFlag()));
				setValue(cmd.isByteMode(), mem, op1, result);
			}
				break;

			case VM_ADDB:
				setValue(true, mem, op1,
						(int) ((long) getValue(true, mem, op1) & 0xFFffFFff
								+ (long) getValue(true, mem, op2) & 0xFFffFFff));
				break;
			case VM_ADDD:
				setValue(
						false,
						mem,
						op1,
						(int) ((long) getValue(false, mem, op1) & 0xFFffFFff
								+ (long) getValue(false, mem, op2) & 0xFFffFFff));
				break;

			case VM_SUB: {
				int value1 = getValue(cmd.isByteMode(), mem, op1);
				int result = (int) ((long) value1 & 0xffFFffFF
						- (long) getValue(cmd.isByteMode(), mem, op2) & 0xFFffFFff);
				flags = (result == 0) ? VMFlags.VM_FZ.getFlag()
						: (result > value1) ? 1 : 0 | (result & VMFlags.VM_FS
								.getFlag());
				setValue(cmd.isByteMode(), mem, op1, result);// (Cmd->ByteMode,Op1,Result);
			}
				break;

			case VM_SUBB:
				setValue(true, mem, op1,
						(int) ((long) getValue(true, mem, op1) & 0xFFffFFff
								- (long) getValue(true, mem, op2) & 0xFFffFFff));
				break;
			case VM_SUBD:
				setValue(
						false,
						mem,
						op1,
						(int) ((long) getValue(false, mem, op1) & 0xFFffFFff
								- (long) getValue(false, mem, op2) & 0xFFffFFff));
				break;

			case VM_JZ:
				if ((flags & VMFlags.VM_FZ.getFlag()) != 0) {
					setIP(getValue(false, mem, op1));
					continue;
				}
				break;
			case VM_JNZ:
				if ((flags & VMFlags.VM_FZ.getFlag()) == 0) {
					setIP(getValue(false, mem, op1));
					continue;
				}
				break;
			case VM_INC: {
				int result = (int) ((long) getValue(cmd.isByteMode(), mem, op1) & 0xFFffFFff + 1);
				if (cmd.isByteMode()) {
					result &= 0xff;
				}

				setValue(cmd.isByteMode(), mem, op1, result);
				flags = result == 0 ? VMFlags.VM_FZ.getFlag() : result
						& VMFlags.VM_FS.getFlag();
			}
				break;

			case VM_INCB:
				setValue(
						true,
						mem,
						op1,
						(int) ((long) getValue(true, mem, op1) & 0xFFffFFff + 1));
				break;
			case VM_INCD:
				setValue(false, mem, op1, (int) ((long) getValue(false, mem,
						op1) & 0xFFffFFff + 1));
				break;

			case VM_DEC: {
				int result = (int) ((long) getValue(cmd.isByteMode(), mem, op1) & 0xFFffFFff - 1);
				setValue(cmd.isByteMode(), mem, op1, result);
				flags = result == 0 ? VMFlags.VM_FZ.getFlag() : result
						& VMFlags.VM_FS.getFlag();
			}
				break;

			case VM_DECB:
				setValue(
						true,
						mem,
						op1,
						(int) ((long) getValue(true, mem, op1) & 0xFFffFFff - 1));
				break;
			case VM_DECD:
				setValue(false, mem, op1, (int) ((long) getValue(false, mem,
						op1) & 0xFFffFFff - 1));
				break;

			case VM_JMP:
				setIP(getValue(false, mem, op1));
				continue;
			case VM_XOR: {
				int result = getValue(cmd.isByteMode(), mem, op1)
						^ getValue(cmd.isByteMode(), mem, op2);
				flags = result == 0 ? VMFlags.VM_FZ.getFlag() : result
						& VMFlags.VM_FS.getFlag();
				setValue(cmd.isByteMode(), mem, op1, result);
			}
				break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美喷水一区二区| www久久精品| 怡红院av一区二区三区| 成人精品国产免费网站| 精品日韩99亚洲| 天天综合日日夜夜精品| 欧美亚洲尤物久久| 亚洲最大成人网4388xx| 色婷婷综合中文久久一本| 亚洲人吸女人奶水| 99r国产精品| 成人免费在线视频| 91猫先生在线| 亚洲精品视频在线观看网站| 日本韩国一区二区三区视频| 亚洲黄色尤物视频| 欧美色视频在线观看| 亚洲国产一区二区a毛片| 欧美私人免费视频| 日韩国产欧美视频| 日韩欧美国产一二三区| 国产在线精品不卡| 精品一区二区免费在线观看| 日韩一区二区三区视频在线| 久久国产综合精品| 久久先锋影音av鲁色资源| 国产中文字幕一区| 中文字幕精品一区二区精品绿巨人| 风间由美性色一区二区三区| 日韩一区中文字幕| 欧美性受xxxx| 久久成人免费网站| 国产视频不卡一区| 99热国产精品| 亚洲成人1区2区| 日韩美女一区二区三区四区| 国产九色sp调教91| 一区在线观看免费| 欧美午夜精品一区二区三区| 蜜臀av亚洲一区中文字幕| 久久女同精品一区二区| 白白色亚洲国产精品| 一区二区三区欧美亚洲| 欧美一区日韩一区| 国产精品亚洲人在线观看| 中文字幕制服丝袜一区二区三区| 欧洲精品视频在线观看| 蜜臀av性久久久久蜜臀av麻豆| 2024国产精品| 色噜噜狠狠色综合欧洲selulu| 丝袜美腿亚洲色图| 久久久久久久电影| 日本高清不卡视频| 麻豆一区二区三区| 亚洲天堂成人在线观看| 91精品国产欧美一区二区18 | 日本亚洲天堂网| 久久久国产午夜精品 | av亚洲精华国产精华精华| 亚洲国产综合91精品麻豆| 精品久久久久99| 91麻豆自制传媒国产之光| 玖玖九九国产精品| 成人欧美一区二区三区小说 | 国产精品久久久久久一区二区三区| 欧美在线观看一二区| 国产一区二区视频在线播放| 成人天堂资源www在线| 一区二区三区欧美在线观看| 欧美一区二区黄| av色综合久久天堂av综合| 日韩综合一区二区| 国产精品不卡一区| 91精品国产色综合久久不卡蜜臀 | 欧美自拍偷拍午夜视频| 美女一区二区在线观看| 综合分类小说区另类春色亚洲小说欧美| 欧美日韩精品三区| 成人深夜在线观看| 欧美bbbbb| 亚洲最大成人网4388xx| 中文久久乱码一区二区| 欧美一区二区在线视频| 91美女视频网站| 国产高清不卡一区二区| 青青草视频一区| 亚洲日本一区二区三区| 久久夜色精品国产欧美乱极品| 日本道在线观看一区二区| 国产一区二区久久| 秋霞国产午夜精品免费视频| 成人欧美一区二区三区视频网页 | **欧美大码日韩| 精品国产免费久久| 欧美色综合天天久久综合精品| 国产成人在线影院| 老鸭窝一区二区久久精品| 亚洲一级片在线观看| 国产精品美女久久久久久久久 | 午夜免费欧美电影| 亚洲美女视频在线观看| 国产三级欧美三级| 精品久久久久久久人人人人传媒| 欧美日韩国产a| 91成人免费在线视频| 成人黄色大片在线观看| 国产乱理伦片在线观看夜一区| 日精品一区二区| 亚洲不卡在线观看| 一区二区三区四区激情| 国产精品五月天| 国产欧美精品国产国产专区| 日韩欧美高清在线| 欧美精品一二三区| 欧美性大战xxxxx久久久| 一本大道久久精品懂色aⅴ| av一二三不卡影片| 成人国产电影网| 国产成人aaaa| 国产a区久久久| 国产不卡高清在线观看视频| 久久丁香综合五月国产三级网站| 日韩精品国产欧美| 午夜精品视频一区| 亚洲成av人片一区二区三区| 亚洲免费在线视频| 亚洲欧美电影一区二区| 综合久久久久久久| 亚洲丝袜制服诱惑| 亚洲欧美色图小说| 中文字幕在线观看一区二区| 国产精品日韩成人| 日韩毛片视频在线看| 日韩毛片一二三区| 一区二区在线免费| 亚洲成在线观看| 天天影视色香欲综合网老头| 日韩成人av影视| 久色婷婷小香蕉久久| 精品一区二区精品| 国产乱码精品一区二区三区av| 国产一区在线看| 国产精品一二三四| 国产.精品.日韩.另类.中文.在线.播放| 国产乱码一区二区三区| 国产不卡免费视频| 91色.com| 欧美日韩在线综合| 欧美一区二区三区视频在线 | 丝袜亚洲另类欧美| 麻豆91在线播放免费| 国产精品一区2区| av在线免费不卡| 欧美最新大片在线看 | 欧美性猛交xxxx黑人交| 678五月天丁香亚洲综合网| 欧美一区二区三区四区高清 | 久久久久国产成人精品亚洲午夜| 久久久久久麻豆| 国产精品第五页| 一区二区三区在线视频免费观看 | 日日夜夜一区二区| 久久99国产乱子伦精品免费| 福利一区在线观看| 色综合中文综合网| 欧美日韩的一区二区| 欧美videos大乳护士334| 国产亲近乱来精品视频 | 亚洲最大的成人av| 免费精品视频在线| 国产成人av电影在线| 91官网在线观看| 欧美一区二区国产| 国产女人aaa级久久久级| 亚洲最大成人综合| 久久99久久久久久久久久久| 成人性视频网站| 精品1区2区3区| 久久免费偷拍视频| 夜夜夜精品看看| 精品一区二区三区免费观看| 91小宝寻花一区二区三区| 欧美日韩mp4| 国产欧美日韩精品在线| 亚洲色欲色欲www在线观看| 日本伊人色综合网| 成人av综合一区| 91精品免费在线观看| 国产精品久久久久影院色老大| 亚洲不卡在线观看| 国产成人高清在线| 欧美日韩国产高清一区| 欧美韩国日本不卡| 日韩av中文字幕一区二区| 懂色av一区二区三区免费观看 | 91一区在线观看| 欧美大片国产精品| 亚洲免费在线观看视频| 国产一区二区三区日韩| 欧美色综合久久|