os2exe.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 479 行 · 第 1/2 页
C
479 行
}
if( flag & OSF_IS_PROT_DLL ) {
Wdputs( " | PROTDLL" );
}
if( flag & OSF_INTERNAL_FIXUPS_DONE ) {
Wdputs( " | NO_INT_FIXUPS" );
}
if( flag & OSF_EXTERNAL_FIXUPS_DONE ) {
Wdputs( " | NO_EXT_FIXUPS" );
}
if( flag & OSF_LINK_ERROR ) {
Wdputs( " | LINKERRORSDETECTED" );
}
switch( flag & OS2_COMPATIBILITY_MASK ) {
case OSF_NOT_PM_COMPATIBLE:
Wdputs( " | NOTWINDOWCOMPAT" );
break;
case OSF_PM_COMPATIBLE:
Wdputs( " | WINDOWCOMPAT" );
break;
case OSF_PM_APP:
Wdputs( " | WINDOWAPI" );
break;
}
if( flag & 0x80000 ) {
Wdputs( " | MPUNSAFE" );
}
Wdputslc( "\n" );
Wdputslc( "\n" );
}
/*
* Dump the New Executable Header, if any.
*/
bool Dmp_os2_head( void )
/***********************/
{
Wlseek( New_exe_off );
Wread( &Os2_head, sizeof( struct os2_exe_header ) );
if( Os2_head.signature != OS2_SIGNATURE_WORD ) {
return( 0 );
}
if( Os2_head.align == 0 ) {
Os2_head.align = 9;
}
Banner( "New EXE Header (OS/2 or Windows)" );
Wdputs( "file offset = " );
Puthex( New_exe_off, 8 );
Wdputslc( "H\n" );
Wdputslc( "\n" );
Dump_header( (char *)&Os2_head.version, os2_exe_msg );
dmp_mod_flag_ne( Os2_head.info, Os2_head.target );
Dmp_seg_tab();
Dmp_resrc_tab();
Dmp_ne_tbls();
if( Options_dmp & OS2_SEG_DMP ) {
Dmp_segments();
}
if( Int_seg_tab != NULL ) {
free( Int_seg_tab );
}
return( 1 );
}
/*
* dump the object page table
*/
static void dmp_obj_page( object_record obj )
/*******************************************/
{
unsigned_32 j;
unsigned_32 offset;
map_entry map;
if( Form == FORM_LX ) {
offset = ( obj.mapidx-1 ) * sizeof( lx_map_entry );
} else {
offset = ( obj.mapidx-1 ) * sizeof( le_map_entry );
}
offset += New_exe_off + Os2_386_head.objmap_off;
for( j = 0; j < obj.mapsize; ++j ) {
Data_count++;
Wdputs( " page # " );
Putdec( Data_count );
Wdputs( " map page = " );
switch( Form ) {
case FORM_LE:
Wlseek( offset );
Wread( &map, sizeof( le_map_entry ) );
offset += sizeof( le_map_entry );
Puthex( map.le.page_num[0], 2 );
Puthex( map.le.page_num[1], 2 );
Puthex( map.le.page_num[2], 2 );
Wdputs( "H flgs = " );
Puthex( map.le.flags, 2 );
Wdputs( "H " );
Wdputs( map_flgs[ map.le.flags ] );
if( Options_dmp & OS2_SEG_DMP ) {
Dmp_le_page_seg();
}
break;
case FORM_LX:
Wlseek( offset );
Wread( &map, sizeof( lx_map_entry ) );
offset += sizeof( lx_map_entry );
Puthex( map.lx.page_offset, 8 );
Wdputs( "H size = " );
Puthex( map.lx.data_size, 4 );
Wdputs( "H flgs = " );
Puthex( map.le.flags, 2 );
Wdputs( "H " );
Wdputs( map_flgs[ map.lx.flags ] );
if( Options_dmp & OS2_SEG_DMP ) {
Dmp_lx_page_seg( map );
}
break;
}
Wdputslc( "\n" );
}
}
/*
* dump the object flag word
*/
static void dmp_obj_flags( unsigned_32 flags )
/********************************************/
{
char name[256];
name[0] = 0;
if( flags & OBJ_READABLE ) {
strcat( name, "READABLE|" );
}
if( flags & OBJ_WRITEABLE ) {
strcat( name, "WRITABLE|" );
}
if( flags & OBJ_EXECUTABLE ) {
strcat( name, "EXECUTABLE|" );
}
if( flags & OBJ_RESOURCE ) {
strcat( name, "RESOURCE|" );
}
if( flags & OBJ_DISCARDABLE ) {
strcat( name, "DISCARDABLE|" );
}
if( flags & OBJ_SHARABLE ) {
strcat( name, "SHARED|" );
}
if( flags & OBJ_HAS_PRELOAD ) {
strcat( name, "PRELOAD|" );
}
if( flags & OBJ_HAS_INVALID ) {
strcat( name, "INVALID|" );
}
if( flags & OBJ_PERM_SWAPPABLE ) {
strcat( name, "SWAPPABLE|" );
}
if( flags & OBJ_PERM_RESIDENT ) {
strcat( name, "RESIDENT|" );
}
if( flags & OBJ_PERM_LOCKABLE ) {
strcat( name, "PERM_LOCKABLE|" );
}
if( flags & OBJ_ALIAS_REQUIRED ) {
strcat( name, "16:16_ALIAS|" );
}
if( flags & OBJ_BIG ) {
strcat( name, "BIG|" );
}
if( flags & OBJ_CONFORMING ) {
strcat( name, "CONFORMING|" );
}
if( flags & OBJ_IOPL ) {
strcat( name, "IOPL|" );
}
if( name[strlen(name)-1] == '|' ) {
name[strlen(name)-1] = 0;
}
Wdputs( name );
Wdputslc( "\n" );
}
/*
* dump the LE/LX object table
*/
static void dmp_obj_table( void )
/*******************************/
{
unsigned_16 i;
object_record os_obj;
Banner( "Object Table" );
for( i = 0; i < Os2_386_head.num_objects; i++ ) {
Wlseek( New_exe_off + Os2_386_head.objtab_off
+ i * sizeof( object_record ) );
Wread( &os_obj, sizeof( object_record ) );
Wdputs( "object " );
Putdec( i + 1 );
Wdputs( ": " );
Dump_header( &os_obj.size, os2_obj_msg );
Wdputs( " flags = " );
dmp_obj_flags( os_obj.flags );
if( Options_dmp & PAGE_DMP ) {
dmp_obj_page( os_obj );
}
Wdputslc( "\n" );
}
}
/*
* Dump the 386 Executable Header, if any.
*/
bool Dmp_386_head( void )
/***********************/
{
Wlseek( New_exe_off );
Wread( &Os2_386_head, sizeof( Os2_386_head ) );
if( Os2_386_head.signature == OSF_FLAT_SIGNATURE ) {
Form = FORM_LE;
Banner( "Linear EXE Header (OS/2 V2.x) - LE" );
} else if ( Os2_386_head.signature == OSF_FLAT_LX_SIGNATURE ) {
Form = FORM_LX;
Banner( "Linear EXE Header (OS/2 V2.x) - LX" );
} else {
return( 0 );
}
Wdputs( "file offset = " );
Puthex( New_exe_off, 8 );
Wdputslc( "H\n" );
Wdputslc( "\n" );
Dump_header( (char *)&Os2_386_head.byte_order, os2_386_msg );
dmp_mod_flag_lx( Os2_386_head.flags, Os2_386_head.os_type );
dmp_obj_table();
Dmp_resrc2_tab();
Dmp_le_lx_tbls();
return( 1 );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?