windows-nt/Source/XPSP1/NT/base/ntos/lpc/i386/lpcmove.asm

133 lines
3.2 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
title "LPC Move Message Support"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; lpcmove.asm
;
; Abstract:
;
; This module implements functions to support the efficient movement of
; LPC Message blocks
;
; Author:
;
; Steven R. Wood (stevewo) 30-Jun-1989
;
; Environment:
;
; Kernel mode only.
;
; Revision History:
;
; 6-Mar-90 bryanwi
; Ported to the 386.
;
;--
.386p
include callconv.inc ; calling convention macros
page ,132
subttl "Update System Time"
_PAGE SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; VOID
; LpcpMoveMessage (
; OUT PPORT_MESSAGE DstMsg
; IN PPORT_MESSAGE SrcMsg
; IN ULONG MsgType OPTIONAL,
; IN PCLIENT_ID ClientId OPTIONAL
; )
;
; Routine Description:
;
; This function moves an LPC message block.
;
; Arguments:
;
; DstMsg (TOS) - Supplies pointer to where to move the message block to.
;
; SrcMsg (TOS+4) - Supplies a pointer to the message to move.
;
; MsgType (TOS+8) - If non-zero, then store in Type field of DstMsg
;
; ClientId (TOS+12) - If non-NULL, then points to a ClientId to copy to dst
;
; Return Value:
;
; None
;
;--
DstMsg equ [esp + 12]
SrcMsg equ [esp + 16]
SrcMsgData equ [esp + 20]
MsgType equ [esp + 24]
ClientId equ [esp + 28]
cPublicProc _LpcpMoveMessage ,5
push esi ; Save non-volatile registers
push edi
mov edi,DstMsg ; (edi)->Destination
cld
mov esi,SrcMsg ; (esi)->Source
lodsd ; (eax)=length
stosd
lea ecx,3[eax]
and ecx,0FFFCH ; (ecx)=length rounded up to 4
shr ecx,2 ; (ecx)=length in dwords
lodsd ; (eax)=DataInfoOffset U Type
mov edx,MsgType ; (edx)=MsgType
or edx,edx
jz lmm10 ; No MsgType, go do straight copy
mov ax,dx ; (eax low 16)=MsgType
lmm10: stosd
mov edx,ClientId ; (edx)=ClientId
or edx,edx
jz lmm20 ; No Clientid to set, go do copy
mov eax,[edx] ; Get new ClientId
stosd ; and store in DstMsg->ClientId
mov eax,[edx+4]
stosd
add esi,8 ; and skip over SrcMsg->ClientId
jmp short lmm30
lmm20: movsd ; Copy ClientId
movsd
;
; At this point, all of the control structures are copied, all we
; need to copy is the data.
;
lmm30:
movsd ; Copy MessageId
movsd ; Copy ClientViewSize
mov esi,SrcMsgData ; Copy data directly from user buffer
rep movsd ; Copy the data portion of message
pop edi
pop esi ; Restore non-volatile registers
stdRET _LpcpMoveMessage
stdENDP _LpcpMoveMessage
_PAGE ends
end