BOOL FillLBWithEntryTable()

in tools/ExeView/filllb.cpp [320:424]


BOOL FillLBWithEntryTable (HWND hWnd, PEXEINFO pExeInfo )
{
    char  szBuff[255];
    LPSTR lp = (LPSTR)szBuff;
    PSTR  ptr;  
    WORD  wIndex=1;
    WORD  wI;
    BYTE  bBundles;
    BYTE  bFlags;

    #define ADDITEM() SendMessage( hWnd, LB_ADDSTRING, 0, (LPARAM)lp )

    SendMessage( hWnd, WM_SETREDRAW, 0, 0L );
    SendMessage( hWnd, LB_RESETCONTENT, 0, 0L );

    lstrcpy( lp, "Entry Table" );
    ADDITEM();

    lstrcpy( lp, "" );
    ADDITEM();

    lstrcpy( lp, "Ordinal\tSegment#   Offset   Stack Words   Flags" );
    ADDITEM();

    lstrcpy( lp, "---------------------------------------------------------------" );
    ADDITEM();

    ptr = pExeInfo->pEntryTable;

    while (TRUE)
    {
        bBundles = (BYTE)*ptr++;
    
        if (bBundles==0)            // End of the table
            break;

        bFlags= (BYTE)*ptr++;

        switch (bFlags)
        {
            case 0x00:      // Placeholders
                if (bBundles == 1)
                    wsprintf( lp, "%d\t                                  Placeholder",
                        wIndex );
                else
                    wsprintf( lp, "%d-%d\t                                  Placeholders",
                        wIndex, wIndex + bBundles - 1 );
                ADDITEM();
                wIndex += bBundles;
            break;

            case 0xFF:      // MOVEABLE segments
                for (wI=0; wI<(WORD)bBundles; wI++)
                {
                    PMENTRY pe = (PMENTRY)ptr;
                    WORD    wS = ((WORD)pe->bFlags)>>2;

                    wsprintf( lp, "%d\t%#04x     %#04x   %#04x        MOVEABLE  ",
                        wIndex, pe->bSegNumber, pe->wSegOffset, wS );

                    if (pe->bFlags & EXPORTED)
                        lstrcat( lp, "EXPORTED " );
                    else
                        lstrcat( lp, "         " );

                    if (pe->bFlags & SHAREDDATA)
                        lstrcat( lp, "SHARED_DATA" );

                    ADDITEM();
                    wIndex++;
                    ptr += sizeof( MENTRY );
                }
            break;

            default:        // FIXED Segments
                for (wI=0; wI<(WORD)bBundles; wI++)
                {
                    PFENTRY pe = (PFENTRY)ptr;
                    WORD    wS = ((WORD)pe->bFlags)>>2;

                    wsprintf( lp, "%d\t%#04x     %#04x   %#04x        FIXED     ",
                        wIndex, bFlags, pe->wSegOffset, wS );

                    if (pe->bFlags & EXPORTED)
                        lstrcat( lp, "EXPORTED  " );
                    else
                        lstrcat( lp, "         " );

                    if (pe->bFlags & SHAREDDATA)
                        lstrcat( lp, "SHARED_DATA" );

                    ADDITEM();
                    wIndex++;
                    ptr += sizeof( FENTRY );
                }
            break;
        }
    }

    SendMessage( hWnd, WM_SETREDRAW, 1, 0L );
    InvalidateRect( hWnd, NULL, TRUE );
    UpdateWindow( hWnd );
    return TRUE;

} //*** FillLBWithEntryTable