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.
498 lines
13 KiB
498 lines
13 KiB
.LALL
|
|
;*****************************************************************************
|
|
;
|
|
; (C) Copyright MICROSOFT Corp, 1993
|
|
;
|
|
; Title: DPLAY.ASM
|
|
;
|
|
; Version: 1.00
|
|
;
|
|
; Date: 16-Mar-1993
|
|
;
|
|
; Author: AaronO (mostly stolen from SnowBall vxdinit.asm)
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Change log:
|
|
;
|
|
; Date Rev Description
|
|
; ----------- --- ------------------------------------------------------
|
|
; 16-Mar-1993 AWO Original (splurped from SnowBall vxdinit.asm)
|
|
;
|
|
;=============================================================================
|
|
;
|
|
; Main VxD module for the NWSERVER NCP server:
|
|
;
|
|
; Real mode initialization
|
|
; VxD Initialization, including server VM creation
|
|
; VxD PM API support
|
|
; ServerStarvation checker
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
; BUGBUG: make sure everything is cleaned up from getting rid of VM here.
|
|
;-----------------------------------------------------------------------------
|
|
TITLE $DEBUG
|
|
.386P
|
|
|
|
|
|
include vmm.inc
|
|
include debug.inc
|
|
include shell.inc
|
|
|
|
include perf.inc ;performance monitor
|
|
include msgmacro.inc
|
|
include messages.inc
|
|
|
|
MASM=1
|
|
|
|
|
|
ifdef DEBUG
|
|
extrn _Debug_Query : near
|
|
extrn _DebugQueryCmdStr : byte
|
|
extrn _DebugQueryCmdStrLen : dword
|
|
endif
|
|
|
|
VxD_LOCKED_CODE_SEG
|
|
|
|
DPLAY_Device_Id equ 444h
|
|
|
|
Declare_Virtual_Device DPLAY, 1, 0, DPLAY_Control, DPLAY_Device_Id, \
|
|
Undefined_Init_Order, 0, 0
|
|
|
|
|
|
;=============================================================================
|
|
; VxD Control Dispatch table
|
|
;-----------------------------------------------------------------------------
|
|
|
|
Begin_Control_Dispatch DPLAY
|
|
; Control_Dispatch Set_Device_Focus, SERVER_Set_Device_Focus
|
|
; Control_Dispatch QUERY_DESTROY, NWSERVER_Query_Destroy
|
|
; Control_Dispatch SYS_CRITICAL_INIT, NWSERVER_Critical_Init
|
|
Control_Dispatch DEVICE_INIT, DPLAY_Device_Init
|
|
; Control_Dispatch INIT_COMPLETE, NWSERVER_Init_Complete
|
|
Control_Dispatch DEBUG_QUERY, DPLAY_Debug_Query
|
|
; Control_Dispatch Create_VM, SERVER_Create_VM
|
|
; Control_Dispatch SYS_VM_TERMINATE, NWSERVER_Exit
|
|
; Control_Dispatch SYS_CRITICAL_EXIT, NWSERVER_Critical_Exit
|
|
; Control_Dispatch VM_NOT_EXECUTEABLE, NWSERVER_VM_Not_Exec
|
|
; Control_Dispatch END_PM_APP, NWSERVER_End_PM_App
|
|
; Control_Dispatch Device_Reboot_Notify, NWSERVER_Reboot
|
|
; Control_Dispatch DESTROY_THREAD, NWSERVER_Destroy_Thread
|
|
; Control_Dispatch BEGIN_PM_APP, NWSERVER_Begin_PM_App
|
|
; Control_Dispatch KERNEL32_INITIALIZED, NWSERVER_Kernel32Initialized
|
|
; Control_Dispatch KERNEL32_SHUTDOWN, NWSERVER_Kernel32Shutdown
|
|
; Control_Dispatch W32_DeviceIoControl, NWSERVER_Win32_API
|
|
;PNP_NEW_DEVNODE EQU 22h
|
|
; Control_Dispatch PNP_NEW_DEVNODE, NWSERVER_PNPNewDevNode
|
|
; Control_Dispatch System_Exit, NWSERVER_System_Exit
|
|
Control_Dispatch W32_DEVICEIOCONTROL, DPLAY_W32_DeviceIOControl, sCall, <ecx, ebx, edx, esi>
|
|
|
|
End_Control_Dispatch DPLAY
|
|
|
|
;
|
|
; DbgPrint is defined in DbgPrint.c in this case.
|
|
;
|
|
_VMM_Out_Debug_String PROC NEAR PUBLIC
|
|
push esi
|
|
mov esi, [esp].8
|
|
VMMcall Out_Debug_String
|
|
pop esi
|
|
ret
|
|
_VMM_Out_Debug_String ENDP
|
|
|
|
; VOID VMM_Out_Debug_Code_Label(PVOID Address)
|
|
;
|
|
; Outputs a flat pointer as a symbolic label
|
|
;
|
|
_VMM_Out_Debug_Code_Label PROC NEAR PUBLIC
|
|
mov eax, [esp].4
|
|
mov dx, cs
|
|
Trace_Out "?DX:EAX", nocrlf
|
|
ret
|
|
_VMM_Out_Debug_Code_Label ENDP
|
|
|
|
; VOID VMM_Out_Debug_Data_Label(PVOID Address)
|
|
;
|
|
; Outputs a flat pointer as a symbolic label
|
|
;
|
|
_VMM_Out_Debug_Data_Label PROC NEAR PUBLIC
|
|
mov eax, [esp].4
|
|
mov dx, ds
|
|
Trace_Out "?DX:EAX", nocrlf
|
|
ret
|
|
_VMM_Out_Debug_Data_Label ENDP
|
|
|
|
|
|
_VMM_Get_Sys_VM_Handle proc public
|
|
push ebx
|
|
VMMcall Get_Sys_VM_Handle
|
|
mov eax, ebx
|
|
pop ebx
|
|
ret
|
|
_VMM_Get_Sys_VM_Handle endp
|
|
|
|
_VMM_Get_Profile_String proc public
|
|
push ebp
|
|
mov ebp, esp
|
|
|
|
push esi
|
|
push edi
|
|
|
|
mov esi, [ebp+8] ; Section name
|
|
mov edi, [ebp+12] ; Key name
|
|
mov edx, [ebp+16] ; default
|
|
VMMcall Get_Profile_String
|
|
mov eax, edx
|
|
|
|
pop edi
|
|
pop esi
|
|
|
|
pop ebp
|
|
ret
|
|
_VMM_Get_Profile_String endp
|
|
|
|
_VMM_Get_Profile_Hex_Int proc public
|
|
push ebp
|
|
mov ebp, esp
|
|
|
|
push esi
|
|
push edi
|
|
|
|
mov esi, [ebp+8] ; Section name
|
|
mov edi, [ebp+12] ; Key name
|
|
mov eax, [ebp+16] ; default
|
|
VMMcall Get_Profile_Hex_Int
|
|
|
|
pop edi
|
|
pop esi
|
|
|
|
pop ebp
|
|
ret
|
|
_VMM_Get_Profile_Hex_Int endp
|
|
|
|
_C_HeapAllocate PROC NEAR PUBLIC
|
|
mov eax,ss:[esp+8]
|
|
mov edx,ss:[esp+4]
|
|
push eax
|
|
push edx
|
|
VMMCall _HeapAllocate
|
|
add esp,8
|
|
ret
|
|
_C_HeapAllocate ENDP
|
|
|
|
_C_HeapFree PROC NEAR PUBLIC
|
|
mov edx,ss:[esp+4]
|
|
push 0
|
|
push edx
|
|
VMMcall _HeapFree
|
|
add esp,8
|
|
ret
|
|
_C_HeapFree ENDP
|
|
|
|
_GetThreadHandle PROC NEAR PUBLIC
|
|
push edi
|
|
VMMcall Get_Cur_Thread_Handle
|
|
mov eax,edi
|
|
pop edi
|
|
ret
|
|
_GetThreadHandle ENDP
|
|
|
|
_VMM_Create_Semaphore proc public
|
|
mov ecx, [esp+4] ; First arg = Initial token count
|
|
VMMCall Create_Semaphore
|
|
jnc vcs_1
|
|
xor eax, eax
|
|
vcs_1:
|
|
ret
|
|
_VMM_Create_Semaphore endp
|
|
|
|
_VMM_Destroy_Semaphore proc public
|
|
mov eax, [esp+4] ; First arg = Semaphore handle
|
|
VMMJmp Destroy_Semaphore
|
|
_VMM_Destroy_Semaphore endp
|
|
|
|
_VMM_Signal_Semaphore proc public
|
|
mov eax, [esp+4] ; First arg = Semaphore handle
|
|
VMMJmp Signal_Semaphore
|
|
_VMM_Signal_Semaphore endp
|
|
|
|
; VMM_Wait_Semaphore_Ints - Waits on a semaphore, allowing ints to be processed in this thread
|
|
;
|
|
_VMM_Wait_Semaphore_Ints proc public
|
|
mov eax, [esp+4] ; First arg = Semaphore handle
|
|
mov ecx, Block_Force_Svc_Ints+Block_Svc_Ints
|
|
VMMJmp Wait_Semaphore
|
|
_VMM_Wait_Semaphore_Ints endp
|
|
|
|
;Get system time in milliseconds
|
|
_VMM_Get_System_Time proc public
|
|
VMMJmp Get_System_Time
|
|
_VMM_Get_System_Time endp
|
|
|
|
;**************************************************************************
|
|
;
|
|
; MAP_Client_Ptr - convert a pointer to a 0:32 flat pointer
|
|
;
|
|
; IN eax = client Segment/Selector
|
|
; IN ebx = client Offset
|
|
; IN edi = points o Client Reg Structure
|
|
;
|
|
; OUT edx = flat client ptr
|
|
;**************************************************************************
|
|
MAP_Client_Ptr proc near uses ecx
|
|
|
|
;borrow the client DS:DX
|
|
movzx ecx, [edi].Client_DS
|
|
push ecx
|
|
movzx ecx, [edi].Client_DX
|
|
push ecx
|
|
|
|
mov [edi].Client_DS, ax
|
|
mov [edi].Client_DX, bx
|
|
Client_Ptr_Flat edx, DS, DX
|
|
|
|
;restore the contents of the client regs
|
|
pop ecx
|
|
mov [edi].Client_DX, cx
|
|
pop ecx
|
|
mov [edi].Client_DS, cx
|
|
|
|
RET
|
|
|
|
MAP_Client_Ptr ENDP
|
|
|
|
;*****************************************************************************
|
|
; DPLAYGetVersion - returns the version number of DPLAY DEBUG module
|
|
;
|
|
; ENTRY:
|
|
;
|
|
; EXIT: Carry is clear, ax=DPLAYVXD version <AH=Major AL = Minor>
|
|
;=============================================================================
|
|
|
|
BeginProc DPLAYGetVersion Service
|
|
mov eax, 001h
|
|
clc
|
|
ret
|
|
EndProc DPLAYGetVersion
|
|
|
|
|
|
; NOTE: The following assumes (craftily) that the command tail for the debug query
|
|
; dot-command is passed in by VMM in FS:[ESI].
|
|
;
|
|
BeginProc DPLAY_Debug_Query
|
|
|
|
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 _Debug_Query
|
|
add esp, 4
|
|
ret
|
|
EndProc DPLAY_Debug_Query
|
|
|
|
VxD_LOCKED_CODE_ENDS
|
|
|
|
VxD_LOCKED_DATA_SEG
|
|
|
|
;====================================================================
|
|
; STATISTICS for performance monitor
|
|
;--------------------------------------------------------------------
|
|
public hPerfId
|
|
hPerfId dd ?
|
|
|
|
|
|
public _stat_ThrottleRate
|
|
_stat_ThrottleRate dd ?
|
|
|
|
public _stat_BytesSent
|
|
_stat_BytesSent dd ?
|
|
|
|
public _stat_BackLog
|
|
_stat_BackLog dd ?
|
|
|
|
public _stat_BytesLost
|
|
_stat_BytesLost dd ?
|
|
|
|
public _stat_RemBytesReceived
|
|
_stat_RemBytesReceived dd ?
|
|
|
|
public _stat_Latency
|
|
_stat_Latency dd ?
|
|
|
|
public _stat_MinLatency
|
|
_stat_MinLatency dd ?
|
|
|
|
public _stat_AvgLatency
|
|
_stat_AvgLatency dd ?
|
|
|
|
public _stat_AvgDevLatency
|
|
_stat_AvgDevLatency dd ?
|
|
|
|
public _stat_USER1
|
|
_stat_USER1 dd ?
|
|
|
|
public _stat_USER2
|
|
_stat_USER2 dd ?
|
|
|
|
public _stat_USER3
|
|
_stat_USER3 dd ?
|
|
|
|
public _stat_USER4
|
|
_stat_USER4 dd ?
|
|
|
|
public _stat_USER5
|
|
_stat_USER5 dd ?
|
|
|
|
public _stat_USER6
|
|
_stat_USER6 dd ?
|
|
|
|
Vxd_LOCKED_DATA_ENDS
|
|
|
|
|
|
VXD_ICODE_SEG
|
|
|
|
DPLAY_Device_Init proc near public
|
|
|
|
LocalVar hStatNULL, DWORD
|
|
LocalVar hStat2, DWORD
|
|
LocalVar hStat1, DWORD
|
|
|
|
; Do STATISTICS VxD stuff
|
|
|
|
GET_MESSAGE_PTR <PerfName>, ebx
|
|
GET_MESSAGE_PTR <PerfNodeName>, ecx
|
|
Reg_Perf_Srv 0,0,ebx,ecx,0
|
|
or eax, eax ; Q: perf.386 around?
|
|
jz ir0 ; N: skip it
|
|
mov hPerfId, eax
|
|
|
|
GET_MESSAGE_PTR <PerfThrottleNam>, ebx
|
|
GET_MESSAGE_PTR <PerfThrottleNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfThrottleDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_ThrottleRate
|
|
|
|
GET_MESSAGE_PTR <PerfBWNam>, ebx
|
|
GET_MESSAGE_PTR <PerfBWNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfBWDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_BytesSent
|
|
|
|
GET_MESSAGE_PTR <PerfBackLogNam>, ebx
|
|
GET_MESSAGE_PTR <PerfBackLogNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfBackLogDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_BackLog
|
|
|
|
GET_MESSAGE_PTR <PerfBytesLostNam>, ebx
|
|
GET_MESSAGE_PTR <PerfBytesLostNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfBytesLostDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_BytesLost
|
|
|
|
GET_MESSAGE_PTR <PerfLocThroughputNam>, ebx
|
|
GET_MESSAGE_PTR <PerfLocThroughputNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfThroughputDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_RemBytesReceived
|
|
|
|
GET_MESSAGE_PTR <PerfLastLatNam>, ebx
|
|
GET_MESSAGE_PTR <PerfLastLatNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfLastLatDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_Latency
|
|
|
|
GET_MESSAGE_PTR <PerfMinLatNam>, ebx
|
|
GET_MESSAGE_PTR <PerfMinLatNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfMinLatDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_MinLatency
|
|
|
|
GET_MESSAGE_PTR <PerfAvgLatNam>, ebx
|
|
GET_MESSAGE_PTR <PerfAvgLatNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfAvgLatDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_AvgLatency
|
|
|
|
GET_MESSAGE_PTR <PerfAvgDevLatNam>, ebx
|
|
GET_MESSAGE_PTR <PerfAvgDevLatNodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfAvgDevLatDsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_AvgDevLatency
|
|
|
|
GET_MESSAGE_PTR <PerfUSER1Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER1NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER1Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER1
|
|
|
|
GET_MESSAGE_PTR <PerfUSER2Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER2NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER2Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER2
|
|
|
|
GET_MESSAGE_PTR <PerfUSER3Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER3NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER3Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER3
|
|
|
|
GET_MESSAGE_PTR <PerfUSER4Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER4NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER4Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER4
|
|
|
|
GET_MESSAGE_PTR <PerfUSER5Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER5NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER5Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER5
|
|
|
|
GET_MESSAGE_PTR <PerfUSER6Nam>, ebx
|
|
GET_MESSAGE_PTR <PerfUSER6NodeNam>, ecx
|
|
GET_MESSAGE_PTR <PerfUSER6Dsc>, edx
|
|
Reg_Perf_Stat hPerfId,0,0,ebx,ecx,0,edx,_stat_USER6
|
|
;
|
|
; GET_MESSAGE_PTR <PerfTPSNam>, ebx
|
|
; GET_MESSAGE_PTR <PerfTPSNodeNam>, ecx
|
|
; GET_MESSAGE_PTR <PerfTPSDsc>, edx
|
|
; Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_Transactions
|
|
;
|
|
;
|
|
; GET_MESSAGE_PTR <PerfBReadNam>, ebx
|
|
; GET_MESSAGE_PTR <PerfBReadNodeNam>, ecx
|
|
; GET_MESSAGE_PTR <PerfBReadDsc>, edx
|
|
; Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_BRead
|
|
; mov [hStat1], eax
|
|
;
|
|
; GET_MESSAGE_PTR <PerfBWriteNam>, ebx
|
|
; GET_MESSAGE_PTR <PerfBWriteNodeNam>, ecx
|
|
; GET_MESSAGE_PTR <PerfBWriteDsc>, edx
|
|
; Reg_Perf_Stat hPerfId,0,<PSTF_RATE>,ebx,ecx,0,edx,_stat_BWrite
|
|
; mov [hStat2], eax
|
|
; mov [hStatNull],0
|
|
;
|
|
; lea eax,hStat1
|
|
; GET_MESSAGE_PTR <PerfThroughputNam>, ebx
|
|
; GET_MESSAGE_PTR <PerfThroughputNodeNam>, ecx
|
|
; GET_MESSAGE_PTR <PerfThroughputDsc>, edx
|
|
; Reg_Perf_Stat hPerfId,0,<PSTF_COMPLEX OR PSTF_RATE>,ebx,ecx,0,edx,eax
|
|
|
|
ir0:
|
|
clc
|
|
ir1:
|
|
LeaveProc
|
|
Return
|
|
|
|
DPLAY_Device_Init endp
|
|
|
|
VXD_ICODE_ENDS
|
|
|
|
END
|