MCPcopy Create free account
hub / github.com/HyperDbg/HyperDbg / PushSymbol

Function PushSymbol

hyperdbg/script-engine/code/script-engine.c:3965–4075  ·  view source on GitHub ↗

* @brief Gets a symbol and push it into the symbol buffer * * @param SymbolBuffer * @param Symbol * @return PSYMBOL_BUFFER */

Source from the content-addressed store, hash-verified

3963 * @return PSYMBOL_BUFFER
3964 */
3965PSYMBOL_BUFFER
3966PushSymbol(PSYMBOL_BUFFER SymbolBuffer, const PSYMBOL Symbol)
3967{
3968 //
3969 // Calculate address to write new token
3970 //
3971 uintptr_t Head = (uintptr_t)SymbolBuffer->Head;
3972 uintptr_t Pointer = (uintptr_t)SymbolBuffer->Pointer;
3973 PSYMBOL WriteAddr = (PSYMBOL)(Head + Pointer * sizeof(SYMBOL));
3974
3975 if (Symbol->Type == SYMBOL_STRING_TYPE || Symbol->Type == SYMBOL_WSTRING_TYPE)
3976 {
3977 //
3978 // Update Pointer
3979 //
3980 SymbolBuffer->Pointer += GetSymbolHeapSize(Symbol);
3981
3982 //
3983 // Handle Overflow
3984 //
3985 if (SymbolBuffer->Pointer >= SymbolBuffer->Size - 1)
3986 {
3987 //
3988 // Calculate new size for the symbol B
3989 //
3990 unsigned int NewSize = SymbolBuffer->Size;
3991 do
3992 {
3993 NewSize *= 2;
3994 } while (NewSize <= SymbolBuffer->Pointer);
3995
3996 //
3997 // Allocate a new buffer for string list with doubled length
3998 //
3999 PSYMBOL NewHead = (PSYMBOL)malloc(NewSize * sizeof(SYMBOL));
4000
4001 if (NewHead == NULL)
4002 {
4003 printf("err, could not allocate buffer");
4004 return NULL;
4005 }
4006
4007 //
4008 // Copy old buffer to new buffer
4009 //
4010 memcpy(NewHead, SymbolBuffer->Head, SymbolBuffer->Size * sizeof(SYMBOL));
4011
4012 //
4013 // Free old buffer
4014 //
4015 free(SymbolBuffer->Head);
4016
4017 //
4018 // Update Head and size of SymbolBuffer
4019 //
4020 SymbolBuffer->Size = NewSize;
4021 SymbolBuffer->Head = NewHead;
4022 }

Callers 2

ScriptEngineParseFunction · 0.85
CodeGenFunction · 0.85

Calls 1

GetSymbolHeapSizeFunction · 0.85

Tested by

no test coverage detected