mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
7.4 KiB
314 lines
7.4 KiB
;/**********************************************************************/
|
|
;/** Microsoft Windows/NT **/
|
|
;/** Copyright(c) Microsoft Corp., 1993 **/
|
|
;/**********************************************************************/
|
|
|
|
;/*
|
|
; vxdFile.asm
|
|
;
|
|
; Contains simple VXD File I/O routines for lmhosts support
|
|
;
|
|
; FILE HISTORY:
|
|
; Johnl 06-Oct-1993 Created
|
|
;
|
|
;*/
|
|
|
|
.386p
|
|
include vmm.inc
|
|
include v86mmgr.inc
|
|
include dosmgr.inc
|
|
include opttest.inc
|
|
include netvxd.inc
|
|
include debug.inc
|
|
|
|
;
|
|
; Must match manifest in vxd\fileio.c
|
|
;
|
|
LMHOSTS_READ_BUFF_SIZE equ 256
|
|
|
|
EXTRN _pMappedFilePath:DWORD
|
|
EXTRN _pMappedFileBuff:DWORD
|
|
EXTRN _pFileBuff:DWORD
|
|
EXTRN _pFilePath:DWORD
|
|
EXTRN _fInInit:DWORD
|
|
|
|
EXTRN _GetInDosFlag:NEAR
|
|
|
|
;****************************************************************************
|
|
;** CheckInDos Macro
|
|
;
|
|
; Breaks if the Indos flag is set
|
|
;
|
|
; Uses EAX
|
|
;
|
|
CheckInDos MACRO
|
|
IFDEF DEBUG
|
|
push eax
|
|
cmp _fInInit, 0 ; Can't call while initializing
|
|
jnz @f
|
|
call _GetInDosFlag
|
|
cmp ax, 0
|
|
je @f
|
|
Debug_Out "In dos flag set and about to make dos call!"
|
|
@@:
|
|
pop eax
|
|
ENDIF
|
|
ENDM
|
|
|
|
;****************************************************************************
|
|
;** PushState Macro
|
|
;
|
|
; Saves the client state and begins nested exec block. ebx will contain
|
|
; the current VM's client handle
|
|
;
|
|
; Uses ECX!!
|
|
; EBX will be set to the client area
|
|
;
|
|
PushState MACRO
|
|
|
|
CheckInDos
|
|
|
|
push ebx
|
|
VMMcall Get_Cur_VM_Handle ; Puts current handle into EBX
|
|
mov ebx, [ebx.CB_Client_Pointer]
|
|
|
|
mov ecx, 0
|
|
VMMCall Begin_Critical_Section
|
|
|
|
Push_Client_State ; This pushes lots of crap
|
|
VMMcall Begin_Nest_V86_Exec
|
|
ENDM
|
|
|
|
;****************************************************************************
|
|
;** PopState Macro
|
|
;
|
|
; Restores client state and ends the nested exec block
|
|
;
|
|
;
|
|
PopState MACRO
|
|
|
|
VMMcall End_Nest_Exec
|
|
Pop_Client_State
|
|
|
|
VMMCall End_Critical_Section
|
|
|
|
pop ebx
|
|
|
|
ENDM
|
|
|
|
|
|
VxD_ICODE_SEG
|
|
|
|
;****************************************************************************
|
|
;** _VxdInitLmHostsSupport
|
|
;
|
|
; Allocates and maps memory for lmhosts support
|
|
;
|
|
; This is an Init time only routine
|
|
;
|
|
; Entry: [ESP+4] - Pointer to full path of file,
|
|
; [ESP+8] - strlen of path
|
|
;
|
|
; Exit: TRUE if successful, FALSE otherwise
|
|
;
|
|
BeginProc _VxdInitLmHostsSupport
|
|
push esi
|
|
push edi
|
|
|
|
mov ecx, [esp+16]
|
|
add ecx, LMHOSTS_READ_BUFF_SIZE
|
|
|
|
push ecx ; save ecx for the map call
|
|
VMMCall _Allocate_Global_V86_Data_Area, <ecx, GVDAZeroInit>
|
|
pop ecx
|
|
or eax,eax ; zero if error
|
|
jz ILMH_50
|
|
|
|
push eax
|
|
mov _pFileBuff, eax ; Save the linear address so we can access
|
|
add eax, LMHOSTS_READ_BUFF_SIZE ; from the vxd
|
|
mov _pFilePath, eax
|
|
pop eax
|
|
|
|
shl eax, 12 ; Convert linear to V86 address
|
|
shr ax, 12
|
|
|
|
mov _pMappedFileBuff, eax
|
|
add eax, LMHOSTS_READ_BUFF_SIZE
|
|
mov _pMappedFilePath, eax
|
|
|
|
jmp ILMH_70
|
|
|
|
ILMH_40:
|
|
; Free allocated V86 global memory (how?)
|
|
|
|
|
|
ILMH_50:
|
|
; error occurred, eax already contains zero
|
|
|
|
|
|
ILMH_70:
|
|
pop edi
|
|
pop esi
|
|
ret
|
|
|
|
EndProc _VxdInitLmHostsSupport
|
|
|
|
|
|
;****************************************************************************
|
|
;** _VxdWindowsPath
|
|
;
|
|
; Gets a pointer to (null-terminated) path to the windows directory
|
|
;
|
|
; This is an Init time only routine
|
|
;
|
|
; Entry: nothing
|
|
;
|
|
; Exit: pointer to path to windows directory
|
|
;
|
|
BeginProc _VxdWindowsPath
|
|
PushState ; Pushes lots of crap
|
|
|
|
VmmCall Get_Config_Directory
|
|
|
|
mov eax, edx ; path is returned in edx
|
|
|
|
PopState ; now pop all that crap
|
|
|
|
ret
|
|
|
|
EndProc _VxdWindowsPath
|
|
|
|
VxD_ICODE_ENDS
|
|
|
|
VxD_CODE_SEG
|
|
|
|
;****************************************************************************
|
|
;** _VxdFileOpen
|
|
;
|
|
; Opens a file
|
|
;
|
|
; Entry: [ESP+4] - Pointer to full path of file, path must be mapped
|
|
; to v86 memory before calling this
|
|
;
|
|
; Exit: EAX will contain a handle to the openned file
|
|
;
|
|
BeginProc _VxdFileOpen
|
|
|
|
push edi
|
|
push esi
|
|
|
|
mov dx, word ptr [esp+12] ; Just the offset
|
|
mov di, word ptr [esp+14] ; Just the segment
|
|
|
|
PushState ; This pushes lots of crap
|
|
|
|
mov [ebx.Client_ax], 3d00h ; Open file, read only, share
|
|
mov [ebx.Client_dx], dx
|
|
mov [ebx.Client_ds], di
|
|
|
|
mov eax, 21h
|
|
VmmCall Exec_Int
|
|
test [ebx.Client_Flags], CF_Mask ; Carry set if error
|
|
jz VFO_6 ; Carry set if error
|
|
|
|
mov eax, 0 ; Failed to open the file
|
|
jmp VFO_10
|
|
|
|
VFO_6:
|
|
movzx eax, [ebx.Client_ax] ; Handle of file
|
|
|
|
VFO_10:
|
|
PopState
|
|
|
|
pop esi
|
|
pop edi
|
|
ret
|
|
EndProc _VxdFileOpen
|
|
|
|
|
|
;****************************************************************************
|
|
;** _VxdFileRead
|
|
;
|
|
; Reads x bytes from a previously openned file
|
|
;
|
|
; Entry: [ESP+4] - Handle from _VxdFileOpen
|
|
; [ESP+8] - Count of bytes to read
|
|
; [ESP+12]- Mapped memory of destination buffer
|
|
;
|
|
; Exit: EAX will contain the number of bytes read, 0 if EOF or
|
|
; an error occurred.
|
|
;
|
|
BeginProc _VxdFileRead
|
|
|
|
push edi
|
|
push esi
|
|
|
|
mov ax, [esp+12] ; File Handle
|
|
mov si, [esp+16] ; Bytes to read
|
|
mov dx, [esp+20] ; Just the offset
|
|
mov di, [esp+22] ; Just the segment
|
|
|
|
PushState ; Pushes lots of crap (uses cx)
|
|
|
|
mov [ebx.Client_ax], 3f00h ; File Read
|
|
mov [ebx.Client_bx], ax ; File Handle
|
|
mov [ebx.Client_cx], si ; Bytes to read
|
|
mov [ebx.Client_dx], dx ; Mapped destination buffer
|
|
mov [ebx.Client_ds], di
|
|
|
|
mov eax, 21h
|
|
VmmCall Exec_Int
|
|
test [ebx.Client_Flags], CF_Mask ; Carry set if error
|
|
jz VFR_6 ; Carry set if error
|
|
|
|
mov eax, 0 ; Failed to open the file
|
|
jmp VFR_7
|
|
|
|
VFR_6:
|
|
movzx eax, [ebx.Client_ax] ; Bytes read
|
|
|
|
VFR_7:
|
|
|
|
VFR_10:
|
|
PopState
|
|
|
|
pop esi
|
|
pop edi
|
|
ret
|
|
EndProc _VxdFileRead
|
|
|
|
|
|
;****************************************************************************
|
|
;** _VxdFileClose
|
|
;
|
|
; Closes a file openned with VxdOpenFile
|
|
;
|
|
; Entry: [ESP+4] - Handle from _VxdFileOpen
|
|
;
|
|
BeginProc _VxdFileClose
|
|
|
|
mov ax, [esp+4] ; File Handle
|
|
|
|
PushState ; Pushes lots of crap
|
|
|
|
mov [ebx.Client_ax], 3e00h ; File Close
|
|
mov [ebx.Client_bx], ax ; File Handle
|
|
|
|
mov eax, 21h
|
|
VmmCall Exec_Int
|
|
test [ebx.Client_Flags], CF_Mask ; Carry set if error
|
|
jz VFCL_10 ; Carry set if error
|
|
|
|
Debug_Out "VxdFileClose - Close failed"
|
|
mov eax, 0 ; Failed to close the file
|
|
|
|
VFCL_10:
|
|
PopState
|
|
|
|
ret
|
|
EndProc _VxdFileClose
|
|
|
|
|
|
VxD_CODE_ENDS
|
|
END
|