1,221
社区成员
发帖
与我相关
我的任务
分享
#define IPCONFIG_OUTPUT_SIZE 4096
size_t FindPhysicalAddress(string& strMacAddr, size_t nInitPos)
{
size_t nIdx = strMacAddr.find('-', nInitPos);
if(string::npos == nIdx)
return string::npos;
if(nIdx > 1 && (strMacAddr.length() - nIdx) > 14 &&
strMacAddr[nIdx + 3] == '-' && strMacAddr[nIdx + 6] == '-' &&
strMacAddr[nIdx + 9] == '-' && strMacAddr[nIdx + 12] == '-' &&
(isdigit(strMacAddr[nIdx - 1]) || isalpha(strMacAddr[nIdx - 1])) &&
(isdigit(strMacAddr[nIdx - 2]) || isalpha(strMacAddr[nIdx - 2])) &&
(isdigit(strMacAddr[nIdx + 1]) || isalpha(strMacAddr[nIdx + 1])) &&
(isdigit(strMacAddr[nIdx + 2]) || isalpha(strMacAddr[nIdx + 2])) &&
(isdigit(strMacAddr[nIdx + 4]) || isalpha(strMacAddr[nIdx + 4])) &&
(isdigit(strMacAddr[nIdx + 5]) || isalpha(strMacAddr[nIdx + 5])) &&
(isdigit(strMacAddr[nIdx + 7]) || isalpha(strMacAddr[nIdx + 7])) &&
(isdigit(strMacAddr[nIdx + 8]) || isalpha(strMacAddr[nIdx + 8])) &&
(isdigit(strMacAddr[nIdx + 10]) || isalpha(strMacAddr[nIdx + 10])) &&
(isdigit(strMacAddr[nIdx + 11]) || isalpha(strMacAddr[nIdx + 11])) &&
(isdigit(strMacAddr[nIdx + 13]) || isalpha(strMacAddr[nIdx + 13])) &&
(isdigit(strMacAddr[nIdx + 14]) || isalpha(strMacAddr[nIdx + 14])))
{
return nIdx - 2;
}
else
return FindPhysicalAddress(strMacAddr, nIdx + 1);
}
int GetMacAddrFromIPConfig(string& strMacAddr)
{
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
if(!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0))
return 0;
STARTUPINFOA si;
memset(&si, 0, sizeof(STARTUPINFOA));
si.cb = sizeof(STARTUPINFOA);
GetStartupInfoA(&si);
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.wShowWindow = SW_HIDE;
si.dwFlags = /*STARTF_USESHOWWINDOW |*/ STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
if(CreateProcessA(NULL, "ipconfig.exe /all", NULL, NULL, TRUE, 0 , NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
char szBuffer[IPCONFIG_OUTPUT_SIZE] = {0};
DWORD dwRead;
if(ReadFile(hReadPipe, szBuffer, IPCONFIG_OUTPUT_SIZE, &dwRead, NULL))
{
string strOutput = szBuffer;
size_t nIdx = 0;
while (1)
{
nIdx = FindPhysicalAddress(strOutput, nIdx);
if(string::npos == nIdx)
break;
if(strMacAddr.length())
strMacAddr += '+';
strMacAddr += strOutput.substr(nIdx, 17);
nIdx += 15;
}
}
}
CloseHandle(hWritePipe);
CloseHandle(hReadPipe);
return 0;
}
---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
string mac;
GetMacAddrFromIPConfig(mac);
Memo1->Text = AnsiString(mac.c_str());
}
//---------------------------------------------------------------------------