2014년 10월 27일 월요일

맥어드레스(MAC Address) 추출하기( Win32 )

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;
}

댓글 없음: