private DllWrapper(int processId, SafeHandle hProcess, IAutoScalingSharedBuffer buffer) : base(IntPtr.Zero, false) { m_process = hProcess; m_buffer = buffer; m_unwrapper = buffer.Reserve(c_unwrapper.Length * 4 + c_padding); m_unwrapper.WriteNullTerminatedString(c_padding, c_unwrapper, Encoding.Unicode); m_pid = processId; SetHandle(getHandle(processId, "Kernel32.dll")); }
// todo: dispose before buffer disposed or use other memory public DllWrapper(string name, SafeHandle hProcess, int processId, DllWrapper kernel, IAutoScalingSharedBuffer buffer) : base(IntPtr.Zero, true) { m_process = hProcess; m_kernel = kernel; m_buffer = buffer; m_unwrapper = m_kernel.m_unwrapper; m_pid = processId; SetHandle(getHandle(processId, name)); }
public InterprocessManualResetEventSlim InitializeInteraction(IAutoManagedMemory queue) { if (!Kernel.DuplicateHandle(m_process, (IntPtr)this[c_init, false](queue), Process.GetCurrentProcess() .Handle, out var duplicated)) { throw new InvalidOperationException($"Can't duplicate handle (error: 0x{Kernel.GetLastError():X})"); } return(new InterprocessManualResetEventSlim(duplicated, true)); }
private SafeWaitHandleSlim callProc(IAutoManagedMemory unwrapperArg) { var thread = new SafeWaitHandleSlim(Kernel.CreateRemoteThread(m_process, 0, 0, m_unwrapper + c_padding, unwrapperArg.Start, 0, out _), true); if (thread.DangerousGetHandle() == IntPtr.Zero) { throw new InvalidOperationException($"Error: 0x{Kernel.GetLastError():X}"); } return(thread); }
internal void AddNested(IAutoManagedMemory nested) { m_nested.Add(nested); }
public void Write(int offset, IAutoManagedMemory pointer) { Write(offset, pointer.Start); }
public bool TryReserve(int size, out IAutoManagedMemory reserved) { reserved = reserveBlock(size); return(reserved != null); }