view src/gpf/ccd/ccddata_load.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  
|  Modul   : ccddata_load.c
+----------------------------------------------------------------------------- 
|  Copyright 2002 Texas Instruments Berlin, AG 
|                 All rights reserved. 
| 
|                 This file is confidential and a trade secret of Texas 
|                 Instruments Berlin, AG 
|                 The receipt of or possession of this file does not convey 
|                 any rights to reproduce or disclose its contents or to 
|                 manufacture, use, or sell anything it may describe, in 
|                 whole, or in part, without the specific written consent of 
|                 Texas Instruments Berlin, AG. 
+----------------------------------------------------------------------------- 
|  Purpose :  Manage the explicit dynamic loading of ccddata.
+----------------------------------------------------------------------------- 
*/

/*==== INCLUDES ==============================================================*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "typedefs.h"
#include "vsi.h"
#include "ccdtable.h"
#include "ccdapi.h"
#include "pdi.h"
#include "pcon.h"
#include "ccdedit.h"
#include "ccddata.h"
#include "ccddata_tap_priv.h"
/*==== CONSTS ================================================================*/
#define MAXPROC 16
/*==== TYPES =================================================================*/
/* pcon.c */
typedef ULONG (*T_pcon_init_prim_coding)(T_HANDLE caller, UBYTE format);
typedef ULONG (*T_pcon_decodePrim)(ULONG opc,
                                    void ** decoded_prim,
                                    void * coded_prim,
                                    ULONG * length,
                                    ULONG woff);
typedef ULONG (*T_pcon_codePrim)(ULONG opc,
                                  void * decoded_prim,
                                  void ** coded_prim,
                                  ULONG * length,
                                  ULONG woff,
                                  char* receiver);
typedef ULONG (*T_pcon_init_ccddata)(void);
typedef ULONG (*T_pcon_make_filter)(char* string, void** prim);
typedef ULONG (*T_pcon_filter_decode_prim)(ULONG opc,
                                           void** decoded_prim,
                                           void* coded_prim,
                                           ULONG* length,
                                           ULONG woff,
                                           void** shadow_prim);
/* ccddata_pdi.c */
typedef int (*T_ccddata_get_pdi_dinfo)(const T_PDI_DECODEINFO* (*dinfo) );
/* ccddata_mconst.c */
typedef int (*T_ccddata_get_num_of_entities)(void);
typedef int (*T_ccddata_get_max_message_id)(void);
typedef int (*T_ccddata_get_max_bitstream_len)(void);
typedef int (*T_ccddata_get_max_mstruct_len)(void);
typedef int (*T_ccddata_get_max_mstruct_len)(void);
typedef int (*T_ccddata_mccd_symbols)(void);
/* ccddata_pconst.c */
typedef int (*T_ccddata_get_max_sap_num)(void);
typedef int (*T_ccddata_get_max_primitive_id)(void);
typedef int (*T_ccddata_get_max_pstruct_len)(void);
/* ccddata_ccdmtab.c */
typedef const T_CCD_VarTabEntry*   (*T_ccddata_get_mvar)  (USHORT idx);
typedef const T_CCD_SpareTabEntry* (*T_ccddata_get_spare) (USHORT idx);
typedef const T_CCD_CalcTabEntry*  (*T_ccddata_get_calc)  (USHORT idx);
typedef const T_CCD_CompTabEntry*  (*T_ccddata_get_mcomp) (USHORT idx);
typedef const T_CCD_ElemTabEntry*  (*T_ccddata_get_melem) (USHORT idx);
typedef const T_CCD_CalcIndex*     (*T_ccddata_get_calcidx) (USHORT idx);
typedef USHORT (*T_ccddata_get_mmtx) (USHORT entity, USHORT msgid, USHORT idx);
/* ccddata_ccdptab.c */
typedef const T_CCD_VarTabEntry*  (*T_ccddata_get_pvar)  (USHORT idx);
typedef const T_CCD_CompTabEntry* (*T_ccddata_get_pcomp) (USHORT idx);
typedef const T_CCD_ElemTabEntry* (*T_ccddata_get_pelem) (USHORT idx);
typedef USHORT (*T_ccddata_get_pmtx) (USHORT sap, USHORT primid, USHORT idx);
/* ccddata_cdemval.c */
typedef const T_CCD_ValTabEntry* (*T_ccddata_get_mval) (USHORT idx);
/* ccddata_cdemstr.c */
typedef const T_CCD_StrTabEntry* (*T_ccddata_get_mstr) (USHORT idx);
/* ccddata_cdepval.c */
typedef const T_CCD_ValTabEntry* (*T_ccddata_get_pval) (USHORT idx);
typedef const T_CCD_StrTabEntry* (*T_ccddata_get_pstr) (USHORT idx);
/* ccddata_ccdent.c */
typedef short (*T_ccddata_get_ccdent) (char* entname);
typedef const char * (*T_ccddata_get_entname) (short ccdent);
/* ccddata_alias.c */
typedef char* (*T_ccddata_get_alias) (USHORT idx, int from_msg);
/* ccddata_version.c */
typedef char* (*T_ccddata_get_version) ();
typedef int (*T_ccddata_get_table_version) ();
/* ccd_config.c */
typedef UBYTE* (*T_ccddata_get_mi_length) (void);
typedef UBYTE* (*T_ccddata_get_decmsgbuffer) (void);
/* ccddata_tap_priv.c */
typedef int (*T_ccddata_tap_get_pd) (UCHAR comp);
typedef int (*T_ccddata_tap_check_pd) (UCHAR comp, UCHAR pd);
/* ccddata_eg.c */
typedef int (*T_ccddata_eg_nodes) (void);
typedef char** (*T_ccddata_eg_nodenames) (void);
typedef char* (*T_ccddata_eg_adjacent) (int idx);
typedef int (*T_ccddata_eg_saps) (void);
typedef char** (*T_ccddata_eg_sapnames) (void);
typedef T_COMENDPOINTS* (*T_ccddata_eg_comendpoints) (int idx);
/* ccdedit.c */
typedef void (*T_cde_init) (void);
typedef USHORT (*T_cde_get_comp) (T_CCDE_HANDLE* chandle,
                                  T_CCDE_ELEM_DESCR* edescr);
typedef USHORT (*T_cde_prim_first) (T_CCDE_HANDLE* phandle,
                                    ULONG primcode,
                                    char* name);
typedef USHORT (*T_cde_prim_next) (T_CCDE_HANDLE* phandle,
                                   UBYTE descent,
                                   T_CCDE_ELEM_DESCR* pdescr);
typedef USHORT (*T_cde_msg_first) (T_CCDE_HANDLE* mhandle,
                                  UBYTE type,
                                  UBYTE direction,
                                  UBYTE entity,
                                  char* name);
typedef USHORT (*T_cde_msg_next) (T_CCDE_HANDLE* mhandle,
                                  UBYTE descent,
                                  T_CCDE_ELEM_DESCR* iedesrc);
typedef USHORT (*T_cde_comp_first) (T_CCDE_HANDLE* chandle,
                                    T_ELM_SRC source,
                                    char* compname);
typedef USHORT (*T_cde_comp_next) (T_CCDE_HANDLE* chandle,
                                   UBYTE descent,
                                   T_CCDE_ELEM_DESCR* descr);
typedef char* (*T_cde_get_symval) (int elem_value,
                                   T_CCDE_ELEM_DESCR* descr);
typedef USHORT (*T_cde_read_elem) (T_CCDE_HANDLE* handle,
                                   void* cstruct,
                                   T_CCDE_ELEM_DESCR* descr,
                                   UBYTE* value);
typedef void (*T_cde_write_prepare) (T_CCDE_HANDLE* handle,
                                     void* cstruct,
                                     T_CCDE_ELEM_DESCR* descr);
typedef USHORT (*T_cde_write_elem) (T_CCDE_HANDLE* handle,
                                    void* cstruct,
                                    T_CCDE_ELEM_DESCR* descr,
                                    UBYTE* value);
typedef USHORT (*T_cde_get_type) (char* name, T_ELM_SRC* source);
typedef USHORT (*T_cde_get_primcode) (char* name, ULONG* primcode);
typedef USHORT (*T_cde_get_msgcode) (char* name,
                                     UBYTE* type,
                                     UBYTE* direction,
                                     UBYTE* entity);
typedef int (*T_cde_get_is_downlink) (ULONG comp_index);
typedef ULONG (*T_cde_get_comp_index) (char* comp_name, T_ELM_SRC table);
typedef char* (*T_cde_get_element_name) (ULONG comp_index,
                                         USHORT elem_off,
                                         T_ELM_SRC table);
typedef ULONG (*T_cde_get_array_kind) (char* var_name, T_ELM_SRC table);
/* pdi.c */
typedef T_PDI_CONTEXT* (*T_pdi_createDefContext) ();
typedef T_PDI_CONTEXT* (*T_pdi_createContext) (const T_PDI_DECODEINFO* dinfop,
                                                unsigned int dicount);
typedef void (*T_pdi_destroyContext) (T_PDI_CONTEXT* context);
typedef void (*T_pdi_startPrim) (T_PDI_CONTEXT* context, ULONG opc);
typedef void (*T_pdi_getDecodeInfo) (T_PDI_CONTEXT* context,
                                       const char* ename,
                                       char* evalue,
                                       int evlen,
                                       T_PDI* decinfo);
typedef short (*T_pdi_getEntityByPD) (const T_PDI_CONTEXT* context,
                                         unsigned char pd);
typedef const char* (*T_pdi_pd2name) (unsigned char pd);
/* ccd.c */
typedef int   (*T_ccd_set_patch_infos) (T_patch_info* pinfo);
typedef BYTE  (*T_ccd_init) (void);
typedef int   (*T_ccd_exit) (void);
typedef UBYTE* (*T_ccd_begin) (void);
typedef void  (*T_ccd_end) (void);
typedef BYTE  (*T_ccd_decodeMsg) (UBYTE entity,
                                  UBYTE direction,
                                  T_MSGBUF *mBuf,
                                  UBYTE *mStruct,
                                  UBYTE pt);
typedef S8   (*T_ccd_decodeMsgPtr) (U8 entity,
                                    U8 direction,
                                    U16 l_buf,
                                    U16 o_buf,
                                    U8 *buf,
                                    U8 **mStructPtr,
                                    U8 pt);
