This class supports low level interoperability with NWN2Server.exe. It is not portable.
            /// <summary>
            /// StoreCampaignObject hook.  Called when the server script
            /// function StoreCampaignObject is called by any script.
            /// </summary>
            /// <param name="CodeBaseObject">Supplies the code base this
            /// pointer.</param>
            /// <param name="CampaignName">Supplies the campaign name.</param>
            /// <param name="VarName">Supplies the variable name.</param>
            /// <param name="PlayerName">Supplies the player name.</param>
            /// <param name="Cls">Always supplies the value 'O'.</param>
            /// <param name="Data">Supplies the raw GFF buffer.</param>
            /// <param name="Size">Supplies the count of raw GFF bytes in the
            /// data buffer.</param>
            /// <returns>True if the object was stored, else false if the
            /// object was not stored.
            private Int32 AddBinaryDataHook(IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, Byte Cls, IntPtr Data, UInt32 Size)
            {
                string CampaignNameStr = ServerInterop.ReadCExoString(CampaignName);

                //
                // If the campaign is the virtual database, call registered
                // event handlers.
                //

                if (CampaignNameStr.StartsWith("VDB_"))
                {
                    try
                    {
                        StoreCampaignDatabaseEventArgs EventArgs;
                        string VarNameStr    = ServerInterop.ReadCExoString(VarName);
                        string PlayerNameStr = ServerInterop.ReadCExoString(PlayerName);
                        byte[] GFF           = new byte[(int)Size];

                        Marshal.Copy(Data, GFF, 0, (int)Size);

                        EventArgs = new StoreCampaignDatabaseEventArgs(CampaignNameStr.Substring(4), VarNameStr, PlayerNameStr, GFF);
                        CampaignDatabase.StoreCampaignDatabaseEvent(null, EventArgs);

                        return(EventArgs.Handled ? 1 : 0);
                    }
                    catch (Exception e)
                    {
                        Logger.Log("CampaignDatabaseHook.AddBinaryDataHook: Exception: {0}", e);
                        return(0);
                    }
                }

                //
                // Pass through to the original server implementation that uses
                // the standard campaign database.
                //

                return(CCodeBase_AddBinaryData_OriginalDelegate(CodeBaseObject, CampaignName, VarName, PlayerName, Cls, Data, Size));
            }
            /// <summary>
            /// RetrieveCampaignObject hook.  Called when the server script
            /// function RetrieveCampaignObject is called by any script.
            /// </summary>
            /// <param name="CodeBaseObject">Supplies the code base this
            /// pointer.</param>
            /// <param name="CampaignName">Supplies the campaign name.</param>
            /// <param name="VarName">Supplies the variable name.</param>
            /// <param name="PlayerName">Supplies the player name.</param>
            /// <param name="Cls">Always receives 'O'.</param>
            /// <param name="Size">Receives the size of the restored object GFF
            /// data.</param>
            /// <returns>An unmanaged pointer on the server heap that contains
            /// the raw GFF data for the object.  IntPtr.Zero if there is no
            /// data to restore.</returns>
            private IntPtr GetBinaryDataHook(IntPtr CodeBaseObject, IntPtr CampaignName, IntPtr VarName, IntPtr PlayerName, out Byte Cls, out UInt32 Size)
            {
                string CampaignNameStr = ServerInterop.ReadCExoString(CampaignName);

                //
                // If the campaign is the virtual database, call registered
                // event handlers.
                //

                if (CampaignNameStr.StartsWith("VDB_"))
                {
                    Cls = (byte)'O';

                    try
                    {
                        RetrieveCampaignDatabaseEventArgs EventArgs;
                        string VarNameStr    = ServerInterop.ReadCExoString(VarName);
                        string PlayerNameStr = ServerInterop.ReadCExoString(PlayerName);

                        EventArgs = new RetrieveCampaignDatabaseEventArgs(CampaignNameStr.Substring(4), VarNameStr, PlayerNameStr);
                        CampaignDatabase.RetrieveCampaignDatabaseEvent(null, EventArgs);

                        //
                        // If no handler instantiated a GFF, then return no
                        // data found.  Otherwise, allocate a buffer from the
                        // unmanaged server heap, and copy the contents of the
                        // GFF into the heap buffer and return the heap buffer.
                        //

                        if (EventArgs.GFF == null || EventArgs.GFF.Length == 0)
                        {
                            Size = 0;
                            return(IntPtr.Zero);
                        }
                        else
                        {
                            IntPtr GFFBuffer = IntPtr.Zero;

                            try
                            {
                                GFFBuffer = ServerInterop.AllocateServerHeap((uint)EventArgs.GFF.Length);
                                Marshal.Copy(EventArgs.GFF, 0, GFFBuffer, EventArgs.GFF.Length);
                                Size = (uint)EventArgs.GFF.Length;

                                return(GFFBuffer);
                            }
                            catch (Exception e)
                            {
                                Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);

                                if (GFFBuffer != IntPtr.Zero)
                                {
                                    ServerInterop.FreeServerHeap(GFFBuffer);
                                    GFFBuffer = IntPtr.Zero;
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Log("CampaignDatabaseHook.GetBinaryDataHook: Exception: {0}", e);

                        Size = 0;
                        return(IntPtr.Zero);
                    }
                }

                //
                // Pass through to the original server implementation that uses
                // the standard campaign database.
                //

                return(CCodeBase_GetBinaryData_OriginalDelegate(CodeBaseObject, CampaignName, VarName, PlayerName, out Cls, out Size));
            }