os2exe.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 479 行 · 第 1/2 页
C
479 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: NE/LE/LX dumping routines.
*
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
#include "wdglb.h"
#include "wdfunc.h"
static char *os2_exe_msg[] = {
"2link version = ",
"2offset of entry table = ",
"2length of entry table = ",
"432-bit chksum = ",
"2module flag = ",
"2segment number of auto data segment = ",
"2initial size of local heap added to auto data seg = ",
"2initial size of stack to be added to auto data seg = ",
"2initial value of IP on entry = ",
"2initial segment number for setting CS on entry = ",
"2initial value of SP on entry = ",
"2segment number for setting SS on entry = ",
"2number of entries in segment table = ",
"2number of entries in module reference table = ",
"2number of bytes in nonresident names table = ",
"2offset of beg of segment table (rel NH) = ",
"2offset of beg of resource table = ",
"2offset of beg of resident names table = ",
"2offset of beg of module reference table = ",
"2offset of beg of imported names table = ",
"4offset of nonresident names table (rel file) = ",
"2number of movable entry points listed in entry table = ",
"2alignment shift count (0 => 9) = ",
"2number of resource segments (OS/2 only) = ",
"1target OS (1==OS/2, 2==Windows, 3==DOS4, 4==Win386) = ",
"1other flags = ",
"2offset of gangload area (Windows only) = ",
"2length of gangload area (Windows only) = ",
"2swap area (Windows only) = ",
"2expected Windows version (Windows only) = ",
NULL
};
static char *os2_386_msg[] = {
"1byte order (0==little endian, 1==big endian) = ",
"1word order \" \" = ",
"4linear EXE format level = ",
"2cpu type = ",
"2os type (1==OS/2, 2==Windows, 3==DOS4, 4==Win386) = ",
"4module version = ",
"4module flags = ",
"4# module pages = ",
"4object # for initial EIP = ",
"4initial EIP = ",
"4object # for initial ESP = ",
"4initial ESP = ",
"4page size = ",
"4last page size (LE)/page shift (LX) = ",
"4fixup section size = ",
"4fixup section checksum = ",
"4loader section size = ",
"4loader section checksum = ",
"4object table offset = ",
"4# of objects in module = ",
"4object page map offset = ",
"4object iterated data map offset = ",
"4offset of resource table = ",
"4# of resource entries = ",
"4offset of resident name table = ",
"4offset of entry table = ",
"4offset of module directive table = ",
"4# of module directives = ",
"4offset of fixup page table = ",
"4offset of fixup record table = ",
"4offset of import module name table = ",
"4# of entries in import module name table = ",
"4offset of import procedure name table = ",
"4offset of per-page checksum table = ",
"4offset of enumerated data pages = ",
"4# of pre-load pages = ",
"4offset of non-resident names table (rel file) = ",
"4size of non-resident names table = ",
"4non-resident names table checksum = ",
"4object # for automatic data object = ",
"4offset of the debugging information = ",
"4size of the debugging information = ",
"4# of instance pages in the preload section = ",
"4# of instance pages in the demand load section = ",
"4size of heap (for 16-bit apps) = ",
"4size of stack = ",
NULL
};
static char *os2_obj_msg[] = {
"4virtual memory size = ",
"4 relocation base address = ",
"4 object flag bits = ",
"4 object page table index = ",
"4 # of object page table entries = ",
"4 reserved = ",
NULL
};
static char *map_flgs[] = {
"Valid", "Iterated", "Invalid", "Zeroed", "Range", "Compressed"
};
/*
* dump the NE module flag word
*/
static void dmp_mod_flag_ne( unsigned_16 flag, unsigned_8 target )
/****************************************************************/
{
Wdputs( "Module Flag Word = " );
if( flag & OS2_IS_DLL ) {
Wdputs( "LIBRARY" );
} else {
Wdputs( "PROGRAM" );
}
if( target != TARGET_OS2 && flag & OS2_IS_DLL ) {
if( flag & WIN_PRIVATE_DLL ) {
Wdputs( " | PRIVATEDLL" );
}
}
if( flag & OS2_LINK_ERROR ) {
Wdputs( " | LINKERRORSDETECTED" );
}
switch( flag & OS2_COMPATIBILITY_MASK ) {
case OS2_NOT_PM_COMPATIBLE:
Wdputs( " | NOTWINDOWCOMPAT" );
break;
case OS2_PM_COMPATIBLE:
Wdputs( " | WINDOWCOMPAT" );
break;
case OS2_PM_APP:
Wdputs( " | WINDOWAPI" );
break;
}
if( flag & OS2_NEEDS_MATH_CO ) {
Wdputs( " | NEEDFPU" );
}
if( target == TARGET_OS2 && flag & OS2_NEEDS_80386 ) {
Wdputs( " | NEED386" );
}
if( target != TARGET_OS2 && flag & WIN_EMS_GLOBAL_MEM ) {
Wdputs( " | EMSGLOBAL" );
}
if( target == TARGET_OS2 && flag & OS2_NEEDS_80286 ) {
Wdputs( " | NEED286" );
}
if( target != TARGET_OS2 && flag & WIN_EMS_BANK_INSTANCE ) {
Wdputs( " | EMSBANK" );
}
if( target == TARGET_OS2 && flag & WIN_USES_EMS_DIRECT ) {
Wdputs( " | NONCONFORMING" );
}
if( target != TARGET_OS2 && flag & WIN_USES_EMS_DIRECT ) {
Wdputs( " | EMSDIRECT" );
}
if( flag & OS2_PROT_MODE_ONLY ) {
Wdputs( " | PROTMODEONLY" );
}
if( target == TARGET_OS2 && flag & OS2_INIT_INSTANCE ) {
Wdputs( " | INITINSTANCE" );
}
if( target != TARGET_OS2 && flag & OS2_INIT_INSTANCE ) {
Wdputs( " | REALMODE" );
}
if( target == TARGET_OS2 && flag & OS2_IS_DLL ) {
if( flag & WIN_PRIVATE_DLL ) {
Wdputs( " | PRIVATEDLL" );
}
}
if( flag & OS2_MULT_AUTO ) {
Wdputs( " | MULTIPLEDATA" );
}
if( flag & OS2_SINGLE_AUTO ) {
Wdputs( " | SINGLEDATA" );
}
Wdputslc( "\n" );
Wdputslc( "\n" );
}
#define OSF_MODTYPE_MASK 0x38000UL
/*
* dump the LE/LX module flag word
*/
static void dmp_mod_flag_lx( unsigned_32 flag, unsigned_16 ostype )
/*****************************************************************/
{
Wdputs( "Module Flags = " );
if( (flag & OSF_MODTYPE_MASK) == OSF_VIRT_DEVICE ) {
Wdputs( "VIRTDEVICE" );
} else if( (flag & OSF_MODTYPE_MASK) == OSF_PHYS_DEVICE ) {
Wdputs( "PHYSDEVICE" );
} else if( (flag & OSF_MODTYPE_MASK) == OSF_IS_DLL ) {
Wdputs( "LIBRARY" );
} else {
Wdputs( "PROGRAM" );
}
if( flag & OSF_SINGLE_DATA ) {
Wdputs( " | SINGLEDATA" );
}
if( flag & OSF_INIT_INSTANCE ) {
Wdputs( " | INITINSTANCE" );
}
if( flag & OSF_TERM_INSTANCE ) {
Wdputs( " | TERMINSTANCE" );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?