Implement version table support for int21/ah=4b, subfunctions 0 and 1
This commit is contained in:
parent
35a18350a0
commit
7496c685ea
@ -117,6 +117,13 @@ cd ..\kernel
|
|||||||
%MAKE% production
|
%MAKE% production
|
||||||
if errorlevel 1 goto abort-cd
|
if errorlevel 1 goto abort-cd
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Process SETVER +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
echo.
|
||||||
|
cd ..\setver
|
||||||
|
%MAKE% production
|
||||||
|
if errorlevel 1 goto abort-cd
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
set XERROR=
|
set XERROR=
|
||||||
|
@ -27,6 +27,9 @@ cd ..\sys
|
|||||||
cd ..\kernel
|
cd ..\kernel
|
||||||
%MAKE% clean
|
%MAKE% clean
|
||||||
|
|
||||||
|
cd ..\setver
|
||||||
|
%MAKE% clean
|
||||||
|
|
||||||
cd ..\hdr
|
cd ..\hdr
|
||||||
if exist *.bak del *.bak
|
if exist *.bak del *.bak
|
||||||
|
|
||||||
|
@ -27,6 +27,9 @@ cd ..\sys
|
|||||||
cd ..\kernel
|
cd ..\kernel
|
||||||
%MAKE% clobber
|
%MAKE% clobber
|
||||||
|
|
||||||
|
cd ..\setver
|
||||||
|
%MAKE% clobber
|
||||||
|
|
||||||
cd ..\hdr
|
cd ..\hdr
|
||||||
if exist *.bak del *.bak
|
if exist *.bak del *.bak
|
||||||
|
|
||||||
|
@ -268,6 +268,8 @@ extern BYTE ASM ErrorMode, /* Critical error flag */
|
|||||||
ASM CritErrClass, ASM VgaSet,
|
ASM CritErrClass, ASM VgaSet,
|
||||||
ASM njoined; /* number of joined devices */
|
ASM njoined; /* number of joined devices */
|
||||||
|
|
||||||
|
extern VOID FAR * ASM setverPtr; /* Pointer to SETVER list */
|
||||||
|
|
||||||
extern UWORD ASM Int21AX;
|
extern UWORD ASM Int21AX;
|
||||||
extern COUNT ASM CritErrCode;
|
extern COUNT ASM CritErrCode;
|
||||||
extern BYTE FAR * ASM CritErrDev;
|
extern BYTE FAR * ASM CritErrDev;
|
||||||
|
@ -407,7 +407,8 @@ _nul_dev: ; 0022 device chain root
|
|||||||
global _njoined
|
global _njoined
|
||||||
_njoined db 0 ; 0034 number of joined devices
|
_njoined db 0 ; 0034 number of joined devices
|
||||||
dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
|
dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
|
||||||
setverPtr dw 0,0 ; 0037 setver list
|
global _setverPtr
|
||||||
|
_setverPtr dw 0,0 ; 0037 setver list
|
||||||
dw 0 ; 003B cs offset for fix a20
|
dw 0 ; 003B cs offset for fix a20
|
||||||
dw 0 ; 003D psp of last umb exec
|
dw 0 ; 003D psp of last umb exec
|
||||||
global _LoL_nbuffers
|
global _LoL_nbuffers
|
||||||
|
@ -92,6 +92,44 @@ ULONG SftGetFsize(int sft_idx)
|
|||||||
return s->sft_size;
|
return s->sft_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC WORD SetverCompareFilename(BYTE FAR *m1, BYTE FAR *m2, COUNT c)
|
||||||
|
{
|
||||||
|
while (c--)
|
||||||
|
{
|
||||||
|
if (toupper(*m1) != toupper(*m2))
|
||||||
|
{
|
||||||
|
return *m1 - *m2;
|
||||||
|
}
|
||||||
|
|
||||||
|
m1 = m1 + 1; m2 = m2 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC UWORD SetverGetVersion(BYTE FAR *table, BYTE FAR *name)
|
||||||
|
{
|
||||||
|
BYTE FAR *len;
|
||||||
|
COUNT nlen;
|
||||||
|
|
||||||
|
if ((table != NULL) && (name != NULL))
|
||||||
|
{
|
||||||
|
nlen = fstrlen(name);
|
||||||
|
|
||||||
|
while (*(len = table) != 0)
|
||||||
|
{
|
||||||
|
if ((*len == nlen) && (SetverCompareFilename(name, table + 1, *len) == 0))
|
||||||
|
{
|
||||||
|
return *((UWORD FAR *)(table + *len + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
table = table + *len + 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
STATIC COUNT ChildEnv(exec_blk * exp, UWORD * pChildEnvSeg, char far * pathname)
|
STATIC COUNT ChildEnv(exec_blk * exp, UWORD * pChildEnvSeg, char far * pathname)
|
||||||
{
|
{
|
||||||
BYTE FAR *pSrc;
|
BYTE FAR *pSrc;
|
||||||
@ -242,6 +280,7 @@ STATIC UWORD patchPSP(UWORD pspseg, UWORD envseg, exec_blk FAR * exb,
|
|||||||
mcb FAR *pspmcb;
|
mcb FAR *pspmcb;
|
||||||
int i;
|
int i;
|
||||||
BYTE FAR *np;
|
BYTE FAR *np;
|
||||||
|
UWORD fakever;
|
||||||
|
|
||||||
pspmcb = MK_FP(pspseg, 0);
|
pspmcb = MK_FP(pspseg, 0);
|
||||||
++pspseg;
|
++pspseg;
|
||||||
@ -287,6 +326,11 @@ set_name:
|
|||||||
if (i < 8)
|
if (i < 8)
|
||||||
pspmcb->m_name[i] = '\0';
|
pspmcb->m_name[i] = '\0';
|
||||||
|
|
||||||
|
if ((fakever = SetverGetVersion(setverPtr, np)) != 0)
|
||||||
|
{
|
||||||
|
psp->ps_retdosver = fakever;
|
||||||
|
}
|
||||||
|
|
||||||
/* return value: AX value to be passed based on FCB values */
|
/* return value: AX value to be passed based on FCB values */
|
||||||
return (get_cds1(psp->ps_fcb1.fcb_drive) ? 0 : 0xff) |
|
return (get_cds1(psp->ps_fcb1.fcb_drive) ? 0 : 0xff) |
|
||||||
(get_cds1(psp->ps_fcb2.fcb_drive) ? 0 : 0xff00);
|
(get_cds1(psp->ps_fcb2.fcb_drive) ? 0 : 0xff00);
|
||||||
|
7
makefile
7
makefile
@ -91,8 +91,8 @@ XUPX=upx --8086 --best
|
|||||||
XNASM=nasm
|
XNASM=nasm
|
||||||
ifeq ($(COMPILER),gcc)
|
ifeq ($(COMPILER),gcc)
|
||||||
MAKE=make
|
MAKE=make
|
||||||
MAKEADJUST=for i in utils lib drivers boot sys kernel; do sed 's@!include "\(.*\)"@include ../mkfiles/gcc.mak@' < $$i/makefile > $$i/GNUmakefile; done
|
MAKEADJUST=for i in utils lib drivers boot sys kernel setver; do sed 's@!include "\(.*\)"@include ../mkfiles/gcc.mak@' < $$i/makefile > $$i/GNUmakefile; done
|
||||||
MAKEREMOVE=for i in utils lib drivers boot sys kernel; do rm -f $$i/GNUmakefile; done
|
MAKEREMOVE=for i in utils lib drivers boot sys kernel setver; do rm -f $$i/GNUmakefile; done
|
||||||
XLINK=ia16-elf-gcc
|
XLINK=ia16-elf-gcc
|
||||||
else
|
else
|
||||||
MAKE=wmake -ms -h
|
MAKE=wmake -ms -h
|
||||||
@ -115,6 +115,7 @@ all:
|
|||||||
cd boot && $(MAKE) production
|
cd boot && $(MAKE) production
|
||||||
cd sys && $(MAKE) production
|
cd sys && $(MAKE) production
|
||||||
cd kernel && $(MAKE) production
|
cd kernel && $(MAKE) production
|
||||||
|
cd setver && $(MAKE) production
|
||||||
$(MAKEREMOVE)
|
$(MAKEREMOVE)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@ -125,6 +126,7 @@ clean:
|
|||||||
cd boot && $(MAKE) clean
|
cd boot && $(MAKE) clean
|
||||||
cd sys && $(MAKE) clean
|
cd sys && $(MAKE) clean
|
||||||
cd kernel && $(MAKE) clean
|
cd kernel && $(MAKE) clean
|
||||||
|
cd setver && $(MAKE) clean
|
||||||
$(MAKEREMOVE)
|
$(MAKEREMOVE)
|
||||||
|
|
||||||
clobber:
|
clobber:
|
||||||
@ -135,4 +137,5 @@ clobber:
|
|||||||
cd boot && $(MAKE) clobber
|
cd boot && $(MAKE) clobber
|
||||||
cd sys && $(MAKE) clobber
|
cd sys && $(MAKE) clobber
|
||||||
cd kernel && $(MAKE) clobber
|
cd kernel && $(MAKE) clobber
|
||||||
|
cd setver && $(MAKE) clobber
|
||||||
$(MAKEREMOVE)
|
$(MAKEREMOVE)
|
||||||
|
17
setver/makefile
Normal file
17
setver/makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#
|
||||||
|
# makefile for setver.sys
|
||||||
|
#
|
||||||
|
|
||||||
|
!include "../mkfiles/generic.mak"
|
||||||
|
|
||||||
|
|
||||||
|
production: setver.sys
|
||||||
|
|
||||||
|
setver.sys: setver.asm
|
||||||
|
$(NASM) -o ..$(DIRSEP)bin$(DIRSEP)setver.sys setver.asm
|
||||||
|
|
||||||
|
clobber: clean
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) *.obj *.map *.lst *.err
|
||||||
|
|
81
setver/setver.asm
Normal file
81
setver/setver.asm
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
;
|
||||||
|
; Initially written by Ricardo Hanke
|
||||||
|
; Released under the terms of the GNU General Public License.
|
||||||
|
; See the file 'COPYING' in the main directory for details.
|
||||||
|
;
|
||||||
|
; This driver loads the list of special programs into memory.
|
||||||
|
;
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
|
||||||
|
COMMAND equ 2
|
||||||
|
STATUS equ 3
|
||||||
|
DRIVEREND equ 14
|
||||||
|
|
||||||
|
FAKETABLE equ 37h
|
||||||
|
|
||||||
|
|
||||||
|
header dw -1, -1
|
||||||
|
dw 1000000000000000b
|
||||||
|
dw strategy
|
||||||
|
dw interrupt
|
||||||
|
db "SETVERXX"
|
||||||
|
|
||||||
|
dw signature
|
||||||
|
|
||||||
|
paramblock dd 0
|
||||||
|
|
||||||
|
|
||||||
|
strategy: mov [cs:paramblock + 0], bx
|
||||||
|
mov [cs:paramblock + 2], es
|
||||||
|
retf
|
||||||
|
|
||||||
|
|
||||||
|
interrupt: push ax
|
||||||
|
push bx
|
||||||
|
push di
|
||||||
|
push es
|
||||||
|
pushf
|
||||||
|
|
||||||
|
les di, [paramblock]
|
||||||
|
mov bl, [es:di + COMMAND]
|
||||||
|
cmp bl, 0
|
||||||
|
jne error
|
||||||
|
|
||||||
|
mov ax, table
|
||||||
|
add ax, [length]
|
||||||
|
|
||||||
|
mov word [es:di + DRIVEREND + 0], ax
|
||||||
|
mov word [es:di + DRIVEREND + 2], cs
|
||||||
|
|
||||||
|
mov ah, 52h
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
mov word [es:bx + FAKETABLE + 0], table
|
||||||
|
mov word [es:bx + FAKETABLE + 2], cs
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
jmp exit
|
||||||
|
|
||||||
|
error: mov ax, 8003h
|
||||||
|
|
||||||
|
exit: or ax, 0100h
|
||||||
|
mov [es:di + STATUS], ax
|
||||||
|
|
||||||
|
popf
|
||||||
|
pop es
|
||||||
|
pop di
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
retf
|
||||||
|
|
||||||
|
|
||||||
|
signature db 'SDIR'
|
||||||
|
length dw 1
|
||||||
|
|
||||||
|
table ;db 11, "SHOWVER.EXE", 5, 00
|
||||||
|
;db 12, "BUGGYPRG.EXE", 3, 31
|
||||||
|
|
||||||
|
db 0
|
Loading…
Reference in New Issue
Block a user