home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / ps.zip / ps.c < prev    next >
C/C++ Source or Header  |  1993-08-26  |  18KB  |  578 lines

  1. /****************************************************************
  2.  *
  3.  *  Dieses Programm ersetzt das von IBM mitgelieferte pstat.
  4.  *  Es ist aber möglich mehr Angaben auszugegeben bzw die Ausgaben
  5.  *  auf wesentlich Merkmale zu reduzieren.
  6.  *  Author: Ralf Seidel
  7.  *  email: rauh@wrcd1.uni-wuppertal.de
  8.  *  subject: fuer Ralf
  9.  *
  10.  *  This Program replaces pstat deliverd with the OS/2 package. 
  11.  *  It has some more options and alows the output to be more brief.
  12.  *  All comments are written in german, because I don't expect 
  13.  *  much interrest.
  14.  *  I developed it using EMX GCC but it may be possible to use other
  15.  *  compilers though I could not test this by myself.
  16.  *  Author: Ralf Seidel
  17.  *  email: rauh@wrcd1.uni-wuppertal.de
  18.  *  subject: for Ralf
  19.  ****************************************************************/
  20. #include <stdio.h>
  21. #include <strings.h>
  22. #include <malloc.h>
  23. #include <ctype.h>
  24. #define INCL_DOSERRORS
  25. #define INCL_DOSPROCESS
  26. #include <os2.h>
  27. #include "ps.h"
  28.  
  29. #define RC_OK 0                 /* return codes */
  30. #define RC_ERR 1
  31.  
  32. /*
  33. #define SHOW_UNKNOWN_HEADER 
  34. #define SHOW_UNKNOWN_PROCESS
  35. #define SHOW_UNKNOWN_THREAD  
  36. #define SHOW_UNKNOWN_SEM     
  37. #define SHOW_UNKNOWN_MODULS
  38. */
  39.  
  40. /* Funktionen */
  41.  
  42. #ifndef __EMX__
  43. /* Diese Funktion dubliziert den ihr übergebenen ASCIIZ String */
  44. /* Sie allociert dafür mittels malloc() den benötigten Platz und */
  45. /* kopiert dann bei Erfolg von malloc() den übergebenen String mit */
  46. /* den Befehl memcpy */
  47. char *strdup( char *string )
  48. {
  49.    char *p;
  50.    size_t n;
  51.    n = strlen( string ) + 1;
  52.    if ( p = (char*) malloc( n )) != NULL )
  53.       (char *)memcpy( p, string, n );
  54.    return p;
  55. }
  56. #endif
  57.  
  58.  
  59. /* Ausgabe einer kurzen Mitteilung bei falschen Parametern */
  60. void ShowUsage()
  61. {
  62.    fprintf( stderr, "Fehler bei den Komandooptionen\n" );
  63.    fprintf( stderr, "Gültige Optionen sind: ?ABCHMOT\n" );
  64.    exit( RC_ERR );
  65. }
  66.  
  67. /* Ausgabe der Hilfestellung */
  68. void ShowHelp()
  69. {
  70.    printf( "Optionen sind:\n" );
  71.    printf( "\tH : Anzeigen von allgemeinen Informationen\n" );
  72.    printf( "\tC : Anzeigen von Prozeßinformationen\n" );
  73.    printf( "\tT : Anzeigen von Prozeß- und Threadinformationen\n" );
  74.    printf( "\tO : Anzeigen von Modulen im System\n" );
  75.    printf( "\tM : Anzeigen von Informationen über 'shared Memory'\n" );
  76.    printf( "\tS : Anzeigen von Systemsemaphoren\n" );
  77.    printf( "\tA : Anzeigen aller Angaben (default)\n" );
  78.    printf( "\tB : Kurzanzeige\n" );
  79.    printf( "Bei der Verwendung der Option B werden die Angaben " \
  80.            "verkürzt ausgeben:\n" );
  81.    exit( RC_OK );
  82. }
  83.  
  84. /* Ausgabe der allgemeinen Angaben */
  85. void ShowSum( PBUFFHEADER pBufHead )
  86. {
  87.    PSUMMARY pProcSum;
  88.  
  89.    printf( "\nAllgemeine Angaben:\n" );
  90.    pProcSum = pBufHead->psumm;
  91.    printf( "Anzahl der Prozesse(?)\t: %.8x\n", pProcSum->ulProcCt );
  92.    printf( "Anzahl der Threads\t: %.8x\n",
  93.            pProcSum->ulThreadCt );
  94.    printf( "Geöffnete Dateien\t: %.8x\n", pProcSum->ulOpenFileCt );
  95. #ifdef SHOW_UNKNOWN_HEADER
  96.    printf( "Unknown1: %.8x\n", pBufHead->pUnknown1 );
  97.    printf( "Unknown2: %.8x\n", pBufHead->pUnknown2 );
  98.    printf( "Unknown3: %.8x\n", pBufHead->pUnknown3 );
  99. #endif /* SHOW_UNKNOWN_HEADER */
  100.  
  101. /* Ausgabe der Processinformationen */
  102. void ShowProc( PBUFFHEADER pBufHead, \
  103.                BOOL fShowThread, BOOL fShowBrief )
  104. {
  105.    typedef struct _MODLIST
  106.    {
  107.       struct _MODLIST *pNext;
  108.       USHORT   hMod;            /* Interne Kennung */
  109.       PSZ      pModName;        /* Name des Moduls */
  110.    } MODLIST, *PMODLIST;
  111.  
  112.    PPROCESSINFO pProcInfo;
  113.    PTHREADINFO pThreadInfo;
  114.    PMODINFO pModInfo;
  115.    PMODLIST pModList;
  116.    PMODLIST pmli;
  117. /*   PUSHORT pusi; */
  118.  
  119.    printf( "\n\t\tProzeßinformationen\n\n" );
  120.  
  121.    /* Erstellung der Liste mit den Modulnamen */
  122.  
  123.    if (( pModList = (PMODLIST) malloc( sizeof (MODLIST) )) == NULL )
  124.    {
  125.       fprintf(stderr, "malloc: memory exhausted in %s at %d\n", \
  126.               __FILE__, __LINE__ );
  127.       exit( RC_ERR );
  128.    }
  129.    pmli = pModList;
  130.    for ( pModInfo = pBufHead->pmi; pModInfo != NULL;
  131.          pModInfo = pModInfo->pNext )
  132.    {
  133.    if (( pmli->pModName = (CHAR *)strdup(pModInfo->szModName )) == NULL )
  134.    {
  135.       fprintf(stderr, "strdup: memory exhausted in %s at %d\n",
  136.               __FILE__, __LINE__ );
  137.       exit( RC_ERR );
  138.    } /* endif */
  139.       pmli->hMod = pModInfo->hMod;
  140.       if ( (pmli->pNext = (PMODLIST) malloc( sizeof (MODLIST) )) == NULL )
  141.       {
  142.          fprintf(stderr, "malloc: memory exhausted in %s at %d\n",
  143.                  __FILE__, __LINE__ );
  144.          exit( RC_ERR );
  145.       }
  146.       pmli = pmli->pNext;
  147.       pmli->pNext = NULL;
  148.    }
  149.  
  150.    /* Ausgabe der Prozeßinformationen */
  151.  
  152.    printf( "PID  (dez)\tModulname\n" );
  153.    if ( fShowBrief == FALSE )
  154.       printf( "\tPPID\tSID\tKennung\tSession Typ\n");
  155.    if ( fShowThread == TRUE )
  156.    {
  157.       printf( "Threadinfos:\n" );
  158.       printf( "\tProcID\tSysID\tBlockID\t\tPrio.\tZähler 1 & 2\t" );
  159.       printf( "Status\n" );
  160.    } /* endif fShowThread */
  161.    pProcInfo = pBufHead->ppi;
  162.    while ( pProcInfo->ulEndFlag != PROCINFO_ENDFLAG )
  163.    {
  164.       if ( pProcInfo->ulEndFlag != PROCINFO_CONTFLAG )
  165.       {
  166.          fprintf( stderr,
  167.                   "Unerwarteter Wert in der Prozessinfolist: %d\n",
  168.                   pProcInfo->ulEndFlag );
  169.          exit( RC_ERR );
  170.       } /* endif */
  171.  
  172.       /* Finden des zum Prozeß dazugehörigen Moduls */
  173.  
  174.       pmli = pModList;
  175.       while ( (pmli != NULL) && (pmli->hMod != pProcInfo->hModRef) )
  176.          pmli = pmli->pNext;
  177.       printf( "%.4x (%d)\t", pProcInfo->pid, pProcInfo->pid );
  178.       if ( pmli == NULL )
  179.          printf( "Name nicht gefunden!\n" );
  180.       else
  181.          printf( "%s\n", pmli->pModName );
  182.       if ( fShowBrief == FALSE )
  183.       {
  184.          printf( "\t%.2x\t", pProcInfo->pidParent );
  185.          printf( "%.2x\t", pProcInfo->sid );
  186.          printf( "%.4x\t", pProcInfo->hModRef );
  187.          printf( "%d : ",pProcInfo->usSessionType );
  188.          switch( pProcInfo->usSessionType )
  189.          {
  190.          case SSF_TYPE_DEFAULT:
  191.             printf("System\n");
  192.             break;
  193.          case SSF_TYPE_FULLSCREEN:
  194.             if ( pProcInfo->hModRef == 0 )
  195.                printf( "DOS\n" );
  196.             else
  197.                printf( "OS/2 FS\n" );
  198.             break;
  199.          case SSF_TYPE_WINDOWABLEVIO:
  200.             printf( "OS/2 Window\n" );
  201.             break;
  202.          case SSF_TYPE_PM:
  203.             printf( "PM\n" );
  204.             break;
  205.          case SSF_TYPE_VDM:
  206.             printf( "Detached\n" );
  207.             break;
  208. /* Folgende Typen werden noch in os.h deklariert aber nie benutzt */
  209. /*       case SSF_TYPE_GROUP:   
  210.             printf( "Gruppe\n" );
  211.             break;
  212.          case SSF_TYPE_DLL:
  213.             printf( "DLL\n" );
  214.             break;
  215.          case SSF_TYPE_WINDOWEDVDM:
  216.             printf( "Virtual DOS (Window)\n" );
  217.             break;
  218.          case SSF_TYPE_PDD:
  219.             printf( "PDD\n" );
  220.             break;
  221.          case SSF_TYPE_VDD:
  222.             printf( "VDD\n" );
  223.             break; */
  224.          default:
  225.             printf( "Unbekannt (Fehler ?)\n" );
  226.          } /* endswitch */
  227. #ifdef SHOW_UNKNOWN_PROCESS
  228.          printf( "Unknown1: %4x\n", pProcInfo->usUnknown1 );
  229.          printf( "Unknown2: %4x\n", pProcInfo->usUnknown2 );
  230.          printf( "Unknown3: %4x\n", pProcInfo->usUnknown3 );
  231.          printf( "Unknown4: %4x\n", pProcInfo->usUnknown4 );
  232.          printf( "Unknown5: %4x\n", pProcInfo->usUnknown5 );
  233.          printf( "Unknown6: %4x\n", pProcInfo->usUnknown6 );
  234.          printf( "Unknown7: %4x\n", pProcInfo->usUnknown7 );
  235.          printf( "Unknown8: %4x\n", pProcInfo->usUnknown8 );
  236.          printf( "Unknown9: %4x\n", pProcInfo->usUnknown9 );
  237. #endif
  238.       } /* endif fShowBrief */
  239.       /* Ausgabe der zugehörigen Thread Informationen */
  240.       if ( fShowThread == TRUE )
  241.       {
  242.          pThreadInfo = pProcInfo->ptiFirst;
  243.          for ( pThreadInfo = pProcInfo->ptiFirst;
  244.                pThreadInfo < pProcInfo->ptiFirst
  245.                              + pProcInfo->usThreadCt;
  246.                pThreadInfo++ )
  247.          {
  248.             printf( "\t%.2x\t", pThreadInfo->usProcTid );
  249.             printf( "%.2x\t", pThreadInfo->usSysTid );
  250.             printf( "%.8x\t", pThreadInfo->ulBlockId );
  251.             printf( "%.4x\t", pThreadInfo->usPriority );
  252.             printf( "%.4x\t", pThreadInfo->ulExecCt1 );
  253.             printf( "%.4x\t", pThreadInfo->ulExecCt2 );
  254.             printf( "%d : ", pThreadInfo->usThreadStat );
  255.             switch ( pThreadInfo->usThreadStat )
  256.             {
  257.             case 1:
  258.                printf( "ready\n" );
  259.                break;
  260.             case 2:
  261.                printf( "blocked\n" );
  262.                break;
  263.             case 5:
  264.                printf( "running\n" );
  265.                break;
  266.             case 9:
  267.                printf( "frozen\n" );
  268.                break;
  269.             default:
  270.                printf( "unbekannt\n" );
  271.             } /* endswitch */
  272. #ifdef SHOW_UNKNOWN_THREAD
  273.             printf( "Unknown1: %.4x\n", pThreadInfo->usUnknown1 );
  274.             printf( "Unknown2: %.4x\n", pThreadInfo->usUnknown2 );
  275.             printf( "Unknown3: %.4x\n", pThreadInfo->usUnknown3 );
  276.             printf( "Unknown4: %.4x\n", pThreadInfo->usUnknown4 );
  277. #endif
  278.          } /* endif fShowThread */
  279.       } /* endfor */
  280.       pProcInfo = (PPROCESSINFO)
  281.                   ( pProcInfo->ptiFirst + pProcInfo->usThreadCt );
  282.    } /* endwhile */
  283.    printf( "\n" );
  284. } /* end ShowProc */
  285.  
  286. /* Ausgabe der Informationen über Semaphoren */
  287. void ShowSem( PBUFFHEADER pBufHead, BOOL fShowBrief )
  288. {
  289.    PSEMINFO pSemInfo;
  290.  
  291.    printf( "\n\t\tSystemsemaphoren\n\n" );
  292.    printf( "Semaphorenname\n" );
  293.    if ( fShowBrief == FALSE )
  294.    {
  295.       printf( "\tEigner\t\tAnzahl\t\tAnzahl\n" );
  296.       printf( "\tThread" );
  297.       printf( "\tIndex" );
  298.       printf( "\tVerweise" );
  299.       printf( "\tAnforderungen" );
  300.       printf( "\tFlags\n" );
  301.    } /* endif fShowBrief */
  302.    for (pSemInfo = (PSEMINFO)((char*)pBufHead->psi + 0x10);
  303.         pSemInfo != NULL && pSemInfo->usIndex != 0;
  304.         pSemInfo = pSemInfo->pNext )
  305.    {
  306.       printf( "%s\n", pSemInfo->szSemName );
  307.       if ( fShowBrief == FALSE )
  308.       {
  309.          if ( pSemInfo->usOwner != 0 )
  310.             printf( "\t%.4x", pSemInfo->usOwner );
  311.          else
  312.             printf( "\t" );
  313.          printf( "\t%.4x", pSemInfo->usIndex );
  314.          printf( "\t%.2x\t", pSemInfo->uchRefCt );
  315.          printf( "\t%.2x\t", pSemInfo->uchRequestCt );
  316.          printf( "\t%.2x\n", pSemInfo->uchFlag );
  317. #ifdef SHOW_UNKNOWN_SEM
  318.          printf( "Unknown1: %.2x\t", pSemInfo->uchUnknown1 );
  319.          printf( "Unknown2: %.4x\t", pSemInfo->usUnknown2 );
  320.          printf( "Unknown3: %.4x\n", pSemInfo->usUnknown3 );
  321. #endif
  322.       } /* endif fShowBrief */
  323.    } /* endfor fShowBrief */
  324.    printf( "\n" );
  325. } /* end ShowSem */
  326.  
  327. /* Ausgabe der Informationen über shared memory */
  328. void ShowMem ( PBUFFHEADER pBufHead, BOOL fShowBrief )
  329. {
  330.    PSHRMEMINFO pShrMemInfo;
  331.  
  332.    printf( "\n\t\tGemeinsam benutzter Speicher\n\n" );
  333.    printf( "Name des Speichers\n" );
  334.    if ( fShowBrief == FALSE )
  335.    {
  336.       printf( "\tInterne Kennung\t\tAnzahl der Verweise\tSelektor\n" );
  337.    } /* endif fShowBrief */
  338.    for ( pShrMemInfo = pBufHead->psmi;
  339.          pShrMemInfo != NULL && pShrMemInfo->selMem != 0;
  340.          pShrMemInfo = pShrMemInfo->pNext )
  341.    {
  342.       printf( "%s\n", pShrMemInfo->szMemName );
  343.       if ( fShowBrief == FALSE )
  344.       {
  345.          printf( "\t%.4x\t\t", pShrMemInfo->usMemHandle);
  346.          printf( "\t%.4x\t\t", pShrMemInfo->usRefCt );
  347.          printf( "\t%.4x\n", pShrMemInfo->selMem );
  348.       } /* endif fShowBrief */
  349.    } /* endfor pShrMemInfo */
  350.    printf( "\n" );
  351. } /* end ShowMem */
  352.  
  353. /* Ausgabe der Informationen über geladene Module */
  354. void ShowMod( PBUFFHEADER pBufHead, BOOL fShowBrief )
  355. {
  356.    PMODINFO pModInfo;
  357.    USHORT *pModRef;
  358.    INT i;
  359.  
  360.    printf( "Geladene Module im System:\n\n" );
  361.    printf( "Modulname\n" );
  362.    if ( fShowBrief == FALSE )
  363.    {
  364.       printf( "\t\t\tInterne\t\tAnzahl\t\tAnzahl\n" );
  365.       printf( "\tModultyp\t" );
  366.       printf( "Kennung\t\t" );
  367.       printf( "Verweise\t" );
  368.       printf( "Segmente\n" );
  369.       printf( "Kennungen von referenzierten Modulen\n" );
  370.    } /* endif fShowBrief */
  371.    for ( pModInfo = pBufHead->pmi; pModInfo != NULL;
  372.          pModInfo = pModInfo->pNext )
  373.    {
  374.       printf( "%s\n", pModInfo->szModName );
  375.       if ( fShowBrief == FALSE )
  376.       {
  377.          printf( "\t%d = %s\t", pModInfo->usMemModel,
  378.                  (pModInfo->usMemModel == 0)?"16 Bit":"32 Bit");
  379.          printf( "%.4x\t\t", pModInfo->hMod );
  380.          printf( "%.4x\t\t", pModInfo->ulRefCt );
  381.          printf( "%.4x\n", pModInfo->ulSegCt );
  382.          pModRef = pModInfo-> usModRef;
  383.          for ( i = 0; i < pModInfo->ulRefCt; i++ )
  384.             printf( "%.4x\t", *pModRef++ );
  385.          printf( "\n" );
  386. #ifdef SHOW_UNKNOWN_MODULS
  387.             printf( "Unnkown1: %.8x\n", pModInfo->ulUnknown1 );
  388. #endif
  389.       } /* endif fShowBrief */
  390.    } /* endfor */
  391. } /* end ShowMod */
  392.  
  393.  
  394. /* HAUPTPROGRAMM */
  395.  
  396. int main(int argc, char *argv[], char *envp[])
  397. {
  398.    /* Variablen für die Systeminformationen */
  399.    PBUFFHEADER pBufHead;
  400.    USHORT usRetCode;
  401.    USHORT usBufSize = PROCINFO_BUF_SIZE;
  402.  
  403.    /* Variablen für die Ausgabeoptionen */
  404.    BOOL fShowSum = TRUE;
  405.    BOOL fShowProc = TRUE;
  406.    BOOL fShowThread = TRUE;
  407.    BOOL fShowSem = TRUE;
  408.    BOOL fShowMem = TRUE;
  409.    BOOL fShowMod = TRUE;
  410.    BOOL fShowBrief = FALSE;
  411.  
  412.    /* Variablen für die Parameterauswertung */
  413.    PSZ szParam;
  414.  
  415.    /* Sonstige Variablen */
  416.    INT i;
  417.  
  418.    /* Auswertung der Kommandozeile */
  419.  
  420.    /* Ausgabe des Programmnamens */
  421.    printf( "%s : (c) Ralf Seidel 2/93\n", argv[0] );
  422.    for (i = 1; i < argc; i++)
  423.    {
  424.       for ( szParam = argv[i]; *szParam != '\0'; szParam++ )
  425.       {
  426.          switch ( toupper( *szParam ))
  427.          {
  428.          case '-':
  429.          case '/':
  430.             break;
  431.          case '?':
  432.             ShowHelp();
  433.             break;
  434.          case 'B':
  435.             fShowBrief = TRUE;
  436.             break;
  437.          case 'C':
  438.             if ( fShowProc == TRUE )
  439.             {
  440.                fShowSum = FALSE;
  441.                fShowThread = FALSE;
  442.                fShowSem = FALSE;
  443.                fShowMem = FALSE;
  444.                fShowMod = FALSE;
  445.             }
  446.             else
  447.                fShowProc = TRUE;
  448.             /* endif */
  449.             break;
  450.          case 'T':
  451.             if ( fShowThread == TRUE )
  452.             {
  453.                fShowSum = FALSE;
  454.                fShowSem = FALSE;
  455.                fShowMem = FALSE;
  456.                fShowMod = FALSE;
  457.             }
  458.             else
  459.             {
  460.                fShowProc = TRUE;
  461.                fShowThread = TRUE;
  462.             } /* endif */
  463.             break;
  464.          case 'H':
  465.             if ( fShowSum == TRUE )
  466.             {
  467.                fShowProc = FALSE;
  468.                fShowThread = FALSE;
  469.                fShowSem = FALSE;
  470.                fShowMem = FALSE;
  471.                fShowMod = FALSE;
  472.             }
  473.             else
  474.                fShowSum = TRUE;
  475.             /* endif fShowSum */
  476.             break;
  477.          case 'S':
  478.             if ( fShowSem == TRUE )
  479.             {
  480.                fShowSum = FALSE;
  481.                fShowProc = FALSE;
  482.                fShowThread = FALSE;
  483.                fShowMem = FALSE;
  484.                fShowMod = FALSE;
  485.             }
  486.             else
  487.                fShowSem = TRUE;
  488.             /* endif fShowSem */
  489.             break;
  490.          case 'M':
  491.             if ( fShowMem == TRUE )
  492.             {
  493.                fShowSum = FALSE;
  494.                fShowProc = FALSE;
  495.                fShowThread = FALSE;
  496.                fShowSem = FALSE;
  497.                fShowMod = FALSE;
  498.             }
  499.             else
  500.                fShowMem = TRUE;
  501.             /* endif fShowMem */
  502.             break;
  503.          case 'L':
  504.          case 'O':
  505.             if ( fShowMod == TRUE )
  506.             {
  507.                fShowSum = FALSE;
  508.                fShowProc = FALSE;
  509.                fShowThread = FALSE;
  510.                fShowSem = FALSE;
  511.                fShowMem = FALSE;
  512.             }
  513.             else
  514.                fShowMod = TRUE;
  515.             /* endif */
  516.             break;
  517.          case 'A':
  518.             fShowSum = TRUE;
  519.             fShowProc = TRUE;
  520.             fShowThread = TRUE;
  521.             fShowSem = TRUE;
  522.             fShowMem = TRUE;
  523.             fShowMod = TRUE;
  524.             break;
  525. /*       case 'P':
  526.             break;*/
  527.          default: 
  528.             ShowUsage();
  529.          } /* endswitch */
  530.       } /* endfor szParam */
  531.    } /* endfor i */
  532.    if (( pBufHead = (PBUFFHEADER) malloc( (size_t)usBufSize)) == NULL )
  533.    {
  534.       fprintf(stderr, "malloc: memory exhausted in %s at %d\n", \
  535.                        __FILE__, __LINE__ );
  536.       exit(RC_ERR);
  537.    }
  538. #ifdef __EMX__
  539.    _THUNK_PROLOG(4 + 2);
  540.    _THUNK_FLAT(pBufHead);
  541.    _THUNK_SHORT(usBufSize);
  542.    usRetCode = (USHORT) _THUNK_CALL( DosQProcStatus );
  543. #else
  544.    usRetCode = DosQProcStatus( pBufHead, usBufSize );
  545. #endif
  546.    switch ( usRetCode )
  547.    {
  548.    case NO_ERROR:
  549.       break;
  550.    case ERROR_BUFFER_OVERFLOW:
  551.       fprintf( stderr, "DosQProcStatus: Datenbuffer zu klein\n" );
  552.       fprintf( stderr, "Buffergröße ändern und neu compilieren\n" );
  553.       exit( RC_ERR );
  554.    default:
  555.       fprintf( stderr, "DosQProcStatus: Errorcode %d", usRetCode );
  556.       exit( RC_ERR );
  557.    } /* endswitch */
  558.  
  559.    /* Ausgabe des Bufferheaders" */
  560.    if ( fShowSum == TRUE ) 
  561.       ShowSum( pBufHead );
  562.    /* Ausgabe der Prozeßinformationen */
  563.    if ( fShowProc == TRUE )
  564.       ShowProc( pBufHead, fShowThread, fShowBrief );
  565.    /* Ausgabe der Informationen über Semaphoren */
  566.    if ( fShowSem == TRUE )
  567.       ShowSem( pBufHead, fShowBrief );
  568.    /* Ausgabe der Informationen über "shared memory" */
  569.    if ( fShowMem == TRUE )
  570.       ShowMem( pBufHead, fShowBrief );
  571.    /* Ausgabe der Informationen über geladene Module */
  572.    if ( fShowMod == TRUE )
  573.       ShowMod( pBufHead, fShowBrief );
  574.    return RC_OK;
  575. }
  576.  
  577.