func (t *Interface) Write(ch chan []byte) (err error) { tx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } tx.HEvent = syscall.Handle(hevent) for { select { case data := <-ch: var l uint32 syscall.WriteFile(t.file, data, &l, &tx) syscall.WaitForSingleObject(tx.HEvent, syscall.INFINITE) tx.Offset += uint32(len(data)) } } }
func (t *tun) Read(ch chan []byte) (err error) { overlappedRx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } overlappedRx.HEvent = syscall.Handle(hevent) buf := make([]byte, t.mtu) var l uint32 for { if err := syscall.ReadFile(t.fd, buf, &l, &overlappedRx); err != nil { } if _, err := syscall.WaitForSingleObject(overlappedRx.HEvent, syscall.INFINITE); err != nil { fmt.Println(err) } overlappedRx.Offset += l totalLen := 0 switch buf[0] & 0xf0 { case 0x40: totalLen = 256*int(buf[2]) + int(buf[3]) case 0x60: continue totalLen = 256*int(buf[4]) + int(buf[5]) + IPv6_HEADER_LENGTH } fmt.Println("read data", buf[:totalLen]) send := make([]byte, totalLen) copy(send, buf) ch <- send } }
func newOverlapped() (*syscall.Overlapped, error) { var overlapped syscall.Overlapped r, _, err := syscall.Syscall6(nCreateEvent, 4, 0, 1, 0, 0, 0, 0) if r == 0 { return nil, err } overlapped.HEvent = syscall.Handle(r) return &overlapped, nil }
func (t *Interface) Read(ch chan []byte) (err error) { rx := syscall.Overlapped{} var hevent windows.Handle hevent, err = windows.CreateEvent(nil, 0, 0, nil) if err != nil { return } rx.HEvent = syscall.Handle(hevent) buf := make([]byte, 1500) var l uint32 for { if err := syscall.ReadFile(t.file, buf, &l, &rx); err != nil { } if _, err := syscall.WaitForSingleObject(rx.HEvent, syscall.INFINITE); err != nil { Log(Error, "Failed to read from TUN/TAP: %v", err) } rx.Offset += l ch <- buf } }
func (p *dev) Read(buf []byte) (int, error) { var done uint32 for { var ov syscall.Overlapped ov.HEvent = p.ev.r if e := syscall.ReadFile(p.fd, buf, &done, &ov); e != nil { if e != syscall.ERROR_IO_PENDING { return 0, &os.PathError{"reading from", p.name, e} } if e = win.GetOverlappedResult(p.fd, &ov, &done, 1); e != nil { return 0, &os.PathError{"reading from", p.name, e} } } if done > 0 { break } } return int(done), nil }