typedef BYTE  (*T_ccd_codeMsg) (UBYTE entity,
                                UBYTE direction,
                                T_MSGBUF *mBuf,
                                UBYTE *mStruct,
                                UBYTE pt);
typedef BYTE (*T_ccd_codeMsgPtr) (U8 entity,
                                  U8 direction,
                                  U16 *l_buf,
                                  U16 o_buf,
                                  U8 *buf,
                                  U8 *mStruct,
                                  U8 pt);
typedef ULONG  (*T_ccd_init_ccddata) (void);
/* cdc_std.c */
typedef BYTE  (*T_ccd_decodeByte) (UBYTE *bitstream,
                                   USHORT startbit,
                                   USHORT bitlen,
                                   UBYTE *value);
typedef BYTE  (*T_ccd_codeByte) (UBYTE *bitstream,
                                 USHORT startbit,
                                 USHORT bitlen,
                                 UBYTE val);
typedef BYTE  (*T_ccd_codeLong) (UBYTE *bitstream,
                                 USHORT startbit,
                                 USHORT bitlen,
                                 ULONG value);
typedef BYTE  (*T_ccd_decodeLong) (UBYTE *bitstream,
                                   USHORT startbit,
                                   USHORT bitlen,
                                   ULONG *value);
typedef void  (*T_ccd_bitcopy) (UBYTE *dest,
                                UBYTE *source,
                                USHORT bitlen,
                                USHORT offset);
/* ccd_err.c */
typedef UBYTE (*T_ccd_getFirstError) (UBYTE entity, USHORT *parlist);
typedef UBYTE (*T_ccd_getNextError) (UBYTE entity, USHORT *parlist);
typedef ULONG (*T_ccd_getFirstFault) (T_CCD_ERR_ENTRY **ccd_err_entry);
typedef ULONG (*T_ccd_getNextFault) (T_CCD_ERR_ENTRY **ccd_err_entry);
typedef void  (*T_ccd_free_faultlist) (void);
typedef int   (*T_ccd_get_numFaults) (void);
/* ccd_elem.c */
typedef int  (*T_ccd_encodeElem) (ULONG ccdid,
                                  USHORT *l_buf,
                                  USHORT o_buf,
                                  UCHAR *buf,
                                  UCHAR *eStruct);

typedef int  (*T_ccd_decodeElem) (ULONG ccdid,
                                  USHORT l_buf,
                                  USHORT o_buf,
                                  UCHAR *buf,
                                  UCHAR *eStruct);
/*==== LOCALS ================================================================*/
static int me = -1;
static HANDLE initlock;
static void (*ccddata_i_notify)(void)=NULL;
static void (*ccddata_x_notify)(void)=NULL;

static int ccddata_attach (int i);

