home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxlist.zip / lxlist.c next >
C/C++ Source or Header  |  1996-08-14  |  4KB  |  188 lines

  1. /*
  2.  *
  3.  * Module   :LXLIST.C
  4.  * Abstract :LX Executable import module list
  5.  * 
  6.  * Copyright (C) Sergey I. Yevtushenko
  7.  * Last Update :Wed  14-08-96
  8.  * Created     :Sat  20-04-96
  9.  */
  10.  
  11. #define INCL_DOSFILEMGR
  12. #define INCL_DOSMODULEMGR
  13. #define INCL_DOSERRORS
  14. #include <os2.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <lxlist.h>
  19.  
  20.  
  21. typedef struct st__module_info
  22. {
  23.     UCHAR Name[CCHMAXPATHCOMP];
  24.     ULONG Type;
  25. } MODULE, *PMODULE;
  26.  
  27. APIRET GetModuleInfo(PMODULE Module)
  28. {
  29.     UCHAR LoadError[256] = "";    /* Area for Load failure information */
  30.     HMODULE ModuleHandle = NULLHANDLE;    /* Module handle                     */
  31.     APIRET rc = NO_ERROR;    /* Return code                       */
  32.  
  33.     Module->Type = -1;
  34.  
  35.     rc = DosLoadModule(LoadError, sizeof(LoadError), Module->Name, &ModuleHandle);
  36.     Module->Name[0] = 0;
  37.     if (rc != NO_ERROR)
  38.     {
  39.         return rc;
  40.     }
  41.  
  42.     rc = DosQueryModuleName(ModuleHandle, sizeof(Module->Name), Module->Name);
  43.     if (rc != NO_ERROR)
  44.     {
  45.         Module->Name[0] = 0;
  46.         return rc;
  47.     }
  48.  
  49.     rc = DosQueryProcType(ModuleHandle, 1L, NULL, &Module->Type);
  50.     if (rc != NO_ERROR)
  51.     {
  52.         Module->Type = -1;
  53.         return rc;
  54.     }
  55.  
  56.     rc = DosFreeModule(ModuleHandle);
  57.     return rc;
  58. }
  59.  
  60. void list_LX(char *file)
  61. {
  62.     FILE *in;
  63.     long beg = 0;
  64.     LXheader hdr;
  65.     int i;
  66.     word sign;
  67.  
  68.     in = fopen(file, "rb");
  69.     if (!in)
  70.         return;
  71.     fread(&sign, sizeof(sign), 1, in);
  72.     if (sign != 0x4D5A && sign != 0x5A4D)    /* MZ or ZM !!! Yes this is also valid */
  73.     {
  74.         /* printf("not an executable file"); */
  75.         fclose(in);
  76.         return;
  77.     }
  78.     fseek(in, OffsetToLX, SEEK_SET);
  79.     fread(&beg, sizeof(beg), 1, in);
  80.     fseek(in, beg, SEEK_SET);
  81.     fread(&hdr, sizeof(hdr), 1, in);
  82.     if (hdr._L != 'L' || hdr._X != 'X')
  83.     {
  84.         /* printf("Unknow format '%c%c'", hdr._L, hdr._X); */
  85.         fclose(in);
  86.         return;
  87.     }
  88.     printf("%s :\n", file);
  89.     fseek(in, beg + hdr.ImportModuleTblOff, SEEK_SET);
  90.     for (i = 0; i < (hdr.ImportProcTblOff - hdr.ImportModuleTblOff); i++)
  91.     {
  92.         int j;
  93.         char *name;
  94.         j = getc(in);
  95.         if (j > 0)
  96.         {
  97.             char *ptr;
  98.             name = (char *) malloc(j + 1);
  99.             if (name)
  100.             {
  101.                 APIRET rc;
  102.                 MODULE module;
  103.                 ptr = name;
  104.                 for (; j > 0; j--, i++)
  105.                     *ptr++ = getc(in);
  106.                 *ptr = 0;
  107.                 strcpy(module.Name, name);
  108.                 rc = GetModuleInfo(&module);
  109.                 printf("\t %s (%s) : %s\n", name,
  110.                         (module.Type == -1) ? "(unknow)" :
  111.                         (module.Type == 1 ? "32-bit":"16-bit"), module.Name);
  112.             }
  113.             free(name);
  114.         }
  115.     }
  116.     if (!i)
  117.         printf("\n");
  118.     fclose(in);
  119. }
  120.  
  121. main(int argc, char **argv)
  122. {
  123.     int i;
  124.     char path[CCHMAXPATHCOMP];
  125.     if(argc == 1)
  126.     {
  127.         printf(
  128.             "LX executable import module(s) lister V0.02\n"
  129.             "Copyright (c) 1996  Sergey I. Yevtushenko\n"
  130.             "  Usage: LXLIST <filespec>\n"
  131.         );
  132.         return 0;
  133.     }
  134.     for (i = 1; i < argc; i++)
  135.     {
  136.         HDIR hdirFindHandle = HDIR_SYSTEM;
  137.         FILEFINDBUF3 FindBuffer = {0};
  138.         ULONG ulResultBufLen = sizeof(FILEFINDBUF3);
  139.         ULONG ulFindCount = 1;
  140.         APIRET rc = NO_ERROR;
  141.         char *slash = 0;
  142.  
  143.         strcpy(path, argv[i]);
  144.         slash = strrchr(path, '\\');
  145.         if (slash)
  146.             slash++;
  147.  
  148.         rc = DosFindFirst(argv[i],
  149.                   &hdirFindHandle,
  150.                   FILE_NORMAL | FILE_ARCHIVED |
  151.                   FILE_SYSTEM | FILE_HIDDEN | FILE_READONLY,
  152.                   &FindBuffer,
  153.                   ulResultBufLen,
  154.                   &ulFindCount,
  155.                   FIL_STANDARD);
  156.  
  157.         if (rc != NO_ERROR)
  158.             return 1;
  159.  
  160.         do
  161.         {
  162.             ulFindCount = 1;
  163.             if (slash)
  164.             {
  165.                 strcpy(slash, FindBuffer.achName);
  166.                 list_LX(path);
  167.             }
  168.             else
  169.                 list_LX(FindBuffer.achName);
  170.  
  171.             rc = DosFindNext(hdirFindHandle,
  172.                      &FindBuffer,
  173.                      ulResultBufLen,
  174.                      &ulFindCount);
  175.             if (rc != NO_ERROR && rc != ERROR_NO_MORE_FILES)
  176.             {
  177.                 printf("DosFindNext error: return code = %u\n", rc);
  178.                 return 1;
  179.             }
  180.         }
  181.         while (rc != ERROR_NO_MORE_FILES);
  182.         rc = DosFindClose(hdirFindHandle);
  183.     }
  184.     return 0;
  185. }
  186.  
  187.  
  188.