static bool readObjectAndPageTable( ExeFileInfo *exe ) /****************************************************/ { RcStatus ret; size_t table_size; table_size = exe->u.LXInfo.OS2Head.num_objects * sizeof( object_record ); exe->u.LXInfo.Objects = RESALLOC( table_size ); ret = SeekRead( exe->fid, exe->WinHeadOffset + exe->u.LXInfo.OS2Head.objtab_off, exe->u.LXInfo.Objects, table_size ); if( ret == RS_OK ) { table_size = exe->u.LXInfo.OS2Head.num_pages * sizeof( lx_map_entry ); exe->u.LXInfo.Pages = RESALLOC( table_size ); ret = SeekRead( exe->fid, exe->WinHeadOffset + exe->u.LXInfo.OS2Head.objmap_off, exe->u.LXInfo.Pages, table_size ); } switch( ret ) { case RS_OK: break; case RS_READ_ERROR: RcError( ERR_READING_EXE, exe->name, strerror( errno ) ); break; case RS_READ_INCMPLT: RcError( ERR_UNEXPECTED_EOF, exe->name ); break; default: RcError( ERR_INTERNAL, INTERR_UNKNOWN_RCSTATUS ); break; } CheckDebugOffset( exe ); return( ret != RS_OK ); }
static RcStatus readObjectTable( ExeFileInfo *exe ) /*************************************************/ { RcStatus ret; unsigned objects_size; long file_offset; exe_pe_header *pehdr; pehdr = exe->u.PEInfo.WinHead; if( IS_PE64( *pehdr ) ) { objects_size = PE64( *pehdr ).num_objects * sizeof( pe_object ); file_offset = exe->WinHeadOffset + sizeof( pe_header64 ); } else { objects_size = PE32( *pehdr ).num_objects * sizeof( pe_object ); file_offset = exe->WinHeadOffset + sizeof( pe_header ); } exe->u.PEInfo.Objects = RESALLOC( objects_size ); ret = SeekRead( exe->fid, file_offset, exe->u.PEInfo.Objects, objects_size ); switch( ret ) { case RS_OK: break; case RS_READ_ERROR: RcError( ERR_READING_EXE, exe->name, strerror( errno ) ); break; case RS_READ_INCMPLT: RcError( ERR_UNEXPECTED_EOF, exe->name ); break; default: RcError( ERR_INTERNAL, INTERR_UNKNOWN_RCSTATUS ); break; } CheckDebugOffset( exe ); return( ret ); }
static int readObjectTable( ExeFileInfo * exe ) /*********************************************/ { RcStatus error; exe->u.PEInfo.Objects = RcMemMalloc( exe->u.PEInfo.WinHead->num_objects * sizeof(pe_object) ); error = SeekRead( exe->Handle, exe->WinHeadOffset + sizeof(pe_header), exe->u.PEInfo.Objects, exe->u.PEInfo.WinHead->num_objects * sizeof(pe_object) ); switch( error ) { case RS_OK: break; case RS_READ_ERROR: RcError( ERR_READING_EXE, exe->name, strerror( errno ) ); break; case RS_READ_INCMPLT: RcError( ERR_UNEXPECTED_EOF, exe->name ); break; default: RcError( ERR_INTERNAL, INTERR_UNKNOWN_RCSTATUS ); break; } CheckDebugOffset( exe ); return( error != RS_OK ); }
RcStatus CopyOS2Resources( void ) { OS2ResEntry *entry; WResDirWindow wind; OS2ResTable *restab; WResLangInfo *lang; WResFileID tmphandle; WResFileID reshandle; RcStatus ret; int err_code; int shift_count; int currseg; segment_record *tmpseg; uint_32 seg_offset; long align_amount; int i; restab = &(Pass2Info.TmpFile.u.NEInfo.OS2Res); tmphandle = Pass2Info.TmpFile.Handle; reshandle = Pass2Info.ResFiles->Handle; tmpseg = Pass2Info.TmpFile.u.NEInfo.Seg.Segments; currseg = Pass2Info.OldFile.u.NEInfo.Seg.NumSegs - Pass2Info.OldFile.u.NEInfo.Seg.NumOS2ResSegs; entry = restab->resources; ret = RS_OK; err_code = 0; tmpseg += currseg; shift_count = Pass2Info.TmpFile.u.NEInfo.WinHead.align; seg_offset = 0; // shut up gcc /* We may need to add padding before the first resource segment */ align_amount = AlignAmount( RCTELL( tmphandle ), shift_count ); if( align_amount ) { ret = PadExeData( tmphandle, align_amount ); err_code = errno; } /* Walk through the resource entries */ for( i = 0; i < restab->num_res_segs; i++, entry++, tmpseg++ ) { wind = entry->wind; lang = WResGetLangInfo( wind ); if( entry->first_part ) { seg_offset = RCTELL( tmphandle ); } else { seg_offset += 0x10000; } /* Fill in segment structure */ tmpseg->address = seg_offset >> shift_count; tmpseg->size = entry->seg_length; tmpseg->min = entry->seg_length; tmpseg->info = SEG_DATA | SEG_READ_ONLY | SEG_LEVEL_3; if( entry->mem_flags & MEMFLAG_MOVEABLE ) tmpseg->info |= SEG_MOVABLE; if( entry->mem_flags & MEMFLAG_PURE ) tmpseg->info |= SEG_PURE; if( entry->mem_flags & MEMFLAG_PRELOAD ) tmpseg->info |= SEG_PRELOAD; if( entry->mem_flags & MEMFLAG_DISCARDABLE ) tmpseg->info |= SEG_DISCARD; /* For non-last segment of a resource, there's nothing to copy */ if( !entry->first_part ) continue; /* Copy resource data */ ret = copyOneResource( lang, reshandle, tmphandle, shift_count, &err_code ); if( ret != RS_OK ) break; CheckDebugOffset( &(Pass2Info.TmpFile) ); } switch( ret ) { case RS_WRITE_ERROR: RcError( ERR_WRITTING_FILE, Pass2Info.TmpFile.name, strerror( err_code ) ); break; case RS_READ_ERROR: RcError( ERR_READING_RES, CmdLineParms.OutResFileName, strerror( err_code ) ); break; case RS_READ_INCMPLT: RcError( ERR_UNEXPECTED_EOF, CmdLineParms.OutResFileName ); break; default: break; } return( ret ); } /* CopyOS2Resources */