26285 total geeks with 3498 solutions
Recent challengers:
 Welcome, you are an anonymous user! [register] [login] Get a yourname@osix.net email address 

Articles

GEEK

User's box
Username:
Password:

Forgot password?
New account

Shoutbox
MaxMouse
It's Friday... That's good enough for me!
CodeX
non stop lolz here but thats soon to end thanks to uni, surely the rest of the world is going good?
stabat
how things are going guys? Here... boring...
CodeX
I must be going wrong on the password lengths then, as long as it was done on ECB
MaxMouse
lol... the key is in hex (MD5: of the string "doit" without the "'s) and is in lower case. Maybe i should have submitted this as a challenge!

Donate
Donate and help us fund new challenges
Donate!
Due Date: May 31
May Goal: $40.00
Gross: $0.00
Net Balance: $0.00
Left to go: $40.00
Contributors


News Feeds
The Register
New Big Blue UK,
Ireland exec to
give kiss o" life
to server sales
Smartwatch face
off: Pebble,
MetaWatch and the
new hi-tech
timepieces
EU boffins in plan
for "more
nutritious"
horsemeat ice cream
The bunker at the
end of the world -
in Essex
Camby cash
crypto-coders
Cronto chomped on
pronto by Vasco
Facebook teens"
kimonos - basically
never closed
Attention large
Linux workloads
HTC woes prompts
"leave now" tweet
from former staffer
Japan uses big data
to map cultural
climate change
WW II U-boat
attacks prompt new
US response
Slashdot
Ask Slashdot:
Moving From
Contract Developers
To Hiring One
In-House?
Quadcopter Drone
Network Will
Transport Supplies
For Disaster Relief
Congressional
Report: US Power
Grid Highly
Vulnerable To
Cyberattack
Google Chrome 27 Is
Out: 5% Faster Page
Loads
Special Ops Takes
Its Manhunts Into
Space
Aurora Attackers
Were Looking For
Google"s
Surveillance
Database
Dart Is Not the
Language You Think
It Is
EPA Makes a Rad
Decision
Ask Slashdot: Can
Yahoo Actually
Stage a Comeback?
3-D Printable Food
Gets Funding From
NASA
Article viewer

Getting the Network Card MAC Address



Written by:dimport
Published by:Nightscript
Published on:2003-06-21 07:19:46
Topic:Visual Basic
Search OSI about Visual Basic.More articles by dimport.
 viewed 52823 times send this article printer friendly

Digg this!
    Rate this article :
The Network card MAC address is a uniquely assigned code hardcoded into your network card. The value is used by networks when transmitting information between sources

Here's how you get access to it from Visual Basic

Simply create a new VB6 project, add a new module and cut and paste the code below into the module.

Then use the function GetMACAddress() to obtain the string value for the Network card MAC Address

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 'retrieve the MAC Address for the network controller
  'installed, returning a formatted string
  
   Dim tmp As String
   Dim pASTAT As Long
   Dim NCB As NET_CONTROL_BLOCK
   Dim AST As ASTAT 'The IBM NetBIOS 3.0 specifications defines four basic
  'NetBIOS environments under the NCBRESET command. Win32
  'follows the OS/2 Dynamic Link Routine (DLR) environment.
  'This means that the first NCB issued by an application
  'must be a NCBRESET, with the exception of NCBENUM.
  'The Windows NT implementation differs from the IBM
  'NetBIOS 3.0 specifications in the NCB_CALLNAME field.
   NCB.ncb_command = NCBRESET
   Call Netbios(NCB)
  
  'To get the Media Access Control (MAC) address for an
  'ethernet adapter programmatically, use the Netbios()
  'NCBASTAT command and provide a "*" as the name in the
  'NCB.ncb_CallName field (in a 16-chr string).
   NCB.ncb_callname = "* "
   NCB.ncb_command = NCBASTAT
  
  'For machines with multiple network adapters you need to
  'enumerate the LANA numbers and perform the NCBASTAT
  'command on each. Even when you have a single network
  'adapter, it is a good idea to enumerate valid LANA numbers
  'first and perform the NCBASTAT on one of the valid LANA
  'numbers. It is considered bad programming to hardcode the
  'LANA number to 0 (see the comments section below).
   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

This article was originally written by barnseyboy

Did you like this article? There are hundreds more.

Comments:
Anonymous
2006-12-27 09:03:14
VERY GOOD~! IT WORKS PERFECTLY~!!
my os is xp pro , it works perfectly.
thanks a lot
Anonymous
2007-02-10 09:39:21
A wonderful program. Thanks a lot.
True it requires some small corrections, at least on Windows 2000, like use &H33 instead of H33, but it's not a big deal.
Anonymous
2007-07-11 11:24:17
Thank for the code but there are few errors. The following is the corrected code which can work on Win 2000 Server & Win Server 2003:

Option Explicit

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 tmp, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7
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 'retrieve the MAC Address for the network controller
'installed, returning a formatted string

Dim tmp As String
Dim pASTAT As Long
Dim NCB As NET_CONTROL_BLOCK
Dim AST As ASTAT 'The IBM NetBIOS 3.0 specifications defines four basic
'NetBIOS environments under the NCBRESET command. Win32
'follows the OS/2 Dynamic Link Routine (DLR) environment.
'This means that the first NCB issued by an application
'must be a NCBRESET, with the exception of NCBENUM.
'The Windows NT implementation differs from the IBM
'NetBIOS 3.0 specifications in the NCB_CALLNAME field.
NCB.ncb_command = NCBRESET
Call Netbios(NCB)

'To get the Media Access Control (MAC) address for an
'ethernet adapter programmatically, use the Netbios()
'NCBASTAT command and provide a "*" as the name in the
'NCB.ncb_CallName field (in a 16-chr string).
NCB.ncb_callname = "* "
NCB.ncb_command = NCBASTAT

'For machines with multiple network adapters you need to
'enumerate the LANA numbers and perform the NCBASTAT
'command on each. Even when you have a single network
'adapter, it is a good idea to enumerate valid LANA numbers
'first and perform the NCBASTAT on one of the valid LANA
'numbers. It is considered bad programming to hardcode the
'LANA number to 0 (see the comments section below).
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)

tmp1 = Format$(Hex(AST.adapt.adapter_address(0)), "00") & " "
tmp2 = Format$(Hex(AST.adapt.adapter_address(1)), "00") & " "
tmp3 = Format$(Hex(AST.adapt.adapter_address(2)), "00") & " "
tmp4 = Format$(Hex(AST.adapt.adapter_address(3)), "00") & " "
tmp5 = Format$(Hex(AST.adapt.adapter_address(4)), "00") & " "
tmp6 = Format$(Hex(AST.adapt.adapter_address(5)), "00")
tmp = tmp1 & " " & tmp2 & " " & tmp3 & " " & tmp4 & " " & tmp5 & " " & tmp6
HeapFree GetProcessHeap(), 0, pASTAT

GetMACAddress = tmp

End Function


Anonymous
2007-10-03 21:07:06
>> This article was originally written by barnseyboy

jajajaja
This thing it's belongs to microsoft... jjajajaja
http://support.microsoft.com/kb/175472

What a thief!!!! that barnseyboy!!!
Anonymous
2007-10-15 19:07:20
The updated version works perfectly in VBA as well.
Anonymous
2007-12-01 18:49:42
The revised code produces the right MAC on three of my newest PCs (all Vista) but produces all zeros on my older XP boxes. Anybody understand why?
Anonymous
2007-12-10 19:55:48
Worked both in XP-SP2 and in Wine on Ubuntu. Excellent.
Anonymous
2007-12-11 09:24:39
To elaborate on my post above from yesterday - I have now found that it does NOT work on some other machines, so the truth is that this NetBIOS call IS unreliable. Have a look at http://www.codeguru.com/vb/gen/vb_system/network/article.php/c10887/ the GetIfTable method there has worked on all machines I've tested so far, including Wine - but the GetAdaptersInfo method did not work on Wine.
Anonymous
2008-10-07 16:06:05
Perfect !!

Thanks a lot
Anonymous
2009-01-07 15:12:27
It causes a memory leak when HeapFree GetProcessHeap(), 0, pASTAT is executed in Windows Vista
Anonymous
2009-05-18 22:50:38
I TEST CODE, WORK'S OK, BUT THIS ORIGINALY,FROM MICROSOFT.COM, ON MSDN LIBRARY, GOOD CODES, AND OTHERS LOOK ATHAT, FOR REPLY ANY ANSWERS
Anonymous
2009-06-26 09:01:05
THANKS! CODE WORKS FINE WITH WIN XP SP1,SP2;WINDOWS SERVER 2003 BUT RETURNS STRING "00 00 00 00 00 00" WHEN TRID ON WIN VISTA HOME BASIC
Anonymous
2009-08-18 13:44:55
I like the and when i try it work well for my work and make me relax in much matters i was here when i was looking for some good stuff on small business web hosting services along with the ecommerce hosting services at affordable price, previously i was using chap packages of hosting reseller services which are affordable and easy to use but one thing i must say that i like your work as you have done great job, i would love come here again.
Anonymous
2009-10-05 22:04:37
I tested this code too, its working fine.
dirt bike games
Anonymous
2009-11-21 20:47:12
I gave it a try in our pet meds site and it worked like a charm. Thanks.
Anonymous
2010-03-08 18:18:01
This is a create solution to an issue I kept getting, but just couldn't get my head around, so thanks! Much better for my business site and Business Web Hosting to be working correctly!
Prinkis
2011-04-11 23:31:16
Write Vb program to perform simple register
ObatAsamUrat
2011-06-16 07:11:18
Very good morning! Did you know whenever they create just about any jacks to help you using Search engine optimisation? I am just trying to find our blog site to rate for a lot of precise search phrases nevertheless That's not me discovering good results. Once you know from a remember to talk about. Well done!
kaos distro
Anonymously add a comment: (or register here)
(registration is really fast and we send you no spam)
BB Code is enabled.
Captcha Number:


Test Yourself: (why not try testing your skill on this subject? Clicking the link will start the test.)
VB Potpourri: Programming, History And Syntax by batterseapower

A nice little collection of the basics of Visual Basic.
Advanced Programming Techniques by batterseapower

A fiendish test covering some of the more obscure elements of Visual Basic 6.


     
Your Ad Here
 
Copyright Open Source Institute, 2006