static symbol *create_symbol (symbol_type t, char *n) { symbol *rt=DCALLOC (symbol, 1, "symbol"); rt->t=t; rt->skip_on_tracing=Fuzzy_Undefined; rt->name=DSTRDUP(n, "name"); return rt; };
MemoryCache* MC_MemoryCache_ctor(HANDLE PHDL, bool dont_read_from_quicksilver_places) { MemoryCache* rt=DCALLOC(MemoryCache, 1, "MemoryCache"); rt->PHDL=PHDL; rt->_cache=rbtree_create(true, "MemoryCache._cache", compare_size_t); rt->dont_read_from_quicksilver_places=dont_read_from_quicksilver_places; return rt; };
BPM *create_BPM(unsigned width, enum BPM_type t) { BPM *rt=DCALLOC (BPM, 1, "BPM"); rt->width=width; rt->t=t; return rt; };
MemoryCache* MC_MemoryCache_ctor_testing(BYTE *testing_memory, SIZE_T testing_memory_size) { oassert ((testing_memory_size & (PAGE_SIZE-1))==0); MemoryCache* rt=DCALLOC(MemoryCache, 1, "MemoryCache"); rt->_cache=rbtree_create(true, "MemoryCache._cache", compare_size_t); rt->testing=true; rt->testing_memory=testing_memory; rt->testing_memory_size=testing_memory_size; return rt; };
bool MC_LoadPageForAddress (MemoryCache *mc, address adr) { address idx, rd_adr; SIZE_T bytes_read; MemoryCacheElement *t=NULL; #ifndef _WIN64 // as of win32 #define _ADR_SKIP 0x7FFE0000 if (mc->dont_read_from_quicksilver_places && (adr>=_ADR_SKIP && adr<(_ADR_SKIP+PAGE_SIZE))) { // нужно всегда обламывать чтение этих мест - там, например, текущее системное время, // от этого тестирование эмулятора CPU рандомно глючит, долго я искал эту багу :( // с другой стороны, эмулятор CPU вполне может нормально работать, хоть и с небольшими // отклонениями по системному времени //L (2, __FUNCTION__ "(0x" PRI_ADR_HEX "): wouldn't read process memory\n"); return false; }; #endif idx=adr>>LOG2_PAGE_SIZE; rd_adr=idx<<LOG2_PAGE_SIZE; t=DCALLOC(MemoryCacheElement, 1, "MemoryCacheElement"); #ifdef BOLT_DEBUG if (mc->testing) { if (rd_adr+PAGE_SIZE > mc->testing_memory_size) goto free_t_and_return_false; memcpy (t->block, mc->testing_memory+rd_adr, PAGE_SIZE); bytes_read=PAGE_SIZE; }; #endif #ifdef BOLT_DEBUG if (mc->testing==false) #endif if (ReadProcessMemory (mc->PHDL, (LPCVOID)rd_adr, t->block, PAGE_SIZE, &bytes_read)==false) goto free_t_and_return_false; oassert (bytes_read==PAGE_SIZE); rbtree_insert(mc->_cache, (void*)idx, t); return true; free_t_and_return_false: DFREE(t); return false; };
void add_thread (process *p, DWORD TID, HANDLE THDL, address start, address TIB) { thread *t=DCALLOC (thread, 1, "thread"); if (thread_c_debug) L ("%s() begin\n", __func__); t->TID=TID; t->THDL=THDL; t->TIB=TIB; t->start=start; oassert (rbtree_lookup(p->threads, (void*)TID)==NULL && "this TID is already in table"); rbtree_insert (p->threads, (void*)TID, t); if (thread_c_debug) L ("%s() end\n", __func__); };
MemoryCache* MC_MemoryCache_copy_ctor (MemoryCache *mc) { MemoryCache* rt; //L (2, __FUNCTION__"(): begin\n"); rt=DCALLOC(MemoryCache, 1, "MemoryCache"); rt->PHDL=mc->PHDL; rt->dont_read_from_quicksilver_places=mc->dont_read_from_quicksilver_places; rt->_cache=rbtree_create(true, "MemoryCache._cache", compare_size_t); rbtree_copy (mc->_cache, rt->_cache, key_copier, value_copier); #ifdef BOLT_DEBUG rt->testing=mc->testing; rt->testing_memory=mc->testing_memory; rt->testing_memory_size=mc->testing_memory_size; #endif return rt; };
allocate_buffer P1(int, size) { buffer_t *buf; #ifndef DISALLOW_BUFFER_TYPE if ((size < 0) || (size > max_buffer_size)) { error("Illegal buffer size.\n"); } if (size == 0) { return null_buffer(); } /* using calloc() so that memory will be zero'd out when allocated */ buf = (buffer_t *) DCALLOC(sizeof(buffer_t) + size - 1, 1, TAG_BUFFER, "allocate_buffer"); buf->size = size; buf->ref = 1; return buf; #else return NULL; #endif }