|
|
|
#ifndef __NATIVE_CODE_H
|
|
|
|
#define __NATIVE_CODE_H
|
|
|
|
|
|
|
|
#include "Windas.h"
|
|
|
|
#include "XedWrap.h"
|
|
|
|
#include "Code.h"
|
|
|
|
|
|
|
|
struct _NATIVE_CODE_BLOCK;
|
|
|
|
struct _NATIVE_CODE_LINK;
|
|
|
|
|
|
|
|
typedef BOOL(*FN_INST_ASM_OP)(_NATIVE_CODE_LINK* Link, PUCHAR ToMutate, PVOID Context);
|
|
|
|
|
|
|
|
typedef struct _NATIVE_CODE_LINK
|
|
|
|
{
|
|
|
|
_NATIVE_CODE_LINK* Next;
|
|
|
|
_NATIVE_CODE_LINK* Prev;
|
|
|
|
_NATIVE_CODE_BLOCK* Block;
|
|
|
|
UINT Flags;
|
|
|
|
UINT Label;
|
|
|
|
PUCHAR RawData;
|
|
|
|
UINT RawDataSize;
|
|
|
|
XED_DECODED_INST XedInstruction;
|
|
|
|
STDVECTOR<STDPAIR<FN_INST_ASM_OP, PVOID>> AsmOperations;
|
|
|
|
_NATIVE_CODE_LINK();
|
|
|
|
_NATIVE_CODE_LINK(UINT LabelId, _NATIVE_CODE_BLOCK* B);
|
|
|
|
_NATIVE_CODE_LINK(UINT F, PVOID Rd, UINT Rds, BOOL Decode = FALSE);
|
|
|
|
~_NATIVE_CODE_LINK();
|
|
|
|
}NATIVE_CODE_LINK, *PNATIVE_CODE_LINK;
|
|
|
|
|
|
|
|
typedef struct _NATIVE_CODE_BLOCK
|
|
|
|
{
|
|
|
|
PNATIVE_CODE_LINK Start;
|
|
|
|
PNATIVE_CODE_LINK End;
|
|
|
|
STDVECTOR<UINT> LabelIds;
|
|
|
|
_NATIVE_CODE_BLOCK();
|
|
|
|
}NATIVE_CODE_BLOCK, *PNATIVE_CODE_BLOCK;
|
|
|
|
|
|
|
|
VOID NcAppendToBlock(PNATIVE_CODE_BLOCK Block, PNATIVE_CODE_LINK Link);
|
|
|
|
|
|
|
|
VOID NcPrependToBlock(PNATIVE_CODE_BLOCK Block, PNATIVE_CODE_LINK Link);
|
|
|
|
|
|
|
|
VOID NcInsertLinkAfter(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2);
|
|
|
|
|
|
|
|
VOID NcInsertLinkBefore(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2);
|
|
|
|
|
|
|
|
VOID NcUnlink(PNATIVE_CODE_LINK Link);
|
|
|
|
|
|
|
|
UINT NcCountInstructions(PNATIVE_CODE_BLOCK Block, BOOL CountCombinedAsOne = FALSE);
|
|
|
|
|
|
|
|
UINT NcCalcBlockSizeInBytes(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
VOID NcChangeLabelId(PNATIVE_CODE_BLOCK Block1, UINT Original, UINT New);
|
|
|
|
|
|
|
|
UINT NcGenUnusedLabelId(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
VOID NcFixLabelsForBlocks(PNATIVE_CODE_BLOCK Block1, PNATIVE_CODE_BLOCK Block2);
|
|
|
|
|
|
|
|
BOOL NcInsertBlockAfter(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block, BOOL FixLabels = TRUE);
|
|
|
|
|
|
|
|
BOOL NcInsertBlockBefore(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block, BOOL FixLabels = TRUE);
|
|
|
|
|
|
|
|
BOOL NcInsertBlockStartToEnd(PNATIVE_CODE_LINK Start, PNATIVE_CODE_LINK End, PNATIVE_CODE_BLOCK NewBlock);
|
|
|
|
|
|
|
|
BOOL NcCreateLabels(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
PNATIVE_CODE_LINK NcValidateJmp(PNATIVE_CODE_LINK Link, INT32 Delta);
|
|
|
|
|
|
|
|
PNATIVE_CODE_LINK NcDeepCopyLink(PNATIVE_CODE_LINK Link);
|
|
|
|
|
|
|
|
BOOL NcDeepCopyPartialBlock(PNATIVE_CODE_LINK Start, PNATIVE_CODE_LINK End, PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
BOOL NcDeepCopyBlock(PNATIVE_CODE_BLOCK Block, PNATIVE_CODE_BLOCK BlockCopy);
|
|
|
|
|
|
|
|
BOOL NcPromoteRelJmpTo32(PNATIVE_CODE_LINK Link);
|
|
|
|
|
|
|
|
BOOL NcPromoteAllRelJmpTo32(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
BOOL NcGetDeltaToLabel(PNATIVE_CODE_LINK Link, PINT32 DeltaOut);
|
|
|
|
|
|
|
|
BOOL NcGetDeltaToRandomLabel(PNATIVE_CODE_LINK Link, PINT32 DeltaOut);
|
|
|
|
|
|
|
|
BOOL NcFixRelJmps(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
BOOL NcHasIllegalInstructions(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
BOOL NcDisassemble(PNATIVE_CODE_BLOCK Block, PVOID Buffer, UINT BufferSize);
|
|
|
|
|
|
|
|
PVOID NcAssemble(PNATIVE_CODE_BLOCK Block, PUINT OutSize);
|
|
|
|
|
|
|
|
PVOID NcAssembleEx(PNATIVE_CODE_BLOCK Block, PUINT OutSize);
|
|
|
|
|
|
|
|
VOID NcDeleteBlock(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
VOID NcDebugPrint(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
VOID NcPrintBlockCode(PNATIVE_CODE_BLOCK Block);
|
|
|
|
|
|
|
|
#endif
|