1 ////////////////////////////////////////////////
2 // LocalHostInfo.cpp文件
3
4 #include <windows.h>
5 #include <stdio.h>
6
7 #include "Iphlpapi.h"
8 #pragma comment(lib, "Iphlpapi.lib")
9 #pragma comment(lib, "WS2_32.lib")
10 BOOL IsLocalAdapter(char *pAdapterName);
11 /////////////////////////////////////////
12 // 全局数据
13 u_char g_ucLocalMac[6]; // 本地MAC地址
14 DWORD g_dwGatewayIP; // 网关IP地址
15 DWORD g_dwLocalIP; // 本地IP地址
16 DWORD g_dwMask; // 子网掩码
17
18 BOOL GetGlobalData()
19 {
20 PIP_ADAPTER_INFO pAdapterInfo = NULL;
21 ULONG ulLen = 0;
22
23 // 为适配器结构申请内存
24 ::GetAdaptersInfo(pAdapterInfo,&ulLen);
25 pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);
26
27 // 取得本地适配器结构信息
28 if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == ERROR_SUCCESS)
29 {
30 if(pAdapterInfo != NULL)
31 {
32 memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
33 g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
34 g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
35 g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
36 }
37 }
38
39 printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
40 in_addr in;
41 in.S_un.S_addr = g_dwLocalIP;
42 printf(" IP Address : %s \n", ::inet_ntoa(in));
43
44 in.S_un.S_addr = g_dwMask;
45 printf(" Subnet Mask : %s \n", ::inet_ntoa(in));
46
47 in.S_un.S_addr = g_dwGatewayIP;
48 printf(" Default Gateway : %s \n", ::inet_ntoa(in));
49
50 u_char *p = g_ucLocalMac;
51 printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);
52
53 printf(" \n \n ");
54
55 return TRUE;
56 }
57 void GetLocalMAC(char *buf)
58 {
59 IP_ADAPTER_INFO *IpAdaptersInfo =NULL;
60 IP_ADAPTER_INFO *IpAdaptersInfoHead =NULL;
61
62 IpAdaptersInfo = (IP_ADAPTER_INFO *) GlobalAlloc(GPTR, sizeof(IP_ADAPTER_INFO ));
63
64 if (IpAdaptersInfo == NULL)
65 {
66 return;
67 }
68
69 DWORD dwDataSize = sizeof( IP_ADAPTER_INFO );
70 DWORD dwRetVal = GetAdaptersInfo(IpAdaptersInfo,&dwDataSize);
71
72 if ( ERROR_SUCCESS != dwRetVal)
73 {
74 GlobalFree( IpAdaptersInfo );
75 IpAdaptersInfo = NULL;
76
77 if( ERROR_BUFFER_OVERFLOW == dwRetVal)
78 {
79 IpAdaptersInfo =(IP_ADAPTER_INFO *) GlobalAlloc( GPTR, dwDataSize );
80 if(IpAdaptersInfo != NULL)
81 {
82 memcpy(g_ucLocalMac, IpAdaptersInfo->Address, 6);
83 g_dwGatewayIP = ::inet_addr(IpAdaptersInfo->GatewayList.IpAddress.String);
84 g_dwLocalIP = ::inet_addr(IpAdaptersInfo->IpAddressList.IpAddress.String);
85 g_dwMask = ::inet_addr(IpAdaptersInfo->IpAddressList.IpMask.String);
86 }
87 if ( ERROR_SUCCESS != GetAdaptersInfo( IpAdaptersInfo, &dwDataSize ))
88 {
89 GlobalFree( IpAdaptersInfo );
90 return;
91 }
92
93 }
94 else
95 {
96 return;
97 }
98
99 }
100 printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
101 in_addr in;
102 in.S_un.S_addr = g_dwLocalIP;
103 printf(" IP Address : %s \n", ::inet_ntoa(in));
104
105 in.S_un.S_addr = g_dwMask;
106 printf(" Subnet Mask : %s \n", ::inet_ntoa(in));
107
108 in.S_un.S_addr = g_dwGatewayIP;
109 printf(" Default Gateway : %s \n", ::inet_ntoa(in));
110
111 u_char *p1 = g_ucLocalMac;
112 printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p1[0], p1[1], p1[2], p1[3], p1[4], p1[5]);
113
114 printf(" \n \n ");
115 //Save the head pointer of IP_ADAPTER_INFO structures list.
116 IpAdaptersInfoHead = IpAdaptersInfo;
117
118 do{
119 if (IsLocalAdapter(IpAdaptersInfo->AdapterName))
120 {
121 sprintf(buf,"%02x-%02x-%02x-%02x-%02x-%02x",
122 IpAdaptersInfo->Address[0],
123 IpAdaptersInfo->Address[1],
124 IpAdaptersInfo->Address[2],
125 IpAdaptersInfo->Address[3],
126 IpAdaptersInfo->Address[4],
127 IpAdaptersInfo->Address[5]);
128 //
129 break;
130 }
131
132 IpAdaptersInfo = IpAdaptersInfo->Next;
133
134 }while (IpAdaptersInfo);
135
136 if (IpAdaptersInfoHead != NULL)
137 {
138 GlobalFree( IpAdaptersInfoHead );
139 }
140 g_dwGatewayIP = ::inet_addr(IpAdaptersInfo->GatewayList.IpAddress.String);
141 g_dwLocalIP = ::inet_addr(IpAdaptersInfo->IpAddressList.IpAddress.String);
142 g_dwMask = ::inet_addr(IpAdaptersInfo->IpAddressList.IpMask.String);
143
144 printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
145
146 in.S_un.S_addr = g_dwLocalIP;
147 printf(" IP Address : %s \n", ::inet_ntoa(in));
148
149 in.S_un.S_addr = g_dwMask;
150 printf(" Subnet Mask : %s \n", ::inet_ntoa(in));
151
152 in.S_un.S_addr = g_dwGatewayIP;
153 printf(" Default Gateway : %s \n", ::inet_ntoa(in));
154
155 u_char *p2 = g_ucLocalMac;
156 printf(" MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p2[0], p2[1], p2[2], p2[3], p2[4], p2[5]);
157
158 printf(" \n \n ");
159 }
160
161
162 BOOL IsLocalAdapter(char *pAdapterName)
163 {
164 BOOL ret_value = FALSE;
165
166 #define NET_CARD_KEY TEXT("System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}")
167 char szDataBuf[MAX_PATH+1];
168 DWORD dwDataLen = MAX_PATH;
169 DWORD dwType = REG_SZ;
170 HKEY hNetKey = NULL;
171 HKEY hLocalNet = NULL;
172
173 if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))
174 return FALSE;
175 wsprintf(szDataBuf, "%s\\Connection", pAdapterName);
176 if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
177 {
178 RegCloseKey(hNetKey);
179 return FALSE;
180 }
181 if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
182 {
183 goto ret;
184 }
185 if (*((DWORD *)szDataBuf)!=0x01)
186 goto ret;
187 dwDataLen = MAX_PATH;
188 if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
189 {
190 goto ret;
191 }
192 if (strncmp(szDataBuf, "PCI", strlen("PCI")))
193 goto ret;
194
195 ret_value = TRUE;
196
197 ret:
198 RegCloseKey(hLocalNet);
199 RegCloseKey(hNetKey);
200
201 return ret_value;
202 }
203 int main()
204 {
205 // 获取全局数据
206 GetGlobalData();
207 char * aa=(char *) malloc (sizeof(char)*100);
208 GetLocalMAC(aa);
209 wprintf(L"%s",aa);
210 getchar();
211 return 0;
212 }