/// <summary> /// Creates an procedure that can be called by a remote client /// </summary> /// <remarks> /// Note that this can only be called by a server. /// </remarks> /// <param name="name">The name for this Rpc</param> /// <param name="def">The definition for this Rpc</param> /// <param name="callback">The callback to use the the procedure is called from a remote</param> public static void CreateRpc(string name, byte[] def, RpcCallback callback) { #if CORE 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 nameLen; IntPtr nameB = CoreMethods.CreateCachedUTF8String(name, out nameLen); Interop.NT_CreateRpc(nameB, nameLen, def, (UIntPtr)def.Length, IntPtr.Zero, modCallback); s_rpcCallbacks.Add(modCallback); #else Storage.Instance.CreateRpc(name, def, callback); #endif }
internal static void CreateRpc(string name, IList <byte> def, RpcCallback callback) { Interop.NT_RPCCallback modCallback = (IntPtr data, IntPtr ptr, UIntPtr len, IntPtr intPtr, UIntPtr paramsLen, out UIntPtr resultsLen, ref NtConnectionInfo connInfo) => { string retName = ReadUTF8String(ptr, len); byte[] param = GetRawDataFromPtr(intPtr, paramsLen); IList <byte> cb = callback(retName, param, connInfo.ToManaged()); resultsLen = (UIntPtr)cb.Count; IntPtr retPtr = Interop.NT_AllocateCharArray(resultsLen); if (cb is byte[]) { Marshal.Copy((byte[])cb, 0, retPtr, cb.Count); } else { for (int i = 0; i < cb.Count; i++) { // Must do a slow write if not a byte[] Marshal.WriteByte(retPtr, i, cb[i]); } } return(retPtr); }; var nameB = CreateCachedUTF8String(name); if (def is byte[] bArr) { Interop.NT_CreateRpc(nameB.Buffer, nameB.Length, bArr, (UIntPtr)def.Count, IntPtr.Zero, modCallback); } else { Interop.NT_CreateRpc(nameB.Buffer, nameB.Length, def.ToArray(), (UIntPtr)def.Count, IntPtr.Zero, modCallback); } s_rpcCallbacks.Add(modCallback); }
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); }