Fravia's TOOLS OF OUR TRADE Messageboard ~ Moderated
My hasp95.vxd emulator for MicroSim works
Monday, 22-Feb-99 14:48:06
Here is the source code:
You have to fill read memory XXXX codes with
the ones, required by your MSim instalation.
;************************* HASP95.ASM ***************************************
; File Name : C:\H95VXD\hasp95_1.vxd
; Title 'Aladdin Windows 95 Kernel Device Driver'
;
; ---------------------------------------------------------------------------
.386p
name hasp95
.xlist
include vmm.inc
include debug.inc
include vwin32.inc
include vmd.inc
.list
;============================================================================
; S O M E E Q U
;============================================================================
hasp95_Name EQU <'hasp95 '> ;Must be 8 chars
hasp95_Rev EQU 00H
hasp95_MAJOR_VERSION EQU 1
hasp95_MINOR_VERSION EQU 0
hasp95_Device_Number EQU 3721h
ErrorCode EQU 0FFFFFFFFh
;===================================
;D E V I C E D E C L A R A T I O N
;===================================
DECLARE_VIRTUAL_DEVICE hasp95, \
hasp95_MAJOR_VERSION, \
hasp95_MINOR_VERSION, \
hasp95_Control, \
hasp95_Device_Number, \
UNDEFINED_INIT_ORDER
;============================================================================
; P U B L I C D A T A
;============================================================================
VXD_LOCKED_DATA_SEG
;FLAGS dd 0
;SYS_VM dd 0
;LDT dd 0
Buf40 db 40 dup(0)
dMouseData dd 0
VXD_LOCKED_DATA_ENDS
;============================================================================
VXD_LOCKED_CODE_SEG
;=================
;M A I N C O D E
;=================
;public hasp95_Control
;BeginProc hasp95_Control
; Control_Dispatch DEVICE_INIT, hasp95_DEVICE_INIT
; Control_Dispatch CREATE_VM, hasp95_CREATE_VM
; Control_Dispatch INIT_COMPLETE, hasp95_INIT_COMPLETE
; Control_Dispatch W32_DEVICEIOCONTROL, hasp95_IOCTL
; clc
; ret
;EndProc hasp95_Control
Begin_Control_Dispatch hasp95
Control_Dispatch DEVICE_INIT, hasp95_DEVICE_INIT
Control_Dispatch CREATE_VM, hasp95_CREATE_VM
Control_Dispatch INIT_COMPLETE, hasp95_INIT_COMPLETE
Control_Dispatch W32_DEVICEIOCONTROL, hasp95_IOCTL
End_Control_Dispatch hasp95
; ___________________________________________________________________________
;
; S u b r o u t i n e
;
BeginProc hasp95_CREATE_VM
clc
retn
EndProc hasp95_CREATE_VM
; ___________________________________________________________________________
;
; S u b r o u t i n e
;
BeginProc hasp95_INIT_COMPLETE
clc
retn
EndProc hasp95_INIT_COMPLETE
; ___________________________________________________________________________
;
; S u b r o u t i n e
;
BeginProc hasp95_IOCTL
push ecx
push edi
push ebx
cmp dword ptr [esi+12], 0
jnz short endif_F
jmp short Ret0_6D
endif_F:
cmp dword ptr [esi+12], 1
jnz short endif_27
mov ecx, [esi+28]
mov edi, [esi+16]
mov bl, [edi]
mov edi, [esi+24]
loop_20:
mov [edi], bl
inc edi
loop loop_20
jmp short Ret0_6D
endif_27:
cmp dword ptr [esi+12], 2
jnz short Ret1_66
push eax
push edx
push ecx
push edi
VxDcall VMD_Get_Mouse_Data
mov byte ptr dMouseData, dl
mov edi, offset Buf40
add edi, 4
mov ecx, dMouseData
mov [edi], ecx
pop edi
pop ecx
pop edx
pop eax
mov edi, [esi+28]
push edi
mov edi, offset Buf40
push edi
mov edi, [esi+24]
push edi
call hasp
jmp short Ret0_6D
Ret1_66:
mov eax, 1
jmp short return_71
Ret0_6D:
xor eax, eax
jmp short $+2
return_71:
pop ebx
pop edi
pop ecx
clc
retn
EndProc hasp95_IOCTL
; ___________________________________________________________________________
; S u b r o u t i n e
; Attributes: bp-based frame
extrn _haspreg: NEAR
extrn EDI0_57C4: DWORD
BeginProc hasp
esi_dw24 = dword ptr 8
pBuf40 = dword ptr 0Ch
esi_dw28 = dword ptr 10h
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
push edi
push esi
;
;mov edi, ds:EDI0_57C4
mov edi, EDI0_57C4
mov ebx, [ebp+pBuf40]
mov ecx, [ebp+esi_dw28]
mov esi, [ebp+esi_dw24]
push ebp
call _haspreg
;
pop ebp
pop esi
pop edi
pop edx
pop ecx
pop ebx
pop eax
pop ebp
retn 0Ch
EndProc hasp
; ___________________________________________________________________________
; S u b r o u t i n e
BeginProc haspreg
;jmp _haspreg1
retn
EndProc haspreg
;;db 5682h dup(90h)
;;EDI0_57C4 dd 0 ; DATA XREF: _hasp+9r
VXD_LOCKED_CODE_ENDS
;VXD_REAL_INIT_SEG
;
; ___________________________________________________________________________
;
; S u b r o u t i n e
;BeginProc VxD_Real_Init_Proc
; test bx, Duplicate_Device_ID ; check for already loaded
; jnz short duplicate ; jump if so
; xor bx, bx ; no exclusion table
; xor si, si ; no instance data table
; xor edx, edx ; no reference data
; mov ax, Device_Load_Ok
; ret
;duplicate:
; mov ax, Abort_Device_Load + No_Fail_Message
; ret
;
;EndProc VxD_Real_Init_Proc
;
;VXD_REAL_INIT_ENDS
VXD_ICODE_SEG
; ___________________________________________________________________________
;
; S u b r o u t i n e
BeginProc hasp95_DEVICE_INIT
push eax
push esi
push ebx
;
push offset pRegKey
push offset aSystemCurrentc
push 80000002h
VMMcall _RegOpenKey
add esp, 0Ch
cmp eax, 0
jnz short NoRegKey_2009E
;
mov dword_200E1, 4 ;;offset hasp95_IOCTL
push offset dword_200E1
push offset Buf40
push 0
push 0
push offset aComputertype
push ds:pRegKey
VMMcall _RegQueryValueEx
add esp, 18h
cmp eax, 0
jnz short NoComp_200AB
;
mov esi, offset Buf40
cmp dword ptr [esi], 0
jz short case0_2007C
cmp dword ptr [esi], 1
jz short case1234_20084
cmp dword ptr [esi], 2
jz short case1234_20084
cmp dword ptr [esi], 3
jz short case1234_20084
cmp dword ptr [esi], 4
jz short case1234_20084
cmp dword ptr [esi], 7
jz short case7_2008C
cmp dword ptr [esi], 3DEh
jz short case3DEh_20094
case0_2007C:
mov dword ptr [esi], 0
jmp short jexit_2009C
; ---------------------------------------------------------------------------
case1234_20084:
mov dword ptr [esi], 1
jmp short jexit_2009C
; ---------------------------------------------------------------------------
case7_2008C:
mov dword ptr [esi], 3
jmp short jexit_2009C
; ---------------------------------------------------------------------------
case3DEh_20094:
mov dword ptr [esi], 3
jmp short $+2
jexit_2009C:
jmp short exit_200B8
; ---------------------------------------------------------------------------
NoRegKey_2009E:
mov esi, offset Buf40
mov dword ptr [esi], 0
jmp short exit_200B8
; ---------------------------------------------------------------------------
NoComp_200AB:
mov esi, offset Buf40
mov dword ptr [esi], 0
jmp short $+2
exit_200B8:
push ds:pRegKey
VMMcall _RegCloseKey
add esp, 4
pop ebx
pop esi
pop eax
clc
retn
EndProc hasp95_DEVICE_INIT
VXD_ICODE_ENDS
; ---------------------------------------------------------------------------
VXD_IDATA_SEG
pRegKey dd 0
aComputertype db 'ComputerType',0
dd 0
dword_200E1 dd 0
aSystemCurrentc db 'System\CurrentControlSet\Services\VxD\HASP95\Parameters',0
VXD_IDATA_ENDS
END
;************************* HASPREG.ASM ***************************************
.386p
.xlist
include vmm.inc
;; include debug.inc
.list
;******************************************************************************
; Data
;------------------------------------------------------------------------------
VXD_LOCKED_DATA_SEG
dECX0 dd 0
dEBX0 dd 0
dESI0 dd 0
dEDI0 dd 0
wTH_PortAddr dw 0
wTH_OutData dw 0
wCOMMAND dw 0
wHaspPortNum dw 0
wPNamHi_1 dw 0
wPnamLo_1 dw 0
pRetCode4 dd 0
wID_SEED dw 0
RetStruc dw 23 dup(0), 2, 557 dup(0)
bType_FF9 db 0
word_0_FFA dw 0
wHaspSrvRtn dw 0
word_0_271 dw 0
bCodeTbl40_rcl db 97h, 0Fh, 89h, 85h, 6Fh
db 0AAh, 0D1h, 36h, 87h, 36h
db 0D9h, 0F5h, 0DFh, 0E9h, 0A1h
db 94h, 77h, 4Ah, 29h, 55h
db 4Fh, 0AEh, 71h, 69h, 67h
db 0BBh, 79h, 73h, 0BFh, 0E7h
db 41h, 5, 57h, 0F9h, 0C9h
db 20h, 2Fh, 86h, 11h, 0B8h
db 47h, 74h, 19h, 2Dh, 9Fh
db 79h, 0E1h, 0D1h, 37h, 9Ch
db 69h, 68h, 0Fh, 0B2h, 0B1h
db 0A2h, 27h, 0E1h, 0B9h, 0A2h
db 7Fh, 1Fh, 81h, 7Ah, 17h
db 0B3h, 9, 0ACh, 0EFh, 0B1h
db 51h, 0A9h, 7, 82h, 59h
db 54h, 5Fh, 59h, 21h, 7Fh
word_0_2C3 dw 0
word_0_2C5 dw 0
word_0_2C7 dw 0
word_0_2C9 dw 0
word_0_2CB dw 0
w_EQU_17 dw 17
w_EQU_40 dw 40
wCodeTbl20_mult dw 6027h, 80B9h, 0F48Fh, 0E231h, 0AF37h
dw 3A69h, 121Fh, 4F61h, 0AF47h, 1719h
dw 0A8AFh, 3791h, 3057h, 86C9h, 83Fh
dw 8AC1h, 267h, 0F979h, 80CFh, 38F1h
dw 0F577h, 0DF29h, 625Fh, 3221h, 0D987h
dw 0A7D9h, 0FCEFh, 6651h, 7E97h, 0C389h
dw 0A07Fh, 0C581h, 0B4A7h, 0A239h
dw 9D0Fh, 3FB1h, 4BB7h, 0B3E9h, 429Fh
dw 0C4E1h, 2Ch dup(0)
wHaspCodeArray db 8 dup(0)
bHaspType db 1
bPortType db 5
VXD_LOCKED_DATA_ENDS
;******************************************************************************
; Code
;------------------------------------------------------------------------------
VXD_LOCKED_CODE_SEG
; ---------------------------------------------------------------------------
public _haspreg
public EDI0_57C4
; ___________________________________________________________________________
;
; S u b r o u t i n e
BeginProc _haspreg
push esi
push edi
push ebp
mov ebp, 0
;
mov dECX0, ecx
mov dEBX0, ebx
mov dESI0, esi
mov dEDI0, edi
mov edi, dESI0
add edi, 4
mov esi, offset32 RetStruc
call _DecodeServ
mov eax, [edi+80]
mov [esi+40], eax
mov edi, offset32 RetStruc
mov bh, [edi+4]
mov bl, [edi+12]
mov esi, dEBX0
push esi
push edi
push eax
add esi, 4
mov edi, [esi]
mov word_0_FFA, di
pop eax
pop edi
pop esi
push eax
xor eax, eax
mov al, [esi]
mov bType_FF9, al
pop eax
;*; add bl, 3Ch
mov ax, [edi+8]
mov cx, [edi+16]
mov dx, [edi+20]
mov si, [edi+28]
.IF (((bh >= 50) && (bh < 74)) || ((bh >= 76) && (bh < 78)))
mov eax, [edi+36]
.ENDIF
mov di, [edi+24]
mov wID_SEED, ax
mov wTH_OutData, si
mov wTH_PortAddr, di
mov pRetCode4, eax
push ebx
mov bl, bh
xor bh, bh
mov wCOMMAND, bx
pop ebx
xor bh, bh
mov wHaspPortNum, bx
mov wPNamHi_1, dx
mov wPnamLo_1, cx
call _HaspServ
mov wHaspSrvRtn, ax
.IF (wCOMMAND == 3)
mov ax, wTH_PortAddr
.ELSE
mov ax, wHaspSrvRtn
.ENDIF
and eax, 0FFFFh
and ebx, 0FFFFh
.IF (wCOMMAND == 2)
and ecx, 0FFFFh
.ENDIF
and edx, 0FFFFh
mov edi, offset32 RetStruc
mov [edi+24], eax
mov [edi+28], ebx
mov [edi+32], ecx
mov [edi+36], edx
mov eax, dEDI0
mov [edi], ax
mov esi, dESI0
add esi, 4
call _EncodeServ
pop ebp
pop edi
pop esi
ret
EndProc _haspreg
; ___________________________________________________________________________
; S u b r o u t i n e
BeginProc _DecodeServ
push eax
push ebx
push ecx
push edx
push esi
push edi
; ESI <-> EDI
push esi
mov esi, edi
pop edi
push esi
push edi
add esi, 40
call __Decode
pop edi
pop esi
call __Decode
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
retn
EndProc _DecodeServ
; ___________________________________________________________________________
; S u b r o u t i n e
BeginProc __Decode
;
push esi
push edi
mov edi, esi
mov ecx, 20
mov ebx, offset32 wCodeTbl20_mult
.REPEAT
lodsw
mul word ptr [ebx]
inc ebx
inc ebx
stosw
.UNTILCXZ
;
pop edi
pop esi
mov edx, esi
add edx, 40
mov ebx, offset32 bCodeTbl40_rcl
mov ecx, 40
.REPEAT
push ecx
mov ecx, 8
.REPEAT
rcl byte ptr [esi], 1
rcl al, 1
inc esi
.IF ( esi >= edx)
sub esi, 40
.ENDIF
.UNTILCXZ
pop ecx
sub al, [ebx]
inc ebx
stosb
.UNTILCXZ
retn
EndProc __Decode
; ___________________________________________________________________________
; S u b r o u t i n e
BeginProc _EncodeServ
push eax
push ebx
push ecx
push edx
push esi
push edi
push esi
mov esi, edi
pop edi
push edi
call _Encode
pop esi
call _Encode
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
retn
EndProc _EncodeServ
; ___________________________________________________________________________
; S u b r o u t i n e
BeginProc _Encode
;
mov edx, edi
add edx, 40
mov ebx, offset32 bCodeTbl40_rcl
mov ecx, 40
.REPEAT
lodsb
add al, [ebx]
inc ebx
push ecx
mov ecx, 8
.REPEAT
rcl al, 1
rcl byte ptr [edi], 1
inc edi
.IF (edi >= edx)
sub edi, 40
.ENDIF
.UNTILCXZ
pop ecx
.UNTILCXZ
mov esi, edi
mov ecx, 20
mov ebx, offset32 bCodeTbl40_rcl
.REPEAT
lodsw
mul word ptr [ebx]
inc ebx
inc ebx
stosw
.UNTILCXZ
retn
EndProc _Encode
;****************************************************************************
;
; S u b r o u t i n e
;
BeginProc _HaspServ
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov ax, wCOMMAND
sub eax, 1
cmp eax, 6
jae short default
jmp SW_TBL[eax*4]
default:
mov eax, 0
mov ebx, 0
mov edx, 0
mov ecx, -3E7h
retn
;==============================================================
_IsHasp:
mov word ptr wHaspCodeArray+0, 1
mov word ptr wHaspCodeArray+2, 0
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 0
jmp break
;==============================================================
_GetHaspCode:
mov ax, wID_SEED
cmp ax, 0
jnz gc_1
mov word ptr wHaspCodeArray+0, 37E3h
mov word ptr wHaspCodeArray+2, 0C5F8h
mov word ptr wHaspCodeArray+4, 0A1BDh
mov word ptr wHaspCodeArray+6, 0D636h
jmp break
gc_1:
cmp ax, 1
jnz gc_100
mov word ptr wHaspCodeArray+0, 0A76Bh
mov word ptr wHaspCodeArray+2, 0E7CFh
mov word ptr wHaspCodeArray+4, 0CE55h
mov word ptr wHaspCodeArray+6, 8FC2h
jmp break
gc_100:
cmp ax, 64h
jnz gc_27590
mov word ptr wHaspCodeArray+0, 0D7AAh
mov word ptr wHaspCodeArray+2, 0FBA0h
mov word ptr wHaspCodeArray+4, 5277h
mov word ptr wHaspCodeArray+6, 39C1h
jmp break
gc_27590:
cmp ax, 6BC6h
jnz gc_default
mov word ptr wHaspCodeArray+0, 68FCh
mov word ptr wHaspCodeArray+2, 857Ch
mov word ptr wHaspCodeArray+4, 0F0FDh
mov word ptr wHaspCodeArray+6, 0FA9Bh
jmp break
gc_default:
mov word ptr wHaspCodeArray+0, 0
mov word ptr wHaspCodeArray+2, 0
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 0
jmp break
;==============================================================
_ReadMemo:
xor eax, eax
mov ax, wTH_PortAddr
cmp ax, 4
jae short rm_default
jmp RM_SW_TBL[eax*4]
rm_default:
mov word ptr wHaspCodeArray+0, 0
mov word ptr wHaspCodeArray+2, 0
mov word ptr wHaspCodeArray+4, 1
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
rm_addr0:
mov word ptr wHaspCodeArray+0, XXXX
mov word ptr wHaspCodeArray+2, XXXX
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
rm_addr1:
mov word ptr wHaspCodeArray+0, XXXX
mov word ptr wHaspCodeArray+2, XXXX
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
rm_addr2:
mov word ptr wHaspCodeArray+0, XXXX
mov word ptr wHaspCodeArray+2, XXXX
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
rm_addr3:
mov word ptr wHaspCodeArray+0, XXXX
mov word ptr wHaspCodeArray+2, XXXX
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
RM_SW_TBL:
dd offset32 rm_addr0
dd offset32 rm_addr1
dd offset32 rm_addr2
dd offset32 rm_addr3
;==============================================================
;;_WriteMemo:
;; retn
;==============================================================
_GetHaspStatus:
mov word ptr wHaspCodeArray+0, 1
mov word ptr wHaspCodeArray+2, 1
mov word ptr wHaspCodeArray+4, 66h
mov word ptr wHaspCodeArray+6, 0
jmp break
;==============================================================
_GetIdNum:
mov word ptr wHaspCodeArray+0, 2DD8h
mov word ptr wHaspCodeArray+2, 19BFh
mov word ptr wHaspCodeArray+4, 0
mov word ptr wHaspCodeArray+6, 73E4h
jmp break
;==============================================================
break:
mov ax, word ptr wHaspCodeArray+0
mov bx, word ptr wHaspCodeArray+2
mov cx, word ptr wHaspCodeArray+4
mov dx, word ptr wHaspCodeArray+6
retn
;==============================================================
SW_TBL:
dd offset32 _IsHasp
dd offset32 _GetHaspCode
dd offset32 _ReadMemo
dd offset32 default ;; _WriteMemo
dd offset32 _GetHaspStatus
dd offset32 _GetIdNum
EndProc _HaspServ
EDI0_57C4 dd 0
;==============================================================================
VXD_LOCKED_CODE_ENDS
END
;*********************** MAKEFILE ******************************************
OBJECTS = hasp95.obj haspreg.obj
hasp95.vxd: $(OBJECTS) hasp95.d40
D:\DDK\BIN\LINK.EXE @<<
-VXD -OUT:hasp95.vxd -MAP
-DEBUG -DEBUGTYPE:MAP
-DEF:hasp95.d40
-MERGE:.data=_LDATA -MERGE:.bss=_LDATA -MERGE:_PDATA=_PTEXT
-COMMENT:"hasp95 Kernel Device"
$(OBJECTS)
<<
D:\DDK\BIN\SETHDR -x $@
C:\SIW95\UTIL16\MSYM.EXE hasp95.map
.asm.obj:
set ML=-ID:\DDK\INCLUDE -coff -DBLD_COFF -DIS_32 -nologo -W3 -Zd -c -Cx -DMASM6 -DINITLOG -DDEBLEVEL=1 -DDEBUG -Fl
D:\DDK\BIN\ML -Fo$*.obj $<
# editbin -section:_ITEXT,cer!w!ia4 -section:_LTEXT,cer!w!ia4 -section:_TLS,cer!w!ia4 $*.obj
hasp95.d40:
copy <
VXD hasp95
SEGMENTS
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_MSGTABLE CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
_MSGDATA CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
_IMSGTABLE CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
_IMSGDATA CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
_ITEXT CLASS 'ICODE' DISCARDABLE
_IDATA CLASS 'ICODE' DISCARDABLE
_PTEXT CLASS 'PCODE' NONDISCARDABLE
_PDATA CLASS 'PDATA' NONDISCARDABLE SHARED
_STEXT CLASS 'SCODE' RESIDENT
_SDATA CLASS 'SCODE' RESIDENT
_DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
_RCODE CLASS 'RCODE'
EXPORTS
hasp95_DDB
<<
hasp95.obj: hasp95.asm
haspreg.obj: haspreg.asm
WH