void FromAdapterInfo( Kxe_KAdapterInfo_Param& infoParam, const KAdapterInfo& info ) { infoParam.ConnGuidId = info.m_ConnGuidId; infoParam.ConnName = info.m_ConnName; infoParam.ConnStatus = (int)info.m_ConnStatus; infoParam.ConnMedia = (int)info.m_ConnMedia; infoParam.DeviceName = info.m_DeviceName; infoParam.uHostIp = info.m_uHostIp; infoParam.uGatewayIp = info.m_uGatewayIp; FromMAC( &(infoParam.vecHostMac), info.m_HostMac ); FromMAC( &(infoParam.vecGatewayMac), info.m_GatewayMac ); infoParam.strHostName = info.m_strHostName; infoParam.strGateName = info.m_strGateName; infoParam.bWireless = info.m_bWireless; infoParam.bAttackGate = info.m_bAttackGate; infoParam.bAttackInter = info.m_bAttackInter; infoParam.adapterFlux.dwLow = LOINT64( info.m_adapterFlux ); infoParam.adapterFlux.dwHigh = HIINT64( info.m_adapterFlux ); }
u4 ExecutionEngine::Execute(Frame* pFrameStack) { //ASSERT(pFrameStack); Frame* pFrame=&pFrameStack[0]; //ASSERT(pFrame); u1 *bc=pFrame->pMethod->pCode_attr->code + pFrame->pc; i4 error=0; JavaClass *pClass = pFrame->pClass; QString strMethod; pClass->GetStringFromConstPool(pFrame->pMethod->name_index, strMethod); i4 index=0; qint64 longVal; while(1) { switch(bc[pFrame->pc]) { case nop: pFrame->pc++; break; ///////////////// Stack Operations //////////////// //Instructions that push a constant onto the stack case iconst_m1: case iconst_0: case iconst_1: case iconst_2: case iconst_3: case iconst_4: case iconst_5: pFrame->sp++; pFrame->stack[pFrame->sp].intValue = (u1)bc[pFrame->pc]-iconst_0; pFrame->pc++; break; case aconst_null: pFrame->sp++; pFrame->stack[pFrame->sp].object.index = 0; pFrame->pc++; break; case lconst_0:// 9 /*(0x9)*/ case lconst_1:// 10 /*(0xa)*/ pFrame->sp++; pFrame->stack[pFrame->sp].intValue=0; pFrame->sp++; pFrame->stack[pFrame->sp].intValue=(u1)bc[pFrame->pc]-lconst_0; pFrame->pc++; break; case bipush:// 16 /*(0x10)*/ pFrame->sp++; pFrame->stack[pFrame->sp].charValue=(u1)bc[pFrame->pc+1]; pFrame->pc+=2; break; case sipush:// 17 /*(0x11)*/ pFrame->sp++; pFrame->stack[pFrame->sp].shortValue=getu2(&bc[pFrame->pc+1]); pFrame->pc+=3; break; case ldc: //Push item from constant pool pFrame->stack[++pFrame->sp] =LoadConstant(pFrame->pClass, (u1)bc[pFrame->pc+1]); pFrame->pc+=2; break; case ldc2_w:// 20 /*(0x14)*/ index=getu2(&bc[pFrame->pc+1]); pFrame->sp++; pFrame->stack[pFrame->sp].intValue = getu4(&((char *)pClass->constant_pool[index])[1]); pFrame->sp++; pFrame->stack[pFrame->sp].intValue = getu4(&((char *)pClass->constant_pool[index])[5]); pFrame->pc += 3; break; //Instructions that load a local variable onto the stack case aload:// 25 /*(0x19)*/ pFrame->sp++; pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc+1]]; pFrame->pc+=2; break; case iload:// 21 /*(0x15)*/ pFrame->sp++; pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc+1]]; pFrame->pc+=2; break; case iload_0: //26 Load int from local variable 0 case iload_1: //27 Load int from local variable 1 case iload_2: //28 Load int from local variable 2 case iload_3: //29 Load int from local variable 3 pFrame->sp++; pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc]-iload_0]; pFrame->pc++; break; case lload:// 22 /*(0x16)*/ break; case lload_0:// 30 /*(0x1e) */ case lload_1:// 31 /*(0x1f) */ case lload_2:// 32 /*(0x20) */ case lload_3:// 33 /*(0x21) */ pFrame->sp++; pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc]-lload_0]; pFrame->sp++; pFrame->stack[pFrame->sp]=pFrame->stack[(u1)bc[pFrame->pc]-lload_0+1]; pFrame->pc++; break; case fload_0: // 34 /*(0x22)*/ case fload_1: // 35 /*(0x23) */ case fload_2: // 36 /*(0x24) */ case fload_3: // 37 /*(0x25)*/ pFrame->sp++; pFrame->stack[pFrame->sp] = pFrame->stack[(u1)bc[pFrame->pc]-fload_0]; pFrame->pc++; break; case aload_0: //42 Load reference from local variable 0 case aload_1: //Load reference from local variable 1 case aload_2: //Load reference from local variable 2 case aload_3: //Load reference from local variable 3 pFrame->sp++; pFrame->stack[pFrame->sp]= pFrame->stack[(u1)bc[pFrame->pc]-aload_0]; DumpObject(pFrame->stack[pFrame->sp].object); pFrame->pc++; break; case iaload:// 46 /*(0x2e)*/Load int from array //..., arrayref, index => ..., value pFrame->stack[pFrame->sp-1]=pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-1].object)[pFrame->stack[pFrame->sp].intValue+1]; pFrame->sp--; pFrame->pc++; break; case aaload://50 //..., arrayref, index ..., value pFrame->stack[pFrame->sp-1]=pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-1].object)[pFrame->stack[pFrame->sp].intValue+1]; pFrame->sp--; pFrame->pc++; break; //Instructions that store a value from the stack into a local variable case astore:// 58 (0x3a) pFrame->stack[(u1)bc[pFrame->pc+1]]=pFrame->stack[pFrame->sp--]; pFrame->pc+=2; break; case istore:// 54 /*(0x36)*/ pFrame->stack[(u1)bc[pFrame->pc+1]]=pFrame->stack[pFrame->sp--]; pFrame->pc+=2; break; case istore_0: // 59 /*(0x3b)*/ case istore_1: // 60 /*(0x3c) */ case istore_2: // 61 /*(0x3d) */ case istore_3: // 62 /*(0x3e)*/ pFrame->stack[(u1)bc[pFrame->pc]-istore_0]=pFrame->stack[pFrame->sp--]; pFrame->pc++; break; case lstore_0: // 63 /*(0x3f) */ case lstore_1: // 64 /*(0x40) */ case lstore_2: // 65 /*(0x41) */ case lstore_3: // 66 /*(0x42) */ pFrame->stack[(u1)bc[pFrame->pc]-lstore_0+1]=pFrame->stack[pFrame->sp--]; pFrame->stack[(u1)bc[pFrame->pc]-lstore_0]=pFrame->stack[pFrame->sp--]; pFrame->pc++; break; case fstore_0: case fstore_1: case fstore_2: case fstore_3: pFrame->stack[(u1)bc[pFrame->pc]-fstore_0]=pFrame->stack[pFrame->sp--]; pFrame->pc++; break; case astore_0:// 75 /*(0x4b) Store reference into local variable 0*/ case astore_1:// 76 /*(0x4c) */ case astore_2:// 77 /*(0x4d) */ case astore_3:// 78 /*(0x4e)*/ pFrame->stack[(u1)bc[pFrame->pc]-astore_0]=pFrame->stack[pFrame->sp--]; pFrame->pc++; break; case iastore:// 79 /*(0x4f)*/ case aastore: // 83 - both seems same (TODO: Check it) pObjectHeap->GetObjectPointer(pFrame->stack[pFrame->sp-2].object)[pFrame->stack[pFrame->sp-1].intValue+1]=pFrame->stack[pFrame->sp]; pFrame->sp-=3; pFrame->pc++; break; //Generic (typeless) stack operations case dup:// 89 /*(0x59)*/ pFrame->stack[pFrame->sp+1]=pFrame->stack[pFrame->sp]; pFrame->sp++; pFrame->pc++; break; case dup_x1:// 90 /*(0x5a)*/ pFrame->stack[pFrame->sp+1]=pFrame->stack[pFrame->sp]; pFrame->stack[pFrame->sp]=pFrame->stack[pFrame->sp-1]; pFrame->stack[pFrame->sp-1]=pFrame->stack[pFrame->sp+1]; pFrame->sp++; pFrame->pc++; break; case dup_x2:// 91 /*(0x5b)*/ error=1; break; //Type Conversion //Integer Arithmetic case iadd: //96 pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue + pFrame->stack[pFrame->sp].intValue; pFrame->sp--; pFrame->pc++; break; case ladd:// 97 /*(0x61)*/ longVal = (qint64)(((qint64)pFrame->stack[pFrame->sp-3].intValue<<32) | (qint64)pFrame->stack[pFrame->sp-2].intValue)+(qint64)(((qint64)pFrame->stack[pFrame->sp-1].intValue<<32) | (qint64)pFrame->stack[pFrame->sp].intValue); pFrame->stack[pFrame->sp-3].intValue=HIINT64(longVal); pFrame->stack[pFrame->sp-2].intValue=LOINT64(longVal); pFrame->sp -= 2; pFrame->pc++; break; case isub: //100 pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue - pFrame->stack[pFrame->sp].intValue; pFrame->sp--; pFrame->pc++; break; case imul://104 pFrame->stack[pFrame->sp-1].intValue=pFrame->stack[pFrame->sp-1].intValue * pFrame->stack[pFrame->sp].intValue; pFrame->sp--; pFrame->pc++; break; case iinc:// 132 /*(0x84)*/ Increment local variable by constant pFrame->stack[(u1)bc[pFrame->pc+1]].intValue += (char)bc[pFrame->pc+2]; pFrame->pc+=3; break; ////////////////////// Logic /////////////////// //Shift operations //Bitwise boolean operations //Floating Point Arithmetic /////////////// Objects and Arrays //////////// //Instructions that deal with objects case _new:// 187 (0xbb) ExecuteNew(pFrame); pFrame->pc+=3; break; case putfield: //181 (0xb5): Set field in object PutField(pFrame); pFrame->sp-=2; pFrame->pc+=3; break; case getfield: //180 (0xb4) Fetch field from object GetField(pFrame); pFrame->pc+=3; break; //Instructions that deal with arrays case newarray:// 188 /*(0xbc)*/ ExecuteNewArray(pFrame); pFrame->pc+=2; break; case anewarray: //189 ExecuteANewArray(pFrame); pFrame->pc+=3; break; ////////////// Control Flow ///////////////////// //Conditional branch instructions case if_icmpeq: // 159 /*(0x9f) */ if(pFrame->stack[pFrame->sp -1].intValue == pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case if_icmpne: //160 /*(0xa0) */ if(pFrame->stack[pFrame->sp -1].intValue != pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case if_icmplt: // 161 /*(0xa1) */ if(pFrame->stack[pFrame->sp -1].intValue < pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case if_icmpge: // 162 /*(0xa2) */ if(pFrame->stack[pFrame->sp -1].intValue >= pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case if_icmpgt: // 163 /*(0xa3) */ if(pFrame->stack[pFrame->sp -1].intValue > pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case if_icmple: // 164 /*(0xa4)*/ if(pFrame->stack[pFrame->sp -1].intValue <= pFrame->stack[pFrame->sp].intValue) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp-=2; break; case ifeq:// 153 /*(0x99) */ if(pFrame->stack[pFrame->sp].intValue == 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; case ifne:// 154 /*(0x9a) */ if(pFrame->stack[pFrame->sp].intValue != 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; case iflt:// 155 /*(0x9b) */ if(pFrame->stack[pFrame->sp].intValue < 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; case ifge:// 156 /*(0x9c) */ if(pFrame->stack[pFrame->sp].intValue >= 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; case ifgt:// 157 /*(0x9d) */ if(pFrame->stack[pFrame->sp].intValue > 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; case ifle:// 158 /*(0x9e)*/ if(pFrame->stack[pFrame->sp].intValue <= 0) { pFrame->pc+= geti2(&bc[pFrame->pc+1]); } else { pFrame->pc+=3; } pFrame->sp--; break; //Comparison instructions //Unconditional branch instructions case _goto: // 167 /*(0xa7)*/ pFrame->pc += geti2(&bc[pFrame->pc+1]); break; //Table jumping instructions ////////////// Exceptions /////////////////////// case athrow: error =1; break; //////////////////////// Method Invocation and Return //////// //Method invocation instructions case invokespecial: ExecuteInvokeSpecial(pFrame); pFrame->pc+=3; break; case invokevirtual: //182 ExecuteInvokeVirtual(pFrame, invokevirtual); pFrame->pc+=3; break; case invokestatic:// 184 ExecuteInvokeVirtual(pFrame, invokestatic); pFrame->pc+=3; break; //Method return instructions case ireturn: //172 (0xac) pFrame->stack[0].intValue=pFrame->stack[pFrame->sp].intValue; return ireturn; break; case _return: //177 (0xb1): Return (void) from method return 0;//METHOD_RETURN; break; //////////////// Thread Synchronization //////////////////// case monitorenter:// Enter and acquire object monitor case monitorexit:// Release and exit object monitor error = 1; break; default: error=1; break; } if(error) break; } //ASSERT(!error); return 0; }