Blame winpr/libwinpr/rpc/ndr_correlation.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Microsoft Remote Procedure Call (MSRPC)
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <stdio.h>
Packit Service fa4841
#include <stdlib.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/rpc.h>
Packit Service fa4841
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
#include "ndr_correlation.h"
Packit Service fa4841
#include "ndr_private.h"
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * Correlation Descriptors: http://msdn.microsoft.com/en-us/library/windows/desktop/aa373607/
Packit Service fa4841
 *
Packit Service fa4841
 * correlation_type<1>
Packit Service fa4841
 * correlation_operator<1>
Packit Service fa4841
 * offset<2>
Packit Service fa4841
 * [robust_flags<2>]
Packit Service fa4841
 *
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
PFORMAT_STRING NdrpComputeCount(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory,
Packit Service fa4841
                                PFORMAT_STRING pFormat, ULONG_PTR* pCount)
Packit Service fa4841
{
Packit Service fa4841
	LPVOID ptr = NULL;
Packit Service fa4841
	ULONG_PTR data = 0;
Packit Service fa4841
	unsigned char type;
Packit Service fa4841
	unsigned short offset;
Packit Service fa4841
	unsigned char conformance;
Packit Service fa4841
	unsigned char correlation_type;
Packit Service fa4841
	unsigned char correlation_operator;
Packit Service fa4841
	correlation_type = pFormat[0];
Packit Service fa4841
	type = correlation_type & 0x0F;
Packit Service fa4841
	conformance = correlation_type & 0xF0;
Packit Service fa4841
	correlation_operator = pFormat[1];
Packit Service fa4841
	offset = *(unsigned short*)&pFormat[2];
Packit Service fa4841
Packit Service fa4841
	if (conformance == FC_NORMAL_CONFORMANCE)
Packit Service fa4841
	{
Packit Service fa4841
		ptr = pMemory;
Packit Service fa4841
	}
Packit Service fa4841
	else if (conformance == FC_POINTER_CONFORMANCE)
Packit Service fa4841
	{
Packit Service fa4841
		ptr = pStubMsg->Memory;
Packit Service fa4841
	}
Packit Service fa4841
	else if (conformance == FC_TOP_LEVEL_CONFORMANCE)
Packit Service fa4841
	{
Packit Service fa4841
		ptr = pStubMsg->StackTop;
Packit Service fa4841
	}
Packit Service fa4841
	else if (conformance == FC_CONSTANT_CONFORMANCE)
Packit Service fa4841
	{
Packit Service fa4841
		data = offset | ((DWORD)pFormat[1] << 16);
Packit Service fa4841
		*pCount = data;
Packit Service fa4841
	}
Packit Service fa4841
	else if (conformance == FC_TOP_LEVEL_MULTID_CONFORMANCE)
Packit Service fa4841
	{
Packit Service fa4841
		if (pStubMsg->StackTop)
Packit Service fa4841
			ptr = pStubMsg->StackTop;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
		return pFormat;
Packit Service fa4841
Packit Service fa4841
	switch (correlation_operator)
Packit Service fa4841
	{
Packit Service fa4841
		case FC_DEREFERENCE:
Packit Service fa4841
			if (!ptr)
Packit Service fa4841
				return pFormat;
Packit Service fa4841
Packit Service fa4841
			ptr = *(LPVOID*)((char*)ptr + offset);
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_DIV_2:
Packit Service fa4841
			ptr = (char*)ptr + offset;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_MULT_2:
Packit Service fa4841
			ptr = (char*)ptr + offset;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_SUB_1:
Packit Service fa4841
			ptr = (char*)ptr + offset;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_ADD_1:
Packit Service fa4841
			ptr = (char*)ptr + offset;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_CALLBACK:
Packit Service fa4841
		{
Packit Service fa4841
			WLog_ERR(TAG, "warning: NdrpComputeConformance FC_CALLBACK unimplemented");
Packit Service fa4841
		}
Packit Service fa4841
		break;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (!ptr)
Packit Service fa4841
		return pFormat;
Packit Service fa4841
Packit Service fa4841
	switch (type)
Packit Service fa4841
	{
Packit Service fa4841
		case FC_LONG:
Packit Service fa4841
			data = *(LONG*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_ULONG:
Packit Service fa4841
			data = *(ULONG*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_SHORT:
Packit Service fa4841
			data = *(SHORT*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_USHORT:
Packit Service fa4841
			data = *(USHORT*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_CHAR:
Packit Service fa4841
		case FC_SMALL:
Packit Service fa4841
			data = *(CHAR*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_BYTE:
Packit Service fa4841
		case FC_USMALL:
Packit Service fa4841
			data = *(BYTE*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_HYPER:
Packit Service fa4841
			data = (ULONG_PTR) * (ULONGLONG*)ptr;
Packit Service fa4841
			break;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	switch (correlation_operator)
Packit Service fa4841
	{
Packit Service fa4841
		case FC_ZERO:
Packit Service fa4841
		case FC_DEREFERENCE:
Packit Service fa4841
			*pCount = data;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_DIV_2:
Packit Service fa4841
			*pCount = data / 1;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_MULT_2:
Packit Service fa4841
			*pCount = data * 1;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_SUB_1:
Packit Service fa4841
			*pCount = data - 1;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_ADD_1:
Packit Service fa4841
			*pCount = data + 1;
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		case FC_CALLBACK:
Packit Service fa4841
			break;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (pStubMsg->fHasNewCorrDesc)
Packit Service fa4841
		pFormat += 6;
Packit Service fa4841
	else
Packit Service fa4841
		pFormat += 4;
Packit Service fa4841
Packit Service fa4841
	return pFormat;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
PFORMAT_STRING NdrpComputeConformance(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory,
Packit Service fa4841
                                      PFORMAT_STRING pFormat)
Packit Service fa4841
{
Packit Service fa4841
	return NdrpComputeCount(pStubMsg, pMemory, pFormat, &pStubMsg->MaxCount);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
PFORMAT_STRING NdrpComputeVariance(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory,
Packit Service fa4841
                                   PFORMAT_STRING pFormat)
Packit Service fa4841
{
Packit Service fa4841
	ULONG_PTR ActualCount = pStubMsg->ActualCount;
Packit Service fa4841
	pFormat = NdrpComputeCount(pStubMsg, pMemory, pFormat, &ActualCount);
Packit Service fa4841
	pStubMsg->ActualCount = (ULONG)ActualCount;
Packit Service fa4841
	return pFormat;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#endif