CString GetMAC()
{
DWORD dwStatus;
IP_ADAPTER_INFO *pAdapterInfo = NULL;
IP_ADAPTER_INFO *pOriginalPtr = NULL;
ULONG ulSizeAdapterInfo = 0;
CString sMacAddr;
dwStatus = GetAdaptersInfo(pAdapterInfo,&ulSizeAdapterInfo);
//***********************************************************************
//버퍼 오버 플로우 일때 ulSizeAdapterInfo 크기로 메모리를 할당하고
//다시 GetAdaptersInfo를 호출한다.
if( dwStatus == ERROR_BUFFER_OVERFLOW)
{
if( !(pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulSizeAdapterInfo)) )
{
::MessageBox(NULL,"Insufficient Memory","GetMacAddress Error",MB_OK);
sMacAddr = _T("000000000000");
goto finish;
}
dwStatus = GetAdaptersInfo(pAdapterInfo,&ulSizeAdapterInfo);
}
//***********************************************************************
pOriginalPtr = pAdapterInfo; //메모리 해제를 위해 저장
if( pAdapterInfo == NULL )
{
::MessageBox(NULL,"No Interfaces Present \n","Error",MB_OK);
sMacAddr = _T("000000000000");
goto finish;
}
//랜카드 개수 만큼 루프
while( pAdapterInfo != NULL )
{
//여기서는 맥주소만을 처리합니다.
if( pAdapterInfo->AddressLength == 6 )
{
sMacAddr.Format( _T("%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X"), (DWORD)pAdapterInfo->Address[0], (DWORD)pAdapterInfo->Address[1], (DWORD)pAdapterInfo->Address[2], (DWORD)pAdapterInfo->Address[3], (DWORD)pAdapterInfo->Address[4], (DWORD)pAdapterInfo->Address[5] );
}
pAdapterInfo = pAdapterInfo->Next;
break;//편의상 하나만 체크
}
//위에서 저장한 포인터로 해제. XP에서는 에러가 나지 않을 수 있지만, 비스타와 Win7에서는 나온다.
//이렇게 하는 이유는 바로 위에서 Next 메소를 호출하면서 메모리 포인터가 옮겨감에 따라, 메모리 해제시 정상적인 메모리 해제가 안될 수 있다. 포인터가 옮겨간 곳에서 일정양을 해제하기 때문.
free(pOriginalPtr);
finish :
return sMacAddr;
}
댓글 없음:
댓글 쓰기