Leaked source code of windows server 2003
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

.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