119 lines
2.6 KiB
C
119 lines
2.6 KiB
C
|
/**
|
|||
|
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
|
|||
|
***
|
|||
|
*** The information and source code contained herein is the exclusive
|
|||
|
*** property of Intel Corporation and may not be disclosed, examined
|
|||
|
*** or reproduced in whole or in part without explicit written authorization
|
|||
|
*** from the company.
|
|||
|
**/
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995 Intel Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
lpcmove.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements functions to support the efficient movement
|
|||
|
of LPC message blocks.
|
|||
|
|
|||
|
There is a corresponding .s version that is hand optimized.
|
|||
|
Need to evaluate and install one or the other.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Roy D'Souza (rdsouza) 5-May-96
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "lpcp.h"
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
LpcpMoveMessage (
|
|||
|
OUT PPORT_MESSAGE DstMsg,
|
|||
|
IN PPORT_MESSAGE SrcMsg,
|
|||
|
IN PUCHAR SrcMsgData,
|
|||
|
IN ULONG MsgType OPTIONAL,
|
|||
|
IN PCLIENT_ID ClientId OPTIONAL
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function moves an LPC message block and optionally sets the message
|
|||
|
type and client id to the specified values.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DstMsg - Supplies a pointer to the destination message.
|
|||
|
|
|||
|
SrcMsg - Supplies a pointer to the source message.
|
|||
|
|
|||
|
SrcMsgData - Supplies a pointer to the source message data to
|
|||
|
copy to destination.
|
|||
|
|
|||
|
MsgType - If non-zero, then store in type field of the
|
|||
|
destination message.
|
|||
|
|
|||
|
ClientId - If non-NULL, then points to a ClientId to copy to
|
|||
|
the destination message.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
ULONG NumberDwords;
|
|||
|
|
|||
|
//
|
|||
|
// Extract the data length and copy over the first dword
|
|||
|
//
|
|||
|
|
|||
|
*((PULONG)DstMsg)++ = NumberDwords = *((PULONG)SrcMsg)++;
|
|||
|
NumberDwords = ((0x0000FFFF & NumberDwords) + 3) >> 2;
|
|||
|
|
|||
|
//
|
|||
|
// Set the message type properly and update the second dword
|
|||
|
//
|
|||
|
|
|||
|
*((PULONG)DstMsg)++ = MsgType == 0 ? *((PULONG)SrcMsg)++ :
|
|||
|
*((PULONG)SrcMsg)++ & 0xFFFF0000 | MsgType & 0xFFFF;
|
|||
|
|
|||
|
//
|
|||
|
// Set the ClientId appropriately and update the third dword
|
|||
|
//
|
|||
|
|
|||
|
*((PULONG_PTR)DstMsg)++ = ClientId == NULL ? *((PULONG_PTR)SrcMsg) :
|
|||
|
*((PULONG_PTR)ClientId)++;
|
|||
|
((PULONG_PTR)SrcMsg)++;
|
|||
|
|
|||
|
*((PULONG_PTR)DstMsg)++ = ClientId == NULL ? *((PULONG_PTR)SrcMsg) :
|
|||
|
*((PULONG_PTR)ClientId);
|
|||
|
((PULONG_PTR)SrcMsg)++;
|
|||
|
|
|||
|
//
|
|||
|
// Update the final two longwords in the header
|
|||
|
//
|
|||
|
|
|||
|
*((PULONG_PTR)DstMsg)++ = *((PULONG_PTR)SrcMsg)++;
|
|||
|
*((PULONG_PTR)DstMsg)++ = *((PULONG_PTR)SrcMsg)++;
|
|||
|
|
|||
|
//
|
|||
|
// Copy the data
|
|||
|
//
|
|||
|
|
|||
|
if (NumberDwords > 0) {
|
|||
|
|
|||
|
RtlCopyMemory(DstMsg, SrcMsgData, NumberDwords*sizeof(ULONG));
|
|||
|
}
|
|||
|
}
|