Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  ddd
Language: C/C++
Code:
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#pragma hdrstop



// if the next #define is commented out, the strings
// get read directly from the resource data. If the
// #define is active, FormatMessage() is used.

// #define USE_FORMAT_MESSAGE 1



#define gle GetLastError()
#define addoffset(p,o) ( (byte *) (p) + o )



int wmain( int argc, wchar_t *argv[] )
{
     HINSTANCE hDLL;
     DWORD from = 0, to = 0xffff;
     HRSRC hRes;
     HGLOBAL hgRes;
     MESSAGE_RESOURCE_DATA *pMRD;
     MESSAGE_RESOURCE_ENTRY *pMRE;
     DWORD first, last, count, i, j;

     if ( argc < 2 || argc > 4 )
     {
          _putws( L"\nusage: fm dllname.ext [from [to]]\n" );
          _putws( L"dllname.exe: name of the DLL from which to dump the messages" );
          _putws( L"from, to: first and last message number to dump" );
          _putws( L"  (defaults: 0 to 65536)" );
          return 1;
     }

     if ( argc >= 3 )
          from = (DWORD) _wtoi( argv[2] );

     if ( argc >= 4 )
          to = (DWORD) _wtoi( argv[3] );

     if ( from > to )
     {
          DWORD t;
          t = from;
          from = to;
          to = t;
     }

     // ----------------------------------------------------------------------------------

     hDLL = LoadLibraryEx( argv[1], NULL, DONT_RESOLVE_DLL_REFERENCES |
          LOAD_LIBRARY_AS_DATAFILE | LOAD_WITH_ALTERED_SEARCH_PATH );
     if ( hDLL == NULL )
     {
          fwprintf( stderr, L"LoadLibraryEx( \"%s\" ): gle = %lu\n", argv[1], gle );
          return 1;
     }

     hRes = FindResource( hDLL, MAKEINTRESOURCE( 1 ),
          MAKEINTRESOURCE( RT_MESSAGETABLE ) );
     if ( hRes == NULL )
     {
          fwprintf( stderr, L"FindResource( 1, RT_MESSAGETABLE ): gle = %lu\n", gle );
          return 1;
     }

     hgRes = LoadResource( hDLL, hRes );
     if ( hgRes == NULL )
     {
          fwprintf( stderr, L"LoadResource(): gle = %lu\n", gle );
          return 1;
     }

     pMRD = (MESSAGE_RESOURCE_DATA *) LockResource( hgRes );
     if ( pMRD == NULL )
     {
          fwprintf( stderr, L"LockResource(): gle = %lu\n", gle );
          return 1;
     }

     // ----------------------------------------------------------------------------------
     // look for string table, extract first/last entries

     if ( pMRD->NumberOfBlocks == 0 )
     {
          fwprintf( stderr, L"No strings in this message table\n", gle );
          return 1;
     }

     first = last = pMRD->Blocks[0].LowId;
     count = 0;

     for ( i = 0; i < pMRD->NumberOfBlocks; ++ i )
     {
          count += pMRD->Blocks[i].HighId - pMRD->Blocks[i].LowId + 1;
          if ( first > pMRD->Blocks[i].LowId )
               first = pMRD->Blocks[i].LowId;
          if ( last < pMRD->Blocks[i].HighId )
               last = pMRD->Blocks[i].HighId;
     }

     fwprintf( stderr, L"%s: %lu strings, range %lu-%lu, in %lu blocks\n",
          argv[1], count, first, last, pMRD->NumberOfBlocks );

     if ( from < first )
     {
          fwprintf( stderr, L"Adjusting \"from\": %lu -> %lu\n", from, first );
          from = first;
     }

     if ( to > last )
     {
          fwprintf( stderr, L"Adjusting \"to\": %lu -> %lu\n", to, last );
          to = last;
     }

     // ----------------------------------------------------------------------------------
     // now display the strings

#ifndef USE_FORMAT_MESSAGE
     for ( i = 0; i < pMRD->NumberOfBlocks; ++ i )
     {
          for ( pMRE = (MESSAGE_RESOURCE_ENTRY *) addoffset( pMRD, pMRD->Blocks[i].OffsetToEntries ), j = pMRD->Blocks[i].LowId;
               j <= pMRD->Blocks[i].HighId;
               pMRE = (MESSAGE_RESOURCE_ENTRY *) addoffset( pMRE, pMRE->Length ), ++ j )
          {
               wprintf( pMRE->Flags? L"[%lu] -- %s": L"[%lu] -- %S", j, pMRE->Text );
          }
     }
#endif

     FreeResource( hRes ); // Obsolete? HA!

     // ----------------------------------------------------------------------------------
     // now get the strings with FormatMessage()

#ifdef USE_FORMAT_MESSAGE
     DWORD rc, msg;
     wchar_t *buf;

     (void) j; (void) pMRE;

     for ( msg = from; msg <= to; ++ msg )
     {
          buf = NULL;

          if ( 0 == FormatMessage( 70 | FORMAT_MESSAGE_ALLOCATE_BUFFER |
               FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
               hDLL, msg, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT),
               (wchar_t *) &buf, 0, NULL ) )
          {
               rc = gle;
               switch ( rc )
               {
               case ERROR_MR_MID_NOT_FOUND:
                    if ( msg % 64 == 0 )
                         fwprintf( stderr, L"[%lu]\r", msg );
                    break;
               case ERROR_RESOURCE_DATA_NOT_FOUND:
                    fwprintf( stderr, L"FormatMessage( \"%s\", %lu ): gle = %lu, "
                         L"no resources in this file\n", argv[1], msg, rc );
                    return 3;
               default:
                    fwprintf( stderr, L"FormatMessage( \"%s\", %lu ): gle = %lu\n",
                         argv[1], msg, rc );
                    return 2;
               }
          }
          else
               wprintf( L"[%lu] -- %s\n", msg, buf );
               

          if ( buf != NULL )
               LocalFree( buf );
     }

     fwprintf( stderr, L"[%lu]\n", to );
#endif

     // ----------------------------------------------------------------------------------

     FreeLibrary( hDLL );

     return 0;
}
Comments: