private int SendNetifLevel3Output(byte *buffer, int offset, int length) { if (offset < 0 || length < 0) { return(~0); } if (buffer == null) { int num = (offset + length); if (0 == num) { return(0); } return(~0); } lock (this) { NativeNetif.OVERLAPPED *overlapped = stackalloc NativeNetif.OVERLAPPED[1]; NativeNetif.memset(overlapped, 0, sizeof(NativeNetif.OVERLAPPED)); if (!NativeNetif.WriteFile(this.Handle, &buffer[offset], length, out int lpNumberOfBytesWritten, overlapped)) { lpNumberOfBytesWritten = 0; if (!NativeNetif.GetOverlappedResult(this.Handle, overlapped, ref lpNumberOfBytesWritten, true)) { lpNumberOfBytesWritten = ~0; } } return(lpNumberOfBytesWritten); } }
private void CloseTunDev(IntPtr handle) { if (handle != IntPtr.Zero) { NativeNetif.CloseHandle(handle); } }
private void ListenNetifLevel3Input(Action <byte[], int> callback) { NativeNetif.OVERLAPPED *overlapped = stackalloc NativeNetif.OVERLAPPED[1]; byte[] buffer = new byte[MTU]; while (0 == Interlocked.CompareExchange(ref this._disposed, 0, 0)) { NativeNetif.memset(overlapped, 0, sizeof(NativeNetif.OVERLAPPED)); int nNumberOfBytesToRead = 0; if (!NativeNetif.ReadFile(this.Handle, buffer, MTU, ref nNumberOfBytesToRead, ref *overlapped)) { if (!NativeNetif.GetOverlappedResult(this.Handle, overlapped, ref nNumberOfBytesToRead, true)) { callback?.Invoke(buffer, ~0); break; } } callback?.Invoke(buffer, nNumberOfBytesToRead); } }
protected bool DeviceIoControl(uint commands, byte[] contents) { IntPtr hEvent = NativeNetif.CreateEvent(IntPtr.Zero, false, false, null); try { NativeNetif.OVERLAPPED overlapped = new NativeNetif.OVERLAPPED(); overlapped.hEvent = hEvent; uint dw = 0; uint content_size = 0; if (contents == null) { if (!NativeNetif.DeviceIoControl(this.Handle, commands, contents, 0, contents, 0, ref dw, ref overlapped)) { NativeNetif.WaitForSingleObject(hEvent, Timeout.Infinite); return(overlapped.Internal == NativeNetif.ERROR_SUCCESS); } } else { content_size = (uint)contents.Length; if (!NativeNetif.DeviceIoControl(this.Handle, commands, contents, content_size, contents, content_size, ref dw, ref overlapped)) { NativeNetif.WaitForSingleObject(hEvent, Timeout.Infinite); return(overlapped.Internal == NativeNetif.ERROR_SUCCESS); } } return(true); } finally { if (hEvent != IntPtr.Zero) { NativeNetif.CloseHandle(hEvent); } } }
private IntPtr OpenTunDev(string componentId) { string devName = $"\\\\.\\Global\\{componentId}.tap"; return(NativeNetif.OpenDrive(devName)); }
public static ISet <string> FindAllComponentId() { ISet <string> s = NativeNetif.FindAllComponentId(); return(s); }