|
|
; 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
|