-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathndisapi_io.go
114 lines (100 loc) · 2.77 KB
/
ndisapi_io.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//go:build windows
package ndisapi
import (
"unsafe"
)
const MaximumBlockNum = 10
const MaximumPacketBlock = 510
// EthernetPacket is a container for IntermediateBuffer pointer
// This structure can be extended in the future versions
type EthernetPacket struct {
Buffer *IntermediateBuffer
}
// EtherRequest used for passing the "read packet" request to driver
type EtherRequest struct {
AdapterHandle Handle
EthernetPacket EthernetPacket
}
// EtherMultiRequest used for passing the "read packet" request to driver
type EtherMultiRequest struct {
AdapterHandle Handle
PacketsNumber uint32
PacketsSuccess uint32
EthernetPackets [MaximumPacketBlock]EthernetPacket
}
// SendPacketToMstcp sends a packet to the MSTCP.
func (a *NdisApi) SendPacketToMstcp(packet *EtherRequest) error {
return a.DeviceIoControl(
IOCTL_NDISRD_SEND_PACKET_TO_MSTCP,
unsafe.Pointer(packet),
uint32(unsafe.Sizeof(EtherRequest{})),
nil,
0,
&a.bytesReturned,
nil,
)
}
// SendPacketToAdapter sends a packet to the network adapter.
func (a *NdisApi) SendPacketToAdapter(packet *EtherRequest) error {
return a.DeviceIoControl(
IOCTL_NDISRD_SEND_PACKET_TO_ADAPTER,
unsafe.Pointer(packet),
uint32(unsafe.Sizeof(EtherRequest{})),
nil,
0,
&a.bytesReturned,
nil,
)
}
// ReadPacket reads a packet from the Windows Packet Filter driver.
func (a *NdisApi) ReadPacket(packet *EtherRequest) bool {
size := uint32(unsafe.Sizeof(EtherRequest{}))
err := a.DeviceIoControl(
IOCTL_NDISRD_READ_PACKET,
unsafe.Pointer(packet),
size,
unsafe.Pointer(packet),
size,
nil,
nil,
)
return err != nil
}
// SendPacketsToMstcp sends multiple packets to the Microsoft TCP/IP stack.
func (a *NdisApi) SendPacketsToMstcp(packet *EtherMultiRequest) error {
return a.DeviceIoControl(
IOCTL_NDISRD_SEND_PACKETS_TO_MSTCP,
unsafe.Pointer(packet),
uint32(unsafe.Sizeof(EtherMultiRequest{}))+uint32(unsafe.Sizeof(EthernetPacket{}))*(packet.PacketsNumber-1),
nil,
0,
&a.bytesReturned,
nil,
)
}
// SendPacketsToAdapter sends multiple packets to the network adapter.
func (a *NdisApi) SendPacketsToAdapter(packet *EtherMultiRequest) error {
return a.DeviceIoControl(
IOCTL_NDISRD_SEND_PACKETS_TO_ADAPTER,
unsafe.Pointer(packet),
uint32(unsafe.Sizeof(EtherMultiRequest{}))+uint32(unsafe.Sizeof(EthernetPacket{}))*(packet.PacketsNumber-1),
nil,
0,
&a.bytesReturned,
nil,
)
}
// ReadPackets reads multiple packets from the network adapter.
func (a *NdisApi) ReadPackets(packet *EtherMultiRequest) bool {
size := uint32(unsafe.Sizeof(EtherMultiRequest{})) + uint32(unsafe.Sizeof(EthernetPacket{}))*(packet.PacketsNumber-1)
err := a.DeviceIoControl(
IOCTL_NDISRD_READ_PACKETS,
unsafe.Pointer(packet),
size,
unsafe.Pointer(packet),
size,
&a.bytesReturned,
nil,
)
return err != nil
}