#include "stdafx.h" #include "VMOp.Units.h" #include "VMOpCPU.h" #pragma pack(push, 1) //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // // // --PUSH GPR-- // MEMBER* pMEMBER = &((OBJECT*)->(_OFFSET MEMBER)); // BOOL bCHECK = CALL_HANDLER( 0, pMEMBER, 0, 0 ); // if( bCHECK ) // { // EAX = { ~, pMEMBER, _INTERVAL, ~ } // CALL_HANDLER( EAX ); // --POP GPR-- // return TRUE; // } // //if( !bCHECK ) goto _JMPFAILCASE; // _JMPFAILCASE: // --POP GPR-- // return FALSE; // // // EAX = { ~, pMEMBER, _INTERVAL, ~ } // EOP = { OBJECT*, sCALC(OBJECT, MEMBER) } // ERP = bCHECK // EFL // template struct sIL_SET_BOOL { sIL M01; sIL_GET_OFFSET_PTR_ON_ROOT M02; struct sIL_SET_B4 { sIL M01; sDT4<_BOOL> M02; } M03_SET_VALUE; sIL M04; inline VOID ChangeBaseObject( WzPTR pPTR ) { M02.ChangeBaseObject( pPTR ); } inline VOID ChangeSettingBOOL( BOOL bBOOL ) { M03_SET_VALUE.M02.Change( (DWORD)bBOOL ); } }; template struct sMETHOD_CLOCK_CONTROL_CODES { sIL M01; // STK(n) struct sINTER_make_args_arg1isOffsetPtr_arg2isInterval { sIL_MOV_EAX1_B4<_INTERVAL> M01; sIL_GET_OFFSET_PTR_ON_ROOT M02; sIL M03; } M02_MAKE_ARGS; sIL_CALL_IBF_HASH_USRINPUT, _ACT_IBF_HASH> M03; // User Code Block _USRCODE M06; // °á°úó¸® (TRUE) // EBX = TRUE; // ERP = EBX struct sINTER_make_return_true_result { sIL M01; sDT1 M02; sIL M03; } M09; sIL_MARK01 M10; sIL M11; sIL_RET M12; inline VOID ChangeBaseObject( WzPTR pPTR ) { M02_MAKE_ARGS.M02.ChangeBaseObject( pPTR ); } inline VOID Change_call_IBF_handler( WzASM_IBF_HASH_T wHASH_IBF ) { M03.ChangeHASH( wHASH_IBF ); } }; #pragma pack(pop) typedef sIL_SET_BOOL sIL_SET_BOOL_ENABLED_FALSE_T; typedef sMETHOD_CLOCK_CONTROL_CODES< IBF_HASH::IBF_ITimeout_SetNTCTB, sIL_NOP, OFFSETOF(IVMOpGenerater, m_UpdateInterval), IVMOpGenerater::INTERVAL_MOLA_HEARTBEAT > /*TYPE*/ sMETHOD_CLOCK_START_CODES_T; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // IVMOpGenerater::IVMOpGenerater() { } IVMOpGenerater::~IVMOpGenerater() { } BOOL IVMOpGenerater::DoInit() { m_bEnabled = FALSE; m_UpdateInterval.SetNextTimeoutByCurTickBased( INTERVAL_MOLA_HEARTBEAT ); // ¸Å 1ÃÊÀÇ Heartbeat m_dwUpdateLoopCount = 0; m_dwUpdateCount = 0; // DoProcess È£Ãâ ¼ö do { m_SetNextStartAction = MolaTAllocNew(WzASM_EIP)(); sMETHOD_CLOCK_START_CODES_T* pSTREAM = m_SetNextStartAction->InitInstance(); pSTREAM->ChangeBaseObject(this); m_SetNextStartAction->Prefetch(); } while(0); do { m_SetEnable = MolaTAllocNew(WzASM_EIP)(); sIL_SET_BOOL_ENABLED_FALSE_T* pSTREAM = m_SetEnable->InitInstance(); pSTREAM->ChangeBaseObject(this); } while(0); return TRUE; } BOOL IVMOpGenerater::DoProcess() { if( !m_bEnabled ) return TRUE; ++m_dwUpdateLoopCount; if( m_UpdateInterval.IsExpired() ) { m_UpdateInterval.SetNextTimeoutByCurTickBased( INTERVAL_MOLA_HEARTBEAT ); ++m_dwUpdateCount; sSIG_NOTIFY_HEARTBEAT msgSIG( m_dwUpdateCount ); VMOpCPU::OnMsg( &msgSIG ); } return TRUE; } BOOL IVMOpGenerater::IsComplete() { return FALSE; } BOOL IVMOpGenerater::DoRelease() { return TRUE; } VOID IVMOpGenerater::OnMsg( eMOLASIG_MSG* pSIG_MSG ) { if( SIGMSG::CONTROL_START == pSIG_MSG->_TYPE ) { sIL_SET_BOOL_ENABLED_FALSE_T* pSTREAM = m_SetEnable->CmdStream(); pSTREAM->ChangeSettingBOOL( TRUE ); m_SetEnable->Execute(); //m_UpdateInterval.SetNextTimeoutByCurTickBased( INTERVAL_MOLA_HEARTBEAT ); //m_bEnabled = TRUE; } else if( SIGMSG::CONTROL_STOP == pSIG_MSG->_TYPE ) { sIL_SET_BOOL_ENABLED_FALSE_T* pSTREAM = m_SetEnable->CmdStream(); pSTREAM->ChangeSettingBOOL( FALSE ); m_SetEnable->Execute(); //m_bEnabled = FALSE; } }