2025-04-27 07:49:33 -04:00

2463 lines
67 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PAGE 58,132
;******************************************************************************
TITLE SHADOW.ASM - Windows/386 NETBIOS SHADOW FOR REMOTE NETWORK ACCESS
;******************************************************************************
;
; (C) Copyright MICROSOFT Corp., 1987-1993
;
; Title: SHADOW.ASM -
;
;
;
; Version:
;
; Date:
;
; Author:
;
;------------------------------------------------------------------------------
.386p
.XLIST
WIN40COMPAT equ 1
include vmm.inc
include shell.inc
include debug.inc
include ifsmgr.inc
include dosmgr.inc
include vxdldr.inc
include vwin32.inc
include winnetwk.inc
include netvxd.inc
include vrdsvc.inc
.LIST
extern _ProcessRegisterNet:near
extern _ProcessNetFunction:near
IFDEF HOOKMOUNT
extern _ProcessRegisterMount:near
ENDIF
extern _FS_ConnectResourceShadow:near
extern _IoctlRegisterAgent:near
extern _IoctlUnRegisterAgent:near
extern _IoctlGetUNCPath:near
extern _IoctlBeginPQEnum:near
extern _IoctlEndPQEnum:near
extern _IoctlNextPriShadow:near
extern _IoctlPrevPriShadow:near
extern _IoctlGetShadowInfo:near
extern _IoctlSetShadowInfo:near
extern _IoctlCopyChunk:near
extern _IoctlChkUpdtStatus:near
extern _IoctlDoShadowMaintenance:near
extern _IoctlBeginReint:near
extern _IoctlEndReint:near
extern _IoctlCreateShadow:near
extern _IoctlDeleteShadow:near
extern _IoctlSetServerStatus:near
extern _IoctlGetServerStatus:near
extern _IoctlAddUse:near
extern _IoctlDelUse:near
extern _IoctlGetUse:near
extern _ActOnCreateVM:near
extern _ActOnResumeVM:near
extern _ActOnSetDeviceFocus:near
extern _TerminateHook:near
extern _IoctlSwitches:near
extern _IoctlGetShadow:near
extern _IoctlGetGlobalStatus:near
extern _IoctlFindOpenHSHADOW:near
extern _IoctlFindNextHSHADOW:near
extern _IoctlFindCloseHSHADOW:near
extern _IoctlGetPriorityHSHADOW:near
extern _IoctlSetPriorityHSHADOW:near
extern _IoctlAddHint:near
extern _IoctlDeleteHint:near
extern _IoctlFindOpenHint:near
extern _IoctlFindNextHint:near
extern _IoctlFindCloseHint:near
extern _IoctlGetAliasHSHADOW:near
extern _FS_FakeNetConnect:near
extern _ActOnTerminateThread:near
IFDEF DEBUG
extern _ShadowRestrictedEventCallback:near
extern _DebugQueryCmdStr:byte
extern _DebugQueryCmdStrLen:dword
extern _SHDDebug:near
ENDIF
Declare_Virtual_Device SHADOW, 3, 0Ah, Shadow_Control, CSC_Device_ID, IFSMgr_Init_Order+1,,Shadow_PM_Api_Handler
SHADOW_VERSION EQU 8287h
API_SUCCESS EQU 1
API_FAILURE EQU 0
Time_Out_Period EQU 1100
MAX_LANS EQU 16
Shadow_IOCTL_BASE EQU 1001
Shadow_IOCTL_GENERROR EQU 1
TRUE EQU 1
FALSE EQU 0
;SHADOW_OEM_ID EQU 00220000h
IFDEF DEBUG
SHADOW_LOG_TIME_INTERVAL EQU 60000
SHADOW_STATS_FLUSH_COUNT EQU 10
ENDIF
VxD_DATA_SEG
IFDEF DEBUG
_NbDebug dd 0
ENDIF
public OrigRegisterNetFunc
public _OrigNetFunction
public _fLog
public _fShadow
public _fShadowFind
public _fDiscon
public _fNoShadow
public _OrigSetupFailedConnection
public _proidShadow
public _FCBToShort
public _ShortToFCB
public _DebugMenu
public _GetConfigDir
public _Get_Sys_VM_Handle
public _Get_Cur_VM_Handle
public _Call_VM_Event
public _SetWin32Event
public _CloseVxDHandle
public _VRedirCSCInfoFunction
public _MyCheckAccessConflict
OrigRegisterNetFunc dd -1
_OrigNetFunction dd 0
OrigHookDeviceService dd 0
NextNetFunction dd 0
_OrigSetupFailedConnection dd 0
_proidShadow dd 0
_VRedirCSCInfoFunction dd 0
IFDEF HOOKMOUNT
public OrigRegisterMountFunc
OrigRegisterMountFunc dd -1
ENDIF
ALIGN 4
indos_ptr dd 0
IFDEF DEBUG
Alloc_watch dd 0
Alloc_table dd 512 DUP (0)
Alloc_sizes dd 512 DUP (0)
Alloc_cnt dd 0
ENDIF
ALIGN 4
Shadow_PM_API_Table LABEL DWORD
dd offset32 Shadow_PM_API_Get_Version
Shadow_PM_API_Max EQU ($-Shadow_PM_API_Table)/4
Shadow_IOCTL_Table LABEL DWORD
dd offset32 Shadow_PM_API_Register_Agent
dd offset32 Shadow_PM_API_UnRegister_Agent
dd offset32 Shadow_PM_API_GetUNCPath
dd offset32 Shadow_PM_API_BeginPQEnum
dd offset32 Shadow_PM_API_EndPQEnum
dd offset32 Shadow_PM_API_NextPriShadow
dd offset32 Shadow_PM_API_PrevPriShadow
dd offset32 Shadow_PM_API_GetShadowInfo
dd offset32 Shadow_PM_API_SetShadowInfo
dd offset32 Shadow_PM_API_ChkUpdtStatus
dd offset32 Shadow_PM_API_DoShadowMaintenance
dd offset32 Shadow_PM_API_CopyChunk
dd offset32 Shadow_PM_API_BeginReint
dd offset32 Shadow_PM_API_EndReint
dd offset32 Shadow_PM_API_CreateShadow
dd offset32 Shadow_PM_API_DeleteShadow
dd offset32 Shadow_PM_API_GetServerStatus
dd offset32 Shadow_PM_API_SetServerStatus
dd offset32 Shadow_PM_API_AddUse
dd offset32 Shadow_PM_API_DelUse
dd offset32 Shadow_PM_API_GetUse
dd offset32 Shadow_PM_API_Switches
dd offset32 Shadow_PM_API_GetShadow
dd offset32 Shadow_PM_API_GetGlobalStatus
dd offset32 Shadow_PM_API_FindOpenHSHADOW
dd offset32 Shadow_PM_API_FindNextHSHADOW
dd offset32 Shadow_PM_API_FindCloseHSHADOW
dd offset32 Shadow_PM_API_GetPriorityHSHADOW
dd offset32 Shadow_PM_API_SetPriorityHSHADOW
dd offset32 Shadow_PM_API_AddHint
dd offset32 Shadow_PM_API_DeleteHint
dd offset32 Shadow_PM_API_FindOpenHint
dd offset32 Shadow_PM_API_FindNextHint
dd offset32 Shadow_PM_API_FindCloseHint
dd offset32 Shadow_PM_API_GetAliasHSHADOW
Shadow_IOCTL_MAX EQU ($-Shadow_IOCTL_Table)/4
IFDEF DEBUG
Debug_Menu LABEL DWORD
dd OFFSET32 MinDbg_Str, OFFSET32 MinDbg_Debug
dd OFFSET32 DefaultDbg_Str, OFFSET32 DefaultDbg_Debug
dd OFFSET32 MaxDbg_Str, OFFSET32 MaxDbg_Debug
dd OFFSET32 Alloc_Str, OFFSET32 Alloc_Debug
dd OFFSET32 Heap_Str, OFFSET32 AllocDisplay_Debug
Debug_Menu_Len equ ($ - Debug_Menu)/8
dd 0
MinDbg_Str db "Minimal debug output", 0
DefaultDbg_Str db "Default debug output", 0
MaxDbg_Str db "Maximum debug output", 0
Alloc_Str db "Monitor memory allocations", 0
Heap_Str db "Display current memory allocations", 0
Shadow_Str db "Shadow",0
ENDIF ; DEBUG
_fLog dd 0
_fShadow dd 0
_fDiscon dd 0
_fNoShadow dd 0
_cntTicks dd 0
_fShadowFind dd 0
sz386Enh db "386enh",0
_vszShadowOverride db "NoShadow",0
extern _ulMaxStoreSize:DWORD
VxD_DATA_ENDS
VxD_LOCKED_DATA_SEG
VxD_LOCKED_DATA_ENDS
VxD_CODE_SEG
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @api LocalAlloc | Allocates page-locked memory.
;
; @parm flags | ignored
;
; @parm bytesneeded | number of bytes of memory required
;
; @rdesc Returns address of memory if allocation succeeds
; or zero if allocation failed.
;
;******************************************************************************
LocalAlloc proc near c public, flags:dword, bytesneeded:dword
mov eax, bytesneeded
push eax
VxDcall IFSMgr_GetHeap
pop ecx ; Clear stack
test eax, eax
jz short AH50
AH20:
IFDEF DEBUG
jmp AH_Debug
ENDIF
cld
ret
; Heap allocation failed. Try to fill the spare if inDos not set.
AH50:
mov ecx, indos_ptr
cmp word ptr [ecx], 0
jne short AH20
VxDcall IFSMgr_FillHeapSpare
push bytesneeded
VxDcall IFSMgr_GetHeap
pop ecx ; Clear stack
IFDEF DEBUG
jmp AH_Debug
ENDIF
cld
ret
IFDEF DEBUG
AH_Debug:
cld
pushad
test eax, eax
jnz AH_GotMem
Debug_Out "Shadow: LocalAlloc Failed"
jmp AH_Done
AH_GotMem:
mov edx, Alloc_watch
or edx, edx
jz AH_NoTrace
mov edx, bytesneeded
; Trace_Out "Shadow: LocalAlloc #EDX bytes at #EAX"
AH_NoTrace:
mov edi, OFFSET32 Alloc_table
mov ecx, Alloc_cnt
mov [edi + ecx *4], eax
mov edi, OFFSET32 Alloc_sizes
mov edx, bytesneeded
mov [edi + ecx *4], edx
inc Alloc_cnt
AH_Done:
popad
ret
ENDIF
LocalAlloc endp
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @api LocalFree | Frees a previously allocated block of page-locked memory.
;
; @parm memhandle | address of the block to be freed
;
; @rdesc Returns zero.
;
;******************************************************************************
LocalFree proc near c public, memhandle:dword
mov eax, memhandle
IFDEF DEBUG
pushad
IFDEF DEBUG
mov ecx, eax
call _ShadowCheckHeap
ENDIF
mov edi, OFFSET32 Alloc_table
mov ecx, Alloc_cnt
cld
repne scasd
jz FH_Found
Debug_Out "Shadow: LocalFree invalid handle"
jmp FH_Done
FH_Found:
sub edi, 4
xor ecx, ecx
mov [edi], ecx
mov esi, OFFSET32 Alloc_table
mov edx, Alloc_cnt
dec edx
mov ebx, [esi + edx * 4]
mov [edi], ebx
mov esi, OFFSET32 Alloc_sizes
mov ebx, [esi + edx * 4]
sub edi, OFFSET32 Alloc_table
add edi, OFFSET32 Alloc_sizes
mov [edi], ebx
mov Alloc_cnt, edx
mov edx, Alloc_watch
or edx, edx
jz FH_Done
; Trace_Out "Shadow: LocalFree #EAX"
FH_Done:
popad
ENDIF
push eax
VxDcall IFSMgr_RetHeap
pop eax ; Clear stack, smallest way
cld
xor eax, eax
ret
LocalFree endp
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Device_Init | This function is called when the
; shadow is dynamically loaded.
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Succeeded in initializing VxD
;
; @flag CY | Failed to initializing VxD
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;******************************************************************************
BeginProc Shadow_Device_Init, PUBLIC
; int 1
xor eax,eax
mov esi, OFFSET32 sz386Enh
mov edi, OFFSET32 _vszShadowOverride
VMMCall Get_Profile_Decimal_Int
jc yes_shadow_enable
jz yes_shadow_enable
Trace_Out "Shadow: Override set"
mov _fNoShadow, 1
stc
ret
yes_shadow_enable:
mov esi, OFFSET32 ShadowNetFunction
mov eax, @@IFSMgr_NetFunction
VMMcall Hook_Device_Service
jc DevInitError
Trace_Out "Shadow: Hooked IFSMgr_NetFunction"
mov _OrigNetFunction, esi
clc
mov esi, OFFSET32 ShadowHookDeviceService
mov eax, @@Hook_Device_Service
VMMcall Hook_Device_Service
jc DevInitError
Trace_Out "Shadow: Hooked Hook_Device_Service"
mov OrigHookDeviceService, esi
clc
Register_Net_Func:
mov esi, OFFSET32 ShadowRegisterNetFunc
mov eax, @@IFSMgr_RegisterNet
VMMcall Hook_Device_Service
jc DevInitError
Trace_Out "Shadow: Hooked RegisterNet service"
mov OrigRegisterNetFunc, esi
clc
VxDCall IFSMgr_RegisterNet, <_FS_FakeNetConnect, IFSMGRVERSION, WNNC_NET_COGENT>
cmp eax, -1
jz DevInitError
mov _proidShadow, eax
IFDEF HOOKMOUNT
mov esi, OFFSET32 ShadowMountFunction
mov eax, @@IFSMgr_RegisterMount
VMMcall Hook_Device_Service
jc DevInitError
Trace_Out "Shadow: Hooked RegisterMount service"
mov OrigRegisterMountFunc, esi
clc
ENDIF
IFDEF DEBUG
mov eax, SHADOW_LOG_TIME_INTERVAL
mov edx, 0
mov esi, OFFSET32 Shadow_Timer_Callback
VMMCall Set_Global_Time_Out
mov eax,esi
cmp eax,0
jne TimerSet
Trace_Out "Shadow: Couldn't set the logging timer"
TimerSet:
ENDIF
mov esi, OFFSET32 _FS_ConnectResourceShadow
mov eax, @@IFSMgr_SetupFailedConnection
VMMcall Hook_Device_Service
jc SFC_Error
Trace_Out "Shadow: Hooked SetupFailedConnection"
mov _OrigSetupFailedConnection, esi
SFC_Error:
clc
ret
DevInitError:
Trace_Out "Shadow: Error Hooking services"
mov _fshadow, 0
ret
EndProc Shadow_Device_Init
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Device_Exit | This function is called when the
; VxD is dynamically unloaded.
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Success
;
; @flag CY | Failure
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;
;******************************************************************************
BeginProc Shadow_Device_Exit
clc
ret
EndProc Shadow_Device_Exit
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Sys_VM_Terminate | This function is called when the
; VxD is dynamically unloaded.
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Success
;
; @flag CY | Failure
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;
;******************************************************************************
BeginProc Shadow_Sys_VM_Terminate
call _TerminateHook
clc
ret
EndProc Shadow_Sys_VM_Terminate
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Control | This function dispatches VxD control messages
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Success
;
; @flag CY | Failure
;
; @uses FLAGS
;
;******************************************************************************
BeginProc Shadow_Control
Control_Dispatch Device_Init, Shadow_Device_Init
Control_Dispatch System_Exit, Shadow_Device_Exit
Control_Dispatch Sys_VM_Terminate, Shadow_Sys_VM_Terminate
Control_Dispatch W32_DEVICEIOCONTROL, Shadow_DeviceIOControl
Control_Dispatch Create_VM, Shadow_Create_VM
Control_Dispatch VM_Resume, Shadow_Resume_VM
Control_Dispatch Set_Device_Focus, Shadow_Set_Device_Focus
Control_Dispatch terminate_thread, Shadow_Terminate_Thread
IFDEF DEBUG
Control_Dispatch Debug_Query, SHDDumpDebug
ENDIF
clc
ret
EndProc Shadow_Control
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_DeviceIOControl | This is the single entry point for WIN32
; Device IOCTL calls.
;
; @reg EAX | W32_DEVICEIOCONTROL
;
; @reg EBX | DDB
;
; @reg ECX | dwIoControlCode
;
; @reg ESI | Pointer to DIOCParams structure.
;
; @rdesc Return code in EAX as follows
;
; @flag 0 | Success
;
; @flag -1 | Asynchronous I/O in progress
;
; @falg Other | Error code.
;
; @uses ALL
;
;******************************************************************************
BeginProc Shadow_DeviceIOControl
push ebx
push esi
push edi
cmp ecx, DIOC_GETVERSION ; Q: Version IOCTL? (must be supported)
jne DIOC_10 ; N: Continue
; Y: Information returned from GetVersion TBD
xor eax, eax ; Return w/ EAX = 0 (success)
jmp DIOC_Done
DIOC_10:
; cmp ecx, DIOC_CLOSEHANDLE ; Q: Close IOCTL? (must be supported)
; jne DIOC_20 ; N: Continue
; xor eax, eax ; Y: Return w/ EAX = 0 (success)
; jmp DIOC_Done
DIOC_20:
shr ecx, 2 ; as per winioctl.h
and ecx, 7ffh ; as per winioctl.h
sub ecx, Shadow_IOCTL_BASE
cmp ecx, Shadow_IOCTL_MAX ; Q: index in range?
jae SHORT DIOC_Error ; N: Return error
mov edi, [esi.lpvInBuffer] ; Y: Call appropriate API
call Shadow_IOCTL_Table[ecx*4]
cmp eax, 0
jl DIOC_Error
xor eax, eax ; Return w/ EAX = 0 (success)
; fall-through
DIOC_Done:
clc
pop edi
pop esi
pop ebx
ret
DIOC_Error:
mov eax, Shadow_IOCTL_GENERROR
jmp DIOC_Done
EndProc Shadow_DeviceIOControl
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Create_VM | This function is called when a virtual
; machine is created
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Succeeded in initializing VxD
;
; @flag CY | Failed to initializing VxD
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;******************************************************************************
BeginProc Shadow_Create_VM, PUBLIC
call _ActOnCreateVM
clc
ret
EndProc Shadow_Create_VM
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Resume_VM | This function is called when a virtual
; machine is created
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Succeeded in initializing VxD
;
; @flag CY | Failed to initializing VxD
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;******************************************************************************
BeginProc Shadow_Resume_VM, PUBLIC
call _ActOnResumeVM
clc
ret
EndProc Shadow_Resume_VM
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Set_Device_Focus | This function is called when our VXD
; gets Set_Device_Focus message
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Succeeded in initializing VxD
;
; @flag CY | Failed to initializing VxD
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;******************************************************************************
BeginProc Shadow_Set_Device_Focus, PUBLIC
call _ActOnSetDeviceFocus
clc
ret
EndProc Shadow_Set_Device_Focus
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_Terminate_Thread | This function is called when our VXD
; gets Terminate_Thread message
;
; @reg EBX | System VM Handle
;
; @reg EBP | pointer to client regs structure
;
; @rdesc Register values at return:
;
; @reg FLAGS | Flags defined at return:
;
; @flag NC | Succeeded in initializing VxD
;
; @flag CY | Failed to initializing VxD
;
; @uses FLAGS
;
; @xref Shadow_Control
;
;******************************************************************************
BeginProc Shadow_Terminate_Thread, PUBLIC
push edi
call _ActOnTerminateThread
pop edi
clc
ret
EndProc Shadow_Terminate_Thread
;******************************************************************************
;
; @doc INTERNAL SHADOW
;
; @asm Shadow_PM_API_Handler | This is the single entry point for VMs
; executing in protect-mode.
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg CLIENT_AX | Shadow PM API Index.
;
; @reg CLIENT_ES:CLIENT_(E)BX | API specific parameters or NULL
;
; @rdesc Refer to specific APIs for client register values at return.
; A return value of 0 indicates that the API succeeded, otherwise
; an error value is returned. The version call is an exception
;
; @uses FLAGS
;
;******************************************************************************
BeginProc Shadow_PM_API_Handler
movzx eax, [ebp.Client_AX] ; Get API index
cmp eax, Shadow_PM_API_MAX ; Q: index in range?
jae SHORT Shadow_Handler_Error ; N: Fail call.
mov [ebp.Client_AX], 1
mov cx,[ebp.Client_ES] ; Q: Null Parameters?
or cx,[ebp.Client_ES] ; Y: Don't call map_flat
jz SHORT Shadow_Handler_Null_Parms
Client_Ptr_Flat edi, es, bx ; N: EDI -> parameter struc.
Shadow_Handler_Null_Parms:
call Shadow_PM_API_Table[eax*4] ; Call appropriate API
mov [ebp.Client_AX], ax
ret
Shadow_Handler_Error:
mov [ebp.Client_AX], API_FAILURE
ret
EndProc Shadow_PM_API_Handler
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm Shadow_PM_API_Get_Version | This function returns the version
; number of the device,
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg CLIENT_AX | VTD API Index.
;
; @rdesc AX contains version number
;
; @uses FLAGS
;
; @xref Shadow_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_Get_Version
mov eax, SHADOW_VERSION
ret
EndProc Shadow_PM_API_Get_Version
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Register_Agent | This function allows the
; reintegartion agent to register itself
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | Contains the window handle
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_Register_Agent
push edi
call _IoctlRegisterAgent
pop edi
ret
EndProc Shadow_PM_API_Register_Agent
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_UnRegister_Agent | This function allows the
; reintegartion agent to unregister itself
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Dont' Care
;
; @reg EDI | Contains the window handle
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_UnRegister_Agent
push edi
call _IoctlUnRegisterAgent
pop edi
ret
EndProc Shadow_PM_API_UnRegister_Agent
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Get_Copyback_Params | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to a PATHS structure :
; typedef struct tagPATHS
; {
; unsigned uCookie; // Indicates the reintegartion ID
; LPVOID lpSrc; // Name of local file
; int cbSrc; // Buffer size
; LPVOD lpDst; // Name of remote file
; int cbDst; // Buffer size
; }
; PATHS;
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetUNCPath
push edi
call _IoctlGetUNCPath
pop edi
ret
EndProc Shadow_PM_API_GetUNCPath
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Begin_PQ_Enum | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to a unsigned long
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_BeginPQEnum
push edi
call _IoctlBeginPQEnum
pop edi
ret
EndProc Shadow_PM_API_BeginPQEnum
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_End_PQ_Enum | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to a unsigned long
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_EndPQEnum
push edi
call _IoctlEndPQEnum
pop edi
ret
EndProc Shadow_PM_API_EndPQEnum
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Next_Pri_Shadow | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to a unsigned long
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_NextPriShadow
push edi
call _IoctlNextPriShadow
pop edi
ret
EndProc Shadow_PM_API_NextPriShadow
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Prev_Pri_Shadow | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to a unsigned long
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_PrevPriShadow
push edi
call _IoctlPrevPriShadow
pop edi
ret
EndProc Shadow_PM_API_PrevPriShadow
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Get_Shadow_Info | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned short usStatus;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetShadowInfo
push edi
call _IoctlGetShadowInfo
pop edi
ret
EndProc Shadow_PM_API_GetShadowInfo
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Set_Shadow_Info | This function is called
; by the Reintegration Agent. It returns the
; name of the shadow file that has been modified and
; the remote file that needs to be updated
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned short usStatus;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_SetShadowInfo
push edi
call _IoctlSetShadowInfo
pop edi
ret
EndProc Shadow_PM_API_SetShadowInfo
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_ChkUpdtStatus | This function is called
; by the Reintegration Agent.
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_ChkUpdtStatus
push edi
call _IoctlChkUpdtStatus
pop edi
ret
EndProc Shadow_PM_API_ChkUpdtStatus
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_DoShadowMaintenance | This function is called
; by the Reintegration Agent.
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_DoShadowMaintenance
push edi
call _IoctlDoShadowMaintenance
pop edi
ret
EndProc Shadow_PM_API_DoShadowMaintenance
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_CopyChunk | This function is called
; by the Reintegration Agent.
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_CopyChunk
push ebx
mov ebx,[esi.lpvOutBuffer]
push ebx
push edi
call _IoctlCopyChunk
pop edi
pop ebx
pop ebx
ret
EndProc Shadow_PM_API_CopyChunk
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_BeginReint | This function is called
; by the Reintegration Agent to start reintegration on a
; server whose handle is in the SHADOWINFO structure
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned short usStatus;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_BeginReint
push edi
call _IoctlBeginReint
pop edi
ret
EndProc Shadow_PM_API_BeginReint
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_EndReint | This function is called
; by the Reintegration Agent to end reintegration on a
; server whose handle is in the SHADOWINFO structure.
; uStatus contains the server status to be set.
; uOp contains the operation to be applied on the status(AND,OR etc.)
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_EndReint
push edi
call _IoctlEndReint
pop edi
ret
EndProc Shadow_PM_API_EndReint
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_CreateShadow | This function is called
; by the Reintegration Agent to create a shadow
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_CreateShadow
push edi
call _IoctlCreateShadow
pop edi
ret
EndProc Shadow_PM_API_CreateShadow
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_DeleteShadow | This function is called
; by the Reintegration Agent to delete a shadow
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_DeleteShadow
push edi
call _IoctlDeleteShadow
pop edi
ret
EndProc Shadow_PM_API_DeleteShadow
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_GetServerStatus | This function is called
; by the Reintegration Agent to create a shadow
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetServerStatus
push edi
call _IoctlGetServerStatus
pop edi
ret
EndProc Shadow_PM_API_GetServerStatus
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_SetServerStatus | This function is called
; by the Reintegration Agent to create a shadow
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_SetServerStatus
push edi
call _IoctlSetServerStatus
pop edi
ret
EndProc Shadow_PM_API_SetServerStatus
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_AddUse | This function is by Shadow NP
; on detecting disconnection
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to COPYPARAMS structure
; typedef struct tagCOPYPARAMS
; {
; HSERVER hServer;
; HSHADOW hDir;
; HSHADOW hShadow;
; LPSTR lpLocalPath;
; LPSTR lpRemotePath;
; LPSTR lpServerPath;
; }
; COPYPARAMS;
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_AddUse
push edi
call _IoctlAddUse
pop edi
ret
EndProc Shadow_PM_API_AddUse
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_DelUse | This function is by Shadow NP
; on detecting disconnection
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to COPYPARAMS structure
; typedef struct tagCOPYPARAMS
; {
; HSERVER hServer;
; HSHADOW hDir;
; HSHADOW hShadow;
; LPSTR lpLocalPath;
; LPSTR lpRemotePath;
; LPSTR lpServerPath;
; }
; COPYPARAMS;
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_DelUse
push edi
call _IoctlDelUse
pop edi
ret
EndProc Shadow_PM_API_DelUse
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_GetUse | This function is by Shadow NP
; on detecting disconnection
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to COPYPARAMS structure
; typedef struct tagCOPYPARAMS
; {
; HSERVER hServer;
; HSHADOW hDir;
; HSHADOW hShadow;
; LPSTR lpLocalPath;
; LPSTR lpRemotePath;
; LPSTR lpServerPath;
; }
; COPYPARAMS;
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetUse
push edi
call _IoctlGetUse
pop edi
ret
EndProc Shadow_PM_API_GetUse
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Switches | This function is called
; by the Reintegration Agent to switch on/off shadowing, loggin etc.
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSHADOW hShadow;
; HSHADOW hDir;
; HSERVER hServer;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_Switches
push edi
call _IoctlSwitches
pop edi
ret
EndProc Shadow_PM_API_Switches
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Get_Shadow_Info |
; IN: hDir, name of the shadow (OEM string) in lpFind2->cFileName
; OUT: hShadow, uStatus, lpFind32 contains the find info
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to SHADOWINFO structure
; {
; HSERVER hServer;
; HSHADOW hDir;
; HSHADOW hShadow;
; LPFIND32 lpFind32;
; unsigned uStatus;
; unsigned uOp;
; }
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetShadow
push edi
call _IoctlGetShadow
pop edi
ret
EndProc Shadow_PM_API_GetShadow
;******************************************************************************
;
; @doc INTERNAL SHADOW API
;
; @asm SHADOW_PM_API_Get_Space_Info |
;
; @reg EBX | Current VM Handle
;
; @reg EBP | Pointer to Client Register Structure.
;
; @reg EDI | A pointer to GLOABLSTATUS structure
;
; @rdesc eax contains zero if API failed, else non-zero.
;
; @uses FLAGS
;
; @xref SHADOW_PM_API_Handler
;
;******************************************************************************
BeginProc Shadow_PM_API_GetGlobalStatus
push edi
call _IoctlGetGlobalStatus
pop edi
ret
EndProc Shadow_PM_API_GetGlobalStatus
BeginProc Shadow_PM_API_FindOpenHSHADOW
push edi
call _IoctlFindOpenHSHADOW
pop edi
ret
EndProc Shadow_PM_API_FindOpenHSHADOW
BeginProc Shadow_PM_API_FindNextHSHADOW
push edi
call _IoctlFindNextHSHADOW
pop edi
ret
EndProc Shadow_PM_API_FindNextHSHADOW
BeginProc Shadow_PM_API_FindCloseHSHADOW
push edi
call _IoctlFindCloseHSHADOW
pop edi
ret
EndProc Shadow_PM_API_FindCloseHSHADOW
BeginProc Shadow_PM_API_GetPriorityHSHADOW
push edi
call _IoctlGetPriorityHSHADOW
pop edi
ret
EndProc Shadow_PM_API_GetPriorityHSHADOW
BeginProc Shadow_PM_API_SetPriorityHSHADOW
push edi
call _IoctlSetPriorityHSHADOW
pop edi
ret
EndProc Shadow_PM_API_SetPriorityHSHADOW
BeginProc Shadow_PM_API_AddHint
push edi
call _IoctlAddHint
pop edi
ret
EndProc Shadow_PM_API_AddHint
BeginProc Shadow_PM_API_DeleteHint
push edi
call _IoctlDeleteHint
pop edi
ret
EndProc Shadow_PM_API_DeleteHint
BeginProc Shadow_PM_API_FindOpenHint
push edi
call _IoctlFindOpenHint
pop edi
ret
EndProc Shadow_PM_API_FindOpenHint
BeginProc Shadow_PM_API_FindNextHint
push edi
call _IoctlFindNextHint
pop edi
ret
EndProc Shadow_PM_API_FindNextHint
BeginProc Shadow_PM_API_FindCloseHint
push edi
call _IoctlFindCloseHint
pop edi
ret
EndProc Shadow_PM_API_FindCloseHint
BeginProc Shadow_PM_API_GetAliasHSHADOW
push edi
call _IoctlGetAliasHSHADOW
pop edi
ret
EndProc Shadow_PM_API_GetAliasHSHADOW
IFDEF DEBUG
;******************************************************************************
; D E B U G G I N G C O D E
;******************************************************************************
BeginProc Shadow_Timer_Callback, PUBLIC
inc _cntTicks
mov eax, _cntTicks
cmp eax, SHADOW_STATS_FLUSH_COUNT
jl STC_Done
mov eax, 0
mov ebx, 0
mov ecx, PEF_WAIT_NOT_NESTED_EXEC
mov edx, 0
lea esi, Shadow_Restricted_Event_Callback
VMMCall Call_Restricted_Event
mov _cntTicks,0
STC_Done:
ret
EndProc Shadow_Timer_Callback
BeginProc Shadow_Restricted_Event_Callback, PUBLIC
call _ShadowRestrictedEventCallback
mov eax, SHADOW_LOG_TIME_INTERVAL
mov edx, 0
mov esi, OFFSET32 Shadow_Timer_Callback
VMMCall Set_Global_Time_Out
mov eax,esi
cmp eax,0
jne TimerSet1
Trace_Out "Shadow: Couldn't set the logging timer again"
TimerSet1:
ret
EndProc Shadow_Restricted_Event_Callback
BeginProc _DebugBreak, PUBLIC
push [esp+4]
VMMCall _Debug_Out_Service
pop eax
ret
EndProc _DebugBreak
BeginProc MinDbg_Debug
mov _NbDebug, 0
ret
EndProc MinDbg_Debug
BeginProc DefaultDbg_Debug
; mov _NbDebug, DEFAULT_DEBUG
ret
EndProc DefaultDbg_Debug
BeginProc MaxDbg_Debug
mov _NbDebug, 0FFFFFFFFh
ret
EndProc MaxDbg_Debug
BeginProc Alloc_Debug
mov eax, Alloc_watch
not eax
mov Alloc_watch, eax
ret
EndProc Alloc_Debug
BeginProc _ShadowCheckHeap
pushad
push @Line
push OFFSET32 Shadow_str
push ecx
VxDCall IFSMgr_CheckHeap
add esp, 12
or eax, eax
jz GCH_10
trace_out "Heap is fried"
GCH_10:
popad
ret
EndProc _ShadowCheckHeap
BeginProc _CheckHeap
mov ecx, [esp+4]
call _shadowCheckHeap
ret
EndProc _Checkheap
BeginProc AllocDisplay_Debug
mov ecx, Alloc_cnt
or ecx, ecx
jz AD_Exit
mov edi, OFFSET32 Alloc_table
mov esi, OFFSET32 Alloc_sizes
AD_Loop:
mov edx, [edi]
mov ebx, [esi]
Trace_Out "Memory block: #edx Size: #ebx"
add esi, 4
add edi, 4
loop AD_Loop
AD_Exit:
Trace_Out " "
call _ShadowCheckHeap
ret
EndProc AllocDisplay_Debug
;** SHDDumpDebug - Dump debug information to the debugger
;
public SHDDumpDebug
SHDDumpDebug proc near
xor ebx, ebx
mov ax, fs
test ax, ax
jz dq1
push esi
push ds
lea edi, _DebugQueryCmdStr
mov ecx, _DebugQueryCmdStrLen
mov ds, ax
cld
rep movsb
xor eax, eax
stosb
pop ds
pop esi
lea ebx, _DebugQueryCmdStr
dq1:
push ebx
call _SHDDebug
add esp, 4
ret
SHDDumpDebug endp
ENDIF
;** ShadowHookDeviceService - external API handler
;
; This routine receives HookDeviceService from the IFSMgr
;
; Entry (TOS+4) = ioreq & user register ptr
; Exit none
; Uses C registers
BeginProc ShadowHookDeviceService, PUBLIC
; Trace_Out "HookDeviceService Hook Called"
pushf
cmp eax, @@IFSMgr_NetFunction
jz SHDS_Unhook
popf
jmp OrigHookDeviceService
SHDS_Unhook:
; Someone is indeed trying to hook IFSMgr_NetFunction
; Let us first unhook ourselves
popf
; Trace_Out "Someone hooking IFSMgr_NetFunction"
push eax
push esi
mov esi, OFFSET32 ShadowNetFunction
VMMCall Unhook_Device_Service
pop esi
pop eax
jc SHDS_error
; We unhooked ourselves
; let the caller do it
call OrigHookDeviceService
; Save his result on the stack
pushf
; Let us hook ourselves back in
push esi
push eax
mov esi, OFFSET32 ShadowNetFunction
mov eax, @@IFSMgr_NetFunction
call OrigHookDeviceService
mov _OrigNetFunction, esi
pop eax
pop esi
jc SHDS_unhook_error
popf
jmp SHDS_done
SHDS_unhook_error:
popf
jmp SHDS_error
SHDS_error:
Trace_Out "HookDeviceService Hook Error, disabling shadowing"
mov _fShadow, 0
SHDS_done:
ret
EndProc ShadowHookDeviceService
;** ShadowRegisterNetFunction - external API handler
;
; This routine receives RegisterNet from the IFSMgr
;
; Entry (TOS+4) = ioreq & user register ptr
; Exit none
; Uses C registers
BeginProc ShadowRegisterNetFunc, PUBLIC
; int 1
Trace_Out "Hook Called"
mov eax, [esp+8]
cmp eax, IFSMGRVERSION
jne connect_passthrough ; if wrong ifs version, don't hook
mov eax, [esp+0ch]
cmp eax, WNNC_NET_LANMAN
je hooklanman ; hookit if lanman or ourselves
mov eax, [esp+0ch]
cmp eax, WNNC_NET_COGENT ; BUGBUG get us a net ID
je hookus
Trace_Out "Hook Called by some other FSD"
jmp connect_passthrough
hooklanman:
Trace_Out "Hook Called by LANMAN"
xor ecx, ecx ;; important step!!!
VxDCall VRedir_Get_Version
mov _VRedirCSCInfoFunction, ecx ;; if this is a new vredir, it will give us the function
jmp hookit
hookus:
Trace_Out "Hook Called by us"
hookit:
mov eax, [esp+4] ; take the pFunc from FSD
; Put it in our table
push eax
call _ProcessRegisterNet
add esp,4
or eax,eax
jz connect_passthrough
mov [esp+4],eax ; replace his function with ours
connect_passthrough:
jmp OrigRegisterNetFunc ; pass on to IFSMgr
EndProc ShadowRegisterNetFunc
;** ShadowNetFunction - external API handler
;
; This routine receives NetFunction from the IFSMgr
;
; Entry (TOS+4) = ioreq & user register ptr
; Exit none
; Uses C registers
BeginProc ShadowNetFunction, PUBLIC, HOOK_PROC, NextNetFunction
; Trace_Out "NetFunction Hook Called"
call _ProcessNetFunction
ret
EndProc ShadowNetFunction
IFDEF HOOKMOUNT
;** ShadowMountFunction - external API handler
;
; This routine receives RegisterMount from the IFSMgr
;
; Entry (TOS+4) = ioreq & user register ptr
; Exit none
; Uses C registers
BeginProc ShadowMountFunction, PUBLIC
; int 1
Trace_Out "Hook Called"
mov eax, [esp+4] ; take the pFunc from FSD
; Put it in our table
push eax
call _ProcessRegisterMount
add esp,4
or eax,eax
jz mount_passthrough
mov [esp+4],eax ; replace his function with ours
mount_passthrough:
jmp OrigRegisterMountFunc ; pass on to IFSMgr
EndProc ShadowMountFunction
ENDIF
BeginProc _UniToBCSPath , PUBLIC
int Dyna_Link_Int
dd @@UniToBCSPath OR DL_Jmp_Mask
EndProc _UniToBCSPath
BeginProc _UniToBCS , PUBLIC
int Dyna_Link_Int
dd @@UniToBCS OR DL_Jmp_Mask
EndProc _UniToBCS
BeginProc _BCSToUni , PUBLIC
int Dyna_Link_Int
dd @@BCSToUni OR DL_Jmp_Mask
EndProc _BCSToUni
BeginProc _IFSMgr_MetaMatch, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_MetaMatch OR DL_Jmp_Mask
EndProc _IFSMgr_MetaMatch
BeginProc _UniToUpper, PUBLIC
int Dyna_Link_Int
dd @@UniToUpper OR DL_Jmp_Mask
EndProc _UniToUpper
BeginProc _FGHS, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_GetHeap OR DL_Jmp_Mask
EndProc _FGHS
BeginProc _RetHeap, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_RetHeap OR DL_Jmp_Mask
EndProc _RetHeap
BeginProc _IFSMgr_Printf, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_printf OR DL_Jmp_Mask
EndProc _IFSMgr_Printf
BeginProc _IFSMgr_AssertFailed, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_AssertFailed OR DL_Jmp_Mask
EndProc _IFSMgr_AssertFailed
BeginProc _Ring0Api, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_Ring0_FileIO OR DL_Jmp_Mask
EndProc _Ring0Api
BeginProc _ParsePath, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_ParsePath OR DL_Jmp_Mask
EndProc _ParsePath
BeginProc _IFSMgr_Win32ToDosTime, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_Win32ToDosTime OR DL_Jmp_Mask
EndProc _IFSMgr_Win32ToDosTime
BeginProc _IFSMgr_DosToWin32Time, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_DosToWin32Time OR DL_Jmp_Mask
EndProc _IFSMgr_DosToWin32Time
BeginProc _IFSMgr_DosToNetTime, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_DosToNetTime OR DL_Jmp_Mask
EndProc _IFSMgr_DosToNetTime
BeginProc _IFSMgr_Get_NetTime, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_Get_NetTime OR DL_Jmp_Mask
EndProc _IFSMgr_Get_NetTime
BeginProc _IFSMgr_NetToWin32Time, PUBLIC
int Dyna_Link_Int
dd @@IFSMgr_NetToWin32Time OR DL_Jmp_Mask
EndProc _IFSMgr_NetToWin32Time
BeginProc _GetCurThreadHandle
VMMCall Get_Cur_Thread_Handle
mov eax,edi
ret
EndProc _GetCurThreadHandle
BeginProc _Shell_PostMessage
int Dyna_Link_Int
dd @@_Shell_PostMessage OR DL_Jmp_Mask
EndProc _Shell_PostMessage
BeginProc __BlockOnID
int Dyna_Link_Int
dd @@_BlockOnID OR DL_Jmp_Mask
EndProc __BlockOnID
BeginProc __SignalID
int Dyna_Link_Int
dd @@_SignalID OR DL_Jmp_Mask
EndProc __SignalID
BeginProc _IFSMgr_UseAdd
int Dyna_Link_Int
dd @@IFSMgr_UseAdd OR DL_Jmp_Mask
EndProc _IFSMgr_UseAdd
BeginProc _IFSMgr_UseDel
int Dyna_Link_Int
dd @@IFSMgr_UseDel OR DL_Jmp_Mask
EndProc _IFSMgr_UseDel
BeginProc _CreateBasis
int Dyna_Link_Int
dd @@CreateBasis OR DL_Jmp_Mask
EndProc _CreateBasis
BeginProc _MatchBasisName
int Dyna_Link_Int
dd @@MatchBasisName OR DL_Jmp_Mask
EndProc _MatchBasisName
BeginProc _AppendBasisTail
int Dyna_Link_Int
dd @@AppendBasisTail OR DL_Jmp_Mask
EndProc _AppendBasisTail
BeginProc _FCBToShort
int Dyna_Link_Int
dd @@FcbToShort OR DL_Jmp_Mask
EndProc _FCBToShort
BeginProc _ShortToFCB
int Dyna_Link_Int
dd @@ShortToFcb OR DL_Jmp_Mask
EndProc _ShortToFCB
BeginProc _DebugMenu
int Dyna_Link_Int
dd @@IFSMgr_DebugMenu OR DL_Jmp_Mask
EndProc _DebugMenu
_GetConfigDir:
push edx
VMMCall Get_Config_Directory
mov eax, edx
pop edx
ret
_Get_Sys_VM_Handle:
push ebx
VMMcall Get_Sys_VM_Handle
mov eax, ebx
pop ebx
ret
_Get_Cur_VM_Handle:
push ebx
VMMcall Get_Cur_VM_Handle
mov eax, ebx
pop ebx
ret
_Call_VM_Event:
push ebx
push esi
push edx
mov ebx, [esp+16] ;VM handle
mov esi, [esp+20] ;callback function
mov edx, [esp+24] ; refdata
VMMCall Call_VM_Event
pop edx
pop esi
pop ebx
ret
;*** _SetWin32Event - This function sets an event to the signaled state.
;
; _SetWin32Event is a thunk to VWIN32_SetWin32Event. (We make
; sure that Win32 is loaded prior to making the call.)
;
; BOOL = SetWin32Event( pevt );
;
; ENTRY [esp+4] - pointer to an event object
;
; EXIT eax = 0 if event was invalid, <> 0 if OK
; The event object is set to a signaled state. If it is a
; manual reset event, it remains in the signaled state until it
; is explicitly reset and all threads currently blocked on this
; event are unblocked. If it is an auto reset event, one waiting
; thread is unblocked.
;
; USES EAX, ECX, EDX
;
BeginProc _SetWin32Event
VxDCall VWIN32_Get_Version ; Verify Win32 installation
jc short swe90 ; Win32 not installed! (EAX)=0
; BUGBUG - the input parameter to _VWIN32_SetWin32Event is
; documented as being in EAX right now, but if someone comes to
; their senses and makes this C callable, this code will still work!
mov eax,DWORD PTR [esp+4] ; (EAX) = event object address
push eax
VxDCall _VWIN32_SetWin32Event ; Call _VWIN32_SetWin32Event
lea esp,[esp+4]
swe90: ret
EndProc _SetWin32Event
;*** _ResetWin32Event - This function sets an event to not signaled state.
;
; _ResetWin32Event is a thunk to VWIN32_ResetWin32Event.
; (We make sure that Win32 is loaded prior to making the call.)
;
; BOOL = ResetWin32Event( pevt );
;
; ENTRY [esp+4] - pointer to an event object
;
; EXIT eax = 0 if event was invalid, <> 0 if OK
; The event object is set to a not signaled state.
;
; USES EAX, ECX, EDX
;
BeginProc _ResetWin32Event
VxDCall VWIN32_Get_Version ; Verify Win32 installation
jc short swe91 ; Win32 not installed! (EAX)=0
; BUGBUG - the input parameter to _VWIN32_ResetWin32Event is
; documented as being in EAX right now, but if someone comes to
; their senses and makes this C callable, this code will still work!
mov eax,DWORD PTR [esp+4] ; (EAX) = event object address
push eax
VxDCall _VWIN32_ResetWin32Event ; Call _VWIN32_ResetWin32Event
lea esp,[esp+4]
swe91: ret
EndProc _ResetWin32Event
;*** _InSysVM - Returns boolean (Current VM == System VM) in EAX
;
BeginProc _InSysVM
push ebx
VMMCall Get_Cur_VM_Handle ; (EBX) = Current VM
VMMCall Test_Sys_VM_Handle ; (Zero) = (Current VM == System VM)
pop ebx
sete al ; (AL)= (Current VM == System VM)
movzx eax,al ; EAX = (Current VM == System VM)
ret
EndProc _InSysVM
_CloseVxDHandle:
mov eax, [esp+4]
VxDcall _VWIN32_CloseVxDHandle
ret
BeginProc _MyCheckAccessConflict
int Dyna_Link_Int
dd @@IFSMgr_CheckAccessConflict OR DL_Jmp_Mask
EndProc _MyCheckAccessConflict
;
; SP_PutNumber
;
; Takes an unsigned long integer and places it into a buffer, respecting
; a buffer limit, a radix, and a case select (upper or lower, for hex).
;
SP_PutNumber proc near c public, lpb:DWORD, n:DWORD, limit:DWORD, radix:DWORD, case:DWORD
push esi
push edi
mov al,'a'-'0'-10 ; figure out conversion offset
cmp case,0
jz pn_lower
mov al,'A'-'0'-10
pn_lower:
mov byte ptr case,al
mov eax,n ; ebx=number
mov ecx,radix ; cx=radix
mov edi,lpb ; edi->string
mov esi,limit ; cchLimit
divdown:
xor edx,edx
div ecx ; edx = rem, eax = div
xchg eax,edx ; eax = rem, edx = div
add al,'0'
cmp al,'9'
jbe isadig ; is a digit already
add al,byte ptr case ; convert to letter
isadig:
dec esi ; decrement cchLimit
jz pn_exit ; go away if end of string
stosb ; stick it in
mov eax,edx
or eax,eax
jnz divdown ; crack out next digit
pn_exit:
mov eax,edi
sub eax,dword ptr lpb[0] ; find number of chars output
pop edi
pop esi
ret
SP_PutNumber EndP
;
; SP_Reverse
;
; Reverses a string in place
;
SP_Reverse proc near c public, lpFirst:DWORD, lpLast:DWORD
push esi
push edi
mov esi,lpFirst
mov edi,lpLast
mov ecx,edi ; number of character difference
sub ecx,esi
inc ecx
shr ecx,1 ; number of swaps required
jcxz spr_boring ; nuthin' to do
spr100:
mov ah,[edi]
mov al,[esi] ; load the two characters
mov [esi],ah
mov [edi],al ; swap them
inc esi
dec edi ; adjust the pointers
loop spr100 ; ...until we've done 'em all
spr_boring:
pop edi
pop esi
ret
SP_Reverse EndP
VxD_CODE_ENDS
END