home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
prog
/
source
/
doshandl.lha
/
No.6
< prev
next >
Wrap
Text File
|
1988-05-14
|
7KB
|
262 lines
#include "exec/types.h"
#include "exec/libraries.h"
#include "exec/memory.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#define QTOUPPER(c) ((c)>='a'&&(c)<='z'?(c)-'a'+'A':(c))
#define MAXCHARS 4096
#undef BADDR
#define BADDR(x) ((APTR)((LONG)x << 2))
struct DosList {
BPTR dol_Next; /* bptr to next device list */
LONG dol_Type; /* see DLT below */
struct MsgPort *dol_Task; /* ptr to handler task */
BPTR dol_Lock;
union {
struct {
BSTR *dol_Handler;
LONG dol_StackSize;
LONG dol_Priority;
ULONG dol_Startup;
BPTR dol_SegList;
BPTR dol_GlobVec;
} dol_handler;
struct {
struct DateStamp dol_VolumeDate; /* creation date */
BPTR dol_LockList; /* outstanding locks */
LONG dol_DiskType; /* 'DOS', etc */
} dol_volume;
} dol_misc;
BSTR *dol_Name; /* bptr to bcpl name */
};
struct DosEnvec {
ULONG de_TableSize; /* Size of Environment vector */
ULONG de_SizeBlock; /* in longwords: standard value is 128 */
ULONG de_SecOrg; /* not used; must be 0 */
ULONG de_Surfaces; /* # of heads (surfaces). drive specific */
ULONG de_SectorPerBlock; /* not used; must be 1 */
ULONG de_BlocksPerTrack; /* blocks per track. drive specific */
ULONG de_Reserved; /* DOS reserved blocks at start of partition. */
ULONG de_PreAlloc; /* DOS reserved blocks at end of partition */
ULONG de_Interleave; /* usually 0 */
ULONG de_LowCyl; /* starting cylinder. typically 0 */
ULONG de_HighCyl; /* max cylinder. drive specific */
ULONG de_NumBuffers; /* Initial # DOS of buffers. */
ULONG de_BufMemType; /* type of mem to allocate for buffers */
ULONG de_MaxTransfer; /* Maximum number of blocks to transfer at a time */
ULONG de_Mask; /* Address Mask to block out certain memory */
LONG de_BootPri; /* Boot priority for autoboot */
ULONG de_DosType; /* ASCII (HEX) string showing filesystem type;
* 0X444F5300 is old filesystem,
* 0X444F5301 is fast file system */
};
struct FileSysStartupMsg {
ULONG fssm_Unit; /* exec unit number for this device */
BSTR fssm_Device; /* null terminated bstring to the device name */
BPTR fssm_Environ; /* ptr to environment table (see above) */
ULONG fssm_Flags; /* flags for OpenDevice() */
};
UBYTE *buffer,*point, *base; /* for the output buffer */
int len;
extern struct Library *DOSBase;
main(argc,argv)
int argc;
UBYTE *argv[];
{
ULONG type;
BPTR seglist;
struct MsgPort *task;
UBYTE *name, *handler, *devicename,*p;
ULONG deviceunit,deviceflags;
ULONG file;
int i;
BOOL flags[3]; /* used for argument parsing */
struct DosLibrary *dosLibrary;
struct RootNode *RootNode;
struct DosInfo *dosInfo;
struct DosList *DevInfo;
struct FileSysStartupMsg *startup;
struct DosEnvec *env;
UBYTE b[255];
if(*argv[argc-1]=='?') {
printf("Usage: %ls DEVS|VOLS|DIRS\n",argv[0]);
exit(0);
}
if(argc == 1) {
flags[0]=TRUE;
flags[1]=TRUE;
flags[2]=TRUE;
}
else {
flags[0]=0;
flags[1]=0;
flags[2]=0;
for(i=1; i<argc; i++) {
if (!(strcmpi("devs",argv[i])))flags[0]=TRUE;
if (!(strcmpi("vols",argv[i])))flags[1]=TRUE;
if (!(strcmpi("dirs",argv[i])))flags[2]=TRUE;
}
}
dosLibrary = (struct DosLibrary *)DOSBase;
RootNode = (struct RootNode *)dosLibrary->dl_Root;
dosInfo = (struct DosInfo *)BADDR(RootNode->rn_Info);
DevInfo = (struct DosList *)BADDR(dosInfo->di_DevInfo);
if(!(buffer=(UBYTE *)AllocMem(MAXCHARS,MEMF_PUBLIC|MEMF_CLEAR)))exit(20);
point = buffer;
Forbid();
/* walk the device list */
while ((DevInfo != NULL) && (!(SetSignal(0,0) & SIGBREAKF_CTRL_C))) {
type = DevInfo->dol_Type;
task = DevInfo->dol_Task;
name = (char *)BADDR(DevInfo->dol_Name)+1;
if((type == DLT_DEVICE) && (flags[0])) {
sprintf(b,"Device: %ls at %lx, task is %lx ",name,DevInfo,task);
bp(b);
if(task)bp("(resident)\n");
else {
bp(" (not resident)\n");
seglist = DevInfo->dol_misc.dol_handler.dol_SegList;
if(seglist==0) {
sprintf(b," code not in memory\n");
bp(b);
}
else {
sprintf(b," code is at %lx\n",BADDR(seglist));
bp(b);
}
handler=(char *)BADDR(DevInfo->dol_misc.dol_handler.dol_Handler)+1;
if(handler) {
sprintf(b," handler is %ls\n\017",handler);
bp(b);
}
sprintf(b," stacksize is %ld\n",
DevInfo->dol_misc.dol_handler.dol_StackSize);
bp(b);
sprintf(b," priority is %ld\n",
DevInfo->dol_misc.dol_handler.dol_Priority);
bp(b);
sprintf(b," globvec is %lx\n",
BADDR(DevInfo->dol_misc.dol_handler.dol_GlobVec));
bp(b);
}
if(DevInfo->dol_misc.dol_handler.dol_Startup > 2) {
startup=(struct FileSysStartupMsg *)
BADDR(DevInfo->dol_misc.dol_handler.dol_Startup);
devicename = (char *)BADDR(startup->fssm_Device)+1;
env = (struct DosEnvec *)(BADDR(startup->fssm_Environ));
deviceunit = startup->fssm_Unit;
deviceflags = startup->fssm_Flags;
sprintf(b," Environment vector size %ld\n",(ULONG)env->de_TableSize);
bp(b);
sprintf(b,"| Device name is %s, unit is %ld\n",
devicename,deviceunit);
bp(b);
sprintf(b,"| Surfaces = %ld, BlocksPerTrack = %ld\n",
env->de_Surfaces,env->de_BlocksPerTrack);
bp(b);
sprintf(b,"| Reserved = %ld, LowCyl=%ld, HighCyl=%ld\n",
env->de_Reserved,env->de_LowCyl,env->de_HighCyl);
bp(b);
sprintf(b,"| NumNuffers = %ld, BufMemType = %ld\n",
env->de_NumBuffers,env->de_BufMemType);
bp(b);
if(env->de_TableSize > 12) {
sprintf(b,"| MaxTransfer = %ld, Mask = %lx, BootPri = %ld\n",
env->de_MaxTransfer,env->de_Mask, env->de_BootPri);
bp(b);
sprintf(b,"| DosType is %lx\n",env->de_DosType);
bp(b);
}
}
else bp(" No environment vector\n");
}
else if ((type == DLT_VOLUME) & (flags[1])) {
sprintf(b,"Volume: %ls at %lx, File task is %lx ",name,DevInfo,task);
bp(b);
if (task)bp("[Mounted]\n");
else bp("[Not Mounted]\n");
sprintf(b," LockList is %lx\n",
BADDR(DevInfo->dol_misc.dol_volume.dol_LockList));
bp(b);
sprintf(b," DiskType is %lx\n",
DevInfo->dol_misc.dol_volume.dol_DiskType);
bp(b);
}
else if ((type == DLT_DIRECTORY) && (flags[2])) {
sprintf(b,"Directory: %ls at %lx, FileSystem task is %lx, lock is %lx\n",name,DevInfo,task,DevInfo->dol_Lock);
bp(b);
}
DevInfo = (struct DosList *)BADDR(DevInfo->dol_Next);
}
Permit();
len = point-buffer;
point = buffer;
base = buffer;
for(i=0; i<len; i++) {
if((UBYTE)*point++ == 0) {
printf("%s",base);
base = point;
}
}
FreeMem(buffer,MAXCHARS);
exit(0);
}
strcmpi(str1, str2)
char *str1,*str2;
{
UBYTE *astr =str1;
UBYTE *bstr =str2;
UBYTE c;
while ( (c = QTOUPPER(*astr)) && (c == QTOUPPER(*bstr)))
astr++, bstr++;
if( ! c ) return ( 0 );
if( c < *bstr ) return( -1 );
return( 1 );
}
strlen( str )
UBYTE *str;
{
UBYTE *pt ;
for ( pt=str ; *pt != '\0' ; pt++ );
return( pt-str );
}
bp(s)
UBYTE *s;
{
int i;
i=strlen(s);
if((point+i) < (buffer+MAXCHARS))sprintf(point,s);
point += (i+1);
}