/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Copyright (c) 2000 Microsoft Corporation

Module Name :

    pointer.h

Abstract :

    This file contains the routines for handling pointers and pointer
    layouts.
    
Author :

    Mike Zoran  mzoran   January 2000.

Revision History :

  ---------------------------------------------------------------------*/

#include "ndrp.h"

#if !defined(__POINTER_H__)
#define  __POINTER_H__

void
Ndr64pPointerLayoutMarshall( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pMemory,
    uchar *             pBuffer );

void
Ndr64pPointerLayoutMarshallInternal( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pMemory,
    uchar *             pBuffer );

void
Ndr64pPointerLayoutUnmarshall(
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pMemory,
    uchar *             pBuffer );

void
Ndr64pPointerLayoutMemorySize (
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pBuffer );

void 
Ndr64pPointerLayoutBufferSize ( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pMemory );

void 
Ndr64pPointerLayoutFree( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    PNDR64_FORMAT       pFormat,
    NDR64_UINT32        ArrayIterations,
    uchar *             pMemory );

void 
Ndr64pPointerMarshall( 
    PMIDL_STUB_MESSAGE  pStubMsg, 
    NDR64_PTR_WIRE_TYPE *pBufferMark,
    uchar *             pMemory, 
    PNDR64_FORMAT       pFormat
    );

void 
Ndr64pPointerMemorySize( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    NDR64_PTR_WIRE_TYPE *pBufferMark,
    PNDR64_FORMAT       pFormat
    );

void
Ndr64pPointerUnmarshall(
    PMIDL_STUB_MESSAGE  pStubMsg,
    NDR64_PTR_WIRE_TYPE WirePtr,
    uchar **            ppMemory,
    uchar *             pMemory,
    PNDR64_FORMAT       pFormat 
    );


void
Ndr64pPointerBufferSize ( 
    PMIDL_STUB_MESSAGE  pStubMsg,
    uchar *             pMemory,
    PNDR64_FORMAT       pFormat
    );

__forceinline ulong 
Ndr64pWirePtrToRefId(
        NDR64_PTR_WIRE_TYPE WireRef )
    {

    if ( WireRef > 0x7FFFFFFF )
        {
        RpcRaiseException( RPC_X_BAD_STUB_DATA );
        return 0;
        }

    return (ulong)WireRef;
    }

__forceinline NDR64_PTR_WIRE_TYPE
Ndr64pRefIdToWirePtr(
        ulong RefId )
    {
    // Check if wire ref will fit in a 2GB number.
    
    if ( RefId > 0x7FFFFFFF )
        {
        RpcRaiseException( RPC_X_BAD_STUB_DATA );
        return 0;
        }
    return (NDR64_PTR_WIRE_TYPE)RefId;
    }

__forceinline BOOL
Ndr64pFullPointerQueryPointer( 
    PMIDL_STUB_MESSAGE      pStubMsg,
    void *                  pPointer,
    uchar                   QueryType,
    ulong *                 pRefId )
{

    return (BOOL)
    NdrFullPointerQueryPointer( pStubMsg->FullPtrXlatTables,
                                pPointer,
                                QueryType,
                                pRefId );
        
}


__forceinline BOOL
Ndr64pFullPointerQueryRefId( 
    PMIDL_STUB_MESSAGE      pStubMsg,
    ulong                   RefId,
    uchar                   QueryType,
    void **                 ppPointer )
    {

    return (BOOL)
    NdrFullPointerQueryRefId( pStubMsg->FullPtrXlatTables,
                              RefId,
                              QueryType,
                              ppPointer );

    }

__forceinline void
Ndr64pFullPointerInsertRefId(
    PMIDL_STUB_MESSAGE     pStubMsg,
    ulong                  RefId,
    void *                 pPointer )
    {
    
    NdrFullPointerInsertRefId( pStubMsg->FullPtrXlatTables,
                               RefId,
                               pPointer );

    }

#define FULL_POINTER_INSERT( pStubMsg, Pointer )    \
                { \
                Ndr64pFullPointerInsertRefId( pStubMsg, \
                                           pStubMsg->FullPtrRefId, \
                                           Pointer ); \
 \
                pStubMsg->FullPtrRefId = 0; \
                }

#endif // __POINTER_H__