/* * Copyright © Microsoft Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef _COMPAT_WIN32_H_ #define _COMPAT_WIN32_H_ #include #include #include #include // Include stdlib.h here to make sure we // always replace MSVC getenv definition // with the macro / _getenv inline below #include #ifdef __cplusplus extern "C" { #endif #define F_OK 0 #define RTLD_NOW 0 #define RTLD_GLOBAL 0 #ifndef NTSTATUS typedef LONG NTSTATUS; #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023) #define NT_SUCCESS(status) (((NTSTATUS)(status)) >= 0) #endif typedef unsigned int __uid_t; #if _MSC_VER #define getenv _getenv #define secure_getenv _getenv #define HAVE_SECURE_GETENV inline char* _getenv(const char *varname) { static char _getenv_buf[32767]; return GetEnvironmentVariableA(varname, &_getenv_buf[0], sizeof(_getenv_buf)) ? &_getenv_buf[0] : NULL; } #endif #ifdef _MSC_VER inline char* strtok_r(char *s, const char *delim, char **save_ptr) { return strtok_s(s, delim, save_ptr); } #endif inline void* dlopen(const char *file, int mode) { return LoadLibrary(file); } inline int dlclose(void *handle) { return FreeLibrary(handle); } inline void *dlsym(void *handle, const char *name) { return GetProcAddress(handle, name); } inline static char* dlerror() { static char last_err_string[512]; memset(last_err_string, '\0', 512); FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), last_err_string, (512 - 1), NULL); return last_err_string; } inline __uid_t geteuid() { return 0; }; inline __uid_t getuid() { return 0; }; typedef DWORD pid_t; typedef CRITICAL_SECTION pthread_mutex_t; inline void pthread_mutex_lock(pthread_mutex_t* a) { EnterCriticalSection(a); } inline void pthread_mutex_unlock(pthread_mutex_t* a) { LeaveCriticalSection(a); } inline void pthread_mutex_init(pthread_mutex_t* a, void* attr) { InitializeCriticalSection(a); } inline void pthread_mutex_destroy(pthread_mutex_t* a) { DeleteCriticalSection(a); } inline int gettimeofday(struct timeval *tv, struct timezone* tz) { SYSTEMTIME st; GetSystemTime(&st); tv->tv_sec = st.wSecond; tv->tv_usec = st.wMilliseconds * 1000; /* milli to micro sec */ return 0; } #ifdef _MSC_VER #include #include #else // // DDI level handle that represents a kernel mode object (allocation, device, etc) // typedef UINT D3DKMT_HANDLE; typedef struct _D3DKMT_CLOSEADAPTER { D3DKMT_HANDLE hAdapter; // in: adapter handle } D3DKMT_CLOSEADAPTER; typedef struct _D3DKMT_OPENADAPTERFROMLUID { LUID AdapterLuid; D3DKMT_HANDLE hAdapter; } D3DKMT_OPENADAPTERFROMLUID; typedef enum _KMTQUERYADAPTERINFOTYPE { KMTQAITYPE_QUERYREGISTRY = 48, } KMTQUERYADAPTERINFOTYPE; typedef struct _D3DKMT_QUERYADAPTERINFO { D3DKMT_HANDLE hAdapter; KMTQUERYADAPTERINFOTYPE Type; VOID* pPrivateDriverData; UINT PrivateDriverDataSize; } D3DKMT_QUERYADAPTERINFO; typedef struct _D3DDDI_QUERYREGISTRY_FLAGS { union { struct { UINT TranslatePath : 1; UINT MutableValue : 1; UINT Reserved : 30; }; UINT Value; }; } D3DDDI_QUERYREGISTRY_FLAGS; typedef enum _D3DDDI_QUERYREGISTRY_TYPE { D3DDDI_QUERYREGISTRY_ADAPTERKEY = 1, } D3DDDI_QUERYREGISTRY_TYPE; typedef enum _D3DDDI_QUERYREGISTRY_STATUS { D3DDDI_QUERYREGISTRY_STATUS_SUCCESS = 0, D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW = 1, } D3DDDI_QUERYREGISTRY_STATUS; typedef struct _D3DDDI_QUERYREGISTRY_INFO { D3DDDI_QUERYREGISTRY_TYPE QueryType; // In D3DDDI_QUERYREGISTRY_FLAGS QueryFlags; // In WCHAR ValueName[MAX_PATH]; // In ULONG ValueType; // In ULONG PhysicalAdapterIndex; // In ULONG OutputValueSize; // Out. Number of bytes written to the output value or required in case of D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW. D3DDDI_QUERYREGISTRY_STATUS Status; // Out union { DWORD OutputDword; // Out UINT64 OutputQword; // Out WCHAR OutputString[1]; // Out. Dynamic array BYTE OutputBinary[1]; // Out. Dynamic array }; } D3DDDI_QUERYREGISTRY_INFO; typedef _Check_return_ NTSTATUS(APIENTRY *PFND3DKMT_CLOSEADAPTER)(_In_ CONST D3DKMT_CLOSEADAPTER*); typedef _Check_return_ NTSTATUS(APIENTRY *PFND3DKMT_OPENADAPTERFROMLUID)(_Inout_ D3DKMT_OPENADAPTERFROMLUID*); typedef _Check_return_ NTSTATUS(APIENTRY *PFND3DKMT_QUERYADAPTERINFO)(_Inout_ CONST D3DKMT_QUERYADAPTERINFO*); #endif #ifdef __cplusplus } #endif #endif /* _COMPAT_WIN32_H_ */