Files
RedHotRoast-ios/HybridCLRData/LocalIl2CppData-OSXEditor/il2cpp/libil2cpp/os/WinRT/Win32ApiSharedEmulation.cpp
T

134 lines
3.7 KiB
C++
Raw Normal View History

2026-07-17 14:03:00 +08:00
#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