GetNetBios




Private Const NAME_FLAGS_MASK = &H87
Private Const GROUP_NAME = &H80
Private Const UNIQUE_NAME = &H0
Private Const REGISTERING = &H0
Private Const REGISTERED = &H4
Private Const DEREGISTERED = &H5
Private Const DUPLICATE = &H6
Private Const DUPLICATE_DEREG = &H7

Private Type NTWRKCNTRLBLCK
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(0 To 15) As Byte
ncb_name(0 To 15) As Byte
ncb_rto As Byte
ncb_sto As Byte
lpFunc As Long
ncb_lana_num As Byte
ncb_cmd_cplt As Byte
ncb_reserve(0 To 9) As Byte
ncb_event As Long
End Type

Private Type LANA_ENUM
length As Byte
lana(0 To 256) As Byte
End Type

Private Type ADAPTER_STATUS
adapter_address(0 To 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_(0 To 15) As Byte
name_num As Byte
name_flags As Byte
End Type

Private Type NET_STATUS
Adapter As ADAPTER_STATUS
NameBuffer(30) As NAME_BUFFER
End Type

Private Const NCBENUM = &H37
Private Const NCBRESET = &H32
Private Const NCBASTAT = &H33

Private Declare Function NetBios Lib "netapi32.dll" _
Alias "Netbios"(ByRef pncb As NTWRKCNTRLBLCK) As Byte

Private Declare Function VarPtr Lib "MSVBVM50.DLL" _
(pVoid As Any) As Long

Private Function GetMacAddr() As String
Dim NCB As NTWRKCNTRLBLCK, Status As NET_STATUS, LanEnum As
LANA_ENUM
Dim bReturn As Byte, sMacAddress As String, i As Integer, sHex As
String, l%
Dim k%, iNumNames%, j%, m%, sName$, sBuff$, iPos%, nFlags%
NCB.ncb_command = NCBENUM
NCB.ncb_buffer = VarPtr(LanEnum)
NCB.ncb_length = LenB(LanEnum)
bReturn = NetBios(NCB)
sBuff = ""
l = LanEnum.length
If l > 0 Then
For k = 0 To l
NCB.ncb_command = NCBRESET
NCB.ncb_lana_num = LanEnum.lana(k)
bReturn = NetBios(NCB)

NCB.ncb_command = NCBASTAT
NCB.ncb_lana_num = LanEnum.lana(k)
'Numero massimo di sessioni = 42

NCB.ncb_callname(0) = 42
For i = 1 To 14
'Numero massimo di sessioni = 32

NCB.ncb_callname(i) = 32
32, Use NAME_NUMBER_1
Next i
NCB.ncb_callname(15) = 0
NCB.ncb_buffer = VarPtr(Status)
NCB.ncb_length = LenB(Status)
bReturn = NetBios(NCB)
sBuff = sBuff & "Network #" & Hex$(k) & vbCrLf & Chr$(9)
sMacAddress = ""
For i = 0 To 5
sHex = Hex(Status.Adapter.adapter_address(i))
If Len(sHex) = 1 Then sHex = "0" & sHex
sMacAddress = sMacAddress & sHex
If i <> 5 Then sMacAddress = sMacAddress + "-"
Next i
sBuff = sBuff & "Mac Address = " & UCase(sMacAddress) &
vbCrLf & Chr$(9)
sBuff = sBuff & "Adapter Type = " &
Hex$(Status.Adapter.adapter_type) & vbCrLf & Chr$(9)
iNumNames = Status.Adapter.name_count
sBuff = sBuff & "Name Count = " & Hex$(iNumNames) & vbCrLf & Chr$(9)
If iNumNames > 0 Then
For j = 0 To iNumNames - 1
sName = ""
For m = 0 To 15
sName = sName &
Chr$(Status.NameBuffer(j).name_(m))
Next m
iPos = InStr(sName, Chr$(0))
If iPos Then sName = Left$(sName, iPos - 1)
sName = Trim$(sName)
nFlags = Status.NameBuffer(j).name_flags
If (nFlags And GROUP_NAME) = GROUP_NAME Then
sBuff = sBuff & "WorkGroup Name is #" &
Hex$(j + 1) & " = " & sName & vbCrLf & Chr$(9) & Chr$(9)
Else
sBuff = sBuff & "Name #" & Hex$(j + 1) &
" = " & sName & vbCrLf & Chr$(9) & Chr$(9)
End If
sBuff = sBuff & "Name Flags = " &
Hex$(nFlags) & vbCrLf & Chr$(9)
Next j
Else
sBuff = sBuff & "No Names" & vbCrLf & Chr$(9)
End If
sBuff = sBuff & vbCrLf
Next k
End If
GetMacAddr = sBuff
End Function

Private Sub Command1_Click()
Text1 = GetMacAddr()
End Sub











( getnetbios.html )- by Paolo Puglisi - Modifica del 17/12/2023