123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #include "il2cpp-config.h"
- #if IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE
- #if WINDOWS_SDK_BUILD_VERSION < 16299
- #include "os/Win32/WindowsHeaders.h"
- #include "Win32ApiSharedEmulation.h"
- #include <io.h>
- #include <windows.networking.connectivity.h>
- #include <windows.storage.h>
- using namespace il2cpp::winrt;
- using namespace Microsoft::WRL;
- using namespace Microsoft::WRL::Wrappers;
- using namespace ABI::Windows::Foundation;
- using namespace ABI::Windows::Foundation::Collections;
- using namespace ABI::Windows::Networking;
- using namespace ABI::Windows::Networking::Connectivity;
- using namespace ABI::Windows::Storage;
- extern "C"
- {
- BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize)
- {
- #define ERROR_CHECK(hr) do { if (FAILED(hr)) { SetLastError(WIN32_FROM_HRESULT(hr)); return FALSE; } } while (false)
- ComPtr<INetworkInformationStatics> info;
- auto hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), __uuidof(info), &info);
- ERROR_CHECK(hr);
- ComPtr<IVectorView<HostName*> > names;
- hr = info->GetHostNames(&names);
- ERROR_CHECK(hr);
- unsigned int size;
- hr = names->get_Size(&size);
- if (FAILED(hr) || !size)
- {
- SetLastError(WIN32_FROM_HRESULT(hr));
- return FALSE;
- }
- ComPtr<IHostName> name;
- hr = names->GetAt(0, &name);
- ERROR_CHECK(hr);
- HString displayName;
- hr = name->get_DisplayName(displayName.GetAddressOf());
- ERROR_CHECK(hr);
- #undef ERROR_CHECK
- unsigned int sourceLength;
- auto sourceBuffer = displayName.GetRawBuffer(&sourceLength);
- // NetBIOS caps at 15 characters, not including the null terminator
- DWORD finalSize = sourceLength > 15 ? 15 : sourceLength;
- // Cap at the first period
- for (DWORD i = 0; i < finalSize; ++i)
- if (sourceBuffer[i] == '.')
- finalSize = i;
- // Error and return the size if the buffer is not large enough
- if (finalSize + 1 > *nSize)
- {
- SetLastError(ERROR_BUFFER_OVERFLOW);
- *nSize = finalSize + 1;
- return FALSE;
- }
- if (lpBuffer != nullptr)
- {
- memset(lpBuffer, 0, *nSize);
- // Copy the characters and make them uppercase
- for (DWORD i = 0; i < finalSize; ++i)
- lpBuffer[i] = toupper(sourceBuffer[i]);
- *nSize = finalSize;
- return TRUE;
- }
- *nSize = finalSize;
- return FALSE;
- }
- } // extern "C"
- #endif // WINDOWS_SDK_BUILD_VERSION < 16299
- #if WINDOWS_SDK_BUILD_VERSION < 15063
- #include "os/Win32/WindowsHeaders.h"
- #include "Win32ApiSharedEmulation.h"
- extern "C"
- {
- DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
- {
- if (*pOutBufLen < sizeof(FIXED_INFO))
- {
- *pOutBufLen = sizeof(FIXED_INFO);
- return ERROR_BUFFER_OVERFLOW;
- }
- memset(pFixedInfo, 0, sizeof(FIXED_INFO));
- return ERROR_NOT_SUPPORTED;
- }
- } // extern "C"
- #endif // WINDOWS_SDK_BUILD_VERSION < 15063
- #if IL2CPP_TARGET_WINRT
- #include "Win32ApiSharedEmulation.h"
- extern "C"
- {
- // Provide a dummy GetIfEntry for WinRT. This is used by the class library
- // code to implement GetAllNetworkInterfaces(). It looks like the values
- // returned though are never actually used. So this dummy implementation seems
- // to be enough for the class library code to work in WinRT.
- DWORD WINAPI GetIfEntry(PMIB_IFROW pIfRow)
- {
- memset(pIfRow, 0, sizeof(MIB_IFROW));
- return NO_ERROR;
- }
- } // extern "C"
- #endif // IL2CPP_TARGET_WINRT
- #endif // IL2CPP_TARGET_WINRT || IL2CPP_TARGET_XBOXONE
|