;MS-DOSのバージョンを偽装する
;
;chgver.p86 version 1.00
;Copyright (c) 1993 Delmonta
;

CGROUP	group	TEXT
DGROUP	group	DATA,BSS

TEXT	cseg
DATA	dseg
BSS	dseg

TEXT	cseg

;int	main(int argc,char *argv[])

main_::
	cmp	AX,3
	jc	usage

	push	BX

	mov	BX,[BX+2].W
	mov	AL,[BX].B
	sub	AL,'0'
	jc	badver
	cmp	AL,10
	jnc	badver
	mov	CS:[chgver].B,AL
	inc	BX
	mov	AX,BX
	call	atoi_
	cmp	AX,100
	jnc	badver
	mov	CS:[chgver+1],AL

	mov	AH,30H
	int	21H

	mov	CS:[bxsav].W,BX
	mov	CS:[cxsav].W,CX

	cli
	push	DS
	xor	AX,AX
	mov	DS,AX

	mov	BX,21H*4
	mov	AX,[BX].W
	mov	CS:[intsav].W,AX
	mov	AX,2[BX].W
	mov	CS:2[intsav].W,AX

	mov	[BX].W,handler
	mov	2[BX].W,seg handler

	pop	DS
	sti

	pop	BX

	mov	BX,[BX+4]
	mov	AX,[BX]
	call	execvp_
	push	AX

	cli
	push	DS
	xor	AX,AX
	mov	DS,AX
	mov	BX,21H*4

	mov	AX,CS:[intsav]
	mov	[BX],AX
	mov	AX,CS:[intsav+2]
	mov	2[BX],AX

	pop	DS
	sti

	pop	AX
	ret

usage:
	mov	AX,mes_usage
	call	puts_
	mov	AX,1
	call	exit_
	ret

badver:
	mov	AX,mes_badver
	call	puts_
	mov	AX,1
	call	exit_
	ret

handler:
	pushf			;もしかしたらフラグもパラメータかもしれない

	cmp	AH,30H
	jnz	doscall

	mov	AX,CS:[chgver]
	mov	BX,CS:[bxsav]
	mov	CX,CS:[cxsav]
	popf
	iret

doscall:
	popf
	jmpf	CS:[intsav]
	
chgver:	db	3,10
bxsav:	dw	0
cxsav:	dw	0
intsav:	dw	0
	dw	0

BSS	dseg

DATA	dseg

mes_usage:
	db	"Usage:chgver <version> <command> [<parameter> [<>...]",0
mes_badver:
	db	"Bad version number.",0

	extrn	atoi_
	extrn	puts_
	extrn	exit_
	extrn	execvp_

