📄 h2name.c
字号:
/***************************************************************
*
* H2NAME.C - Jim Kyle
*
* Compile only with large memory model:
* tcc -ml h2name
* cl -AL h2name.c
*
***************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#ifdef __TURBOC__
#include <mem.h>
#else
#include <memory.h>
#endif
#ifndef MK_FP
#define MK_FP(s,o) ((void far *)\
(((unsigned long)(s) << 16) | (unsigned)(o)))
#endif
char * h2name( unsigned psp, int h )
{ static char name[15]; /* will hold file's name */
char far * htbl;
unsigned far *ptr, nmofs;
char far *sptr;
int sftn, sftsize;
union REGS regs;
struct SREGS sregs;
memset( name, 0, 15 ); /* blank out the static name */
/* create pointer to handle table (JFT) */
htbl = *((char far * far *) MK_FP(psp, 0x34));
regs.h.ah = 0x52; /* set up initial SFT pointer */
segread( &sregs );
intdosx( ®s, ®s, &sregs );
ptr = *((unsigned far * far *) MK_FP( sregs.es, regs.x.bx + 4 ));
switch( _osmajor ) /* switch sizes, offsets for ver */
{ case 2: sftsize = 0x28;
nmofs = 4; /* offset of 11-byte name area */
break;
case 3: sftsize = 0x35;
nmofs = 0x20; /* offset of name area */
break;
case 4:
case 5: sftsize = 0x3B;
nmofs = 0x20; /* offset of name area */
break;
default: return name; /* returns null string */
}
if (htbl[h] >= 0) /* now if handle is valid... */
{ sftn = htbl[h]; /* get index into SFT list */
while ( FP_OFF(ptr) != 0xFFFF )
{ if (ptr[2] > sftn) /* then target is here */
{ sptr = (unsigned char far *)&ptr[3];
while (sftn--) /* so skip down to it */
sptr += sftsize;
memcpy( name, &sptr[nmofs], 11 );
return name; /* found and copied, done */
}
sftn -= ptr[2]; /* not here, reduce index */
ptr = (unsigned int far *) MK_FP( ptr[1], ptr[0] );
}
}
strcpy( name, "UNKNOWN" );
return name; /* reached only by error */
}
void main( int argc, char *argv[] )
{
unsigned psp;
int max_files;
int i;
if (argc < 2)
psp = _psp; /* display files for this program */
else
sscanf(argv[1], "%X", &psp); /* take PSP from command line */
if (_osmajor >= 3)
max_files = *((unsigned far *) MK_FP(psp, 0x32));
else
max_files = 20;
fprintf(stderr, "Files for %04X\n", psp);
for (i=0; i<max_files; i++)
fprintf(stderr, "%2d ==> %s\n", i, h2name(psp, i));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -