go 调用winapi_Go调用Window SendARP() 方法
首先用了walk里面的一个winapi.go
// Copyright 2010 The go-winapi Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package winapi
import (
"runtime"
"syscall"
"unsafe"
)
func init() {
runtime.LockOSThread()
}
const (
S_OK = 0x00000000
S_FALSE = 0x00000001
E_UNEXPECTED = 0x8000FFFF
E_NOTIMPL = 0x80004001
E_OUTOFMEMORY = 0x8007000E
E_INVALIDARG = 0x80070057
E_NOINTERFACE = 0x80004002
E_POINTER = 0x80004003
E_HANDLE = 0x80070006
E_ABORT = 0x80004004
E_FAIL = 0x80004005
E_ACCESSDENIED = 0x80070005
E_PENDING = 0x8000000A
)
const (
FALSE = 0
TRUE = 1
)
type (
BOOL int32
HRESULT int32
)
type GUID struct {
Data1 uint32
Data2 uint16
Data3 uint16
Data4 [8]byte
}
func MustLoadLibrary(name string) uintptr {
lib, err := syscall.LoadLibrary(name)
if err != nil {
panic(err)
}
return uintptr(lib)
}
func MustGetProcAddress(lib uintptr, name string) uintptr {
addr, err := syscall.GetProcAddress(syscall.Handle(lib), name)
if err != nil {
panic(err)
}
return uintptr(addr)
}
func SUCCEEDED(hr HRESULT) bool {
return hr >= 0
}
func FAILED(hr HRESULT) bool {
return hr < 0
}
func MAKELONG(lo, hi uint16) uint32 {
return uint32(uint32(lo) | ((uint32(hi)) << 16))
}
func LOWORD(dw uint32) uint16 {
return uint16(dw)
}
func HIWORD(dw uint32) uint16 {
return uint16(dw >> 16 & 0xffff)
}
func UTF16PtrToString(s *uint16) string {
return syscall.UTF16ToString((*[1 << 29]uint16)(unsafe.Pointer(s))[0:])
}
func MAKEINTRESOURCE(id uintptr) *uint16 {
return (*uint16)(unsafe.Pointer(id))
}
func BoolToBOOL(value bool) BOOL {
if value {
return 1
}
return 0
}
具体的SendARP实现
package winapi
import (
"syscall"
"unsafe"
)
var (
// Library
libIphlpapi uintptr
libWs2_32 uintptr
// Functions
sendARP uintptr
inet_addr uintptr
)
func init() {
// library
libIphlpapi = MustLoadLibrary("Iphlpapi.dll")
libWs2_32 = MustLoadLibrary("Ws2_32.dll")
// Functions
/** SendARP(DestIp IPAddr, SrcIp IPAddr, &MacAddr, &PhysAddrLen ULONG) **/
sendARP = MustGetProcAddress(libIphlpapi, "SendARP")
inet_addr = MustGetProcAddress(libWs2_32, "inet_addr")
}
/**
* macAddr是目标的MAC地址
*/
func SendARP(destIP, srcIP int32, macAddr *int64, physAddrLen *int) int {
ret, _, _ := syscall.Syscall6(sendARP, 4,
uintptr(destIP),
uintptr(srcIP),
uintptr(unsafe.Pointer(macAddr)),
uintptr(unsafe.Pointer(physAddrLen)),
0,
0)
return int(ret)
}
func Inet_addr(ipaddr string) (result int32) {
ret, _, _ := syscall.Syscall(inet_addr, 1, // 1表示有一个参数
uintptr(unsafe.Pointer(syscall.StringBytePtr(ipaddr))),
0,
0)
return int32(ret)
}
调用
package main
import (
"lqz/system/winapi"
// "strconv"
// "strings"
// "os"
"log"
"fmt"
)
func main() {
for i := 1; i <= 100; i++ {
getMac(fmt.Sprintf("192.168.2.%d", i))
}
}
func getMac(ip string) {
var macLen int = 6
var mac int64 = 0
destIP := winapi.Inet_addr(ip)
result := winapi.SendARP(destIP, 0, &mac, &macLen)
if result == 0 {
log.Print(ip)
pyMac := fmt.Sprintf("%012X", mac)
x := 2 * macLen
var tempMac string
for i := 0; i < macLen; i++ {
if i == (macLen - 1) {
tempMac = tempMac + pyMac[x-2:x]
} else {
tempMac = tempMac + pyMac[x-2:x] + "-"
}
x -= 2
}
log.Println(tempMac)
}
}
感觉还有点缺陷,比如说那个0, 应该在上面定义好的,但是我不知道这个面的值,都表示什么意思,只知道0是NOERROR,还有其他信息,但是我看MSDN上面的SendARP里面没有给出值,这个以后补上
go 调用winapi_Go调用Window SendARP() 方法相关推荐
- html 两个iframe重叠,解决同一页面中两个iframe互相调用jquery,js函数的方法
这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: b.html中有一个treeview,称为左菜单i ...
- 通过setTimeout调用设置iframe src的方法导致刷新页面时弹出没有权限错误!
通过setTimeout调用设置iframe src的方法导致刷新页面时弹出没有权限错误! 如下: Html代码 <iframe tabindex="4" id=" ...
- html调用父页面的函数,js调用父框架函数与弹窗调用父页面函数的方法
调用父级中的 aaa的函数 子页面中: οnclick="window.parent.frames.aaa()" 父页面中: function aaa() { alert('bbb ...
- Android调用相机与相册的方法
Android调用相机与相册的方法 操作流程 点击拍摄 效果图 点击相册选择 效果图 拒绝权限的情况 效果图 功能实现 项目配置 1.先在项目根目录的build.gradle的repositories ...
- C# WPF 调用打印机的两种方法
C# WPF 调用打印机的两种方法 最近在调试打印机,为了方便测试写了一个小demo.为了更好的判断是打印机硬件的问题还是动态库的问题,设定了定时器不间断打印来进行测试.现来分享记录一下. 需要调用两 ...
- 子页面调用父页面的js方法或参数(iframe.contentWindow)
子页面调用父页面的js方法或参数 子页面调用父页面的参数 父页面调用子页面的参数或方法 相关链接 子页面调用父页面的参数 window.parent.aa();//调取aa函数 window.pare ...
- 为什么静态方法无法直接调用非静态成员变量和方法
静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于 ...
- 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】
C#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要 ...
- 织梦 PHP 字段 调用,织梦dede网站内容模型普通文章调用自定义图片字段的方法(和调用...
织梦DedeCMS网站内容模型普通文章调用自定义图片字段的方法: 我们首先需要创建一个自定义函数, 找到:/include/extend.func.php ,在 function GetOneImgU ...
最新文章
- 《评人工智能如何走向新阶段》后记
- Python学习之解决python下载第三方依赖速度慢的问题
- 雷林鹏分享:PHP 5 时区
- Server Too Busy
- 关于KVM的几篇细节文档
- QT中关于窗口全屏显示与退出全屏的实现
- SVN cleanup 反复失败解决办法
- 【网站建设】简单一行代码,为网站开启深色模式支持
- w3cschool oracle,AJAX 数据库 | w3cschool菜鸟教程
- 计算机网络应用基础_2020年天津市成人高考 高起专 计算机基础题型总结
- Struts2的学习-属性驱动和模型驱动
- smarty 缓存用法简述(转)
- php小h站视频系统源码,苹果cms v10x 原创自适应x站h站源码 视频模板 带试看功能 带自动采集YM源码...
- 火力发电行业三大知识图谱应用场景,助力火力发电厂清洁高效智慧化运营
- 数据仓库ETL工具箱——简介
- android 导航栏动画,使用Lottie动画实现底部导航栏
- 安氏图书报刊发行管理软件[酷软推荐]
- PyTorch笔记【1】---A卡安装(RX580)无果后,改为N卡(2070)安装。这年头就不要用CPU了来搞AI了
- anaconda+pycharm安装
- 手机空间不足?教你2招省5G空间
热门文章
- mysql分库分表中间件6_当当开源sharding-jdbc,轻量级数据库分库分表中间件
- omv检查硬盘坏道_关于怎么用MHDD修复硬盘坏道
- 助力企业高效率办公,华为云桌面必不可少
- 生成短的8位UUID(C#+JAVA)
- Arduino IDE安装UNO和NANO开发板驱动教程(CH341SER.EXE)
- 汽车二自由度相关数学表达式(持续更新)
- 2021中国各省区块链政策竞争力指数TOP10(3月)|链塔月榜
- CLRS 1.1算法
- 【JAVA程序设计】(C00043)基于SSM非maven的人事管理系统
- 剑指offer刷题:javaHZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解