You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2462 lines
67 KiB
2462 lines
67 KiB
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
|
|
|
|
|
|
|