/* to be compiled with EMX/gcc */
#include
#include
#include
#include
#include "dosqss.h"
extern APIRET APIENTRY DosQuerySysState (ULONG func,
ULONG par1, ULONG pid, ULONG _reserved_,
PVOID buf,
ULONG bufsz);
static void dump_global(PQTOPLEVEL);
static void dump_process(PQTOPLEVEL);
static void dump_sema(PQTOPLEVEL);
static void dump_shrmem(PQTOPLEVEL);
static void dump_module(PQTOPLEVEL);
static void dump_files(PQTOPLEVEL);
static void dump_sema32(PQTOPLEVEL);
main(void)
{
int i;
APIRET rc;
#define BUFSIZE 128000l
#define RESERVED 0
char *buf = malloc(BUFSIZE);
memset(buf,0,BUFSIZE);
rc = DosQuerySysState(0x3f, RESERVED, RESERVED, RESERVED, (PCHAR)buf, BUFSIZE);
if (!rc) {
PQTOPLEVEL top = (PQTOPLEVEL)buf;
dump_global(top);
dump_process(top);
dump_module(top);
dump_sema(top);
dump_shrmem(top);
dump_sema32(top);
dump_files(top);
}
}
static void dump_global(PQTOPLEVEL top)
{
PQGLOBAL g = top->gbldata;
printf("\n\n***** Global section: *****\n");
printf("\t# of processes: %d\n",g->proccnt);
printf("\t# of threads: %d\n",g->threadcnt);
printf("\t# of modules: %d\n\n",g->modulecnt);
}
static void dump_process(PQTOPLEVEL top)
{
PQPROCESS p = top->procdata;
PQTHREAD t;
int i;
printf("\n\n***** Process section: *****\n");
while (p->rectype != 3) {
printf("\n PID: %d\n",p->pid);
printf("\tPPID: %d\n",p->ppid);
printf("\ttype: %x\n",p->type);
printf("\tstate: %x\n",p->state);
printf("\tsession id: %d\n",p->sessid);
printf("\tmod handle: %x\n",p->hndmod);
printf("\t# of threads: %d\n",p->threadcnt);
t = p->threads;
for (i=0; ithreadcnt; i++,t++) {
printf("\t TID: %d\n",t->threadid);
printf("\t\tslot: %x\n",t->slotid);
printf("\t\tsleepid: %x\n",t->sleepid);
printf("\t\tpriority: %x\n",t->priority);
printf("\t\tsystime: %d\n",t->systime);
printf("\t\tusertime: %d\n",t->usertime);
printf("\t\tstate: %d\n",t->state);
}
printf("\t# of 16 bit sema: %d\n",p->sem16cnt);
if (p->sem16cnt) {
printf("\t\t");
for (i=0; isem16cnt; i++)
printf("%04X ",p->sem16s[i]);
printf("\n");
}
printf("\t# of dlls: %d\n",p->dllcnt);
if (p->dllcnt) {
printf("\t\t");
for (i=0; idllcnt; i++)
printf("%04X ",p->dlls[i]);
printf("\n");
}
printf("\t# of shrmem: %d\n",p->shrmemcnt);
if (p->shrmemcnt) {
printf("\t\t");
for (i=0; ishrmemcnt; i++)
printf("%04X ",p->shrmems[i]);
printf("\n");
}
p = (PQPROCESS)t;
}
}
static void dump_module(PQTOPLEVEL top)
{
PQMODULE m = top->moddata;
int i;
printf("\n\n***** Module section: *****\n");
while (m) {
printf("\thandle: %x\n",m->hndmod);
printf("\ttype: %d\n",m->type);
printf("\treference count: %d\n",m->refcnt);
if (m->refcnt) {
printf("\t\t");
for (i=0; irefcnt; i++) {
printf("%04X ",m->modref[i]);
}
printf("\n");
}
printf("\tsegment count: %d\n",m->segcnt);
printf("\tname: %s\n",m->name);
m = m->next;
}
}
static void dump_sema(PQTOPLEVEL top)
{
PQSEMSTRUC s = top->semadata;
PQSEMA p = &s->sema;
int i;
printf("\n\n***** Semaphore section: *****\n");
while (p) {
printf("\treference count: %d\n",p->refcnt);
printf("\tflags: %x\n",p->sysflags);
printf("\tproc count: %x\n",p->sysproccnt);
printf("\tindex: %x\n",p->index);
printf("\tname: %s\n",p->name);
p = p->next;
}
}
static void dump_shrmem(PQTOPLEVEL top)
{
PQSHRMEM s = top->shrmemdata;
printf("\n\n***** Shared Memory section: *****\n");
while (s) {
printf("\n handle: %x\n",s->hndshr);
printf("\tselector: %d\n",s->selshr);
printf("\treference count: %d\n",s->refcnt);
printf("\tname: %s\n",s->name);
s = s->next;
}
}
static void dump_files(PQTOPLEVEL top)
{
PQFILE f = (PQFILE)top->filedata;
PQFDS fd;
printf("\n\n***** File data section: *****\n");
while (f) {
/* BUG ALERT, BUG ALERT, BUG ALERT!
* obviously, there is still a bug in Warp 4 DosQuerySysState:
* The last next, is not 0, but points into the following
* shrmemdata section. So check whether the pointer is off.
*/
if ((ULONG)f->next > (ULONG)top->shrmemdata)
break;
printf("\n name: %s\n",f->name);
printf("\topencnt: %d\n",f->opencnt);
fd = f->filedata;
printf("\tsfn: %x\n",fd->sfn);
printf("\trefcnt: %d\n",fd->refcnt);
printf("\tflags: %x\n",fd->flags);
printf("\taccmode: %x\n",fd->accmode);
printf("\tfilesize: %d\n",fd->filesize);
printf("\tvolhnd: %d\n",fd->volhnd);
printf("\tattrib: %x\n",fd->attrib);
f = f->next;
}
}
static void dump_sema32(PQTOPLEVEL top)
{
PQSEM32STRUC s3 = (PQSEM32STRUC)top->sem32data;
printf("\n\n***** SEM32 section: *****\n");
while (s3) {
printf("\n pid: %d\n",s3->evsem.own->pid);
printf("\towner: %d\n",s3->evsem.own->opencnt);
printf("\tpid: %d\n",s3->muxsem.own->pid);
printf("\towner: %d\n",s3->muxsem.own->opencnt);
printf("\tpid: %d\n",s3->smuxsem.own->pid);
printf("\towner: %d\n",s3->smuxsem.own->opencnt);
s3 = s3->next;
}
}