Option Explicit
Public Const NCBASTAT
As Long = &H33
Public Const NCBNAMSZ
As Long = 16
Public Const HEAP_ZERO_MEMORY
As Long = &H8
Public Const HEAP_GENERATE_EXCEPTIONS
As Long = &H4
Public Const NCBRESET
As Long = &H32
Public Type NET_CONTROL_BLOCK
'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
Public 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
Public Type NAME_BUFFER
name
As String * NCBNAMSZ
name_num
As Integer
name_flags
As Integer
End Type
Public Type ASTAT
adapt
As ADAPTER_STATUS
NameBuff(30)
As NAME_BUFFER
End Type
Public Declare Function Netbios
Lib "netapi32.dll" _
 
pncb
As NET_CONTROL_BLOCK)
As Byte
Public Declare Sub CopyMemory
Lib "kernel32"
Alias "RtlMoveMemory" _
 
hpvDest
As Any,
ByVal _
hpvSource
As Long,
ByVal _
cbCopy
As Long)
Public Declare Function GetProcessHeap
Lib "kernel32" ()
As Long
Public Declare Function HeapAlloc
Lib "kernel32" _
 
ByVal hHeap
As Long,
ByVal dwFlags
As Long, _
ByVal dwBytes
As Long)
As Long
Public Declare Function HeapFree
Lib "kernel32" _
 
ByVal hHeap
As Long, _
ByVal dwFlags
As Long, _
lpMem
As Any)
As Long
Public Function GetMACAddress()
As String
'запрашиваем MAC Адрес для сетевой карты
'возвращаем форматированную строку
Dim tmp
As String
Dim pASTAT
As Long
Dim NCB
As NET_CONTROL_BLOCK
Dim AST
As ASTAT
NCB.ncb_command = NCBRESET
Call Netbios(NCB)
'Для получения Media Access Control (MAC) адреса для сетевой карты
'программным путём, используется команда Netbios() -
'NCBASTAT с именем "*" в поле NCB.ncb_CallName (в 16-символьной строке).
NCB.ncb_callname = "* "
NCB.ncb_command = NCBASTAT
'Для машин с несколькими сетевыми картами Вам необходимо использовать
'номер LANA и выполнять команду NCBASTAT для каждого. LANA номер 0 всегда
'соответствует первому сетевому адаптеру. Конечно можно использовать LANA номер
'и для одного сетевого адаптера, но это будет считаться как неэффективное
'программирование.
NCB.ncb_lana_num = 0
NCB.ncb_length =
Len(AST)
pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS _
Or HEAP_ZERO_MEMORY, NCB.ncb_length)
If pASTAT = 0
Then
Debug.
Print "memory allocation failed!"
Exit Function
End If
NCB.ncb_buffer = pASTAT
Call Netbios(NCB)
CopyMemory AST, NCB.ncb_buffer,
Len(AST)
tmp = Format$(Hex(AST.adapt.adapter_address(0)), "00"
& " " & _
Format$(Hex(AST.adapt.adapter_address(1)), "00"
& " " & _
Format$(Hex(AST.adapt.adapter_address(2)), "00"
& " " & _
Format$(Hex(AST.adapt.adapter_address(3)), "00"
& " " & _
Format$(Hex(AST.adapt.adapter_address(4)), "00"
& " " & _
Format$(Hex(AST.adapt.adapter_address(5)), "00"
HeapFree GetProcessHeap(), 0, pASTAT
GetMACAddress = tmp
End Function