FreeRDP/winpr/libwinpr/rpc/ndr_private.c

561 lines
14 KiB
C
Raw Normal View History

/**
* WinPR: Windows Portable Runtime
* Microsoft Remote Procedure Call (MSRPC)
*
* Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <winpr/rpc.h>
#ifndef _WIN32
#include "ndr_array.h"
#include "ndr_context.h"
#include "ndr_pointer.h"
#include "ndr_simple.h"
#include "ndr_string.h"
#include "ndr_structure.h"
#include "ndr_union.h"
#include "ndr_private.h"
void NdrpAlignLength(unsigned long* length, unsigned int alignment)
{
*length = (*length + alignment - 1) & ~(alignment - 1);
}
void NdrpIncrementLength(unsigned long* length, unsigned int size)
{
*length += size;
}
const char* FC_TYPE_STRINGS[] =
{
"FC_ZERO",
"FC_BYTE",
"FC_CHAR",
"FC_SMALL",
"FC_USMALL",
"FC_WCHAR",
"FC_SHORT",
"FC_USHORT",
"FC_LONG",
"FC_ULONG",
"FC_FLOAT",
"FC_HYPER",
"FC_DOUBLE",
"FC_ENUM16",
"FC_ENUM32",
"FC_IGNORE",
"FC_ERROR_STATUS_T",
"FC_RP",
"FC_UP",
"FC_OP",
"FC_FP",
"FC_STRUCT",
"FC_PSTRUCT",
"FC_CSTRUCT",
"FC_CPSTRUCT",
"FC_CVSTRUCT",
"FC_BOGUS_STRUCT",
"FC_CARRAY",
"FC_CVARRAY",
"FC_SMFARRAY",
"FC_LGFARRAY",
"FC_SMVARRAY",
"FC_LGVARRAY",
"FC_BOGUS_ARRAY",
"FC_C_CSTRING",
"FC_C_BSTRING",
"FC_C_SSTRING",
"FC_C_WSTRING",
"FC_CSTRING",
"FC_BSTRING",
"FC_SSTRING",
"FC_WSTRING",
"FC_ENCAPSULATED_UNION",
"FC_NON_ENCAPSULATED_UNION",
"FC_BYTE_COUNT_POINTER",
"FC_TRANSMIT_AS",
"FC_REPRESENT_AS",
"FC_IP",
"FC_BIND_CONTEXT",
"FC_BIND_GENERIC",
"FC_BIND_PRIMITIVE",
"FC_AUTO_HANDLE",
"FC_CALLBACK_HANDLE",
"FC_UNUSED1",
"FC_POINTER",
"FC_ALIGNM2",
"FC_ALIGNM4",
"FC_ALIGNM8",
"FC_UNUSED2",
"FC_UNUSED3",
"FC_UNUSED4",
"FC_STRUCTPAD1",
"FC_STRUCTPAD2",
"FC_STRUCTPAD3",
"FC_STRUCTPAD4",
"FC_STRUCTPAD5",
"FC_STRUCTPAD6",
"FC_STRUCTPAD7",
"FC_STRING_SIZED",
"FC_UNUSED5",
"FC_NO_REPEAT",
"FC_FIXED_REPEAT",
"FC_VARIABLE_REPEAT",
"FC_FIXED_OFFSET",
"FC_VARIABLE_OFFSET",
"FC_PP",
"FC_EMBEDDED_COMPLEX",
"FC_IN_PARAM",
"FC_IN_PARAM_BASETYPE",
"FC_IN_PARAM_NO_FREE_INST",
"FC_IN_OUT_PARAM",
"FC_OUT_PARAM",
"FC_RETURN_PARAM",
"FC_RETURN_PARAM_BASETYPE",
"FC_DEREFERENCE",
"FC_DIV_2",
"FC_MULT_2",
"FC_ADD_1",
"FC_SUB_1",
"FC_CALLBACK",
"FC_CONSTANT_IID",
"FC_END",
"FC_PAD",
"", "", "", "", "", "",
"", "", "", "", "", "",
"", "", "", "", "", "",
"", "", "", "", "", "",
"FC_SPLIT_DEREFERENCE",
"FC_SPLIT_DIV_2",
"FC_SPLIT_MULT_2",
"FC_SPLIT_ADD_1",
"FC_SPLIT_SUB_1",
"FC_SPLIT_CALLBACK",
"", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "",
"FC_HARD_STRUCT",
"FC_TRANSMIT_AS_PTR",
"FC_REPRESENT_AS_PTR",
"FC_USER_MARSHAL",
"FC_PIPE",
"FC_BLKHOLE",
"FC_RANGE",
"FC_INT3264",
"FC_UINT3264",
"FC_END_OF_UNIVERSE",
};
const NDR_TYPE_SIZE_ROUTINE pfnSizeRoutines[] =
{
NULL, /* FC_ZERO */
NdrSimpleTypeBufferSize, /* FC_BYTE */
NdrSimpleTypeBufferSize, /* FC_CHAR */
NdrSimpleTypeBufferSize, /* FC_SMALL */
NdrSimpleTypeBufferSize, /* FC_USMALL */
NdrSimpleTypeBufferSize, /* FC_WCHAR */
NdrSimpleTypeBufferSize, /* FC_SHORT */
NdrSimpleTypeBufferSize, /* FC_USHORT */
NdrSimpleTypeBufferSize, /* FC_LONG */
NdrSimpleTypeBufferSize, /* FC_ULONG */
NdrSimpleTypeBufferSize, /* FC_FLOAT */
NdrSimpleTypeBufferSize, /* FC_HYPER */
NdrSimpleTypeBufferSize, /* FC_DOUBLE */
NdrSimpleTypeBufferSize, /* FC_ENUM16 */
NdrSimpleTypeBufferSize, /* FC_ENUM32 */
NdrSimpleTypeBufferSize, /* FC_IGNORE */
NdrSimpleTypeBufferSize, /* FC_ERROR_STATUS_T */
NdrPointerBufferSize, /* FC_RP */
NdrPointerBufferSize, /* FC_UP */
NdrPointerBufferSize, /* FC_OP */
NdrPointerBufferSize, /* FC_FP */
NdrSimpleStructBufferSize, /* FC_STRUCT */
NdrSimpleStructBufferSize, /* FC_PSTRUCT */
NdrConformantStructBufferSize, /* FC_CSTRUCT */
NdrConformantStructBufferSize, /* FC_CPSTRUCT */
NdrConformantVaryingStructBufferSize, /* FC_CVSTRUCT */
NdrComplexStructBufferSize, /* FC_BOGUS_STRUCT */
NdrConformantArrayBufferSize, /* FC_CARRAY */
NdrConformantVaryingArrayBufferSize, /* FC_CVARRAY */
NdrFixedArrayBufferSize, /* FC_SMFARRAY */
NdrFixedArrayBufferSize, /* FC_LGFARRAY */
NdrVaryingArrayBufferSize, /* FC_SMVARRAY */
NdrVaryingArrayBufferSize, /* FC_LGVARRAY */
NdrComplexArrayBufferSize, /* FC_BOGUS_ARRAY */
NdrConformantStringBufferSize, /* FC_C_CSTRING */
NULL, /* FC_C_BSTRING */
NULL, /* FC_C_SSTRING */
NdrConformantStringBufferSize, /* FC_C_WSTRING */
NdrNonConformantStringBufferSize, /* FC_CSTRING */
NULL, /* FC_BSTRING */
NULL, /* FC_SSTRING */
NULL, /* FC_WSTRING */
NdrEncapsulatedUnionBufferSize, /* FC_ENCAPSULATED_UNION */
NdrNonEncapsulatedUnionBufferSize, /* FC_NON_ENCAPSULATED_UNION */
NdrByteCountPointerBufferSize, /* FC_BYTE_COUNT_POINTER */
NULL, /* FC_TRANSMIT_AS */
NULL, /* FC_REPRESENT_AS */
NULL, /* FC_IP */
NdrContextHandleBufferSize, /* FC_BIND_CONTEXT */
NULL, /* FC_BIND_GENERIC */
NULL, /* FC_BIND_PRIMITIVE */
NULL, /* FC_AUTO_HANDLE */
NULL, /* FC_CALLBACK_HANDLE */
NULL, /* FC_UNUSED1 */
NULL, /* FC_POINTER */
NULL, /* FC_ALIGNM2 */
NULL, /* FC_ALIGNM4 */
NULL, /* FC_ALIGNM8 */
NULL, /* FC_UNUSED2 */
NULL, /* FC_UNUSED3 */
NULL, /* FC_UNUSED4 */
NULL, /* FC_STRUCTPAD1 */
NULL, /* FC_STRUCTPAD2 */
NULL, /* FC_STRUCTPAD3 */
NULL, /* FC_STRUCTPAD4 */
NULL, /* FC_STRUCTPAD5 */
NULL, /* FC_STRUCTPAD6 */
NULL, /* FC_STRUCTPAD7 */
NULL, /* FC_STRING_SIZED */
NULL, /* FC_UNUSED5 */
NULL, /* FC_NO_REPEAT */
NULL, /* FC_FIXED_REPEAT */
NULL, /* FC_VARIABLE_REPEAT */
NULL, /* FC_FIXED_OFFSET */
NULL, /* FC_VARIABLE_OFFSET */
NULL, /* FC_PP */
NULL, /* FC_EMBEDDED_COMPLEX */
NULL, /* FC_IN_PARAM */
NULL, /* FC_IN_PARAM_BASETYPE */
NULL, /* FC_IN_PARAM_NO_FREE_INST */
NULL, /* FC_IN_OUT_PARAM */
NULL, /* FC_OUT_PARAM */
NULL, /* FC_RETURN_PARAM */
NULL, /* FC_RETURN_PARAM_BASETYPE */
NULL, /* FC_DEREFERENCE */
NULL, /* FC_DIV_2 */
NULL, /* FC_MULT_2 */
NULL, /* FC_ADD_1 */
NULL, /* FC_SUB_1 */
NULL, /* FC_CALLBACK */
NULL, /* FC_CONSTANT_IID */
NULL, /* FC_END */
NULL, /* FC_PAD */
};
const NDR_TYPE_MARSHALL_ROUTINE pfnMarshallRoutines[] =
{
NULL, /* FC_ZERO */
NdrSimpleTypeMarshall, /* FC_BYTE */
NdrSimpleTypeMarshall, /* FC_CHAR */
NdrSimpleTypeMarshall, /* FC_SMALL */
NdrSimpleTypeMarshall, /* FC_USMALL */
NdrSimpleTypeMarshall, /* FC_WCHAR */
NdrSimpleTypeMarshall, /* FC_SHORT */
NdrSimpleTypeMarshall, /* FC_USHORT */
NdrSimpleTypeMarshall, /* FC_LONG */
NdrSimpleTypeMarshall, /* FC_ULONG */
NdrSimpleTypeMarshall, /* FC_FLOAT */
NdrSimpleTypeMarshall, /* FC_HYPER */
NdrSimpleTypeMarshall, /* FC_DOUBLE */
NdrSimpleTypeMarshall, /* FC_ENUM16 */
NdrSimpleTypeMarshall, /* FC_ENUM32 */
NdrSimpleTypeMarshall, /* FC_IGNORE */
NULL, /* FC_ERROR_STATUS_T */
NULL, /* FC_RP */
NULL, /* FC_UP */
NULL, /* FC_OP */
NULL, /* FC_FP */
NULL, /* FC_STRUCT */
NULL, /* FC_PSTRUCT */
NULL, /* FC_CSTRUCT */
NULL, /* FC_CPSTRUCT */
NULL, /* FC_CVSTRUCT */
NULL, /* FC_BOGUS_STRUCT */
NULL, /* FC_CARRAY */
NULL, /* FC_CVARRAY */
NULL, /* FC_SMFARRAY */
NULL, /* FC_LGFARRAY */
NULL, /* FC_SMVARRAY */
NULL, /* FC_LGVARRAY */
NULL, /* FC_BOGUS_ARRAY */
NULL, /* FC_C_CSTRING */
NULL, /* FC_C_BSTRING */
NULL, /* FC_C_SSTRING */
NULL, /* FC_C_WSTRING */
NULL, /* FC_CSTRING */
NULL, /* FC_BSTRING */
NULL, /* FC_SSTRING */
NULL, /* FC_WSTRING */
NULL, /* FC_ENCAPSULATED_UNION */
NULL, /* FC_NON_ENCAPSULATED_UNION */
NULL, /* FC_BYTE_COUNT_POINTER */
NULL, /* FC_TRANSMIT_AS */
NULL, /* FC_REPRESENT_AS */
NULL, /* FC_IP */
NULL, /* FC_BIND_CONTEXT */
NULL, /* FC_BIND_GENERIC */
NULL, /* FC_BIND_PRIMITIVE */
NULL, /* FC_AUTO_HANDLE */
NULL, /* FC_CALLBACK_HANDLE */
NULL, /* FC_UNUSED1 */
NULL, /* FC_POINTER */
NULL, /* FC_ALIGNM2 */
NULL, /* FC_ALIGNM4 */
NULL, /* FC_ALIGNM8 */
NULL, /* FC_UNUSED2 */
NULL, /* FC_UNUSED3 */
NULL, /* FC_UNUSED4 */
NULL, /* FC_STRUCTPAD1 */
NULL, /* FC_STRUCTPAD2 */
NULL, /* FC_STRUCTPAD3 */
NULL, /* FC_STRUCTPAD4 */
NULL, /* FC_STRUCTPAD5 */
NULL, /* FC_STRUCTPAD6 */
NULL, /* FC_STRUCTPAD7 */
NULL, /* FC_STRING_SIZED */
NULL, /* FC_UNUSED5 */
NULL, /* FC_NO_REPEAT */
NULL, /* FC_FIXED_REPEAT */
NULL, /* FC_VARIABLE_REPEAT */
NULL, /* FC_FIXED_OFFSET */
NULL, /* FC_VARIABLE_OFFSET */
NULL, /* FC_PP */
NULL, /* FC_EMBEDDED_COMPLEX */
NULL, /* FC_IN_PARAM */
NULL, /* FC_IN_PARAM_BASETYPE */
NULL, /* FC_IN_PARAM_NO_FREE_INST */
NULL, /* FC_IN_OUT_PARAM */
NULL, /* FC_OUT_PARAM */
NULL, /* FC_RETURN_PARAM */
NULL, /* FC_RETURN_PARAM_BASETYPE */
NULL, /* FC_DEREFERENCE */
NULL, /* FC_DIV_2 */
NULL, /* FC_MULT_2 */
NULL, /* FC_ADD_1 */
NULL, /* FC_SUB_1 */
NULL, /* FC_CALLBACK */
NULL, /* FC_CONSTANT_IID */
NULL, /* FC_END */
NULL, /* FC_PAD */
};
const NDR_TYPE_UNMARSHALL_ROUTINE pfnUnmarshallRoutines[] =
{
NULL, /* FC_ZERO */
NdrSimpleTypeUnmarshall, /* FC_BYTE */
NdrSimpleTypeUnmarshall, /* FC_CHAR */
NdrSimpleTypeUnmarshall, /* FC_SMALL */
NdrSimpleTypeUnmarshall, /* FC_USMALL */
NdrSimpleTypeUnmarshall, /* FC_WCHAR */
NdrSimpleTypeUnmarshall, /* FC_SHORT */
NdrSimpleTypeUnmarshall, /* FC_USHORT */
NdrSimpleTypeUnmarshall, /* FC_LONG */
NdrSimpleTypeUnmarshall, /* FC_ULONG */
NdrSimpleTypeUnmarshall, /* FC_FLOAT */
NdrSimpleTypeUnmarshall, /* FC_HYPER */
NdrSimpleTypeUnmarshall, /* FC_DOUBLE */
NdrSimpleTypeUnmarshall, /* FC_ENUM16 */
NdrSimpleTypeUnmarshall, /* FC_ENUM32 */
NdrSimpleTypeUnmarshall, /* FC_IGNORE */
NULL, /* FC_ERROR_STATUS_T */
NULL, /* FC_RP */
NULL, /* FC_UP */
NULL, /* FC_OP */
NULL, /* FC_FP */
NULL, /* FC_STRUCT */
NULL, /* FC_PSTRUCT */
NULL, /* FC_CSTRUCT */
NULL, /* FC_CPSTRUCT */
NULL, /* FC_CVSTRUCT */
NULL, /* FC_BOGUS_STRUCT */
NULL, /* FC_CARRAY */
NULL, /* FC_CVARRAY */
NULL, /* FC_SMFARRAY */
NULL, /* FC_LGFARRAY */
NULL, /* FC_SMVARRAY */
NULL, /* FC_LGVARRAY */
NULL, /* FC_BOGUS_ARRAY */
NULL, /* FC_C_CSTRING */
NULL, /* FC_C_BSTRING */
NULL, /* FC_C_SSTRING */
NULL, /* FC_C_WSTRING */
NULL, /* FC_CSTRING */
NULL, /* FC_BSTRING */
NULL, /* FC_SSTRING */
NULL, /* FC_WSTRING */
NULL, /* FC_ENCAPSULATED_UNION */
NULL, /* FC_NON_ENCAPSULATED_UNION */
NULL, /* FC_BYTE_COUNT_POINTER */
NULL, /* FC_TRANSMIT_AS */
NULL, /* FC_REPRESENT_AS */
NULL, /* FC_IP */
NULL, /* FC_BIND_CONTEXT */
NULL, /* FC_BIND_GENERIC */
NULL, /* FC_BIND_PRIMITIVE */
NULL, /* FC_AUTO_HANDLE */
NULL, /* FC_CALLBACK_HANDLE */
NULL, /* FC_UNUSED1 */
NULL, /* FC_POINTER */
NULL, /* FC_ALIGNM2 */
NULL, /* FC_ALIGNM4 */
NULL, /* FC_ALIGNM8 */
NULL, /* FC_UNUSED2 */
NULL, /* FC_UNUSED3 */
NULL, /* FC_UNUSED4 */
NULL, /* FC_STRUCTPAD1 */
NULL, /* FC_STRUCTPAD2 */
NULL, /* FC_STRUCTPAD3 */
NULL, /* FC_STRUCTPAD4 */
NULL, /* FC_STRUCTPAD5 */
NULL, /* FC_STRUCTPAD6 */
NULL, /* FC_STRUCTPAD7 */
NULL, /* FC_STRING_SIZED */
NULL, /* FC_UNUSED5 */
NULL, /* FC_NO_REPEAT */
NULL, /* FC_FIXED_REPEAT */
NULL, /* FC_VARIABLE_REPEAT */
NULL, /* FC_FIXED_OFFSET */
NULL, /* FC_VARIABLE_OFFSET */
NULL, /* FC_PP */
NULL, /* FC_EMBEDDED_COMPLEX */
NULL, /* FC_IN_PARAM */
NULL, /* FC_IN_PARAM_BASETYPE */
NULL, /* FC_IN_PARAM_NO_FREE_INST */
NULL, /* FC_IN_OUT_PARAM */
NULL, /* FC_OUT_PARAM */
NULL, /* FC_RETURN_PARAM */
NULL, /* FC_RETURN_PARAM_BASETYPE */
NULL, /* FC_DEREFERENCE */
NULL, /* FC_DIV_2 */
NULL, /* FC_MULT_2 */
NULL, /* FC_ADD_1 */
NULL, /* FC_SUB_1 */
NULL, /* FC_CALLBACK */
NULL, /* FC_CONSTANT_IID */
NULL, /* FC_END */
NULL, /* FC_PAD */
};
const NDR_TYPE_FREE_ROUTINE pfnFreeRoutines[] =
{
NULL, /* FC_ZERO */
NdrSimpleTypeFree, /* FC_BYTE */
NdrSimpleTypeFree, /* FC_CHAR */
NdrSimpleTypeFree, /* FC_SMALL */
NdrSimpleTypeFree, /* FC_USMALL */
NdrSimpleTypeFree, /* FC_WCHAR */
NdrSimpleTypeFree, /* FC_SHORT */
NdrSimpleTypeFree, /* FC_USHORT */
NdrSimpleTypeFree, /* FC_LONG */
NdrSimpleTypeFree, /* FC_ULONG */
NdrSimpleTypeFree, /* FC_FLOAT */
NdrSimpleTypeFree, /* FC_HYPER */
NdrSimpleTypeFree, /* FC_DOUBLE */
NdrSimpleTypeFree, /* FC_ENUM16 */
NdrSimpleTypeFree, /* FC_ENUM32 */
NdrSimpleTypeFree, /* FC_IGNORE */
NULL, /* FC_ERROR_STATUS_T */
NULL, /* FC_RP */
NULL, /* FC_UP */
NULL, /* FC_OP */
NULL, /* FC_FP */
NULL, /* FC_STRUCT */
NULL, /* FC_PSTRUCT */
NULL, /* FC_CSTRUCT */
NULL, /* FC_CPSTRUCT */
NULL, /* FC_CVSTRUCT */
NULL, /* FC_BOGUS_STRUCT */
NULL, /* FC_CARRAY */
NULL, /* FC_CVARRAY */
NULL, /* FC_SMFARRAY */
NULL, /* FC_LGFARRAY */
NULL, /* FC_SMVARRAY */
NULL, /* FC_LGVARRAY */
NULL, /* FC_BOGUS_ARRAY */
NULL, /* FC_C_CSTRING */
NULL, /* FC_C_BSTRING */
NULL, /* FC_C_SSTRING */
NULL, /* FC_C_WSTRING */
NULL, /* FC_CSTRING */
NULL, /* FC_BSTRING */
NULL, /* FC_SSTRING */
NULL, /* FC_WSTRING */
NULL, /* FC_ENCAPSULATED_UNION */
NULL, /* FC_NON_ENCAPSULATED_UNION */
NULL, /* FC_BYTE_COUNT_POINTER */
NULL, /* FC_TRANSMIT_AS */
NULL, /* FC_REPRESENT_AS */
NULL, /* FC_IP */
NULL, /* FC_BIND_CONTEXT */
NULL, /* FC_BIND_GENERIC */
NULL, /* FC_BIND_PRIMITIVE */
NULL, /* FC_AUTO_HANDLE */
NULL, /* FC_CALLBACK_HANDLE */
NULL, /* FC_UNUSED1 */
NULL, /* FC_POINTER */
NULL, /* FC_ALIGNM2 */
NULL, /* FC_ALIGNM4 */
NULL, /* FC_ALIGNM8 */
NULL, /* FC_UNUSED2 */
NULL, /* FC_UNUSED3 */
NULL, /* FC_UNUSED4 */
NULL, /* FC_STRUCTPAD1 */
NULL, /* FC_STRUCTPAD2 */
NULL, /* FC_STRUCTPAD3 */
NULL, /* FC_STRUCTPAD4 */
NULL, /* FC_STRUCTPAD5 */
NULL, /* FC_STRUCTPAD6 */
NULL, /* FC_STRUCTPAD7 */
NULL, /* FC_STRING_SIZED */
NULL, /* FC_UNUSED5 */
NULL, /* FC_NO_REPEAT */
NULL, /* FC_FIXED_REPEAT */
NULL, /* FC_VARIABLE_REPEAT */
NULL, /* FC_FIXED_OFFSET */
NULL, /* FC_VARIABLE_OFFSET */
NULL, /* FC_PP */
NULL, /* FC_EMBEDDED_COMPLEX */
NULL, /* FC_IN_PARAM */
NULL, /* FC_IN_PARAM_BASETYPE */
NULL, /* FC_IN_PARAM_NO_FREE_INST */
NULL, /* FC_IN_OUT_PARAM */
NULL, /* FC_OUT_PARAM */
NULL, /* FC_RETURN_PARAM */
NULL, /* FC_RETURN_PARAM_BASETYPE */
NULL, /* FC_DEREFERENCE */
NULL, /* FC_DIV_2 */
NULL, /* FC_MULT_2 */
NULL, /* FC_ADD_1 */
NULL, /* FC_SUB_1 */
NULL, /* FC_CALLBACK */
NULL, /* FC_CONSTANT_IID */
NULL, /* FC_END */
NULL, /* FC_PAD */
};
#endif