/* 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_files(PQTOPLEVEL); main(void) { int i; APIRET rc; #define BUFSIZE 128000l #define RESERVED 0 char *buf = malloc(BUFSIZE); memset(buf,0,BUFSIZE); rc = DosQuerySysState(0x1f, RESERVED, RESERVED, RESERVED, (PCHAR)buf, BUFSIZE); if (!rc) { PQTOPLEVEL top = (PQTOPLEVEL)buf; dump_files(top); } } static void dump_files(PQTOPLEVEL top) { PQFILE f = (PQFILE)top->filedata; PQFDS fd; printf("SFN Opncnt Flags Accmode Size Volhnd Attrib Name\n"); printf("----- ------ -------- -------- -------- ------ ------ ----------------\n"); while (f) { /* BUG ALERT, BUG ALERT, BUG ALERT! * obviously, there is still a bug in Warp 4 DosQuerySysState: * The last f->next is not 0, but points into the following * shrmemdata section. So check whether the pointer is off. * This implies that you should always use 0x1f, in order not to get * a pointer into nirvana, but some sort of a "buffer zone". */ if ((ULONG)f->next > (ULONG)top->shrmemdata) break; fd = f->filedata; printf("%5x %6d %08x %08x %8d %05x ", fd->sfn, f->opencnt, fd->flags, fd->accmode, fd->filesize, fd->volhnd); putchar((fd->attrib & 0x20) ? 'A' : '-'); putchar((fd->attrib & 0x10) ? 'D' : '-'); putchar((fd->attrib & 0x08) ? 'L' : '-'); putchar((fd->attrib & 0x04) ? 'S' : '-'); putchar((fd->attrib & 0x02) ? 'H' : '-'); putchar((fd->attrib & 0x01) ? 'R' : '-'); printf(" %s\n",f->name); f = f->next; } }