示例#1
0
 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);
     }
 }
示例#2
0
 private void CloseTunDev(IntPtr handle)
 {
     if (handle != IntPtr.Zero)
     {
         NativeNetif.CloseHandle(handle);
     }
 }
示例#3
0
 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);
     }
 }
示例#4
0
        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);
                }
            }
        }
示例#5
0
        private IntPtr OpenTunDev(string componentId)
        {
            string devName = $"\\\\.\\Global\\{componentId}.tap";

            return(NativeNetif.OpenDrive(devName));
        }
示例#6
0
        public static ISet <string> FindAllComponentId()
        {
            ISet <string> s = NativeNetif.FindAllComponentId();

            return(s);
        }