Пример #1
0
static
BOOL
pGetAdapterPrimaryIpAddress(
	IN CONST DWORD cbAdapterAddress,
	IN CONST BYTE* pAdapterAddress,
	IN OUT LPDWORD pcbIpAddress,
	OUT LPBYTE pIpAddress)
{
	XTLASSERT(!IsBadReadPtr(pAdapterAddress, cbAdapterAddress));
	XTLASSERT(!IsBadWritePtr(pcbIpAddress, sizeof(DWORD)));
	XTLASSERT(!IsBadWritePtr(pIpAddress, *pcbIpAddress));

	ULONG ulOutBufLen(0);

	DWORD dwResult = ::GetAdaptersInfo(NULL, &ulOutBufLen);
	if (dwResult != ERROR_BUFFER_OVERFLOW) {
		XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
			"Getting adapter info size failed, result=0x%X, error=0x%X.\n", 
			dwResult, GetLastError());
		return FALSE;
	}

	PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*) ::HeapAlloc(
		::GetProcessHeap(),
		HEAP_ZERO_MEMORY,
		ulOutBufLen);

	if (NULL == pAdapterInfo) {
		XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
			"HeapAlloc failed, bytes=%d\n",
			ulOutBufLen);
		return FALSE;
	}

	XTL::AutoProcessHeap autoAdapterInfo = pAdapterInfo;

	dwResult = ::GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
	if (dwResult != ERROR_SUCCESS) 
	{
		XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
			"Getting adapter info failed, result=0x%X, error=0x%X.\n", 
			dwResult, GetLastError());
		return FALSE;
	}

	PIP_ADAPTER_INFO pAdapter = pAdapterInfo;

	BOOL bFound(FALSE);

	while (NULL != pAdapter) {

		if (cbAdapterAddress == pAdapter->AddressLength &&
			::memcmp(pAdapterAddress, pAdapter->Address, cbAdapterAddress) == 0)
		{
			SOCKADDR_IN sockAddress;
			INT iSockAddressLength = sizeof(SOCKADDR);
			
			INT iResult = ::WSAStringToAddressA(
				pAdapter->IpAddressList.IpAddress.String,
				AF_INET,
				NULL,
				(PSOCKADDR)&sockAddress,
				&iSockAddressLength);

			if (0 != iResult) {
				XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
					"WSAStringToAddress failed, error=0x%X.\n", 
					GetLastError());
				break;
			}

			if (*pcbIpAddress < sizeof(sockAddress.sin_addr)) {
				*pcbIpAddress = sizeof(sockAddress.sin_addr);
				::SetLastError(ERROR_BUFFER_OVERFLOW);
				return FALSE;
			}

			*pcbIpAddress = sizeof(sockAddress.sin_addr);
			::CopyMemory(pIpAddress, &sockAddress.sin_addr, *pcbIpAddress);

			TCHAR wszIpAddress[17] = {0};
			::MultiByteToWideChar(
				CP_ACP, 
				0,
				pAdapter->IpAddressList.IpAddress.String,
				16,
				wszIpAddress,
				17);

			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_INFORMATION,
				"IP address=%ls\n", wszIpAddress);

			bFound = TRUE;
			break;
		}

		pAdapter = pAdapter->Next;
	}

	if (!bFound) 
	{
		XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_WARNING,
			"No IP addresses are associated with the adapter\n");
	}

	return TRUE;

}
Пример #2
0
static
BOOL
pGetAdapterPrimaryIpAddress(
	IN CONST DWORD cbAdapterAddress,
	IN CONST BYTE* pAdapterAddress,
	IN OUT LPDWORD pcbIpAddress,
	OUT LPBYTE pIpAddress)
{
	_ASSERTE(!IsBadReadPtr(pAdapterAddress, cbAdapterAddress));
	_ASSERTE(!IsBadWritePtr(pcbIpAddress, sizeof(DWORD)));
	_ASSERTE(!IsBadWritePtr(pIpAddress, *pcbIpAddress));

	ULONG ulOutBufLen(0);

	DWORD dwResult = ::GetAdaptersInfo(NULL, &ulOutBufLen);
	if (dwResult != ERROR_BUFFER_OVERFLOW) {
		DPErrorEx(_FT("Getting adapter info size failed: "));
		return FALSE;
	}

	PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*) ::HeapAlloc(
		::GetProcessHeap(),
		HEAP_ZERO_MEMORY,
		ulOutBufLen);

	if (NULL == pAdapterInfo) {
		DPErrorEx(_FT("Out of memory: "));
		return FALSE;
	}

	AutoProcessHeap autoAdapterInfo = pAdapterInfo;

	dwResult = ::GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
	if (dwResult != ERROR_SUCCESS) {
		DPErrorEx(_FT("Getting adapter info failed: "));
		return FALSE;
	}

	PIP_ADAPTER_INFO pAdapter = pAdapterInfo;

	BOOL bFound(FALSE);

	while (NULL != pAdapter) {

		if (cbAdapterAddress == pAdapter->AddressLength &&
			::memcmp(pAdapterAddress, pAdapter->Address, cbAdapterAddress) == 0)
		{
			SOCKADDR_IN sockAddress;
			INT iSockAddressLength = sizeof(SOCKADDR);
			
			INT iResult = ::WSAStringToAddressA(
				pAdapter->IpAddressList.IpAddress.String,
				AF_INET,
				NULL,
				(PSOCKADDR)&sockAddress,
				&iSockAddressLength);

			if (0 != iResult) {
				DPErrorEx(_FT("WSAStringToAddress failed: "));
				break;
			}

			if (*pcbIpAddress < sizeof(sockAddress.sin_addr)) {
				*pcbIpAddress = sizeof(sockAddress.sin_addr);
				::SetLastError(ERROR_BUFFER_OVERFLOW);
				return FALSE;
			}

			*pcbIpAddress = sizeof(sockAddress.sin_addr);
			::CopyMemory(pIpAddress, &sockAddress.sin_addr, *pcbIpAddress);

			TCHAR wszIpAddress[17] = {0};
			::MultiByteToWideChar(
				CP_ACP, 
				0,
				pAdapter->IpAddressList.IpAddress.String,
				16,
				wszIpAddress,
				17);
			DPInfo(_FT("IP Address: %s\n"), wszIpAddress);

			bFound = TRUE;
			break;
		}

		pAdapter = pAdapter->Next;
	}

	if (!bFound) {
		DPWarning(_FT("No IP addresses are associated with the adapter.\n"));
	}

	return TRUE;

}