如何用API函数NetBios来获得网卡物理地址的。

IT-司马青衫
壹号网络官方账号
2003-01-22 07:50:38
up
...全文
380 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tedtion 2010-06-02
  • 打赏
  • 举报
回复
感谢 songhtao ,获取mac的函数很好用,很方便!
warton 2003-01-22
  • 打赏
  • 举报
回复
哈哈!!
TR@SOE() 你是不是小愉,是的话我就抓你了,我是警察!!!哈哈!!!
kingkee 2003-01-22
  • 打赏
  • 举报
回复
我接接分!
sydt 2003-01-22
  • 打赏
  • 举报
回复
学习!继续!!!
痞子酷 2003-01-22
  • 打赏
  • 举报
回复
问题解决,接分!!!!
我要倒分!!!!!!!!!!!!!
我不懂电脑 2003-01-22
  • 打赏
  • 举报
回复
#include <nb30.h>
//网卡信息
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;

AnsiString __fastcall GetNetMacAddress()
{
AnsiString msg="";
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
LANA_ENUM lana_enum;

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBENUM;

ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(lana_enum);

uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
NCB ncb;
UCHAR uRetCode;

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[0];

Netbios( &ncb );

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[0]; // 指定网卡号

strcpy( (char *)ncb.ncb_callname,"* " );
ncb.ncb_buffer = (unsigned char *) &Adapter;

ncb.ncb_length = sizeof(Adapter);

uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
msg.sprintf("%02X%02X%02X%02X%02X%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]);
}
}
return msg;
}
TR@SOE 2003-01-22
  • 打赏
  • 举报
回复
shak,你是bigwhiteshark的马甲吗?
shak 2003-01-22
  • 打赏
  • 举报
回复
//Get MAC Address
//Proto: bool MAC(char *Mac);
//return: true if success and Mac is MAC address,
// false if fail.
//
bool MAC(char *Mac)
{
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, *PASTAT;

ASTAT Adapter;

NCB ncb;
UCHAR uRetCode;
char tmp[40];
Mac[0]='\0';
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios( &ncb );
if (uRetCode!=0)
{
strcat(Mac,"Init Error!");
return false;
}
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
strcpy((char *)ncb.ncb_callname, "* " );//这个"*"代表获得本机网卡地址,换成IP地址就可以获得局域网内其他机器的网卡地址。

ncb.ncb_buffer =(unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);

uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
for(int i=0;i<6;i++)
{
sprintf(tmp,"%02X ",(int)Adapter.adapt.adapter_address[i]);
strcat(Mac,tmp);
}
sprintf(tmp," Software: %d.%d",Adapter.adapt.rev_major,Adapter.adapt.rev_minor);
strcat(Mac,tmp);
return true;
}
else
{
strcat(Mac,"Unknown.");
return false;
}
}


还有一个VB编写的,原理是一样的。

Option Explicit
' 取得网卡以太地址
' 将下面这段代码拷贝到程序中,然后在你的程序需要的时候调用EthernetAddress(0),该函数返回的字符串就是您机器上网卡的以太序列号。
Private Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32
Private Type NCB
ncb_command As Byte
ncb_retcode As Byte
ncb_lsn As Byte
ncb_num As Byte
ncb_buffer As Long
ncb_length As Integer
ncb_callname As String * NCBNAMSZ
ncb_name As String * NCBNAMSZ
ncb_rto As Byte
ncb_sto As Byte
ncb_post As Long
ncb_lana_num As Byte
ncb_cmd_cplt As Byte
ncb_reserve(9) As Byte ' Reserved, must be 0
ncb_event As Long
End Type
Private Type ADAPTER_STATUS
adapter_address(5) As Byte
rev_major As Byte
reserved0 As Byte
adapter_type As Byte
rev_minor As Byte
duration As Integer
frmr_recv As Integer
frmr_xmit As Integer
iframe_recv_err As Integer
xmit_aborts As Integer
xmit_success As Long
recv_success As Long
iframe_xmit_err As Integer
recv_buff_unavail As Integer
t1_timeouts As Integer
ti_timeouts As Integer
Reserved1 As Long
free_ncbs As Integer
max_cfg_ncbs As Integer
max_ncbs As Integer
xmit_buf_unavail As Integer
max_dgram_size As Integer
pending_sess As Integer
max_cfg_sess As Integer
max_sess As Integer
max_sess_pkt_size As Integer
name_count As Integer
End Type
Private Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type
Private Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type
Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long,
ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long,
ByVal dwFlags As Long, lpMem As Any) As Long

Private Function EthernetAddress(LanaNumber As Long) As String
Dim udtNCB As NCB
Dim bytResponse As Byte
Dim udtASTAT As ASTAT
Dim udtTempASTAT As ASTAT
Dim lngASTAT As Long
Dim strOut As String
Dim x As Integer
udtNCB.ncb_command = NCBRESET
bytResponse = Netbios(udtNCB)
udtNCB.ncb_command = NCBASTAT
udtNCB.ncb_lana_num = LanaNumber
udtNCB.ncb_callname = "* "
udtNCB.ncb_length = Len(udtASTAT)
lngASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or
HEAP_ZERO_MEMORY, udtNCB.ncb_length)
strOut = ""
If lngASTAT Then
udtNCB.ncb_buffer = lngASTAT
bytResponse = Netbios(udtNCB)
CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
With udtASTAT.adapt
For x = 0 To 5
strOut = strOut & Right$("00" & Hex$(.adapter_address(x)), 2)
Next x
End With
HeapFree GetProcessHeap(), 0, lngASTAT
End If
EthernetAddress = strOut
End Function

Private Sub Form_Click()
Me.Caption = EthernetAddress(0)
End Sub

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