#pragma data_seg(".shared")
static char lastdll[MAX_PATH] = { 0 };
static DWORD ptrindex[MAXPROC] = {0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0 };
static HINSTANCE cdll[MAXPROC] = {0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0 };
static HANDLE mut[MAXPROC] = {0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0, 0, 0, 0 };
static T_pcon_init_prim_coding ptr_pcon_init_prim_coding[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pcon_decodePrim ptr_pcon_decodePrim[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pcon_codePrim ptr_pcon_codePrim[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pcon_init_ccddata ptr_pcon_init_ccddata[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pcon_make_filter ptr_pcon_make_filter[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pcon_filter_decode_prim ptr_pcon_filter_decode_prim[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pdi_dinfo ptr_ccddata_get_pdi_dinfo[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_num_of_entities ptr_ccddata_get_num_of_entities[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_message_id ptr_ccddata_get_max_message_id[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_bitstream_len
  ptr_ccddata_get_max_bitstream_len[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_mstruct_len ptr_ccddata_get_max_mstruct_len[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_mccd_symbols ptr_ccddata_mccd_symbols[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_sap_num ptr_ccddata_get_max_sap_num[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_primitive_id ptr_ccddata_get_max_primitive_id[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_max_pstruct_len ptr_ccddata_get_max_pstruct_len[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mvar ptr_ccddata_get_mvar[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_spare ptr_ccddata_get_spare[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_calc ptr_ccddata_get_calc[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mcomp ptr_ccddata_get_mcomp[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_melem ptr_ccddata_get_melem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_calcidx ptr_ccddata_get_calcidx[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mmtx ptr_ccddata_get_mmtx[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pvar ptr_ccddata_get_pvar[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pcomp ptr_ccddata_get_pcomp[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pelem ptr_ccddata_get_pelem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pmtx ptr_ccddata_get_pmtx[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mval ptr_ccddata_get_mval[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mstr ptr_ccddata_get_mstr[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pval ptr_ccddata_get_pval[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_pstr ptr_ccddata_get_pstr[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_ccdent ptr_ccddata_get_ccdent[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_entname ptr_ccddata_get_entname[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_alias ptr_ccddata_get_alias[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_version ptr_ccddata_get_version[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_table_version ptr_ccddata_get_table_version[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_mi_length ptr_ccddata_get_mi_length[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static UBYTE* mi_length[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_get_decmsgbuffer ptr_ccddata_get_decmsgbuffer[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static UBYTE* decmsgbuffer[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_tap_check_pd ptr_ccddata_tap_check_pd[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_tap_get_pd ptr_ccddata_tap_get_pd[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_nodes ptr_ccddata_eg_nodes[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_nodenames ptr_ccddata_eg_nodenames[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_adjacent ptr_ccddata_eg_adjacent[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_saps ptr_ccddata_eg_saps[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_sapnames ptr_ccddata_eg_sapnames[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccddata_eg_comendpoints ptr_ccddata_eg_comendpoints[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_init ptr_cde_init[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_comp ptr_cde_get_comp[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_prim_first ptr_cde_prim_first[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_prim_next ptr_cde_prim_next[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_msg_first ptr_cde_msg_first[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_msg_next ptr_cde_msg_next[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_comp_first ptr_cde_comp_first[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_comp_next ptr_cde_comp_next[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_symval ptr_cde_get_symval[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_read_elem ptr_cde_read_elem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_write_prepare ptr_cde_write_prepare[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_write_elem ptr_cde_write_elem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_type ptr_cde_get_type[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_primcode ptr_cde_get_primcode[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_msgcode ptr_cde_get_msgcode[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_is_downlink ptr_cde_get_is_downlink[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_comp_index ptr_cde_get_comp_index[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_element_name ptr_cde_get_element_name[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_cde_get_array_kind ptr_cde_get_array_kind[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_createDefContext ptr_pdi_createDefContext[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_createContext ptr_pdi_createContext[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_destroyContext ptr_pdi_destroyContext[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_startPrim ptr_pdi_startPrim[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_getDecodeInfo ptr_pdi_getDecodeInfo[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_getEntityByPD ptr_pdi_getEntityByPD[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_pdi_pd2name ptr_pdi_pd2name[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_set_patch_infos ptr_ccd_set_patch_infos[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_init ptr_ccd_init[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_exit ptr_ccd_exit[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_begin ptr_ccd_begin[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_end ptr_ccd_end[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_decodeMsg ptr_ccd_decodeMsg[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_decodeMsgPtr ptr_ccd_decodeMsgPtr[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_codeMsg ptr_ccd_codeMsg[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_codeMsgPtr ptr_ccd_codeMsgPtr[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_init_ccddata ptr_ccd_init_ccddata[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_decodeByte ptr_ccd_decodeByte[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_codeByte ptr_ccd_codeByte[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_codeLong ptr_ccd_codeLong[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_decodeLong ptr_ccd_decodeLong[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_bitcopy ptr_ccd_bitcopy[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_getFirstError ptr_ccd_getFirstError[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_getNextError ptr_ccd_getNextError[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_getFirstFault ptr_ccd_getFirstFault[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_getNextFault ptr_ccd_getNextFault[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_free_faultlist ptr_ccd_free_faultlist[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_get_numFaults ptr_ccd_get_numFaults[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_encodeElem ptr_ccd_encodeElem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static T_ccd_decodeElem ptr_ccd_decodeElem[MAXPROC]
  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#pragma data_seg()


/*==== HANDLER FOR FUNCTIONS UNSUPPORTED BY LOADED DLL =======================*/
int cddl_ccddata_get_pdi_dinfo (const T_PDI_DECODEINFO* (*dinfo) )
{
  dinfo=NULL;
  return 0;
}

int cddl_ccddata_eg_nodes (void)
{
  return 0;
}

char** cddl_ccddata_eg_nodenames (void)
{
  return NULL;
}

char* cddl_ccddata_eg_adjacent (int idx)
{
  return NULL;
}

int cddl_ccddata_eg_saps (void)
{
  return 0;
}

char** cddl_ccddata_eg_sapnames (void)
{
  return NULL;
}

T_COMENDPOINTS* cddl_ccddata_eg_comendpoints (int idx)
{
  return NULL;
}

char* cddl_ccddata_get_version (void)
{
  return "OLD";
}

int cddl_ccddata_get_table_version (void)
{
  return 0;
}

const char * cddl_ccddata_get_entname (short ccdent)
{
  return NULL;
}
/*==== PRIVATE FUNCTIONS =====================================================*/
/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_init_lock
+------------------------------------------------------------------------------
|  Description  :  Synchronize calls of ccddata_init
|
|  Parameters   :  - 
|
|  Return       :  0 on success, otherwise error code
+------------------------------------------------------------------------------
*/
static HANDLE ccddata_init_lock (void)
{
  char* mname = "ccddata_init_lock";
  HANDLE tmp;
  if ((tmp = CreateMutex (NULL, FALSE, mname)) == 0)
  {
    return 0;
  }
  if ((initlock = OpenMutex (MUTEX_ALL_ACCESS, FALSE, mname)) == 0)
  {
    return 0;
  }
  CloseHandle (tmp);
  WaitForSingleObject (initlock, INFINITE);
  return initlock;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_register
+------------------------------------------------------------------------------
|  Description  :  Register process in ccddata load dll
|
|  Parameters   :  -
|
|  Return       :  Index to ptrindex on success, otherwise -1
+------------------------------------------------------------------------------
*/
static int ccddata_register (void)
{
  if (me >= 0)
  {
    return me;
  }
  for (me=0; me<MAXPROC; me++)
  {
    if (!ptrindex[me])
    {
      char mname[32];
      HANDLE tmp;
      ptrindex[me] = GetCurrentProcessId ();
      sprintf (mname, "ccddata_%d", ptrindex[me]);
      tmp = CreateMutex (NULL, FALSE, mname);
      mut[me] = OpenMutex (MUTEX_ALL_ACCESS, FALSE, mname);
      CloseHandle (tmp);
      return me;
    }
  }
  me = -1;
  return me;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_detach
+------------------------------------------------------------------------------
|  Description  :  Unload ccddata dll and clean pointer to the functions
|
|  Parameters   :  i - index to pointer list
|                  exit_all - if set, call ccd_exit and call FreeLibrary
|
|  Return       :  -
+------------------------------------------------------------------------------
*/
static void ccddata_detach (int i, int exit_all)
{
  char mname[32];
  HANDLE mutex;

  if (!cdll[i])
    return;

  if (ccddata_x_notify != NULL && exit_all)
  {
    // make sure all functions are available again
    if (ptr_ccd_init[i] != NULL || ccddata_attach(i)==CCDDATA_DLL_OK)
    {
      (*ccddata_x_notify)();
    }
  }

  if (ptr_ccd_init[i] != NULL)
  {
    // clean all function pointers except ccd_exit
    if (!exit_all)
    {
      sprintf (mname, "ccddata_%d", ptrindex[i]);
      mutex = OpenMutex (MUTEX_ALL_ACCESS, FALSE, mname);
      WaitForSingleObject (mutex, INFINITE);
    }

    ptr_pcon_init_prim_coding[i] = NULL;
    ptr_pcon_decodePrim[i] = NULL;
    ptr_pcon_codePrim[i] = NULL;
    ptr_pcon_init_ccddata[i] = NULL;
    ptr_pcon_make_filter[i] = NULL;
    ptr_pcon_filter_decode_prim[i] = NULL;
    ptr_ccddata_get_pdi_dinfo[i] = NULL;
    ptr_ccddata_get_num_of_entities[i] = NULL;
    ptr_ccddata_get_max_message_id[i] = NULL;
    ptr_ccddata_get_max_bitstream_len[i] = NULL;
    ptr_ccddata_get_max_mstruct_len[i] = NULL;
    ptr_ccddata_mccd_symbols[i] = NULL;
    ptr_ccddata_get_max_sap_num[i] = NULL;
    ptr_ccddata_get_max_primitive_id[i] = NULL;
    ptr_ccddata_get_max_pstruct_len[i] = NULL;
    ptr_ccddata_get_mvar[i] = NULL;
    ptr_ccddata_get_spare[i] = NULL;
    ptr_ccddata_get_calc[i] = NULL;
    ptr_ccddata_get_mcomp[i] = NULL;
    ptr_ccddata_get_melem[i] = NULL;
    ptr_ccddata_get_calcidx[i] = NULL;
    ptr_ccddata_get_mmtx[i] = NULL;
    ptr_ccddata_get_pvar[i] = NULL;
    ptr_ccddata_get_pcomp[i] = NULL;
    ptr_ccddata_get_pelem[i] = NULL;
    ptr_ccddata_get_pmtx[i] = NULL;
    ptr_ccddata_get_mval[i] = NULL;
    ptr_ccddata_get_mstr[i] = NULL;
    ptr_ccddata_get_pval[i] = NULL;
    ptr_ccddata_get_pstr[i] = NULL;
    ptr_ccddata_get_ccdent[i] = NULL;
    ptr_ccddata_get_entname[i] = NULL;
    ptr_ccddata_get_alias[i] = NULL;
    ptr_ccddata_get_version[i] = NULL;
    ptr_ccddata_get_table_version[i] = NULL;
    ptr_ccddata_get_mi_length[i] = NULL;
    mi_length[i] = NULL;
    ptr_ccddata_get_decmsgbuffer[i] = NULL;
    decmsgbuffer[i] = NULL;
    ptr_ccddata_tap_check_pd[i] = NULL;
    ptr_ccddata_tap_get_pd[i] = NULL;
    ptr_ccddata_eg_nodes[i] = NULL;
    ptr_ccddata_eg_nodenames[i] = NULL;
    ptr_ccddata_eg_adjacent[i] = NULL;
    ptr_ccddata_eg_saps[i] = NULL;
    ptr_ccddata_eg_sapnames[i] = NULL;
    ptr_ccddata_eg_comendpoints[i] = NULL;

    ptr_cde_init[i] = NULL;
    ptr_cde_get_comp[i] = NULL;
    ptr_cde_prim_first[i] = NULL;
    ptr_cde_prim_next[i] = NULL;
    ptr_cde_msg_first[i] = NULL;
    ptr_cde_msg_next[i] = NULL;
    ptr_cde_comp_first[i] = NULL;
    ptr_cde_comp_next[i] = NULL;
    ptr_cde_get_symval[i] = NULL;
    ptr_cde_read_elem[i] = NULL;
    ptr_cde_write_prepare[i] = NULL;
    ptr_cde_write_elem[i] = NULL;
    ptr_cde_get_type[i] = NULL;
    ptr_cde_get_primcode[i] = NULL;
    ptr_cde_get_msgcode[i] = NULL;
    ptr_cde_get_is_downlink[i] = NULL;
    ptr_cde_get_comp_index[i] = NULL;
    ptr_cde_get_element_name[i] = NULL;
    ptr_cde_get_array_kind[i] = NULL;

    ptr_pdi_createDefContext[i] = NULL;
    ptr_pdi_createContext[i] = NULL;
    ptr_pdi_destroyContext[i] = NULL;
    ptr_pdi_startPrim[i] = NULL;
    ptr_pdi_getDecodeInfo[i] = NULL;
    ptr_pdi_getEntityByPD[i] = NULL;
    ptr_pdi_pd2name[i] = NULL;

    ptr_ccd_set_patch_infos[i] = NULL;
    ptr_ccd_begin[i] = NULL;
    ptr_ccd_end[i] = NULL;
    ptr_ccd_decodeMsg[i] = NULL;
    ptr_ccd_decodeMsgPtr[i] = NULL;
    ptr_ccd_codeMsg[i] = NULL;
    ptr_ccd_codeMsgPtr[i] = NULL;
    ptr_ccd_init_ccddata[i] = NULL;
    ptr_ccd_decodeByte[i] = NULL;
    ptr_ccd_codeByte[i] = NULL;
    ptr_ccd_codeLong[i] = NULL;
    ptr_ccd_decodeLong[i] = NULL;
    ptr_ccd_bitcopy[i] = NULL;
    ptr_ccd_getFirstError[i] = NULL;
    ptr_ccd_getNextError[i] = NULL;
    ptr_ccd_getFirstFault[i] = NULL;
    ptr_ccd_getNextFault[i] = NULL;
    ptr_ccd_free_faultlist[i] = NULL;
    ptr_ccd_get_numFaults[i] = NULL;
    ptr_ccd_encodeElem[i] = NULL;
    ptr_ccd_decodeElem[i] = NULL;
    ptr_ccd_init[i] = NULL;

    if (!exit_all)
    {
      ReleaseMutex (mutex);
      CloseHandle (mutex);
    }
  }

  if (exit_all)
  {
    if (ptr_ccd_exit[i])
    {
      (void)(*ptr_ccd_exit[i])();
      ptr_ccd_exit[i] = NULL;
    }
    (void) FreeLibrary (cdll[i]);
    cdll[i] = 0;
  }
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_clean
+------------------------------------------------------------------------------
|  Description  :  Free own instance of ccddata dll and clean the pointers
|                  of the other processes.
|
|  Parameters   :  -
|
|  Return       :  CCDDATA_DLL_REGISTER, if the process is not registered
|                  or has not yet called ccddata_exit; CCDDATA_DLL_OK otherwise
+------------------------------------------------------------------------------
*/
static int ccddata_clean (void)
{
  int i;

  if (me < 0)
  {
    return CCDDATA_DLL_REGISTER;
  }

  for (i=0; i<MAXPROC; i++)
  {
    if (me != i)
    {
      ccddata_detach (i, 0);
    }
  }
  
  return CCDDATA_DLL_OK;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_attach
+------------------------------------------------------------------------------
|  Description  :  Unload ccddata dll and clean pointer to the functions
|
|  Parameters   :  i - index to pointer list
|
|  Return       :  CCDDATA_DLL_OK or error code
+------------------------------------------------------------------------------
*/
static int ccddata_attach (int i)
{
  int already_loaded=(cdll[i]!=0);
  if (!already_loaded)
  {
    cdll[i] = LoadLibrary (lastdll);
    if (cdll[i] == NULL)
    {
      return CCDDATA_DLL_LOADLIB;
    }
  }

  ptr_pcon_init_prim_coding[i] = (T_pcon_init_prim_coding)
    GetProcAddress (cdll[i], "cddl_pcon_init_prim_coding");
  ptr_pcon_decodePrim[i] = (T_pcon_decodePrim)
    GetProcAddress (cdll[i], "cddl_pcon_decodePrim");
  ptr_pcon_codePrim[i] = (T_pcon_codePrim)
    GetProcAddress (cdll[i], "cddl_pcon_codePrim");
  ptr_pcon_init_ccddata[i] = (T_pcon_init_ccddata)
    GetProcAddress (cdll[i], "cddl_pcon_init_ccddata");
  ptr_pcon_make_filter[i] = (T_pcon_make_filter)
    GetProcAddress (cdll[i], "cddl_pcon_make_filter");
  ptr_pcon_filter_decode_prim[i] = (T_pcon_filter_decode_prim)
    GetProcAddress (cdll[i], "cddl_pcon_filter_decode_prim");

  if (
    ptr_pcon_init_prim_coding[i] == NULL ||
    ptr_pcon_decodePrim[i] == NULL ||
    ptr_pcon_codePrim[i] == NULL ||
    ptr_pcon_init_ccddata[i] == NULL ||
    ptr_pcon_make_filter[i] == NULL ||
    ptr_pcon_filter_decode_prim[i] == NULL)
  {
    ptr_pcon_init_prim_coding[i] = cddl_pcon_init_prim_coding;
    ptr_pcon_decodePrim[i] = cddl_pcon_decodePrim;
    ptr_pcon_codePrim[i] = cddl_pcon_codePrim;
    ptr_pcon_init_ccddata[i] = cddl_pcon_init_ccddata;
    ptr_pcon_make_filter[i] = cddl_pcon_make_filter;
    ptr_pcon_filter_decode_prim[i] = cddl_pcon_filter_decode_prim;
  }

  ptr_ccd_init[i] = (T_ccd_init)
    GetProcAddress (cdll[i], "cddl_ccd_init");
  ptr_ccd_exit[i] = (T_ccd_exit)
    GetProcAddress (cdll[i], "cddl_ccd_exit");
  ptr_ccd_begin[i] = (T_ccd_begin)
    GetProcAddress (cdll[i], "cddl_ccd_begin");
  ptr_ccd_end[i] = (T_ccd_end)
    GetProcAddress (cdll[i], "cddl_ccd_end");
  ptr_ccd_decodeMsg[i] = (T_ccd_decodeMsg)
    GetProcAddress (cdll[i], "cddl_ccd_decodeMsg");
  ptr_ccd_decodeMsgPtr[i] = (T_ccd_decodeMsgPtr)
    GetProcAddress (cdll[i], "cddl_ccd_decodeMsgPtr");
  ptr_ccd_codeMsg[i] = (T_ccd_codeMsg)
    GetProcAddress (cdll[i], "cddl_ccd_codeMsg");
  ptr_ccd_codeMsgPtr[i] = (T_ccd_codeMsgPtr)
    GetProcAddress (cdll[i], "cddl_ccd_codeMsgPtr");
  ptr_ccd_init_ccddata[i] = (T_ccd_init_ccddata)
    GetProcAddress (cdll[i], "cddl_ccd_init_ccddata");
  ptr_ccd_decodeByte[i] = (T_ccd_decodeByte)
    GetProcAddress (cdll[i], "cddl_ccd_decodeByte");
  ptr_ccd_codeByte[i] = (T_ccd_codeByte)
    GetProcAddress (cdll[i], "cddl_ccd_codeByte");
  ptr_ccd_codeLong[i] = (T_ccd_codeLong)
    GetProcAddress (cdll[i], "cddl_ccd_codeLong");
  ptr_ccd_decodeLong[i] = (T_ccd_decodeLong)
    GetProcAddress (cdll[i], "cddl_ccd_decodeLong");
  ptr_ccd_bitcopy[i] = (T_ccd_bitcopy)
    GetProcAddress (cdll[i], "cddl_ccd_bitcopy");
  ptr_ccd_getFirstError[i] = (T_ccd_getFirstError)
    GetProcAddress (cdll[i], "cddl_ccd_getFirstError");
  ptr_ccd_getNextError[i] = (T_ccd_getNextError)
    GetProcAddress (cdll[i], "cddl_ccd_getNextError");
  ptr_ccd_getFirstFault[i] = (T_ccd_getFirstFault)
    GetProcAddress (cdll[i], "cddl_ccd_getFirstFault");
  ptr_ccd_getNextFault[i] = (T_ccd_getNextFault)
    GetProcAddress (cdll[i], "cddl_ccd_getNextFault");
  ptr_ccd_free_faultlist[i] = (T_ccd_free_faultlist)
    GetProcAddress (cdll[i], "cddl_ccd_free_faultlist");
  ptr_ccd_get_numFaults[i] = (T_ccd_get_numFaults)
    GetProcAddress (cdll[i], "cddl_ccd_get_numFaults");
  ptr_ccd_encodeElem[i] = (T_ccd_encodeElem)
    GetProcAddress (cdll[i], "cddl_ccd_encodeElem");
  ptr_ccd_decodeElem[i] = (T_ccd_decodeElem)
    GetProcAddress (cdll[i], "cddl_ccd_decodeElem");
  if (
    ptr_ccd_init[i] == NULL ||
    ptr_ccd_exit[i] == NULL ||
    ptr_ccd_begin[i] == NULL ||
    ptr_ccd_end[i] == NULL ||
    ptr_ccd_decodeMsg[i] == NULL ||
    ptr_ccd_decodeMsgPtr[i] == NULL ||
    ptr_ccd_codeMsg[i] == NULL ||
    ptr_ccd_codeMsgPtr[i] == NULL ||
    ptr_ccd_init_ccddata[i] == NULL ||
    ptr_ccd_decodeByte[i] == NULL ||
    ptr_ccd_codeByte[i] == NULL ||
    ptr_ccd_codeLong[i] == NULL ||
    ptr_ccd_decodeLong[i] == NULL ||
    ptr_ccd_bitcopy[i] == NULL ||
    ptr_ccd_getFirstError[i] == NULL ||
    ptr_ccd_getNextError[i] == NULL ||
    ptr_ccd_getFirstFault[i] == NULL ||
    ptr_ccd_getNextFault[i] == NULL ||
    ptr_ccd_free_faultlist[i] == NULL ||
    ptr_ccd_get_numFaults[i] == NULL ||
    ptr_ccd_encodeElem[i] == NULL ||
    ptr_ccd_decodeElem[i] == NULL)
  {
    ptr_ccd_init[i] = cddl_ccd_init;
    ptr_ccd_exit[i] = cddl_ccd_exit;
    ptr_ccd_begin[i] = cddl_ccd_begin;
    ptr_ccd_end[i] = cddl_ccd_end;
    ptr_ccd_decodeMsg[i] = cddl_ccd_decodeMsg;
    ptr_ccd_decodeMsgPtr[i] = cddl_ccd_decodeMsgPtr;
    ptr_ccd_codeMsg[i] = cddl_ccd_codeMsg;
    ptr_ccd_codeMsgPtr[i] = cddl_ccd_codeMsgPtr;
    ptr_ccd_init_ccddata[i] = cddl_ccd_init_ccddata;
    ptr_ccd_decodeByte[i] = cddl_ccd_decodeByte;
    ptr_ccd_codeByte[i] = cddl_ccd_codeByte;
    ptr_ccd_codeLong[i] = cddl_ccd_codeLong;
    ptr_ccd_decodeLong[i] = cddl_ccd_decodeLong;
    ptr_ccd_bitcopy[i] = cddl_ccd_bitcopy;
    ptr_ccd_getFirstError[i] = cddl_ccd_getFirstError;
    ptr_ccd_getNextError[i] = cddl_ccd_getNextError;
    ptr_ccd_getFirstFault[i] = cddl_ccd_getFirstFault;
    ptr_ccd_getNextFault[i] = cddl_ccd_getNextFault;
    ptr_ccd_free_faultlist[i] = cddl_ccd_free_faultlist;
    ptr_ccd_get_numFaults[i] = cddl_ccd_get_numFaults;
    ptr_ccd_encodeElem[i] = cddl_ccd_encodeElem;
    ptr_ccd_decodeElem[i] = cddl_ccd_decodeElem;
  }
  ptr_ccd_set_patch_infos[i] = (T_ccd_set_patch_infos)
    GetProcAddress (cdll[i], "cddl_ccd_set_patch_infos");
  if (ptr_ccd_set_patch_infos[i] == NULL)
  {
    ptr_ccd_set_patch_infos[i] = cddl_ccd_set_patch_infos;
  }

  ptr_ccddata_eg_nodes[i] = (T_ccddata_eg_nodes)
    GetProcAddress (cdll[i], "ccddata_eg_nodes");
  ptr_ccddata_eg_nodenames[i] = (T_ccddata_eg_nodenames)
    GetProcAddress (cdll[i], "ccddata_eg_nodenames");
  ptr_ccddata_eg_adjacent[i] = (T_ccddata_eg_adjacent)
    GetProcAddress (cdll[i], "ccddata_eg_adjacent");
  if (
    ptr_ccddata_eg_nodes[i] == NULL ||
    ptr_ccddata_eg_nodenames[i] == NULL ||
    ptr_ccddata_eg_adjacent[i] == NULL)
  {
    ptr_ccddata_eg_nodes[i] = cddl_ccddata_eg_nodes;
    ptr_ccddata_eg_nodenames[i] = cddl_ccddata_eg_nodenames;
    ptr_ccddata_eg_adjacent[i] = cddl_ccddata_eg_adjacent;
  }

  ptr_ccddata_eg_saps[i] = (T_ccddata_eg_saps)
    GetProcAddress (cdll[i], "ccddata_eg_saps");
  ptr_ccddata_eg_sapnames[i] = (T_ccddata_eg_sapnames)
    GetProcAddress (cdll[i], "ccddata_eg_sapnames");
  ptr_ccddata_eg_comendpoints[i] = (T_ccddata_eg_comendpoints)
    GetProcAddress (cdll[i], "ccddata_eg_comendpoints");
  if (
    ptr_ccddata_eg_saps[i] == NULL ||
    ptr_ccddata_eg_sapnames[i] == NULL ||
    ptr_ccddata_eg_comendpoints[i] == NULL)
  {
    ptr_ccddata_eg_saps[i] = cddl_ccddata_eg_saps;
    ptr_ccddata_eg_sapnames[i] = cddl_ccddata_eg_sapnames;
    ptr_ccddata_eg_comendpoints[i] = cddl_ccddata_eg_comendpoints;
  }
  
  ptr_cde_init[i] = (T_cde_init)
    GetProcAddress (cdll[i], "cddl_cde_init");
  ptr_cde_get_comp[i] = (T_cde_get_comp)
    GetProcAddress (cdll[i], "cddl_cde_get_comp");
  ptr_cde_prim_first[i] = (T_cde_prim_first)
    GetProcAddress (cdll[i], "cddl_cde_prim_first");
  ptr_cde_prim_next[i] = (T_cde_prim_next)
    GetProcAddress (cdll[i], "cddl_cde_prim_next");
  ptr_cde_msg_first[i] = (T_cde_msg_first)
    GetProcAddress (cdll[i], "cddl_cde_msg_first");
  ptr_cde_msg_next[i] = (T_cde_msg_next)
    GetProcAddress (cdll[i], "cddl_cde_msg_next");
  ptr_cde_comp_first[i] = (T_cde_comp_first)
    GetProcAddress (cdll[i], "cddl_cde_comp_first");
  ptr_cde_comp_next[i] = (T_cde_comp_next)
    GetProcAddress (cdll[i], "cddl_cde_comp_next");
  ptr_cde_get_symval[i] = (T_cde_get_symval)
    GetProcAddress (cdll[i], "cddl_cde_get_symval");
  ptr_cde_read_elem[i] = (T_cde_read_elem)
    GetProcAddress (cdll[i], "cddl_cde_read_elem");
  ptr_cde_write_prepare[i] = (T_cde_write_prepare)
    GetProcAddress (cdll[i], "cddl_cde_write_prepare");
  ptr_cde_write_elem[i] = (T_cde_write_elem)
    GetProcAddress (cdll[i], "cddl_cde_write_elem");
  ptr_cde_get_type[i] = (T_cde_get_type)
    GetProcAddress (cdll[i], "cddl_cde_get_type");
  ptr_cde_get_primcode[i] = (T_cde_get_primcode)
    GetProcAddress (cdll[i], "cddl_cde_get_primcode");
  ptr_cde_get_msgcode[i] = (T_cde_get_msgcode)
    GetProcAddress (cdll[i], "cddl_cde_get_msgcode");
  ptr_cde_get_is_downlink[i] = (T_cde_get_is_downlink)
    GetProcAddress (cdll[i], "cddl_cde_get_is_downlink");
  ptr_cde_get_comp_index[i] = (T_cde_get_comp_index)
    GetProcAddress (cdll[i], "cddl_cde_get_comp_index");
  ptr_cde_get_element_name[i] = (T_cde_get_element_name)
    GetProcAddress (cdll[i], "cddl_cde_get_element_name");
  ptr_cde_get_array_kind[i] = (T_cde_get_array_kind)
    GetProcAddress (cdll[i], "cddl_cde_get_array_kind");
  if (
    ptr_cde_init[i] == NULL ||
    ptr_cde_get_comp[i] == NULL ||
    ptr_cde_prim_first[i] == NULL ||
    ptr_cde_prim_next[i] == NULL ||
    ptr_cde_msg_first[i] == NULL ||
    ptr_cde_msg_next[i] == NULL ||
    ptr_cde_comp_first[i] == NULL ||
    ptr_cde_comp_next[i] == NULL ||
    ptr_cde_get_symval[i] == NULL ||
    ptr_cde_read_elem[i] == NULL ||
    ptr_cde_write_prepare[i] == NULL ||
    ptr_cde_write_elem[i] == NULL ||
    ptr_cde_get_type[i] == NULL ||
    ptr_cde_get_primcode[i] == NULL ||
    ptr_cde_get_msgcode[i] == NULL ||
    ptr_cde_get_is_downlink[i] == NULL ||
    ptr_cde_get_comp_index[i] == NULL ||
    ptr_cde_get_element_name[i] == NULL ||
    ptr_cde_get_array_kind[i] == NULL)
  {
    ptr_cde_init[i] = cddl_cde_init;
    ptr_cde_get_comp[i] = cddl_cde_get_comp;
    ptr_cde_prim_first[i] = cddl_cde_prim_first;
    ptr_cde_prim_next[i] = cddl_cde_prim_next;
    ptr_cde_msg_first[i] = cddl_cde_msg_first;
    ptr_cde_msg_next[i] = cddl_cde_msg_next;
    ptr_cde_comp_first[i] = cddl_cde_comp_first;
    ptr_cde_comp_next[i] = cddl_cde_comp_next;
    ptr_cde_get_symval[i] = cddl_cde_get_symval;
    ptr_cde_read_elem[i] = cddl_cde_read_elem;
    ptr_cde_write_prepare[i] = cddl_cde_write_prepare;
    ptr_cde_write_elem[i] = cddl_cde_write_elem;
    ptr_cde_get_type[i] = cddl_cde_get_type;
    ptr_cde_get_primcode[i] = cddl_cde_get_primcode;
    ptr_cde_get_msgcode[i] = cddl_cde_get_msgcode;
    ptr_cde_get_is_downlink[i] = cddl_cde_get_is_downlink;
    ptr_cde_get_comp_index[i] = cddl_cde_get_comp_index;
    ptr_cde_get_element_name[i] = cddl_cde_get_element_name;
    ptr_cde_get_array_kind[i] = cddl_cde_get_array_kind;
  }

  ptr_pdi_createDefContext[i] = (T_pdi_createDefContext)
    GetProcAddress (cdll[i], "cddl_pdi_createDefContext");
  ptr_pdi_createContext[i] = (T_pdi_createContext)
    GetProcAddress (cdll[i], "cddl_pdi_createContext");
  ptr_pdi_destroyContext[i] = (T_pdi_destroyContext)
    GetProcAddress (cdll[i], "cddl_pdi_destroyContext");
  ptr_pdi_startPrim[i] = (T_pdi_startPrim)
    GetProcAddress (cdll[i], "cddl_pdi_startPrim");
  ptr_pdi_getDecodeInfo[i] = (T_pdi_getDecodeInfo)
    GetProcAddress (cdll[i], "cddl_pdi_getDecodeInfo");
  ptr_pdi_getEntityByPD[i] = (T_pdi_getEntityByPD)
    GetProcAddress (cdll[i], "cddl_pdi_getEntityByPD");
  ptr_pdi_pd2name[i] = (T_pdi_pd2name)
    GetProcAddress (cdll[i], "cddl_pdi_pd2name");
  if (
    ptr_pdi_createDefContext[i] == NULL ||
    ptr_pdi_createContext[i] == NULL ||
    ptr_pdi_destroyContext[i] == NULL ||
    ptr_pdi_startPrim[i] == NULL ||
    ptr_pdi_getDecodeInfo[i] == NULL ||
    ptr_pdi_getEntityByPD[i] == NULL ||
    ptr_pdi_pd2name[i] == NULL)
  {
    ptr_pdi_createDefContext[i]=cddl_pdi_createDefContext;
    ptr_pdi_createContext[i] =cddl_pdi_createContext;
    ptr_pdi_destroyContext[i] = cddl_pdi_destroyContext;
    ptr_pdi_startPrim[i] = cddl_pdi_startPrim;
    ptr_pdi_getDecodeInfo[i] = cddl_pdi_getDecodeInfo;
    ptr_pdi_getEntityByPD[i] = cddl_pdi_getEntityByPD;
    ptr_pdi_pd2name[i] = cddl_pdi_pd2name;
  }

  ptr_ccddata_get_pdi_dinfo[i] = (T_ccddata_get_pdi_dinfo)
    GetProcAddress (cdll[i], "ccddata_get_pdi_dinfo");
  if (ptr_ccddata_get_pdi_dinfo[i] == NULL)
  {
    ptr_ccddata_get_pdi_dinfo[i] = cddl_ccddata_get_pdi_dinfo;
  }
  ptr_ccddata_get_num_of_entities[i] = (T_ccddata_get_num_of_entities)
    GetProcAddress (cdll[i], "ccddata_get_num_of_entities");
  ptr_ccddata_get_max_message_id[i] = (T_ccddata_get_max_message_id)
    GetProcAddress (cdll[i], "ccddata_get_max_message_id");
  ptr_ccddata_get_max_bitstream_len[i] = (T_ccddata_get_max_bitstream_len)
    GetProcAddress (cdll[i], "ccddata_get_max_bitstream_len");
  ptr_ccddata_get_max_mstruct_len[i] = (T_ccddata_get_max_mstruct_len)
    GetProcAddress (cdll[i], "ccddata_get_max_mstruct_len");
  ptr_ccddata_mccd_symbols[i] = (T_ccddata_mccd_symbols)
    GetProcAddress (cdll[i], "ccddata_mccd_symbols");
  ptr_ccddata_get_max_sap_num[i] = (T_ccddata_get_max_sap_num)
    GetProcAddress (cdll[i], "ccddata_get_max_sap_num");
  ptr_ccddata_get_max_primitive_id[i] = (T_ccddata_get_max_primitive_id)
    GetProcAddress (cdll[i], "ccddata_get_max_primitive_id");
  ptr_ccddata_get_max_pstruct_len[i] = (T_ccddata_get_max_pstruct_len)
    GetProcAddress (cdll[i], "ccddata_get_max_pstruct_len");
  ptr_ccddata_get_mvar[i] = (T_ccddata_get_mvar)
    GetProcAddress (cdll[i], "ccddata_get_mvar");
  ptr_ccddata_get_spare[i] = (T_ccddata_get_spare)
    GetProcAddress (cdll[i], "ccddata_get_spare");
  ptr_ccddata_get_calc[i] = (T_ccddata_get_calc)
    GetProcAddress (cdll[i], "ccddata_get_calc");
  ptr_ccddata_get_mcomp[i] = (T_ccddata_get_mcomp)
    GetProcAddress (cdll[i], "ccddata_get_mcomp");
  ptr_ccddata_get_melem[i] = (T_ccddata_get_melem)
    GetProcAddress (cdll[i], "ccddata_get_melem");
  ptr_ccddata_get_calcidx[i] = (T_ccddata_get_calcidx)
    GetProcAddress (cdll[i], "ccddata_get_calcidx");
  ptr_ccddata_get_mmtx[i] = (T_ccddata_get_mmtx)
    GetProcAddress (cdll[i], "ccddata_get_mmtx");
  ptr_ccddata_get_pvar[i] = (T_ccddata_get_pvar)
    GetProcAddress (cdll[i], "ccddata_get_pvar");
  ptr_ccddata_get_pcomp[i] = (T_ccddata_get_pcomp)
    GetProcAddress (cdll[i], "ccddata_get_pcomp");
  ptr_ccddata_get_pelem[i] = (T_ccddata_get_pelem)
    GetProcAddress (cdll[i], "ccddata_get_pelem");
  ptr_ccddata_get_pmtx[i] = (T_ccddata_get_pmtx)
    GetProcAddress (cdll[i], "ccddata_get_pmtx");
  ptr_ccddata_get_mval[i] = (T_ccddata_get_mval)
    GetProcAddress (cdll[i], "ccddata_get_mval");
  ptr_ccddata_get_mstr[i] = (T_ccddata_get_mstr)
    GetProcAddress (cdll[i], "ccddata_get_mstr");
  ptr_ccddata_get_pval[i] = (T_ccddata_get_pval)
    GetProcAddress (cdll[i], "ccddata_get_pval");
  ptr_ccddata_get_pstr[i] = (T_ccddata_get_pstr)
    GetProcAddress (cdll[i], "ccddata_get_pstr");
  ptr_ccddata_get_ccdent[i] = (T_ccddata_get_ccdent)
    GetProcAddress (cdll[i], "ccddata_get_ccdent");
  ptr_ccddata_get_entname[i] = (T_ccddata_get_entname)
    GetProcAddress (cdll[i], "ccddata_get_entname");
  if (ptr_ccddata_get_entname[i] == NULL)
  {
    ptr_ccddata_get_entname[i] = cddl_ccddata_get_entname;
  }
  ptr_ccddata_get_alias[i] = (T_ccddata_get_alias)
    GetProcAddress (cdll[i], "ccddata_get_alias");
  ptr_ccddata_get_version[i] = (T_ccddata_get_version)
    GetProcAddress (cdll[i], "ccddata_get_version");
  if (ptr_ccddata_get_version[i] == NULL)
  {
    ptr_ccddata_get_version[i] = cddl_ccddata_get_version;
  }
  ptr_ccddata_get_table_version[i] = (T_ccddata_get_table_version)
    GetProcAddress (cdll[i], "ccddata_get_table_version");
  if (ptr_ccddata_get_table_version[i] == NULL)
  {
    ptr_ccddata_get_table_version[i] = cddl_ccddata_get_table_version;
  }
  ptr_ccddata_get_mi_length[i] = (T_ccddata_get_mi_length)
    GetProcAddress (cdll[i], "ccddata_get_mi_length");
  if (ptr_ccddata_get_mi_length[i] == NULL)
  {
    mi_length[i] = (UBYTE*) GetProcAddress (cdll[i], "mi_length");
  }
  ptr_ccddata_get_decmsgbuffer[i] = (T_ccddata_get_decmsgbuffer)
    GetProcAddress (cdll[i], "ccddata_get_decmsgbuffer");
  if (ptr_ccddata_get_decmsgbuffer[i] == NULL)
  {
    decmsgbuffer[i] = (UBYTE*) GetProcAddress (cdll[i], "decMsgBuffer");
  }
  ptr_ccddata_tap_check_pd[i] = (T_ccddata_tap_check_pd)
    GetProcAddress (cdll[i], "ccddata_tap_check_pd");
  ptr_ccddata_tap_get_pd[i] = (T_ccddata_tap_get_pd)
    GetProcAddress (cdll[i], "ccddata_tap_get_pd");
  if (
    ptr_ccddata_get_pdi_dinfo[i] == NULL ||
    ptr_ccddata_get_num_of_entities[i] == NULL ||
    ptr_ccddata_get_max_message_id[i] == NULL ||
    ptr_ccddata_get_max_bitstream_len[i] == NULL ||
    ptr_ccddata_get_max_mstruct_len[i] == NULL ||
    ptr_ccddata_mccd_symbols[i] == NULL ||
    ptr_ccddata_get_max_sap_num[i] == NULL ||
    ptr_ccddata_get_max_primitive_id[i] == NULL ||
    ptr_ccddata_get_max_pstruct_len[i] == NULL ||
    ptr_ccddata_get_mvar[i] == NULL ||
    ptr_ccddata_get_spare[i] == NULL ||
    ptr_ccddata_get_calc[i] == NULL ||
    ptr_ccddata_get_mcomp[i] == NULL ||
    ptr_ccddata_get_melem[i] == NULL ||
    ptr_ccddata_get_calcidx[i] == NULL ||
    ptr_ccddata_get_mmtx[i] == NULL ||
    ptr_ccddata_get_pvar[i] == NULL ||
    ptr_ccddata_get_pcomp[i] == NULL ||
    ptr_ccddata_get_pelem[i] == NULL ||
    ptr_ccddata_get_pmtx[i] == NULL ||
    ptr_ccddata_get_mval[i] == NULL ||
    ptr_ccddata_get_mstr[i] == NULL ||
    ptr_ccddata_get_pval[i] == NULL ||
    ptr_ccddata_get_pstr[i] == NULL ||
    ptr_ccddata_get_ccdent[i] == NULL ||
    ptr_ccddata_get_entname[i] == NULL ||
    ptr_ccddata_get_alias[i] == NULL ||
    ptr_ccddata_get_version[i] == NULL ||
    ptr_ccddata_get_table_version[i] == NULL ||
    ((ptr_ccddata_get_mi_length[i] == NULL) && (mi_length[i] == NULL)) ||
    ((ptr_ccddata_get_decmsgbuffer[i] == NULL) &&
      (decmsgbuffer[i] == NULL)) ||
    ptr_ccddata_tap_check_pd[i] == NULL ||
    ptr_ccddata_tap_get_pd[i] == NULL)
  {
    (void) ccddata_exit ();
    return CCDDATA_DLL_LOADFUN;
  }

  (void) (*ptr_ccd_init_ccddata[i]) ();
  (void) (*ptr_ccd_init[i]) ();
  (void) (*ptr_cde_init[i]) ();
  (void) (*ptr_pcon_init_ccddata[i]) ();
  (void) (*ptr_pcon_init_prim_coding[i]) (0, PCON_LITTLE);

  if (!already_loaded && ccddata_i_notify != NULL)
  {
    (*ccddata_i_notify)();
  }

  return CCDDATA_DLL_OK;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_ehandler
+------------------------------------------------------------------------------
|  Description  :  Handle NULL pointer; if we had loaded a ccddata dll
|                  but any other process had loaded another one in the
|                  meantime, the old one is unloaded and the new one is
<                  attached to.
|
|  Parameters   :  -
|
|  Return       :  An error code or the return value of ccddata_attach
+------------------------------------------------------------------------------
*/
static int ccddata_ehandler (void)
{
  if (me < 0)
  {
    return CCDDATA_DLL_REGISTER;
  }

  // functions not loaded -> reattach
  ccddata_detach (me, 1);
  return ccddata_attach (me);
}
/*==== PUBLIC FUNCTIONS ======================================================*/

/* pcon_init_prim_coding ==================================================== */
ULONG pcon_init_prim_coding (T_HANDLE caller, UBYTE format)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_init_prim_coding[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_init_prim_coding[me]) (caller, format);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_decodePrim ========================================================== */
ULONG pcon_decodePrim (ULONG opc,
                       void ** decoded_prim,
                       void * coded_prim,
                       ULONG * length,
                       ULONG woff)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_decodePrim[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_decodePrim[me])(opc, decoded_prim, coded_prim, length,
                                         woff);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_codePrim  ============================================================*/
ULONG pcon_codePrim (ULONG opc,
                     void * decoded_prim,
                     void ** coded_prim,
                     ULONG * length,
                     ULONG woff,
                     char* receiver)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_codePrim[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_codePrim[me])(opc, decoded_prim, coded_prim, length,
                                     woff, receiver);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_init_ccddata  ========================================================*/
ULONG pcon_init_ccddata (void)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_init_ccddata[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_init_ccddata[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_make_filter  =========================================================*/
ULONG pcon_make_filter (char* string, void** prim)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_make_filter[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_make_filter[me])(string, prim);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_filter_decode_prim ===================================================*/
ULONG pcon_filter_decode_prim (ULONG opc,
                               void** decoded_prim,
                               void* coded_prim,
                               ULONG* length,
                               ULONG woff,
                               void** shadow_prim)
{
  ULONG ret = PCON_DLLFUNC_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pcon_filter_decode_prim[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pcon_filter_decode_prim[me])(opc, decoded_prim, coded_prim,
                                               length, woff, shadow_prim);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pcon_codePrim  ============================================================*/
/* ccddata_get_num_of_entities  ==============================================*/
int ccddata_get_num_of_entities (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_num_of_entities[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_num_of_entities[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pdi_dinfo  ==============================================*/
int ccddata_get_pdi_dinfo (const T_PDI_DECODEINFO* (*dinfo) )
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pdi_dinfo[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pdi_dinfo[me])(dinfo);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_message_id  ===============================================*/
int ccddata_get_max_message_id (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_message_id[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_message_id[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_bitstream_len  ============================================*/
int ccddata_get_max_bitstream_len (void)
{
  int ret = CCDDATA_MCONST_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_bitstream_len[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_bitstream_len[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_mstruct_len  ==============================================*/
int ccddata_get_max_mstruct_len (void)
{
  int ret = CCDDATA_MCONST_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_mstruct_len[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_mstruct_len[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_mccd_symbols  =====================================================*/
int ccddata_mccd_symbols (void)
{
  int ret = CCDDATA_MCONST_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_mccd_symbols[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_mccd_symbols[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_sap_num  ==================================================*/
int ccddata_get_max_sap_num (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_sap_num[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_sap_num[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_primitive_id  =============================================*/
int ccddata_get_max_primitive_id (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_primitive_id[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_primitive_id[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_max_pstruct_len  ==============================================*/
int ccddata_get_max_pstruct_len (void)
{
  int ret = CCDDATA_PCONST_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_max_pstruct_len[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_max_pstruct_len[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_calcidx  ======================================================*/
const T_CCD_CalcIndex* ccddata_get_calcidx (USHORT idx)
{
  const T_CCD_CalcIndex* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_calcidx[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_calcidx[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mvar  =========================================================*/
const T_CCD_VarTabEntry* ccddata_get_mvar (USHORT idx)
{
  const T_CCD_VarTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_mvar[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_mvar[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_spare  ========================================================*/
const T_CCD_SpareTabEntry* ccddata_get_spare (USHORT idx)
{
  const T_CCD_SpareTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_spare[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_spare[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_calc  =========================================================*/
const T_CCD_CalcTabEntry* ccddata_get_calc (USHORT idx)
{
  const T_CCD_CalcTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_calc[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_calc[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mcomp  ========================================================*/
const T_CCD_CompTabEntry* ccddata_get_mcomp (USHORT idx)
{
  const T_CCD_CompTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_mcomp[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_mcomp[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_melem  ========================================================*/
const T_CCD_ElemTabEntry* ccddata_get_melem (USHORT idx)
{
  const T_CCD_ElemTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_melem[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_melem[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mmtx  =========================================================*/
USHORT ccddata_get_mmtx (USHORT entity, USHORT msgid, USHORT index)
{
  USHORT ret = NO_REF;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_mmtx[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_mmtx[me])(entity, msgid, index);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pvar  =========================================================*/
const T_CCD_VarTabEntry* ccddata_get_pvar (USHORT idx)
{
  const T_CCD_VarTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pvar[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pvar[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pcomp  ========================================================*/
const T_CCD_CompTabEntry* ccddata_get_pcomp (USHORT idx)
{
  const T_CCD_CompTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pcomp[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pcomp[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pelem  ========================================================*/
const T_CCD_ElemTabEntry* ccddata_get_pelem (USHORT idx)
{
  const T_CCD_ElemTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pelem[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pelem[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pmtx  =========================================================*/
USHORT ccddata_get_pmtx (USHORT sap, USHORT primid, USHORT index)
{
  USHORT ret = NO_REF;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pmtx[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pmtx[me])(sap, primid, index);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mval  =========================================================*/
const T_CCD_ValTabEntry* ccddata_get_mval (USHORT idx)
{
  const T_CCD_ValTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_mval[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_mval[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mstr  =========================================================*/
const T_CCD_StrTabEntry* ccddata_get_mstr (USHORT idx)
{
  const T_CCD_StrTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_mstr[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_mstr[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pval  =========================================================*/
const T_CCD_ValTabEntry* ccddata_get_pval (USHORT idx)
{
  const T_CCD_ValTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pval[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pval[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_pstr  =========================================================*/
const T_CCD_StrTabEntry* ccddata_get_pstr (USHORT idx)
{
  const T_CCD_StrTabEntry* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_pstr[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_pstr[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_ccdent  =======================================================*/
short ccddata_get_ccdent (char* entname)
{
  short ret = CCDDATA_CCDENT_INVALID;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_ccdent[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_ccdent[me])(entname);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_entname  =======================================================*/
const char * ccddata_get_entname (short ccdent)
{
  const char * ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_entname[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_entname[me])(ccdent);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_alias  ========================================================*/
char* ccddata_get_alias (USHORT idx, int from_msg)
{
  char* ret = "";
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_alias[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_alias[me])(idx, from_msg);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_version  ======================================================*/
char* ccddata_get_version (void)
{
  char* ret = "";
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_version[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_version[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_table_version  ================================================*/
int ccddata_get_table_version (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_get_table_version[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_get_table_version[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_decmsgbuffer  =================================================*/
UBYTE* ccddata_get_decmsgbuffer (void)
{
  UBYTE* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if (ptr_ccddata_get_decmsgbuffer[me] == NULL)
  {
    if (decmsgbuffer[me] != NULL)
    {
      ret = decmsgbuffer[me];
    }
    else if (ccddata_ehandler() == CCDDATA_DLL_OK)
    {
      ret = ccddata_get_decmsgbuffer ();
    }
    else
    {
      ;
    }
  }
  else
  {
    __try
    {
      ret = (*ptr_ccddata_get_decmsgbuffer[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_get_mi_length  ====================================================*/
UBYTE* ccddata_get_mi_length (void)
{
  UBYTE* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if (ptr_ccddata_get_mi_length[me] == NULL)
  {
    if (mi_length[me] != NULL)
    {
      ret = mi_length[me];
    }
    else if (ccddata_ehandler() == CCDDATA_DLL_OK)
    {
      ret = ccddata_get_mi_length ();
    }
    else
    {
      ;
    }
  }
  else
  {
    __try
    {
      ret = (*ptr_ccddata_get_mi_length[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_tap_get_pd  =======================================================*/
int ccddata_tap_get_pd (UCHAR comp)
{
  int ret = TAP_PD_INVALID;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_tap_get_pd[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_tap_get_pd[me])(comp);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_tap_check_pd  =====================================================*/
int ccddata_tap_check_pd (UCHAR comp, UCHAR pd)
{
  int ret = TAP_PD_INVALID;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_tap_check_pd[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_tap_check_pd[me])(comp, pd);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_nodes  =========================================================*/
int ccddata_eg_nodes (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_nodes[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_nodes[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_nodenames  =====================================================*/
char** ccddata_eg_nodenames (void)
{
  char** ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_nodenames[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_nodenames[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_adjacent  ======================================================*/
char* ccddata_eg_adjacent (int idx)
{
  char* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_adjacent[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_adjacent[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_saps  ==========================================================*/
int ccddata_eg_saps (void)
{
  int ret = 0;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_saps[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_saps[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_sapnames  ======================================================*/
char** ccddata_eg_sapnames (void)
{
  char** ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_sapnames[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_sapnames[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccddata_eg_comendpoints  ==================================================*/
T_COMENDPOINTS* ccddata_eg_comendpoints (int idx)
{
  T_COMENDPOINTS* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccddata_eg_comendpoints[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccddata_eg_comendpoints[me])(idx);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_init  =================================================================*/
void cde_init (void)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_init[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_cde_init[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* cde_get_comp  =============================================================*/
USHORT cde_get_comp (T_CCDE_HANDLE*     chandle,
                     T_CCDE_ELEM_DESCR* edescr)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_comp[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_comp[me])(chandle, edescr);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_prim_first  ===========================================================*/
USHORT cde_prim_first (T_CCDE_HANDLE    * phandle,
                       ULONG              primcode,
                       char             * name)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_prim_first[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_prim_first[me])(phandle, primcode, name);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_prim_next  ============================================================*/
USHORT cde_prim_next (T_CCDE_HANDLE      *phandle,
                      UBYTE               descent,
                      T_CCDE_ELEM_DESCR  *pdescr)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_prim_next[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_prim_next[me])(phandle, descent, pdescr);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_msg_first  ============================================================*/
USHORT cde_msg_first (T_CCDE_HANDLE  * mhandle,
                      UBYTE            type,
                      UBYTE            direction,
                      UBYTE            entity,
                      char           * name)

{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_msg_first[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_msg_first[me])(mhandle, type, direction, entity, name);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_msg_next  =============================================================*/
USHORT cde_msg_next (T_CCDE_HANDLE     *mhandle,
                     UBYTE              descent,
                     T_CCDE_ELEM_DESCR *iedescr)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_msg_next[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_msg_next[me])(mhandle, descent, iedescr);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_comp_first  ===========================================================*/
USHORT cde_comp_first (T_CCDE_HANDLE      * chandle,
                       T_ELM_SRC            source,
                       char               * compname)

{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_comp_first[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_comp_first[me])(chandle, source, compname);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_comp_next  ============================================================*/
USHORT cde_comp_next (T_CCDE_HANDLE     *chandle,
                      UBYTE              descent,
                      T_CCDE_ELEM_DESCR *descr)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_comp_next[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_comp_next[me])(chandle, descent, descr);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_symval  ===========================================================*/
char* cde_get_symval (int elem_value, T_CCDE_ELEM_DESCR* edescr)
{
  char* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_symval[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_symval[me])(elem_value, edescr);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_read_elem  ============================================================*/
USHORT cde_read_elem (T_CCDE_HANDLE     * handle,
                      void              * cstruct,
                      T_CCDE_ELEM_DESCR * edescr,
                      UBYTE             * value)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_read_elem[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_read_elem[me])(handle, cstruct, edescr, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_write_prepare  ========================================================*/
void cde_write_prepare (T_CCDE_HANDLE     * handle,
                        void              * cstruct,
                        T_CCDE_ELEM_DESCR * edescr)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_write_prepare[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    (*ptr_cde_write_prepare[me])(handle, cstruct, edescr);
  }
  ReleaseMutex (mut[me]);
}

/* cde_write_elem  ===========================================================*/
USHORT cde_write_elem (T_CCDE_HANDLE     * handle,
                       void              * cstruct,
                       T_CCDE_ELEM_DESCR * edescr,
                       UBYTE             * value)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_write_elem[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_write_elem[me])(handle, cstruct, edescr, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_type  ===========================================================*/
USHORT cde_get_type (char      *name,
                     T_ELM_SRC *type)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_type[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_type[me])(name, type);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_primcode  =========================================================*/
USHORT cde_get_primcode (char      *name,
                         ULONG     *primcode)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_primcode[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_primcode[me])(name, primcode);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_msgcode  ==========================================================*/
USHORT cde_get_msgcode (char      *name,
                        UBYTE     *type,
                        UBYTE     *direction,
                        UBYTE     *entity)
{
  USHORT ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_msgcode[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_msgcode[me])(name, type, direction, entity);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_is_downlink  ======================================================*/
int cde_get_is_downlink (ULONG comp_index)
{
  int ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_is_downlink[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_is_downlink[me])(comp_index);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_comp_index  =======================================================*/
ULONG cde_get_comp_index (char* comp_name, T_ELM_SRC table)
{
  ULONG ret = CCDEDIT_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_comp_index[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_comp_index[me])(comp_name, table);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_element_name  =====================================================*/
char* cde_get_element_name (ULONG comp_index, USHORT elem_off, T_ELM_SRC table)
{
  char* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_element_name[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_element_name[me])(comp_index, elem_off, table);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* cde_get_array_kind  =======================================================*/
ULONG cde_get_array_kind (char* var_name, T_ELM_SRC table)
{
  ULONG ret = (ULONG)CCDEDIT_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_cde_get_array_kind[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_cde_get_array_kind[me])(var_name, table);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_set_patch_infos  ======================================================*/
int ccd_set_patch_infos (T_patch_info* pinfo)
{
  int ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_set_patch_infos[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_set_patch_infos[me])(pinfo);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_init  =================================================================*/
BYTE ccd_init (void)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_init[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_init[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_exit  =================================================================*/
int ccd_exit (void)
{
  int ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_exit[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_exit[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_begin  ================================================================*/
UBYTE* ccd_begin (void)
{
  UBYTE* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_begin[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_begin[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_end  ==================================================================*/
void ccd_end (void)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_end[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    (*ptr_ccd_end[me])();
  }
  ReleaseMutex (mut[me]);
}

/* ccd_decodeMsg  ============================================================*/
BYTE ccd_decodeMsg (UBYTE         entity,
                    UBYTE         direction,
                    T_MSGBUF     *mBuf,
                    UBYTE        *mStruct,
                    UBYTE         mId)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_decodeMsg[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_decodeMsg[me])(entity, direction, mBuf, mStruct, mId);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_decodeMsgPtr  =========================================================*/
S8 ccd_decodeMsgPtr (U8   entity,
		       U8   direction,
		       U16  l_buf,
		       U16  o_buf,
		       U8*  buf,
		       U8** mStructPtr,
		       U8   mId)
{
  S8 ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_decodeMsgPtr[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_decodeMsgPtr[me])(entity, direction, l_buf, o_buf, buf, 
                                      mStructPtr, mId);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_codeMsg  ========================)=====================================*/
BYTE ccd_codeMsg (UBYTE         entity,
      UBYTE         direction,
      T_MSGBUF     *mBuf,
      UBYTE        *mStruct,
      UBYTE         mId)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_codeMsg[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_codeMsg[me])(entity, direction, mBuf, mStruct, mId);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_codeMsgPtr  =========================)=================================*/
S8 ccd_codeMsgPtr(U8   entity,
      U8   direction,
      U16* l_buf,
      U16  o_buf,
      U8*  buf,
      U8*  mStruct,
      U8   mId)
{
  S8 ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_codeMsgPtr[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_codeMsgPtr[me])(entity, direction, l_buf, o_buf, buf, 
                                    mStruct, mId);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_init_ccddata  =========================================================*/
ULONG ccd_init_ccddata (void)
{
  ULONG ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_init_ccddata[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_init_ccddata[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_decodeByte  ===========================================================*/
BYTE ccd_decodeByte (UBYTE* bitstream, USHORT startbit,
                     USHORT bitlen, UBYTE* value)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_decodeByte[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_decodeByte[me])(bitstream, startbit, bitlen, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_codeByte  =============================)===============================*/
BYTE ccd_codeByte (UBYTE* bitstream, USHORT startbit,
              		 USHORT bitlen, UBYTE value)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_codeByte[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_codeByte[me])(bitstream, startbit, bitlen, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_codeLong  ===)=========================================================*/
BYTE ccd_codeLong (UBYTE* bitstream, USHORT startbit,
	                 USHORT bitlen, ULONG value)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_codeLong[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_codeLong[me])(bitstream, startbit, bitlen, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_decodeLong  ===========================================================*/
BYTE ccd_decodeLong (UBYTE* bitstream, USHORT startbit,
	                   USHORT bitlen, ULONG *value)
{
  BYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_decodeLong[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_decodeLong[me])(bitstream, startbit, bitlen, value);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_bitcopy  ============================)=================================*/
void ccd_bitcopy (UBYTE     *dest,
                  UBYTE     *source,
                  USHORT     bitlen,
                  USHORT     offset)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_bitcopy[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_ccd_bitcopy[me])(dest, source, bitlen, offset);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* ccd_getFirstError  ========================================================*/
UBYTE ccd_getFirstError (UBYTE entity, USHORT *parlist)
{
  UBYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_getFirstError[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_getFirstError[me])(entity, parlist);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_getNextError  =========================================================*/
UBYTE ccd_getNextError (UBYTE entity, USHORT *parlist)
{
  UBYTE ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_getNextError[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_getNextError[me])(entity, parlist);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_getFirstFault  ========================================================*/
ULONG ccd_getFirstFault (T_CCD_ERR_ENTRY **ccd_err_entry)
{
  ULONG ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_getFirstFault[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_getFirstFault[me])(ccd_err_entry);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_getNextFault  =========================================================*/
ULONG ccd_getNextFault (T_CCD_ERR_ENTRY **ccd_err_entry)
{
  ULONG ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_getNextFault[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_getNextFault[me])(ccd_err_entry);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_free_faultlist  =======================================================*/
void ccd_free_faultlist (void)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_free_faultlist[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_ccd_free_faultlist[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* ccd_get_numFaults  ========================================================*/
int ccd_get_numFaults ()
{
  int ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_get_numFaults[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_get_numFaults[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_encodeElem  ===========================================================*/
int  ccd_encodeElem (ULONG  ccdid,
                     USHORT* l_buf,
                     USHORT  o_buf,
                     UCHAR*  buf,
                     UCHAR*  eStruct)
{
  int ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_encodeElem[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_encodeElem[me])(ccdid, l_buf, o_buf, buf, eStruct);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* ccd_decodeElem  ===========================================================*/
int  ccd_decodeElem (ULONG  ccdid,
                     USHORT  l_buf,
                     USHORT  o_buf,
                     UCHAR*  buf,
                     UCHAR*  eStruct)
{
  int ret = CCD_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_ccd_decodeElem[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_ccd_decodeElem[me])(ccdid, l_buf, o_buf, buf, eStruct);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pdi_createDefContext  =====================================================*/
T_PDI_CONTEXT* pdi_createDefContext()
{
  T_PDI_CONTEXT* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_createDefContext[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pdi_createDefContext[me])();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pdi_createContext  ========================================================*/
T_PDI_CONTEXT* pdi_createContext(const T_PDI_DECODEINFO* dinfo,
                                 unsigned int dicount)
{
  T_PDI_CONTEXT* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_createContext[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pdi_createContext[me])(dinfo, dicount);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pdi_destroyContext  =======================================================*/
void pdi_destroyContext(T_PDI_CONTEXT *context)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_destroyContext[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_pdi_destroyContext[me])(context);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* pdi_startPrim  ============================================================*/
void pdi_startPrim(T_PDI_CONTEXT *context, ULONG opc)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_startPrim[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_pdi_startPrim[me])(context, opc);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* pdi_getDecodeInfo  ========================================================*/
void pdi_getDecodeInfo(T_PDI_CONTEXT *context, const char *ename,
                       char *evalue, int evlen, T_PDI *decinfo)
{
  if (me < 0)
  {
    return;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_getDecodeInfo[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      (*ptr_pdi_getDecodeInfo[me])(context, ename, evalue, evlen, decinfo);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
}

/* pdi_getEntityByPD  ========================================================*/
short pdi_getEntityByPD(T_PDI_CONTEXT *context, unsigned char pd)
{
  short ret = PDI_DLL_ERROR;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_getEntityByPD[me] != NULL) ||
      (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pdi_getEntityByPD[me])(context, pd);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/* pdi_pd2name  ==============================================================*/
const char* pdi_pd2name(unsigned char pd)
{
  const char* ret = NULL;
  if (me < 0)
  {
    return ret;
  }
  WaitForSingleObject (mut[me], INFINITE);
  if ((ptr_pdi_pd2name[me] != NULL) || (ccddata_ehandler() == CCDDATA_DLL_OK))
  {
    __try
    {
      ret = (*ptr_pdi_pd2name[me])(pd);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
      // acces violation -> possibly wrong ccddata-DLL
    }
  }
  ReleaseMutex (mut[me]);
  return ret;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_dllname
+------------------------------------------------------------------------------
|  Description  :  Deliver name of currently loaded dll
|
|  Parameters   :  -
|
|  Return       :  lastdll
+------------------------------------------------------------------------------
*/
char* ccddata_dllname (void)
{
  return lastdll;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_exit
+------------------------------------------------------------------------------
|  Description  :  Unload ccddata dll and clean pointer to the functions
|
|  Parameters   :  -
|
|  Return       :  0 on success, otherwise error code
+------------------------------------------------------------------------------
*/

int ccddata_exit (void)
{
  if (me < 0)
  {
    return CCDDATA_DLL_REGISTER;
  }

  ccddata_detach (me, 1);

  CloseHandle (mut[me]);
  CloseHandle (initlock);
  ptrindex[me] = 0;
  me = -1;

  return CCDDATA_DLL_OK;
}

/*
+------------------------------------------------------------------------------
|  Function     :  ccddata_init
+------------------------------------------------------------------------------
|  Description  :  Load ccddata dll and initialize pointer to the functions
|
|  Parameters   :  dllname - name of the ccddata dll or NULL
|                  reload  - if set, the ccddata dll will be switched
|
|  Return       :  0 on success, otherwise error code
+------------------------------------------------------------------------------
*/

int ccddata_init (const char* dllname,
                  int reload,
                  void (*ccddata_init_notify)(void),
                  void (*ccddata_exit_notify)(void))
{
  int ret = CCDDATA_DLL_OK;

  if (cdll[me] && !reload)
  {
    return CCDDATA_DLL_ALREADY;
  }

  if ((initlock = ccddata_init_lock ()) == 0)
  {
    return CCDDATA_DLL_REGISTER;
  }

  if (ccddata_register () < 0)
  {
    ret = CCDDATA_DLL_REGISTER;
  }
  else
  {
    ccddata_i_notify = ccddata_init_notify;
    ccddata_x_notify = ccddata_exit_notify;

    if (dllname)
    {
      /* build full path of DLL */
      char name[MAX_PATH+1];
      LPTSTR filepart;
      DWORD len=SearchPath(
        NULL,      // pointer to search path
        dllname,  // pointer to filename
        NULL, // pointer to extension
        MAX_PATH, // size, in characters, of buffer
        name,     // pointer to buffer for found filename
        &filepart   // pointer to pointer to file component
      );
      if (!len)
      {
        strcpy(name, dllname);
      }
      
      if (!lastdll[0])
      {
        // no DLL has been loaded yet
        reload=1;
      }
      else if (strcmp (lastdll, name)==0)
      {
        // the correct DLL is already in use
        reload=0;
      }

      if (reload)
      {
        // we want to load a new DLL but save the current one ... just in case
        char old_dll[MAX_PATH]="";
        strcpy (old_dll, lastdll);
        strcpy (lastdll, name);
        (void) ccddata_detach (me, 1);
        ret = ccddata_attach (me);
        if (ret == CCDDATA_DLL_OK)
        {
          // now inform the other applications
          (void)ccddata_clean ();
        }
        else
        {
          // upps, didn't work
          strcpy (lastdll, old_dll);
          (void) ccddata_attach (me);
        }
      }
      else
      {
        // we just attach to the already loaded DLL
        ret = ccddata_attach (me);
      }

    }
  }

  ReleaseMutex (initlock);

  return ret;
}
/*==== END OF FILE ===========================================================*/