public static void CreateRpc(string name, NtRpcDefinition def, RpcCallback callback)
        {
            Interop.NT_RPCCallback modCallback =
                (IntPtr data, IntPtr ptr, UIntPtr len, IntPtr intPtr, UIntPtr paramsLen, out UIntPtr resultsLen) =>
            {
                string retName = CoreMethods.ReadUTF8String(ptr, len);
                byte[] param   = CoreMethods.GetRawDataFromPtr(intPtr, paramsLen);
                byte[] cb      = callback(retName, param);
                resultsLen = (UIntPtr)cb.Length;
                IntPtr retPtr = Interop.NT_AllocateCharArray(resultsLen);
                Marshal.Copy(cb, 0, retPtr, cb.Length);
                return(retPtr);
            };

            UIntPtr packedLen;

            byte[]  packed = PackRpcDefinition(def, out packedLen);
            UIntPtr nameLen;

            byte[] nameB = CoreMethods.CreateUTF8String(name, out nameLen);
            Interop.NT_CreateRpc(nameB, nameLen, packed, packedLen, IntPtr.Zero, modCallback);
            s_rpcCallbacks.Add(modCallback);
        }