2463 lines
67 KiB
NASM
2463 lines
67 KiB
NASM
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
|
||
|
||
|
||
|