#pragma once #include "../Config.h" #include "../Include/Types.h" #include "AsmHelper64.h" #include "AsmHelper32.h" namespace blackbone { using AsmHelperPtr = std::unique_ptr; /// /// Get suitable asm generator /// class AsmFactory { public: enum eAsmArch { asm32, // x86 asm64 // x86_64 }; /// /// Get suitable asm generator /// /// Desired CPU architecture /// AsmHelperBase interface static AsmHelperPtr GetAssembler( eAsmArch arch ) { switch (arch) { case asm32: return std::make_unique(); case asm64: return std::make_unique(); default: return nullptr; } } /// /// Get suitable asm generator /// /// Desired PE module architecture /// AsmHelperBase interface static AsmHelperPtr GetAssembler( eModType mt ) { if (mt == mt_default) mt = sizeof( intptr_t ) > sizeof( int32_t ) ? mt_mod64 : mt_mod32; switch (mt) { case mt_mod32: return GetAssembler( asm32 ); case mt_mod64: return GetAssembler( asm64 ); default: return nullptr; } } /// /// Get suitable asm generator /// /// Target process CPU architecture /// AsmHelperBase interface static AsmHelperPtr GetAssembler( bool wow64process ) { return GetAssembler( wow64process ? asm32 : asm64 ); } /// /// Get default asm generator /// /// static AsmHelperPtr GetAssembler() { #ifdef USE64 return std::make_unique(); #else return std::make_unique(); #endif } }; }