`
guowee
  • 浏览: 173816 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Windows Mobile 获得 MAC,IP,IMEI,IMSI

阅读更多

How to get the MAC address of your network adapter.

24 05 2008


MAC address stands for Media Access Control address which is 6 bytes( 48 bits ) long . MAC address is the unique address which is used to identify network interface hardware. So how to get the MAC address of your network adapter?


You can use the function - GetAdaptersInfo() . The network adapter information will be populated and filled back in IP_ADAPTER_INFO structure. In that structure, you can get the network adapter name, MAC address and a couple of other information. See the sample code snippet.

#include "Iphlpapi.h"
...
// Get the buffer length required for IP_ADAPTER_INFO.
ULONG BufferLength = 0;
BYTE* pBuffer = 0;
if( ERROR_BUFFER_OVERFLOW == GetAdaptersInfo( 0, &BufferLength ))
{
    // Now the BufferLength contain the required buffer length.
    // Allocate necessary buffer.
    pBuffer = new BYTE[ BufferLength ];
}
else
{
    // Error occurred. handle it accordingly.
}

// Get the Adapter Information.
PIP_ADAPTER_INFO pAdapterInfo =
      reinterpret_cast<PIP_ADAPTER_INFO>(pBuffer);
GetAdaptersInfo( pAdapterInfo, &BufferLength );

// Iterate the network adapters and print their MAC address.
while( pAdapterInfo )
{
    // Assuming pAdapterInfo->AddressLength is 6.
    CString csMacAddress;
    csMacAddress.Format(_T("%02x:%02x:%02x:%02x:%02x:%02x"),
                        pAdapterInfo->Address[0],
                        pAdapterInfo->Address[1],
                        pAdapterInfo->Address[2],
                        pAdapterInfo->Address[3],
                        pAdapterInfo->Address[4],
                        pAdapterInfo->Address[5]);

    cout << "Adapter Name :" << pAdapterInfo->AdapterName << " "
         << "MAC :" << (LPCTSTR) csMacAddress << endl;

    // Get next adapter info.
    pAdapterInfo = pAdapterInfo->Next;
}

// deallocate the buffer.
delete[] pBuffer;

using System;

using System.Collections;

using System.Runtime.InteropServices;

namespace AdapterInfoTest

{

/// <summary>

/// Summary description for AdapterInfo.

/// </summary>

public sealed class AdapterInfo

{

const int MAX_ADAPTER_NAME_LENGTH = 256;

const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;

const int MAX_ADAPTER_ADDRESS_LENGTH = 8;

const int ERROR_BUFFER_OVERFLOW = 111;

const int ERROR_SUCCESS = 0;

[ DllImport ( "iphlpapi.dll" , CharSet= CharSet .Ansi)]

private static extern int GetAdaptersInfo( IntPtr pAdapterInfo, ref Int64 pBufOutLen);

[ StructLayout ( LayoutKind .Sequential, CharSet= CharSet .Ansi)]

private struct IP_ADDRESS_STRING

{

[ MarshalAs ( UnmanagedType .ByValTStr, SizeConst=16)]

public string Address;

}

[ StructLayout ( LayoutKind .Sequential, CharSet= CharSet .Ansi)]

private struct IP_ADDR_STRING

{

public IntPtr Next;

public IP_ADDRESS_STRING IpAddress;

public IP_ADDRESS_STRING Mask;

public Int32 Context;

}

 

[ StructLayout ( LayoutKind .Sequential, CharSet= CharSet .Ansi)]

private struct IP_ADAPTER_INFO

{

public IntPtr Next;

public Int32 ComboIndex;

[ MarshalAs ( UnmanagedType .ByValTStr, SizeConst=MAX_ADAPTER_NAME_LENGTH + 4)]

public string AdapterName;

[ MarshalAs ( UnmanagedType .ByValTStr, SizeConst=MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]

public string AdapterDescription;

public UInt32 AddressLength;

[ MarshalAs ( UnmanagedType .ByValArray, SizeConst=MAX_ADAPTER_ADDRESS_LENGTH)]

public byte [] Address;

public Int32 Index;

public UInt32 Type;

public UInt32 DhcpEnabled;

public IntPtr CurrentIpAddress;

public IP_ADDR_STRING IpAddressList;

public IP_ADDR_STRING GatewayList;

public IP_ADDR_STRING DhcpServer;

public bool HaveWins;

public IP_ADDR_STRING PrimaryWinsServer;

public IP_ADDR_STRING SecondaryWinsServer;

public Int32 LeaseObtained;

public Int32 LeaseExpires;

}

public AdapterInfo()

{

}

public static Adapter [] GetAdaptersInfo()

{

Adapter [] adaptersList;

ArrayList adapters = new ArrayList ();

long structSize = Marshal .SizeOf( typeof ( IP_ADAPTER_INFO ) );

IntPtr pArray = Marshal .AllocHGlobal(( int ) structSize );

int ret = GetAdaptersInfo(pArray, ref structSize );

if (ret == ERROR_BUFFER_OVERFLOW ) // ERROR_BUFFER_OVERFLOW == 111

{

// Buffer was too small, reallocate the correct size for the buffer.

pArray = Marshal .ReAllocHGlobal( pArray, new IntPtr (structSize) );

ret = GetAdaptersInfo( pArray, ref structSize );

} // if

if ( ret == 0 )

{

// Call Succeeded

IntPtr pEntry = pArray;

do

{

// Retrieve the adapter info from the memory address

IP_ADAPTER_INFO entry = ( IP_ADAPTER_INFO ) Marshal .PtrToStructure( pEntry, typeof ( IP_ADAPTER_INFO ));

Adapter adapter = new Adapter ();

adapter.index = entry.Index.ToString();

adapter.name = entry.AdapterName;

adapter.description = entry.AdapterDescription;

adapter.ip = entry.IpAddressList.IpAddress.Address;

// MAC Address (data is in a byte[])

string tmpString = string .Empty;

for ( int i = 0; i < entry.AddressLength ; i++)

{

tmpString += string .Format( "{0:X2}" , entry.AddressIdea );

}

adapter.macAddress = tmpString;

adapters.Add(adapter);

// Get next adapter (if any)

pEntry = entry.Next;

}

while ( pEntry != IntPtr .Zero );

Marshal .FreeHGlobal(pArray);

adaptersList = new Adapter [adapters.Count];

adapters.CopyTo(adaptersList);

}

else

{

adaptersList = new Adapter [0];

Marshal .FreeHGlobal(pArray);

throw new InvalidOperationException ( "GetAdaptersInfo failed with " + ret );

}

return adaptersList;

}

}

public class Adapter

{

public string index;

public string name;

public string description;

public string ip;

public string macAddress;

}

}

 

How to get mac address using win32 programming in windows?

get_Adapter getMacAddress(void)
{
get_Adapter getMac;
char getAdap[100];
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;

pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);

if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}

if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
wsprintf(getAdap , "MacAddress: %02X:%02X:%02X:%02X:%02X:%02X",
pAdapterInfo->Address[0],pAdapterInfo->Address[1],pAdapterInfo->Address[2],
pAdapterInfo->Address[3],pAdapterInfo->Address[4],pAdapterInfo->Address[5]);
getMac.AdapterAddress = getAdap;

wsprintf(getAdap,"Adp Name:%s", pAdapter->AdapterName);
getMac.AdapterName = getAdap;

wsprintf(getAdap,"Adapter Desc: %s", pAdapter->Description);
getMac.AdapterDesc = getAdap;

wsprintf(getAdap,"IP Address: %s", pAdapter->IpAddressList.IpAddress.String);
getMac.IpAddress = getAdap;

wsprintf(getAdap,"IP Mask: %s", pAdapter->IpAddressList.IpMask.String);
getMac.IpMask = getAdap;

_Adapter_Set._Adapter.push_back(getMac);
pAdapter = pAdapter->Next;
}
}
else {
MessageBox(NULL,"Call to GetAdaptersInfo failed","Error",0);
}
return getMac;
}



Don’t forget to add Iphlpapi.lib to project settings.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics