/* * codeLoad - handle the loading of a new DLL/EXE */ static void codeLoad( HANDLE handle, DWORD base, char *name, samp_block_kinds kind ) { seg_offset ovl; int i; pe_object obj; WORD seg; DWORD offset; DWORD bytes; pe_header peh; name = name; ovl.offset = 0; ovl.segment = 0; WriteCodeLoad( ovl, name, kind ); if( !getPEHeader( handle, &peh ) ) { return; } for( i = 0; i < peh.num_objects; i++ ) { ReadFile( handle, &obj, sizeof( obj ), &bytes, NULL ); if( obj.flags & (PE_OBJ_CODE | PE_OBJ_EXECUTABLE) ) { seg = FP_SEG( codeLoad ); } else { seg = FP_SEG( &seg ); } offset = (DWORD) base + obj.rva; WriteAddrMap( i + 1, seg, offset ); } } /* codeLoad */
/*---------------------------------------------------------------------------*/ BOOL isX86DllW(const wchar_t *dllfilename) { PIMAGE_NT_HEADERS peHeader = getPEHeader(dllfilename); if (peHeader) { return ((peHeader->FileHeader.Machine & IMAGE_FILE_MACHINE_I386) == IMAGE_FILE_MACHINE_I386); } return FALSE; }
/*---------------------------------------------------------------------------*/ BOOL isDllW(const wchar_t *dllfilename) { PIMAGE_NT_HEADERS peHeader = getPEHeader(dllfilename); if (peHeader) { return ((peHeader->FileHeader.Characteristics & IMAGE_FILE_DLL) == IMAGE_FILE_DLL); } return FALSE; }
IconLoader::IconLoader(IconsMap *icon_map, const char *name) { section = NULL; if (*name == 0) return; f.setName(name); if (!f.open(IO_Raw | IO_ReadOnly)) return; getDOSHeader(); f.at(dh.e_lfanew); getNEHeader(); if (nh.ne_magic == NEMAGIC) { if ( (nh.ne_restab - nh.ne_rsrctab) == 0) { log(L_WARN, "No resources"); return; } if((nh.ne_rsrctab - nh.ne_segtab)%8!=0) log(L_WARN, "Extra 4 bytes in segment table."); f.at(nh.ne_rsrctab+dh.e_lfanew); // getResourceTable(); }else{ f.at(dh.e_lfanew); getPEHeader(); if (ph.signaturebytes != 0x00004550) { log(L_WARN, "file was neither a ne or pe file"); return; } getPEOptHeader(); section = new PESectHdr[ph.NumberOfSections]; for (unsigned i=0;i<ph.NumberOfSections;i++) getPESectHeader(§ion[i]); U32 offs = imageDirectoryOffset(); f.at(offs); doResourceDir(offs, 0,0,0); } for (INT_MAP::iterator it = groups.begin(); it != groups.end(); ++it){ unsigned id = (*it).first; QPixmap pict = getIcon(id); if (pict.isNull()) continue; icon_map->insert(IconsMap::value_type(id, QIconSet(pict))); } }
/* * codeLoad - handle the loading of a new DLL/EXE */ static void codeLoad( HANDLE handle, DWORD base, const char *name, samp_block_kinds kind ) { seg_offset ovl; int i; pe_object obj; DWORD offset; DWORD bytes; pe_header peh; ovl.offset = 0; ovl.segment = 0; WriteCodeLoad( ovl, name, kind ); if( !getPEHeader( handle, &peh ) ) { return; } for( i = 0; i < peh.num_objects; i++ ) { ReadFile( handle, &obj, sizeof( obj ), &bytes, NULL ); offset = (DWORD)base + obj.rva; WriteAddrMap( i + 1, SEGMENT, offset ); } } /* codeLoad */