I got following definition for a function in a c-based DLL (no source available):
uint MakeReference(MemBlock* ipReferenceMemBlock);
MemBlock is defined as:
typedef struct {
    HANDLE_TAG dTag;
    long dLength;
    BYTE* dpReference;
} MemBlock;
HANDLE_TAG is defined as:
typedef char HANDLE_TAG[10 + 1];
My take on this in a C# Wrapper Class is:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MemBlock
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
    public string dTag;
    public uint dLength;
    [MarshalAs(UnmanagedType.LPStr)]
    public string dpReference;
}
[DllImport("lib.dll", CharSet = CharSet.Ansi, EntryPoint = "MakeReference@24", CallingConvention = CallingConvention.StdCall)]
public static extern uint MakeReference(ref IntPtr pDDipMemBlock);
public static uint FAPIMakeReference(ref MemBlock ipMemBlock)
    {
        uint error = 0;
        IntPtr pDDipMemBlock = Marshal.AllocHGlobal(Marshal.SizeOf(ipMemBlock));
        try
        {
            Marshal.StructureToPtr(ipMemBlock, pDDipMemBlock, false);
            error = MakeReferenceEx(ref pDDipMemBlock);
            ipMemBlock = (MemBlock)Marshal.PtrToStructure(pDDipMemBlock, typeof(MemBlock));
        }
        finally
        {
            Marshal.FreeHGlobal(pDDipMemBlock);
        }
        return error;
    }
calling this with:
MemBlock refMemBlock = new MemBlock();
uint error = MakeReferenceEx(ref refMemBlock);
resulting in an Access Violation Expection