mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-07-12 02:29:28 +00:00
299 lines
6 KiB
C
299 lines
6 KiB
C
/**
|
|
* @file common.h
|
|
* @author M.H. Gholamrezaei (mh@hyperdbg.org)
|
|
*
|
|
* @details Common routines header
|
|
* @version 0.1
|
|
* @date 2020-10-22
|
|
*
|
|
* @copyright This project is released under the GNU Public License v3.
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#ifndef COMMON_H
|
|
# define COMMON_H
|
|
|
|
/**
|
|
*
|
|
initial size of symbol buffer
|
|
*/
|
|
# define SYMBOL_BUFFER_INIT_SIZE 64
|
|
|
|
/**
|
|
* @brief maximum length of string in the token
|
|
*/
|
|
# define TOKEN_VALUE_MAX_LEN 8
|
|
|
|
/**
|
|
* @brief init size of token list
|
|
*/
|
|
# define TOKEN_LIST_INIT_SIZE 256
|
|
|
|
/**
|
|
* @brief enumerates possible types for token
|
|
*/
|
|
typedef enum _SCRIPT_ENGINE_TOKEN_TYPE
|
|
{
|
|
LOCAL_ID,
|
|
LOCAL_UNRESOLVED_ID,
|
|
GLOBAL_ID,
|
|
GLOBAL_UNRESOLVED_ID,
|
|
DECIMAL,
|
|
STATE_ID,
|
|
HEX,
|
|
OCTAL,
|
|
BINARY,
|
|
SPECIAL_TOKEN,
|
|
KEYWORD,
|
|
WHITE_SPACE,
|
|
COMMENT,
|
|
REGISTER,
|
|
PSEUDO_REGISTER,
|
|
NON_TERMINAL,
|
|
SEMANTIC_RULE,
|
|
END_OF_STACK,
|
|
EPSILON,
|
|
TEMP,
|
|
STRING,
|
|
WSTRING,
|
|
FUNCTION_ID,
|
|
FUNCTION_PARAMETER_ID,
|
|
SCRIPT_VARIABLE_TYPE,
|
|
DEFERENCE_TEMP,
|
|
UNKNOWN
|
|
} SCRIPT_ENGINE_TOKEN_TYPE;
|
|
|
|
/**
|
|
* @brief read tokens from input stored in this structure
|
|
*/
|
|
typedef struct _SCRIPT_ENGINE_TOKEN
|
|
{
|
|
SCRIPT_ENGINE_TOKEN_TYPE Type;
|
|
char * Value;
|
|
unsigned int Len;
|
|
unsigned int MaxLen;
|
|
VARIABLE_TYPE * VariableType;
|
|
unsigned long long VariableMemoryIdx;
|
|
} SCRIPT_ENGINE_TOKEN, *PSCRIPT_ENGINE_TOKEN;
|
|
|
|
/**
|
|
* @brief this structure is a dynamic container of TOKENS
|
|
*/
|
|
typedef struct _SCRIPT_ENGINE_TOKEN_LIST
|
|
{
|
|
PSCRIPT_ENGINE_TOKEN * Head;
|
|
unsigned int Pointer;
|
|
unsigned int Size;
|
|
} SCRIPT_ENGINE_TOKEN_LIST, *PSCRIPT_ENGINE_TOKEN_LIST;
|
|
|
|
////////////////////////////////////////////////////
|
|
// PTOKEN related functions //
|
|
////////////////////////////////////////////////////
|
|
PSCRIPT_ENGINE_TOKEN
|
|
NewUnknownToken(void);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char * Value);
|
|
|
|
VOID
|
|
RemoveToken(PSCRIPT_ENGINE_TOKEN * Token);
|
|
|
|
VOID
|
|
PrintToken(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
VOID
|
|
AppendByte(PSCRIPT_ENGINE_TOKEN Token, CHAR c);
|
|
|
|
VOID
|
|
AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
CopyToken(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
NewTemp(PSCRIPT_ENGINE_ERROR_TYPE);
|
|
|
|
VOID
|
|
FreeTemp(PSCRIPT_ENGINE_TOKEN Temp);
|
|
|
|
VARIABLE_TYPE *
|
|
HandleType(PSCRIPT_ENGINE_TOKEN_LIST PtokenStack);
|
|
|
|
VARIABLE_TYPE *
|
|
GetCommonVariableType(VARIABLE_TYPE * Ty1, VARIABLE_TYPE * Ty2);
|
|
|
|
////////////////////////////////////////////////////
|
|
// SCRIPT_ENGINE_TOKEN_LIST related functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
PSCRIPT_ENGINE_TOKEN_LIST
|
|
NewTokenList(void);
|
|
|
|
VOID
|
|
RemoveTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
|
|
|
VOID
|
|
PrintTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
|
|
|
PSCRIPT_ENGINE_TOKEN_LIST
|
|
Push(PSCRIPT_ENGINE_TOKEN_LIST TokenList, PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
Pop(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
Top(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
TopIndexed(PSCRIPT_ENGINE_TOKEN_LIST TokenList, int Index);
|
|
|
|
char
|
|
IsNoneTerminal(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
char
|
|
IsSemanticRule(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
char
|
|
IsEqual(const PSCRIPT_ENGINE_TOKEN Token1, const PSCRIPT_ENGINE_TOKEN Token2);
|
|
|
|
int
|
|
GetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
int
|
|
GetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
int
|
|
LalrGetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
int
|
|
LalrGetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
|
|
|
////////////////////////////////////////////////////
|
|
// Util Functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
char
|
|
IsHex(char c);
|
|
|
|
char
|
|
IsDecimal(char c);
|
|
|
|
char
|
|
IsLetter(char c);
|
|
|
|
char
|
|
IsUnderscore(char c);
|
|
|
|
char
|
|
IsBinary(char c);
|
|
|
|
char
|
|
IsOctal(char c);
|
|
|
|
VOID
|
|
SetType(unsigned long long * Val, unsigned char Type);
|
|
|
|
unsigned long long
|
|
DecimalToInt(char * str);
|
|
|
|
unsigned long long
|
|
DecimalToSignedInt(char * str);
|
|
|
|
unsigned long long
|
|
HexToInt(char * str);
|
|
|
|
unsigned long long
|
|
OctalToInt(char * str);
|
|
|
|
unsigned long long
|
|
BinaryToInt(char * str);
|
|
|
|
VOID
|
|
RotateLeftStringOnce(char * str);
|
|
|
|
////////////////////////////////////////////////////
|
|
// Semantic Rule Related Functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
char
|
|
IsType1Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType2Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType4Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType5Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType6Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType7Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType8Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType9Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType10Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType11Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType12Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType13Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType14Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType15Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsType16Func(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsAssignmentOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsTwoOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
char
|
|
IsOneOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
|
|
|
/**
|
|
* @brief User-defined function linked list node
|
|
*/
|
|
typedef struct _USER_DEFINED_FUNCTION_NODE
|
|
{
|
|
char * Name;
|
|
long long unsigned Address;
|
|
long long unsigned VariableType;
|
|
long long unsigned ParameterNumber;
|
|
long long unsigned MaxTempNumber;
|
|
long long unsigned LocalVariableNumber;
|
|
long long unsigned IdTable;
|
|
long long unsigned FunctionParameterIdTable;
|
|
char * TempMap;
|
|
struct _USER_DEFINED_FUNCTION_NODE * NextNode;
|
|
} USER_DEFINED_FUNCTION_NODE, *PUSER_DEFINED_FUNCTION_NODE;
|
|
|
|
/**
|
|
* @brief Include file linked list node
|
|
*/
|
|
typedef struct _INCLUDE_NODE
|
|
{
|
|
char * FilePath;
|
|
struct _INCLUDE_NODE * NextNode;
|
|
} INCLUDE_NODE, *PINCLUDE_NODE;
|
|
|
|
#endif // !COMMON_H
|