112 lines
1.6 KiB
NASM
112 lines
1.6 KiB
NASM
; DCASM.ASM
|
|
;
|
|
; Created 31-Jul-96 [JonT]
|
|
|
|
PAGE 60, 255
|
|
.MODEL small, pascal
|
|
TITLE DCASM.ASM
|
|
|
|
.386
|
|
.DATA
|
|
extrn g_dwEntrypoint:DWORD
|
|
szName DB 'DCAPVXD ', 0
|
|
|
|
.CODE
|
|
|
|
extrn OpenDriver:FAR
|
|
extrn CloseDriver:FAR
|
|
|
|
PUBLIC _OpenDriver
|
|
_OpenDriver::
|
|
jmp OpenDriver
|
|
|
|
PUBLIC _CloseDriver
|
|
_CloseDriver::
|
|
jmp CloseDriver
|
|
|
|
; ReturnSel
|
|
; Returns either CS or DS to the C caller
|
|
|
|
ReturnSel PROC NEAR PASCAL, fCS:WORD
|
|
mov ax, ds
|
|
cmp fCS, 0
|
|
jz RS_Done
|
|
mov ax, cs
|
|
RS_Done:
|
|
ret
|
|
ReturnSel ENDP
|
|
|
|
|
|
; GetVxDEntrypoint
|
|
; Returns device entrypoint in DX:AX or zero on error
|
|
|
|
GetVxDEntrypoint PROC NEAR PASCAL uses si di
|
|
|
|
; Get the entrypoint from the VMM
|
|
xor bx, bx
|
|
mov ax, 1684h
|
|
push ds
|
|
pop es
|
|
mov di, OFFSET szName
|
|
int 2Fh
|
|
|
|
; Return entrypoint in EAX
|
|
mov dx, es
|
|
mov ax, di
|
|
ret
|
|
|
|
GetVxDEntrypoint ENDP
|
|
|
|
|
|
; SetWin32Event
|
|
; Sets a Win32 event using the VxD
|
|
|
|
SetWin32Event PROC NEAR PASCAL, pev:DWORD
|
|
|
|
; Call the VxD. Note that pev is already a flat pointer
|
|
mov ah, 1
|
|
mov ecx, pev
|
|
call [g_dwEntrypoint]
|
|
ret
|
|
|
|
SetWin32Event ENDP
|
|
|
|
|
|
; _CloseVxDHandle
|
|
; Calls the VxD to close a VxD handle. This is really torturous
|
|
; since it's just going to call into KERNEL32, but there's no
|
|
; export to do this from ring 3. Go figure.
|
|
|
|
_CloseVxDHandle PROC FAR PASCAL USES ds, pev:DWORD
|
|
|
|
mov ax, DGROUP
|
|
mov ds, ax
|
|
mov ah, 2
|
|
mov ecx, pev
|
|
call [g_dwEntrypoint]
|
|
|
|
ret
|
|
|
|
_CloseVxDHandle ENDP
|
|
|
|
|
|
; ZeroMemory
|
|
;
|
|
; Since we can't call CRT, does a memset(lp, 0, len)
|
|
|
|
ZeroMemory PROC NEAR PASCAL USES di, lp:DWORD, len:WORD
|
|
|
|
les di, lp
|
|
xor eax, eax
|
|
mov cx, len
|
|
shr cx, 2
|
|
rep stosd
|
|
mov cx, len
|
|
and cx, 3
|
|
rep stosb
|
|
ret
|
|
|
|
ZeroMemory ENDP
|
|
|
|
END
|