#include <pifdump.h>
#pragma hdrstop


#define STRING(x) x[0]?x:"(empty string in .pif file)"


int __cdecl main( int argc, char *argv[])
{
    HFILE hFile;
    STDPIF stdpif;
    PIFEXTHDR pifexthdr;
    LONG cbRead;
    CHAR szTemp[ 512 ];
    memset( &stdpif, 0, sizeof(stdpif) );

    if (argc!=2)
    {
        printf("usage: pifdump filename.pif\n" );
        return(1);
    }


    hFile =  _lopen( argv[1], OF_READ );
    if (hFile == HFILE_ERROR)
    {
        printf( "pifdump: unable to open file %s, err %d\n",
                argv[1],
                GetLastError()
               );
        return(1);
    }

    _lread( hFile, &stdpif, sizeof(stdpif) );


    printf( "\n===== Dump of PIF file (%s) =====\n\n", argv[1] );

    printf( "[Standard PIF Data]\n" );
    printf( "    unknown    = 0x%02X\n", stdpif.unknown );
    printf( "    id         = 0x%02X\n", stdpif.id );
    printf( "    appname    = %s\n",     STRING(stdpif.appname) );
    printf( "    maxmem     = 0x%04X\n", stdpif.maxmem );
    printf( "    minmem     = 0x%04X\n", stdpif.minmem );
    printf( "    startfile  = %s\n",     STRING(stdpif.startfile) );
    printf( "    MSflags    = 0x%02X\n", stdpif.MSflags );
    if (stdpif.MSflags & fResident)
        printf( "        [fResident is set ==> directly modifies memory]\n", fResident );
    if (stdpif.MSflags & fGraphics)
        printf( "        [fGraphics is set ==> screen exchange: graphics/text]\n", fGraphics );
    if (stdpif.MSflags & fNoSwitch)
        printf( "        [fNoSwitch is set ==> program switch: prevent]\n", fNoSwitch );
    if (stdpif.MSflags & fNoGrab)
        printf( "        [fNoGrab   is set ==> screen exchange: none]\n", fNoGrab );
    if (stdpif.MSflags & fDestroy)
        printf( "        [fDestroy  is set ==> close window on exit]\n", fDestroy );
    if (stdpif.MSflags & fCOM1)
        printf( "        [fCOM1     is set ==> directly modifies: COM1]\n", fCOM1 );
    if (stdpif.MSflags & fCOM2)
        printf( "        [fCOM2     is set ==> directly modifies: COM2]\n", fCOM2 );
    printf( "    reserved   = 0x%02X\n", stdpif.reserved );
    printf( "    defpath    = %s\n",     STRING(stdpif.defpath) );
    printf( "    params     = %s\n",     STRING(stdpif.params) );
    printf( "    cPages     = 0x%02X   (should always be 0x01!)\n", stdpif.cPages );
    printf( "    lowVector  = 0x%02X   (should always be 0x00!)\n", stdpif.lowVector );
    printf( "    highVector = 0x%02X   (should always be 0xFF!)\n", stdpif.highVector );
    printf( "    rows       = 0x%02X   (not used)\n", stdpif.rows );
    printf( "    cols       = 0x%02X   (not used)\n", stdpif.cols );
    printf( "    rowoff     = 0x%02X   (not used)\n", stdpif.rowoff );
    printf( "    coloff     = 0x%02X   (not used)\n", stdpif.coloff );
    printf( "    sysmem     = 0x%04X (not used)\n", stdpif.sysmem );
    printf( "    behavior   = 0x%02X\n", stdpif.behavior);
    if (stdpif.behavior & fScreen)
        printf( "      [fScreen     (0x%02X) is set ==> directly modifies screen]\n", fScreen );
    if (stdpif.behavior & fForeground)
        printf( "      [fForeground (0x%02X) is set ==> Set same as fScreen (alias)]\n", fForeground );
    if (stdpif.behavior & f8087)
        printf( "      [f8087       (0x%02X) is set ==> No PIFEDIT control]\n", f8087 );
    if (stdpif.behavior & fKeyboard)
        printf( "      [fKeyboard   (0x%02X) is set ==> directly modifies keyboard]\n", fKeyboard );
    printf( "    sysflags   = 0x%02X\n", stdpif.sysflags);


    // Read in extended header sections
    while( (cbRead = _lread( hFile, &pifexthdr, sizeof( pifexthdr )))!=0 )
    {
        printf( "\n[%s]\n", pifexthdr.extsig );

        if (strcmp(pifexthdr.extsig, STDHDRSIG)==0) {


            if (pifexthdr.extnxthdrfloff==0xFFFF) {
                printf( "    No more entries\n" );
                goto OutOfHere;
            }
            else
                printf( "    No information in \"%s\" section (as expected)\n\n", STDHDRSIG );

        }

        if (strcmp(pifexthdr.extsig, W286HDRSIG30)==0) {

            W286PIF30   w286ext30;


            _lread( hFile, &w286ext30, sizeof( w286ext30 ) );
            printf( "    PfMaxXmsK   = 0x%04X\n", w286ext30.PfMaxXmsK );
            printf( "    PfMinXmsK   = 0x%04X\n", w286ext30.PfMinXmsK );
            printf( "    PfW286Flags = 0x%04X\n", w286ext30.PfW286Flags );
            if (w286ext30.PfW286Flags & fALTTABdis286)
                printf( "        fALTTABdis286   is set.\n" );
            if (w286ext30.PfW286Flags & fALTESCdis286)
                printf( "        fALTESCdis286   is set.\n" );
            if (w286ext30.PfW286Flags & fALTESCdis286)
                printf( "        fALTPRTSCdis286 is set.\n" );
            if (w286ext30.PfW286Flags & fPRTSCdis286)
                printf( "        fPRTSCdis286    is set.\n" );
            if (w286ext30.PfW286Flags & fCTRLESCdis286)
                printf( "        fCTRLESCdis286  is set.\n" );
            if (w286ext30.PfW286Flags & fNoSaveVid286)
                printf( "        fNoSaveVid286   is set.\n" );
            if (w286ext30.PfW286Flags & fCOM3_286)
                printf( "        fCOM3_286       is set.\n" );
            if (w286ext30.PfW286Flags & fCOM4_286)
                printf( "        fCOM4_286       is set.\n" );
            printf( "\n" );

        }

        if (strcmp(pifexthdr.extsig, W386HDRSIG30)==0) {
            W386PIF30   w386ext30;

            _lread( hFile, &w386ext30, sizeof( w386ext30 ) );
            printf( "    PfW386maxmem  = 0x%02X (%d)\n", w386ext30.PfW386maxmem, w386ext30.PfW386maxmem );
            printf( "    PfW386minmem  = 0x%02X (%d)\n", w386ext30.PfW386minmem, w386ext30.PfW386minmem );
            printf( "    PfFPriority   = 0x%02X (%d)\n", w386ext30.PfFPriority,  w386ext30.PfFPriority );
            printf( "    PfBPriority   = 0x%02X (%d)\n", w386ext30.PfBPriority,  w386ext30.PfBPriority );
            printf( "    PfMaxEMMK     = 0x%02X (%d)\n", w386ext30.PfMaxEMMK,    w386ext30.PfMaxEMMK );
            printf( "    PfMinEMMK     = 0x%02X (%d)\n", w386ext30.PfMinEMMK,    w386ext30.PfMinEMMK );
            printf( "    PfMaxXmsK     = 0x%02X (%d)\n", w386ext30.PfMaxXmsK,    w386ext30.PfMaxXmsK );
            printf( "    PfMinXmsK     = 0x%02X (%d)\n", w386ext30.PfMinXmsK,    w386ext30.PfMinXmsK );
            printf( "    PfW386Flags   = 0x%08X\n", w386ext30.PfW386Flags );
            if (w386ext30.PfW386Flags & fEnableClose)
                printf( "        fEnableClose    is set.\n" );
            if (w386ext30.PfW386Flags & fBackground)
                printf( "        fBackground     is set.\n" );
            if (w386ext30.PfW386Flags & fExclusive)
                printf( "        fExclusive      is set.\n" );
            if (w386ext30.PfW386Flags & fFullScreen)
                printf( "        fFullScreen     is set.\n" );
            if (w386ext30.PfW386Flags & fALTTABdis)
                printf( "        fALTTABdis      is set.\n" );
            if (w386ext30.PfW386Flags & fALTESCdis)
                printf( "        fALTESCdis      is set.\n" );
            if (w386ext30.PfW386Flags & fALTSPACEdis)
                printf( "        fALTSPACEdis    is set.\n" );
            if (w386ext30.PfW386Flags & fALTENTERdis)
                printf( "        fALTENTERdis    is set.\n" );
            if (w386ext30.PfW386Flags & fALTPRTSCdis)
                printf( "        fALTPRTSCdis    is set.\n" );
            if (w386ext30.PfW386Flags & fPRTSCdis)
                printf( "        fPRTSCdis       is set.\n" );
            if (w386ext30.PfW386Flags & fCTRLESCdis)
                printf( "        fCTRLESCdis     is set.\n" );
            if (w386ext30.PfW386Flags & fPollingDetect)
                printf( "        fPollingDetect  is set.\n" );
            if (w386ext30.PfW386Flags & fNoHMA)
                printf( "        fNoHMA          is set.\n" );
            if (w386ext30.PfW386Flags & fHasHotKey)
                printf( "        fHasHotKey      is set.\n" );
            if (w386ext30.PfW386Flags & fEMSLocked)
                printf( "        fEMSLocked      is set.\n" );
            if (w386ext30.PfW386Flags & fXMSLocked)
                printf( "        fXMSLocked      is set.\n" );
            if (w386ext30.PfW386Flags & fINT16Paste)
                printf( "        fINT16Paste     is set.\n" );
            if (w386ext30.PfW386Flags & fVMLocked)
                printf( "        fVMLocked       is set.\n" );
            if (w386ext30.PfW386Flags & fGlobalProtect)
                printf( "        fGlobalProtect  is set.\n" );
            if (w386ext30.PfW386Flags & fMinimized)
                printf( "        fMinimized      is set.\n" );
            if (w386ext30.PfW386Flags & fMaximized)
                printf( "        fMaximized      is set.\n" );
            if (w386ext30.PfW386Flags & fRealMode)
                printf( "        fRealMode       is set.\n" );
            if (w386ext30.PfW386Flags & fWinLie)
                printf( "        fWinLie         is set.\n" );
            if (w386ext30.PfW386Flags & fStrayPtrDetect)
                printf( "        fStrayPtrDetect is set.\n" );
            if (w386ext30.PfW386Flags & fNoSuggestMSDOS)
                printf( "        fNoSuggestMSDOS is set.\n" );
            if (w386ext30.PfW386Flags & fLocalUMBs)
                printf( "        fLocalUMBs      is set.\n" );
            if (w386ext30.PfW386Flags & fRealModeSilent)
                printf( "        fRealModeSilent is set.\n" );
            if (w386ext30.PfW386Flags & fQuickStart)
                printf( "        fQuickStart     is set.\n" );
            if (w386ext30.PfW386Flags & fAmbiguousPIF)
                printf( "        fAmbiguousPIF   is set.\n" );
            printf( "    PfW386Flags2  = 0x%08X\n", w386ext30.PfW386Flags2 );
            if (w386ext30.PfW386Flags2 & fVidTxtEmulate)
                printf( "        fVidTxtEmulate  is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidNoTrpTxt)
                printf( "        fVidNoTrpTxt    is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidNoTrpLRGrfx)
                printf( "        fVidNoTrpLRGrfx is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidNoTrpHRGrfx)
                printf( "        fVidNoTrpHRGrfx is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidTextMd)
                printf( "        fVidTextMd      is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidLowRsGrfxMd)
                printf( "        fVidLowRsGrfxd  is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidHghRsGrfxMd)
                printf( "        fVidHghRsGrfxd  is set.\n" );
            if (w386ext30.PfW386Flags2 & fVidRetainAllo)
                printf( "        fVidRetainAllo  is set.\n" );
            printf( "    PfHotKeyScan  = 0x%04X\n", w386ext30.PfHotKeyScan );
            printf( "    PfHotKeyShVal = 0x%04X\n", w386ext30.PfHotKeyShVal );
            printf( "    PfHotKeyShMsk = 0x%04X\n", w386ext30.PfHotKeyShMsk );
            printf( "    PfHotKeyVal   = 0x%02X\n", w386ext30.PfHotKeyVal );
            printf( "    PfW386params  = %s\n",     STRING(w386ext30.PfW386params) );
            printf( "\n" );

        }

        if (strcmp(pifexthdr.extsig, WNTHDRSIG31)==0) {
            WNTPIF31    wntpif31;

            _lread( hFile, &wntpif31, sizeof( wntpif31 ) );
            printf( "    ==> Internal Revision %d <==\n", wntpif31.wInternalRevision );
            printf( "    dwWNTFlags      = 0x%08X\n", wntpif31.nt31Prop.dwWNTFlags );
            if (wntpif31.nt31Prop.dwWNTFlags & COMPAT_TIMERTIC)
                printf( "        COMPAT_TIMERTIC is set.\n" );
            printf( "    dwRes1          = 0x%08X\n", wntpif31.nt31Prop.dwRes1 );
            printf( "    dwRes2          = 0x%08X\n", wntpif31.nt31Prop.dwRes2 );
            printf( "    achConfigFile   = %s\n", STRING(wntpif31.nt31Prop.achConfigFile) );
            printf( "    achAuotexecFile = %s\n", STRING(wntpif31.nt31Prop.achAutoexecFile) );
        }

        if (strcmp(pifexthdr.extsig, WENHHDRSIG40)==0) {
            WENHPIF40    wenhpif40;

            _lread( hFile, &wenhpif40, sizeof( wenhpif40 ) );
            printf( "    ==> Internal Revision %d <==\n", wenhpif40.wInternalRevision );
            printf( "    dwEnhModeFlagsProp  = 0x%08X\n", wenhpif40.dwEnhModeFlagsProp );
            printf( "    dwRealModeFlagsProp = 0x%08X\n", wenhpif40.dwRealModeFlagsProp );
            printf( "    achOtherFileProp    = %s\n",     STRING(wenhpif40.achOtherFileProp) );
            printf( "    achIconFileProp     = %s\n",     STRING(wenhpif40.achIconFileProp) );
            printf( "    wIconInxexProp      = 0x%04X\n", wenhpif40.wIconIndexProp );

            printf( "    PROPTSK:\n" );
            printf( "        flTsk            = 0x%04X\n", wenhpif40.tskProp.flTsk );
            if (wenhpif40.tskProp.flTsk & TSK_ALLOWCLOSE)
                printf( "            TSK_ALLOWCLOSE      is set.\n" );
            if (wenhpif40.tskProp.flTsk & TSK_BACKGROUND)
                printf( "            TSK_BACKGROUND      is set.\n" );
            if (wenhpif40.tskProp.flTsk & TSK_EXCLUSIVE)
                printf( "            TSK_EXCLUSIVE       is set.\n" );
            if (wenhpif40.tskProp.flTsk & TSK_NOWARNTERMINATE)
                printf( "            TSK_NOWARNTERMINATE is set.\n" );
            if (wenhpif40.tskProp.flTsk & TSK_NOSCREENSAVER)
                printf( "            TSK_NOSCREENSAVER   is set.\n" );
            printf( "        flTskInit        = 0x%04X\n", wenhpif40.tskProp.flTskInit );
            printf( "        wReserved1       = 0x%04X\n", wenhpif40.tskProp.wReserved1 );
            printf( "        wReserved2       = 0x%04X\n", wenhpif40.tskProp.wReserved2 );
            printf( "        wReserved3       = 0x%04X\n", wenhpif40.tskProp.wReserved3 );
            printf( "        wReserved4       = 0x%04X\n", wenhpif40.tskProp.wReserved4 );
            printf( "        wIdleSensitivity = 0x%04X\n", wenhpif40.tskProp.wIdleSensitivity );

            printf( "    PROPVID:\n" );
            printf( "        flVid        = 0x%04X\n", wenhpif40.vidProp.flVid );
            if (wenhpif40.vidProp.flVid & VID_TEXTEMULATE)
                printf( "            VID_TEXTEMULATE  is set.\n" );
            if (wenhpif40.vidProp.flVid & VID_RETAINMEMORY)
                printf( "            VID_RETAINMEMORY is set.\n" );
            if (wenhpif40.vidProp.flVid & VID_FULLSCREEN)
                printf( "            VID_FULLSCREEN   is set.\n" );
            printf( "        flVidInit    = 0x%04X\n", wenhpif40.vidProp.flVidInit );
            printf( "        wReserved1   = 0x%04X\n", wenhpif40.vidProp.wReserved1 );
            printf( "        wReserved2   = 0x%04X\n", wenhpif40.vidProp.wReserved2 );
            printf( "        wReserved3   = 0x%04X\n", wenhpif40.vidProp.wReserved3 );
            printf( "        cScreenLines = 0x%04X\n", wenhpif40.vidProp.cScreenLines );

            printf( "    PROPKBD:\n" );
            printf( "        flKbd            = 0x%04X\n", wenhpif40.kbdProp.flKbd );
            if (wenhpif40.kbdProp.flKbd & KBD_FASTPASTE)
                printf( "            KBD_FASTPASTE  is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOALTTAB)
                printf( "            KBD_NOALTTAB   is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOALTESC)
                printf( "            KBD_NOALTESC   is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOALTSPACE)
                printf( "            KBD_NOALTSPACE is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOALTENTER)
                printf( "            KBD_NOALTENTER is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOALTPRTSC)
                printf( "            KBD_NOALTPRTSC is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOPRTSC)
                printf( "            KBD_NOPRTSC    is set.\n" );
            if (wenhpif40.kbdProp.flKbd & KBD_NOCTRLESC)
                printf( "            KBD_NOCTRLESC   is set.\n" );
            printf( "        flKbdInit        = 0x%04X\n", wenhpif40.kbdProp.flKbdInit );
            printf( "        msAltDelay       = 0x%04X\n", wenhpif40.kbdProp.msAltDelay );
            printf( "        msAltPasteDelay  = 0x%04X\n", wenhpif40.kbdProp.msAltPasteDelay );
            printf( "        msPasteDelay     = 0x%04X\n", wenhpif40.kbdProp.msPasteDelay );
            printf( "        msPasteFullDelay = 0x%04X\n", wenhpif40.kbdProp.msPasteFullDelay );
            printf( "        msPasteTimeout   = 0x%04X\n", wenhpif40.kbdProp.msPasteTimeout );
            printf( "        cPasteSkip       = 0x%04X\n", wenhpif40.kbdProp.cPasteSkip );
            printf( "        cPasteCRSkip     = 0x%04X\n", wenhpif40.kbdProp.cPasteCRSkip );

            printf( "    PROPMSE:\n" );
            printf( "        flMse     = 0x%04X\n", wenhpif40.mseProp.flMse );
            if (wenhpif40.mseProp.flMse & MSE_WINDOWENABLE)
                printf( "            MSE_WINDOWENABLE is set.\n" );
            if (wenhpif40.mseProp.flMse & MSE_EXCLUSIVE)
                printf( "            MSE_EXCLUSIVE    is set.\n" );
            printf( "        flMseInit = 0x%04X\n", wenhpif40.mseProp.flMseInit );

            printf( "    PROPSND:\n" );
            printf( "        flSnd     = 0x%04X\n", wenhpif40.sndProp.flSnd );
            if (wenhpif40.sndProp.flSnd & SND_SPEAKERENABLE)
                printf( "            SND_SPEAKERENABLE is set.\n" );
            printf( "        flSndInit = 0x%04X\n", wenhpif40.sndProp.flSndInit );

            printf( "    PROPFNT:\n" );
            printf( "        flFnt             = 0x%04X\n", wenhpif40.fntProp.flFnt );
            if (wenhpif40.fntProp.flFnt & FNT_RASTERFONTS)
                printf( "            FNT_RASTERFONTS is set.\n" );
            if (wenhpif40.fntProp.flFnt & FNT_TTFONTS)
                printf( "            FNT_TTFONTS     is set.\n" );
            if (wenhpif40.fntProp.flFnt & FNT_AUTOSIZE)
                printf( "            FNT_AUTOSIZE    is set.\n" );
            if (wenhpif40.fntProp.flFnt & FNT_RASTER)
                printf( "            FNT_RASTER      is set.\n" );
            if (wenhpif40.fntProp.flFnt & FNT_TT)
                printf( "            FNT_TT          is set.\n" );
            printf( "        flFntInit         = 0x%04X\n", wenhpif40.fntProp.flFntInit );
            printf( "        cxFont            = 0x%04X (%d)\n", wenhpif40.fntProp.cxFont, wenhpif40.fntProp.cxFont );
            printf( "        cyFont            = 0x%04X (%d)\n", wenhpif40.fntProp.cyFont, wenhpif40.fntProp.cyFont );
            printf( "        cxFontActual      = 0x%04X (%d)\n", wenhpif40.fntProp.cxFontActual, wenhpif40.fntProp.cxFontActual );
            printf( "        cyFontActual      = 0x%04X (%d)\n", wenhpif40.fntProp.cyFontActual, wenhpif40.fntProp.cyFontActual );
            printf( "        achRasterFaceName = %s\n",     STRING(wenhpif40.fntProp.achRasterFaceName) );
            printf( "        achTTFaceName     = %s\n",     STRING(wenhpif40.fntProp.achRasterFaceName) );
            printf( "        wCurrentCP        = 0x%04X\n", wenhpif40.fntProp.wCurrentCP );

            printf( "    PROPWIN:\n" );
            printf( "        flWin      = 0x%04X\n", wenhpif40.winProp.flWin );
            if (wenhpif40.winProp.flWin & WIN_SAVESETTINGS)
                printf( "            WIN_SAVESETTINGS is set.\n" );
            if (wenhpif40.winProp.flWin & WIN_TOOLBAR)
                printf( "            WIN_TOOLBAR      is set.\n" );
            printf( "        flWinInit  = 0x%04X\n",      wenhpif40.winProp.flWinInit );
            printf( "        cxCells    = 0x%04X (%d)\n", wenhpif40.winProp.cxCells,  wenhpif40.winProp.cxCells );
            printf( "        cyCells    = 0x%04X (%d)\n", wenhpif40.winProp.cyCells,  wenhpif40.winProp.cyCells );
            printf( "        cxClient   = 0x%04X (%d)\n", wenhpif40.winProp.cxClient, wenhpif40.winProp.cxClient );
            printf( "        cyClient   = 0x%04X (%d)\n", wenhpif40.winProp.cyClient, wenhpif40.winProp.cyClient );
            printf( "        cxWindow   = 0x%04X (%d)\n", wenhpif40.winProp.cxWindow, wenhpif40.winProp.cxWindow );
            printf( "        cyWindow   = 0x%04X (%d)\n", wenhpif40.winProp.cyWindow, wenhpif40.winProp.cyWindow );
            printf( "        wLength    = 0x%04X\n",      wenhpif40.winProp.wLength );
            printf( "        wShowFlags = 0x%04X\n",      wenhpif40.winProp.wShowFlags );
            printf( "        wShowCmd   = 0x%04X\n",      wenhpif40.winProp.wShowCmd );
            printf( "        xMinimize  = 0x%04X (%d)\n", wenhpif40.winProp.xMinimize, wenhpif40.winProp.xMinimize );
            printf( "        yMinimize  = 0x%04X (%d)\n", wenhpif40.winProp.yMinimize, wenhpif40.winProp.yMinimize );
            printf( "        xMaximize  = 0x%04X (%d)\n", wenhpif40.winProp.xMaximize, wenhpif40.winProp.xMaximize );
            printf( "        yMaximize  = 0x%04X (%d)\n", wenhpif40.winProp.yMaximize, wenhpif40.winProp.yMaximize );
            printf( "        rcNormal   = (0x%04X, 0x%04X, 0x%04X, 0x%04X)\n",
                    wenhpif40.winProp.rcNormal.left, wenhpif40.winProp.rcNormal.top,
                    wenhpif40.winProp.rcNormal.right,wenhpif40.winProp.rcNormal.bottom
                   );

            printf( "    PROPENV:\n" );
            printf( "        flEnv         = 0x%04X\n", wenhpif40.envProp.flEnv );
            printf( "        flEnvInit     = 0x%04X\n", wenhpif40.envProp.flEnvInit );
            printf( "        achBatchFile  = %s\n",     STRING(wenhpif40.envProp.achBatchFile) );
            printf( "        cbEnvironemnt = 0x%04X\n", wenhpif40.envProp.cbEnvironment );
            printf( "        wMaxDPMI      = 0x%04X\n", wenhpif40.envProp.wMaxDPMI );

        }

        if (strcmp(pifexthdr.extsig, WNTHDRSIG40)==0) {

            WNTPIF40   wntpif40;

            _lread( hFile, &wntpif40, sizeof( wntpif40 ) );
            printf( "    ==> Internal Revision %d <==\n", wntpif40.wInternalRevision );
            printf( "    flWnt            = 0x%08X\n", wntpif40.nt40Prop.flWnt );
            if (wntpif40.nt40Prop.flWnt & WNT_LET_SYS_POS)
                printf( "            WNT_LET_SYS_POS   is set.\n" );
            if (wntpif40.nt40Prop.flWnt & WNT_CONSOLE_PROPS)
                printf( "            WNT_CONSOLE_PROPS is set.\n" );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchCmdLine, -1, szTemp, 512, NULL, NULL );
            printf( "    awchCmdLine      = %s\n", STRING(szTemp) );
            printf( "    achSaveCmdLine   = %s\n", STRING(wntpif40.nt40Prop.achSaveCmdLine) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchOtherFile, -1, szTemp, 512, NULL, NULL );
            printf( "    awchOtherFile    = %s\n", STRING(szTemp) );
            printf( "    achSaveOtherFile = %s\n", STRING(wntpif40.nt40Prop.achSaveOtherFile) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchPIFFile, -1, szTemp, 512, NULL, NULL );
            printf( "    awchPIFFile      = %s\n", STRING(szTemp) );
            printf( "    achSavePIFFile   = %s\n", STRING(wntpif40.nt40Prop.achSavePIFFile) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchTitle, -1, szTemp, 512, NULL, NULL );
            printf( "    awchTitle        = %s\n", STRING(szTemp) );
            printf( "    achSaveTitle     = %s\n", STRING(wntpif40.nt40Prop.achSaveTitle) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchIconFile, -1, szTemp, 512, NULL, NULL );
            printf( "    awchIconFIle     = %s\n", STRING(szTemp) );
            printf( "    achSaveIconFile  = %s\n", STRING(wntpif40.nt40Prop.achSaveIconFile) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchWorkDir, -1, szTemp, 512, NULL, NULL );
            printf( "    awchWorkDir      = %s\n", STRING(szTemp) );
            printf( "    achSaveWorkDir   = %s\n", STRING(wntpif40.nt40Prop.achSaveWorkDir) );

            WideCharToMultiByte( CP_ACP, 0, wntpif40.nt40Prop.awchBatchFile, -1, szTemp, 512, NULL, NULL );
            printf( "    awchBatchFile    = %s\n", STRING(szTemp) );
            printf( "    achSaveBatchFile = %s\n", STRING(wntpif40.nt40Prop.achSaveBatchFile) );

            printf( "    dwForeColor      = 0x%08X\n", wntpif40.nt40Prop.dwForeColor );
            printf( "    dwBackColor      = 0x%08X\n", wntpif40.nt40Prop.dwBackColor );
            printf( "    dwPopupForeColor = 0x%08X\n", wntpif40.nt40Prop.dwPopupForeColor );
            printf( "    dwPopupBackColor = 0x%08X\n", wntpif40.nt40Prop.dwPopupBackColor );
            printf( "    WinSize          = (0x%04X, 0x%04X)\n", wntpif40.nt40Prop.WinSize.X,  wntpif40.nt40Prop.WinSize.Y );
            printf( "    BuffSize         = (0x%04X, 0x%04X)\n", wntpif40.nt40Prop.BuffSize.X, wntpif40.nt40Prop.BuffSize.Y );
            printf( "    WinPos           = (0x%08X, 0x%08X)\n", wntpif40.nt40Prop.WinPos.x,   wntpif40.nt40Prop.WinPos.y );
            printf( "    dwCursorSize     = 0x%08X\n", wntpif40.nt40Prop.dwCursorSize );
            printf( "    dwCmdHistBufSize = 0x%08X\n", wntpif40.nt40Prop.dwCmdHistBufSize );
            printf( "    dwNumCmdHist     = 0x%08X\n", wntpif40.nt40Prop.dwNumCmdHist );

        }

        _llseek( hFile, pifexthdr.extnxthdrfloff, FILE_BEGIN );

    }

OutOfHere:
    printf( "\n" );

    return(0);
}