42. FAQ o Win API

Q> How to learn MAC the network interface card address? 
A> 

 Вариант1:  

 From: Sergey Gazimagomedov 2:453/11.13      

To me it was necessary МАС адpес so I received it, using NetBIOS. 
You add name NetBIOS and you send addressed to the station necessary for опpеделения (it is possible 
And the) датагpамный a packet with filled NCB. 
Here a source code of my function for опpеделения МАС адpеса. 

 UCHAR MYLIBAPI GetAdapterID (char *Name,//NetBIOS a station name 
                                UINT lana_num,  
                                CARDID *ID)//6 byte array 
{ 
UCHAR rc = 0; 
UCHAR Status [256]; 

  while (lstrlen (Name) - 15) 
         lstrcat (Name, ""); 

  memset (&SNcb, 0, sizeof (NCB)); 
  SNcb.ncb_command = NCBASTAT; 
  SNcb.ncb_buffer = (LPSTR) Status; 
  SNcb.ncb_length = 256; 
  lstrcpy (SNcb.ncb_callname, Name); 
  SNcb.ncb_lana_num = lana_num; 
  rc = Netbios (&SNcb); 
  if (rc == 0) { 
        memcpy (ID, Status, 6); 
      }
  return (SNcb.ncb_cmd_cplt); 
 }

It under Win32. Certainly there should be пpотокол NetBIOS, but it in фоpточках and so 
It is necessary. 

 Вариант2: 

 From: Alexey Grachyov <rook@relex.ru>   

#include <windows.h> 
#include <winsock.h> 
#include <wsipx.h> 
#include <wsnwlink.h> 
#include <stdio.h> 

void main () 
{ 
int iAdapters, iOpt=sizeof (iAdapters), iSize=sizeof (SOCKADDR_IPX); 
SOCKET skNum; 
SOCKADDR_IPX Addr; 
WSADATA Wsa; 

if (WSAStartup (0x0101,&Wsa)) return; 
if ((skNum=socket (AF_IPX, SOCK_DGRAM, NSPROTO_IPX))! =INVALID_SOCKET) 
   { 
   memset (&Addr,0,sizeof (Addr)); 
   Addr.sa_family=AF_IPX; 
   if (bind (skNum, (SOCKADDR *) &Addr,iSize)! =SOCKET_ERROR) 
      { 
      if (getsockopt (skNum, NSPROTO_IPX, IPX_MAX_ADAPTER_NUM, 
                    (char *) &iAdapters,&iOpt)! =SOCKET_ERROR) 
         { 
         while (iAdapters) 
            { 
            IPX_ADDRESS_DATA Data; 
            memset (&Data,0,sizeof (Data)); 
            Data.adapternum=iAdapters-1; 
            iOpt=sizeof (Data); 
            if (getsockopt (skNum, NSPROTO_IPX, IPX_ADDRESS, (char 
*)&Data,&iOpt)! =SOCKET_ERROR) 
               { 
               printf ("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X \n", 
               (int) Data.netnum [0], (int) Data.netnum [1], (int) Data.netnum [2], 
               (int) Data.netnum [3], (int) Data.netnum [4], (int) Data.netnum [5], 
               (int) Data.netnum [6], (int) Data.netnum [7], (int) Data.netnum [8], 
               (int) Data.netnum [9]); 
               }
            iAdapters-; 
            }
         }
      }
   closesocket (skNum); 
   }
WSACleanup (); 
}

 Вариант3: 

 From: MSDN 

   #include <windows.h> 
   #include <wincon.h> 
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <time.h> 

   typedef struct _ASTAT_ 
   { 
      ADAPTER_STATUS adapt; 
      NAME_BUFFER NameBuff [30]; 
   }ASTAT, * PASTAT; 

   ASTAT Adapter; 

   void main (void) 
   { 
      NCB Ncb; 
      UCHAR uRetCode; 
      char NetName [50]; 

      memset (&Ncb, 0, sizeof (Ncb)); 
      Ncb.ncb_command = NCBRESET; 
      Ncb.ncb_lana_num = 0; 

      uRetCode = Netbios (&Ncb); 
      printf ("The NCBRESET return code is: 0x%x \n", uRetCode); 

      memset (&Ncb, 0, sizeof (Ncb)); 
      Ncb.ncb_command = NCBASTAT; 
      Ncb.ncb_lana_num = 0; 

      strcpy (Ncb.ncb_callname, "*"); 
      Ncb.ncb_buffer = (char *) &Adapter; 
      Ncb.ncb_length = sizeof (Adapter); 

      uRetCode = Netbios (&Ncb); 
      printf ("The NCBASTAT return code is: 0x%x \n", uRetCode); 
      if (uRetCode == 0) 
      { 
         printf ("The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n", 
                  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]); 
      }
   }

2000 (c) DM