home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 8 Other
/
08-Other.zip
/
status1.zip
/
STATUS.C
< prev
next >
Wrap
Text File
|
1989-11-28
|
34KB
|
839 lines
#define PROGRAM "STATUS" // Program Name
#define LEVEL "00" // Program Level
#define COPYRIGHT "Copyright (c) 1989 George Brickner 70040,104"
#pragma title (PROGRAM " Level " LEVEL " - Display OS/2 Status")
#pragma linesize(132)
#pragma pagesize(55)
#pragma comment(exestr,PROGRAM "-Level " LEVEL "-" __TIMESTAMP__ "-" COPYRIGHT)
/*****************************************************************************
** STATUS - Display OS/2 Status via DosQProcStatus API **
** Level 00 - November 27th, 1989 **
** **
** Command line parameters: **
** -A = Display all information **
** -D = Display debug Infomation **
** -L = Display OS/2 Resource Modules (sorted alphabetically) **
** -M = Display OS/2 Shared Memory Segments (sorted alphabetically) **
** -N = Sort Processes by PID (-P), Modules by ModID (-L) **
** -P = Display OS/2 Processes (Default) (sorted alphabetically) **
** -S = Display OS/2 System Semaphores (sorted alphabetically) **
*****************************************************************************/
#define INCL_DOS // Include Base OS/2 Calls
#define INCL_DOSERRORS // Include Base OS/2 Errors
#include <os2.h> // Standard OS/2 Definitions
#include <stdio.h> // C/2 Standard I/O Defs
#include <stdlib.h> // C/2 Standard Library
#include <string.h> // C/2 Standard String Defs
#include <STATUS.h> // Includes For STATUS.c
/********************************************************************
** Define Module Table Data Structure **
********************************************************************/
typedef struct _MODTBL // Define Module Table Entry
{
HMODULE ModID; // Module ID
USHORT MaxDeps; // Maximum Dependencies
PUSHORT pDeps; // Pointer To Dependencies Table
PCHAR pName; // Pointer To Module Name
} MODTBL;
typedef MODTBL FAR *PMODTBL; // Define Pointer
/********************************************************************
** Define Process Table Data Structure **
********************************************************************/
typedef struct _PROCTBL // Define Process Table Entry
{
PID Pid; // Process ID
PID PPid; // Parent Process ID
USHORT SessionID; // OS/2 Session ID
USHORT Threads; // Number Of Threads
USHORT Children; // Child Processes
HMODULE ModID; // Module ID
PCHAR pName; // Module Name
} PROCTBL;
typedef PROCTBL FAR *PPROCTBL; // Define Pointer
#pragma subtitle ("Define Static & Global Data Areas")
#pragma page()
/**********************************************************************
** Define Static Data Areas **
**********************************************************************/
static CHAR const eyepopper[] = PROGRAM "-Level " LEVEL "-" __TIMESTAMP__ "-" COPYRIGHT;
static BYTE bBuf[65535]; // Data Feedback Buffer
static BOOL Show_Procs = FALSE; // Display Process Switch
static BOOL Show_Mods = FALSE; // Display Modules Switch
static BOOL Show_Sems = FALSE; // Display Semaphores Switch
static BOOL Show_Segs = FALSE; // Display Shared Memory Switch
static BOOL Sort_Pid_Num = FALSE; // Numeric Sort (PID)
static BOOL Sort_Mod_Num = FALSE; // Numeric Sort (ModID)
static BOOL Debug_Mode = FALSE; // Debug Mode
static PPROCTBL *pProcTbl = NULL; // Process Table Anchor Ptr
static USHORT ProcMax = 0; // Max Process Table Entries
static USHORT ProcNdx = 0; // Current Process Table Index
static PTYPE1 *pThdTbl = NULL; // Thread Table Anchor Ptr
static USHORT ThdMax = 0; // Max Thread Table Entries
static USHORT ThdNdx = 0; // Current Thread Table Index
static PMODTBL *pModTbl = NULL; // Module Table Anchor Ptr
static USHORT ModMax = 0; // Max Module Table Entries
static USHORT ModNdx = 0; // Current Module Table Index
static PTYPE3 *pSemTbl = NULL; // Semaphore Table Anchor Ptr
static USHORT SemMax = 0; // Max Sem Table Entries
static USHORT SemNdx = 0; // Current Sem Table Index
static PTYPE4 *pMemTbl = NULL; // Memory Table Anchor Ptr
static USHORT MemMax = 0; // Max Memory Table Entries
static USHORT MemNdx = 0; // Current Memory Table Index
#pragma subtitle ("Show Program Usage")
#pragma page()
/**********************************************************************
** Show Program Usage **
**********************************************************************/
VOID ShowUsage (VOID)
{
fprintf (stderr, "\nSTATUS Display OS/2 Status Information\n");
fprintf (stderr, "Usage: STATUS [-A][-L][-M][-N][-P][-S]\n");
fprintf (stderr, "Parameters:\n");
fprintf (stderr, "\t-A = Display all information\n");
fprintf (stderr, "\t-D = Display debug information\n");
fprintf (stderr, "\t-L = Display library module information, sort by name\n");
fprintf (stderr, "\t-LN = Same as above but sort by Module ID\n");
fprintf (stderr, "\t-M = Display shared memory segments\n");
fprintf (stderr, "\t-N = Numeric Sort (PID/Mod ID)\n");
fprintf (stderr, "\t-P = Display process information, sort by name (default)\n");
fprintf (stderr, "\t-PN = Same as above but sort by Process ID\n");
fprintf (stderr, "\t-S = Display system semaphores\n");
exit (0);
}
#pragma subtitle ("Process Parameters")
#pragma page()
/**********************************************************************
** Process Command Line Parameters **
**********************************************************************/
VOID Process_Parameters (USHORT argc, PCHAR argv[])
{
USHORT i; // Index
for (i=1; i < argc; i++)
{
if (argv[i][0] == '-' || argv[i][0] == '/') // Parameter
{
switch (argv[i][1]) // Validate Parameter
{
case ('a'): // Show All
case ('A'): // Show All
{
Show_Procs = Show_Mods = Show_Segs = Show_Sems = TRUE;
break;
}
case ('d'): // Show Debug
case ('D'): // Show Debug
{
Debug_Mode = TRUE;
break;
}
case ('l'): // Show Library Modules
case ('L'): // Show Library Modules
{
Show_Mods = TRUE;
if (strpbrk (argv[i], "nN")) // Numeric Sort
{
Sort_Mod_Num = TRUE;
}
break;
}
case ('m'): // Show Shared Memory
case ('M'): // Show Shared Memory
{
Show_Segs = TRUE;
break;
}
case ('n'): // Numeric Sort
case ('N'): // Numeric Sort
{
Sort_Pid_Num = TRUE;
Sort_Mod_Num = TRUE;
break;
}
case ('p'): // Show Processes
case ('P'): // Show Processes
{
Show_Procs = TRUE;
if (strpbrk (argv[i], "nN")) // Numeric Sort
{
Sort_Pid_Num = TRUE;
}
break;
}
case ('s'): // Show Semaphores
case ('S'): // Show Semaphores
{
Show_Sems = TRUE;
break;
}
case ('?'): // Show Usage
case ('h'): // Show Usage
case ('H'): // Show Usage
{
ShowUsage ();
break;
}
default: // Invalid Parameter
{
fprintf (stderr, "Invalid parameter: %s\n", argv[i]);
ShowUsage ();
break;
}
}
}
}
}
#pragma subtitle ("Sort By Module ID")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Module ID **
**********************************************************************/
INT Mod_Sort (PMODTBL *arg1, PMODTBL *arg2)
{
if ((*arg1)->ModID < (*arg2)->ModID)
{
return -1;
}
else if ((*arg1)->ModID > (*arg2)->ModID)
{
return 1;
}
else
{
return 0;
}
}
#pragma subtitle ("Sort By Module Name")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Module Name **
**********************************************************************/
INT Mod_Name_Sort (PMODTBL *arg1, PMODTBL *arg2)
{
return stricmp ((*arg1)->pName, (*arg2)->pName);
}
#pragma subtitle ("Sort By Process ID")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Process ID **
**********************************************************************/
INT Pid_Sort (PPROCTBL *arg1, PPROCTBL *arg2)
{
if ((*arg1)->Pid < (*arg2)->Pid)
{
return -1;
}
else if ((*arg1)->Pid > (*arg2)->Pid)
{
return 1;
}
else
{
return 0;
}
}
#pragma subtitle ("Sort By Process Name")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Process Name **
**********************************************************************/
INT Pid_Name_Sort (PPROCTBL *arg1, PPROCTBL *arg2)
{
if ((*arg1)->pName == NULL && (*arg2)->pName == NULL)
{
return 0;
}
else if ((*arg1)->pName == NULL) // No Name Specified
{
return -1;
}
else if ((*arg2)->pName == NULL) // No Name Specified
{
return 1;
}
return stricmp ((*arg1)->pName, (*arg2)->pName);
}
#pragma subtitle ("Sort By Thread ID")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Thread ID **
**********************************************************************/
INT Tid_Sort (PTYPE1 *arg1, PTYPE1 *arg2)
{
if ((*arg1)->ProcessID < (*arg2)->ProcessID)
{
return -1;
}
else if ((*arg1)->ProcessID > (*arg2)->ProcessID)
{
return 1;
}
else
{
if ((*arg1)->ThreadID < (*arg2)->ThreadID)
{
return -1;
}
else if ((*arg1)->ThreadID > (*arg2)->ThreadID)
{
return 1;
}
else
{
return 0;
}
}
}
#pragma subtitle ("Sort By Semaphore Name")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Semaphore Name **
**********************************************************************/
INT Sem_Sort (PTYPE3 *arg1, PTYPE3 *arg2)
{
return stricmp ((*arg1)->SemaphoreName, (*arg2)->SemaphoreName);
}
#pragma subtitle ("Sort By Shared Segment Name")
#pragma page()
/**********************************************************************
** Sort Compare Routine - Shared Segment Name **
**********************************************************************/
INT Seg_Sort (PTYPE4 *arg1, PTYPE4 *arg2)
{
return stricmp ((*arg1)->SegmentName, (*arg2)->SegmentName);
}
#pragma subtitle ("Initialization")
#pragma page()
/**********************************************************************
** Initialization Routine **
**********************************************************************/
USHORT Initialization (VOID)
{
USHORT rc = NO_ERROR; // Return Code
USHORT Next = 0; // Offset To Next Record
USHORT i, j; // Index
PPROC_STATUS pBuf; // Proc Status Area Ptr
rc = DosQProcStatus (bBuf, sizeof (bBuf));
if (rc == NO_ERROR) // API Call Successful
{
pBuf = (PPROC_STATUS) bBuf; // Initialize Pointer
while (pBuf->TypeCode != TYPE_END) // Do until end of list
{
Next = pBuf->Next; // Offset To Next Record
switch (pBuf->TypeCode)
{
case TYPE_PID: // Type 0 - Process Info
{
if (Debug_Mode && Show_Procs) // Display Debug Info
{
printf ("\n[%p] Record Type %04X Next=%04X Process Information Record\n",
pBuf, pBuf->TypeCode, pBuf->Next);
printf ("\tPID=%04X PPID=%04X Sess=%02X Mod#=%04X\n",
pBuf->Type.Type_0.ProcessID,
pBuf->Type.Type_0.ParentPID,
pBuf->Type.Type_0.SessionID,
pBuf->Type.Type_0.ModID);
}
if (ProcNdx >= ProcMax) // Increase Table Size
{
ProcMax += 50; // Increment Table Size
pProcTbl = (PPROCTBL *) realloc (pProcTbl, ProcMax * sizeof (PPROCTBL));
if (!pProcTbl) // Allocation Failed
{
printf ("\aProcess table realloc failed\n");
exit (1);
}
}
pProcTbl[ProcNdx] = (PPROCTBL) calloc (1, sizeof (PROCTBL)); // Allocate Table Entry
if (!pProcTbl[ProcNdx]) // Allocation Failed
{
printf ("\aProcess table entry alloc failed\n");
exit (1);
}
pProcTbl[ProcNdx]->Pid = pBuf->Type.Type_0.ProcessID;
pProcTbl[ProcNdx]->PPid = pBuf->Type.Type_0.ParentPID;
pProcTbl[ProcNdx]->ModID = pBuf->Type.Type_0.ModID;
pProcTbl[ProcNdx]->SessionID = pBuf->Type.Type_0.SessionID;
pProcTbl[ProcNdx]->Threads = 0;
pProcTbl[ProcNdx]->Children = 0;
pProcTbl[ProcNdx]->pName = NULL;
ProcNdx++; // Increment Process Table Index
break; // Exit Case
}
case TYPE_TID: // Thread Info
{
if (Debug_Mode && Show_Procs) // Display Debug Info
{
printf ("\n[%p] Record Type %04X Next=%04X Thread Information Record\n",
pBuf, pBuf->TypeCode, pBuf->Next);
printf ("\tSysTID=%02X Unkn=%02X PID=%04X TID=%02X Prty=%04X Flgs=%04X BlockID=%08lX\n",
pBuf->Type.Type_1.SysThreadID,
pBuf->Type.Type_1.Unknown,
pBuf->Type.Type_1.ProcessID,
pBuf->Type.Type_1.ThreadID,
pBuf->Type.Type_1.Priority,
pBuf->Type.Type_1.Flags,
pBuf->Type.Type_1.BlockID);
}
if (ThdNdx >= ThdMax) // Increase Table Size
{
ThdMax += 50; // Increment Table Size
pThdTbl = (PTYPE1 *) realloc (pThdTbl, ThdMax * sizeof (PTYPE1));
if (!pThdTbl) // Allocation Failed
{
printf ("\aThread table realloc failed\n");
exit (1);
}
}
pThdTbl[ThdNdx] = &pBuf->Type.Type_1; // Save Pointer
for (i=0; i < ProcNdx; i++)
{
if (pProcTbl[i]->Pid == pBuf->Type.Type_1.ProcessID) // Found Process
{
pProcTbl[i]->Threads++; // Bump Thread Counter
break; // Exit Loop
}
}
ThdNdx++; // Increment Thread Index
break; // Exit Case
}
case TYPE_MOD: // Module Info
{
if (Debug_Mode && Show_Mods) // Display Debug Info
{
printf ("\n[%p] Record Type %04X Next=%04X Module Information Record\n",
pBuf, pBuf->TypeCode, pBuf->Next);
printf ("\tMod#=%04X Deps=%04X DepOff=%04X NameOff=%04X Name=%s\n",
pBuf->Type.Type_2.ModID,
pBuf->Type.Type_2.MaxDeps,
pBuf->Type.Type_2.Dep_Offset,
pBuf->Type.Type_2.Mod_Name_Offset,
MAKEP (SELECTOROF (pBuf), pBuf->Type.Type_2.Mod_Name_Offset));
}
if (ModNdx >= ModMax) // Increase Table Size
{
ModMax += 50; // Increment Table Size
pModTbl = (PMODTBL *) realloc (pModTbl, ModMax * sizeof (PMODTBL));
if (!pModTbl) // Allocation Failed
{
printf ("\aModule table realloc failed\n");
exit (1);
}
}
pModTbl[ModNdx] = (PMODTBL) calloc (1, sizeof (MODTBL)); // Allocate Table Entry
if (!pModTbl[ModNdx]) // Allocation Failed
{
printf ("\aModule table entry alloc failed\n");
exit (1);
}
pModTbl[ModNdx]->ModID = pBuf->Type.Type_2.ModID;
pModTbl[ModNdx]->MaxDeps = pBuf->Type.Type_2.MaxDeps;
if (pModTbl[ModNdx]->MaxDeps) // Dependents Exist
{
pModTbl[ModNdx]->pDeps = MAKEP (SELECTOROF (pBuf), pBuf->Type.Type_2.Dep_Offset);
}
pModTbl[ModNdx]->pName = MAKEP (SELECTOROF (pBuf), pBuf->Type.Type_2.Mod_Name_Offset);
ModNdx++; // Increment Module Table Index
break; // Exit Case
}
case TYPE_SEM: // System Semaphore Info
{
if (Debug_Mode && Show_Sems) // Display Debug Info
{
printf ("\n[%p] Record Type %04X Next=%04X Semaphore Information Record\n",
pBuf, pBuf->TypeCode, pBuf->Next);
printf ("\tSysTID=%02X Unkn=%02X Ref=%02X Req=%02X Flgs=%04X Name=%s\n",
pBuf->Type.Type_3.SysThreadID,
pBuf->Type.Type_3.Unknown,
pBuf->Type.Type_3.RefCount,
pBuf->Type.Type_3.ReqCount,
pBuf->Type.Type_3.Flags,
pBuf->Type.Type_3.SemaphoreName);
}
if (SemNdx >= SemMax) // Increase Table Size
{
SemMax += 50; // Increment Table Size
pSemTbl = (PTYPE3 *) realloc (pSemTbl, SemMax * sizeof (PTYPE3));
if (!pSemTbl) // Allocation Failed
{
printf ("\aSemaphore table realloc failed\n");
exit (1);
}
}
pSemTbl[SemNdx] = &pBuf->Type.Type_3; // Save Pointer
SemNdx++; // Increment Semaphore Index
break; // Exit Case
}
case TYPE_MEM: // Shared Memory Info
{
if (Debug_Mode && Show_Segs) // Display Debug Info
{
printf ("\n[%p] Record Type %04X Next=%04X Memory Information Record\n",
pBuf, pBuf->TypeCode, pBuf->Next);
printf ("\tHandle=%04X Sel=%04X Use=%04X Name=%s\n",
pBuf->Type.Type_4.Handle,
pBuf->Type.Type_4.Selector,
pBuf->Type.Type_4.UseCount,
pBuf->Type.Type_4.SegmentName);
}
if (MemNdx >= MemMax) // Increase Table Size
{
MemMax += 50; // Increment Table Size
pMemTbl = (PTYPE4 *) realloc (pMemTbl, MemMax * sizeof (PTYPE4));
if (!pMemTbl) // Allocation Failed
{
printf ("\aShared memory table realloc failed\n");
exit (1);
}
}
pMemTbl[MemNdx] = &pBuf->Type.Type_4; // Save Pointer
MemNdx++; // Increment Shared Memory Index
break; // Exit Case
}
default: // Unknown Record Type
{
printf ("\n[%p] Record Type %04X Next=%04X Unknown Record Type\n",
pBuf, pBuf->TypeCode, pBuf->Next);
break; // Exit Case
}
}
OFFSETOF (pBuf) = Next; // Bump to next record
}
for (i=0; i < ProcNdx; i++) // Cross Reference Procs & Mods
{
for (j=0; j < ModNdx; j++)
{
if (pProcTbl[i]->ModID == pModTbl[j]->ModID) // Found Module
{
pProcTbl[i]->pName = pModTbl[j]->pName;
break; // Exit Inner Loop
}
}
}
for (i=0; i < ProcNdx; i++) // Cross Reference Child Procs
{
for (j=0; j < ProcNdx; j++)
{
if (pProcTbl[i]->Pid == pProcTbl[j]->PPid) // Found Child
{
pProcTbl[i]->Children++;
}
}
}
}
return rc; // Return To Main
}
#pragma subtitle ("Display Processes")
#pragma page()
/**********************************************************************
** Display Process Information **
**********************************************************************/
VOID Display_Processes (VOID)
{
USHORT i, b, t; // Index
PCHAR pName; // Process Name
if (Sort_Pid_Num) // Numeric Sort by PID
{
qsort (pProcTbl, ProcNdx, sizeof (PPROCTBL), Pid_Sort);
}
else // Alpha Sort
{
qsort (pProcTbl, ProcNdx, sizeof (PPROCTBL), Pid_Name_Sort);
}
qsort (pThdTbl, ThdNdx, sizeof (PTYPE1), Tid_Sort);
printf ("\n\t\tDisplay Process and Thread Information\n");
printf (" PID PPID Sess Mod# Proc Name Chld TID sTID Prty Block ID Flgs\n");
printf ("---- ---- ---- ---- ---------- ---- --- ---- ---- -------- ----\n");
for (i=0; i < ProcNdx; i++) // Display Process Table
{
if (!pProcTbl[i]->pName) // No Module Name
{
if (!pProcTbl[i]->ModID) // No Module Handle - Kernal
{
if (pProcTbl[i]->SessionID) // Must Be Dos Compat Box
{
pName = "(DosBox)";
}
else // Must be Kernal
{
pName = "(Kernal)";
}
}
else // Unknown Module Name
{
pName = "(Unknown)";
}
}
else // Use Specified Module Name
{
pName = pProcTbl[i]->pName;
}
for (b=0; b < ThdNdx; b++) // Find First Thread
{
if (pThdTbl[b]->ProcessID == pProcTbl[i]->Pid) // Found
{
break;
}
}
printf ("%04X %04X %02X %04X %-10.10s %4u %02X %02X %04X %08lX %04X\n",
pProcTbl[i]->Pid,
pProcTbl[i]->PPid,
pProcTbl[i]->SessionID,
pProcTbl[i]->ModID,
pName,
pProcTbl[i]->Children,
pThdTbl[b]->ThreadID,
pThdTbl[b]->SysThreadID,
pThdTbl[b]->Priority,
pThdTbl[b]->BlockID,
pThdTbl[b]->Flags);
for (t=1; t < pProcTbl[i]->Threads; t++)
{
printf ("%42.42s %02X %02X %04X %08lX %04x\n", "",
pThdTbl[b+t]->ThreadID,
pThdTbl[b+t]->SysThreadID,
pThdTbl[b+t]->Priority,
pThdTbl[b+t]->BlockID,
pThdTbl[b+t]->Flags);
}
}
}
#pragma subtitle ("Display Modules")
#pragma page()
/**********************************************************************
** Display Module Information **
**********************************************************************/
VOID Display_Modules (VOID)
{
USHORT i, j; // Index
if (Sort_Mod_Num) // Numeric Sort by ModID
{
qsort (pModTbl, ModNdx, sizeof (PMODTBL), Mod_Sort);
}
else // Alpha Sort
{
qsort (pModTbl, ModNdx, sizeof (PMODTBL), Mod_Name_Sort);
}
printf ("\n\t\t\tDisplay Module Information\n");
printf ("Mod# Deps Name Resource Module IDs\n");
printf ("---- ---- ---------- -------------------------------------------------\n");
for (i=0; i < ModNdx; i++) // Display Module Table
{
printf ("%04X %4u %-10.10s ",
pModTbl[i]->ModID,
pModTbl[i]->MaxDeps,
pModTbl[i]->pName);
if (pModTbl[i]->MaxDeps) // Display Dependent Mod IDs
{
for (j=0; j < pModTbl[i]->MaxDeps; j++)
{
if (j && !(j % 10)) // Force New Line
{
printf ("\n%24.24s", "");
}
printf ("%04X ", pModTbl[i]->pDeps[j]);
}
}
printf ("\n");
}
}
#pragma subtitle ("Display Semaphores")
#pragma page()
/**********************************************************************
** Display Semaphore Information **
**********************************************************************/
VOID Display_Semaphores (VOID)
{
USHORT i, t, p; // Index
PID Pid; // Process ID
PCHAR pName; // Process Name
qsort (pSemTbl, SemNdx, sizeof (PTYPE3), Sem_Sort);
printf ("\n\t\tDisplay System Semaphore Information\n");
printf ("Owning Process sTID Unkn Ref Req Flgs System Semaphore Name\n");
printf ("-------------- ---- ---- --- --- ---- ---------------------\n");
for (i=0; i < SemNdx; i++) // Display Semaphore Table
{
pName = "????????"; // Unknown Owner
Pid = 0; // Unknown Process
if (pSemTbl[i]->SysThreadID) // Display Owner
{
for (t=0; t < ThdNdx; t++) // Find Owning Thread
{
if (pSemTbl[i]->SysThreadID == pThdTbl[t]->SysThreadID) // Found Thread
{
for (p=0; p < ProcNdx; p++) // Find Owning Process
{
if (pThdTbl[t]->ProcessID == pProcTbl[p]->Pid) // Found Process
{
pName = pProcTbl[p]->pName; // Process Name
Pid = pProcTbl[p]->Pid; // Process ID
break;
}
}
break;
}
}
}
if (pSemTbl[i]->SysThreadID) // Semaphore is owned
{
printf ("%-10.10s%04X %02X %02X %02X %02X %04X %s\n",
pName,
Pid,
pSemTbl[i]->SysThreadID,
pSemTbl[i]->Unknown,
pSemTbl[i]->RefCount,
pSemTbl[i]->ReqCount,
pSemTbl[i]->Flags,
pSemTbl[i]->SemaphoreName);
}
else // Semaphore is not owned
{
printf ("%-14.14s %02X %02X %02X %02X %04X %s\n",
"",
pSemTbl[i]->SysThreadID,
pSemTbl[i]->Unknown,
pSemTbl[i]->RefCount,
pSemTbl[i]->ReqCount,
pSemTbl[i]->Flags,
pSemTbl[i]->SemaphoreName);
}
}
}
#pragma subtitle ("Display Shared Memory")
#pragma page()
/**********************************************************************
** Display Shared Memory Information **
**********************************************************************/
VOID Display_Memory (VOID)
{
USHORT i; // Index
qsort (pMemTbl, MemNdx, sizeof (PTYPE4), Seg_Sort);
printf ("\n\t\tDisplay Shared Memory Segment Information\n");
printf ("Hand Sel Use Shared Memory Segment Name\n");
printf ("---- ---- ---- --------------------------\n");
for (i=0; i < MemNdx; i++) // Display Memory Table
{
printf ("%04X %04X %4u \\SHAREMEM\\%s\n",
pMemTbl[i]->Handle,
pMemTbl[i]->Selector,
pMemTbl[i]->UseCount,
pMemTbl[i]->SegmentName);
}
}
#pragma subtitle ("Main Program")
#pragma page()
/**********************************************************************
** Testing Main Entry Point **
**********************************************************************/
USHORT main (USHORT argc, PCHAR argv[])
{
USHORT rc = NO_ERROR; // Return Code
if (argc > 1) // Process Arguments
{
Process_Parameters (argc, argv);
}
if (!Show_Procs && !Show_Mods && !Show_Sems && !Show_Segs) // Default
{
Show_Procs = TRUE; // Display Processes
}
rc = Initialization (); // Initialize Data
if (rc == NO_ERROR) // Success
{
if (Show_Procs) // Display Processes & Threads
{
Display_Processes ();
}
if (Show_Mods) // Display Modules
{
Display_Modules ();
}
if (Show_Sems) // Display System Semaphores
{
Display_Semaphores ();
}
if (Show_Segs) // Display Shared Memory
{
Display_Memory ();
}
}
return rc; // Return To OS/2
}