mirror of
https://github.com/Ed94/HandmadeHero.git
synced 2024-11-13 21:04:51 -08:00
391 lines
12 KiB
C
391 lines
12 KiB
C
/*
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Copyright (c) Arvid Gerstmann. All rights reserved.
|
|
*/
|
|
#ifndef _WINDOWS_
|
|
#ifndef WINDOWS_MISC_H
|
|
#define WINDOWS_MISC_H
|
|
|
|
/* Disable all warnings */
|
|
#if defined(_MSC_VER)
|
|
#pragma warning(push, 0)
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
|
|
#ifndef WINDOWS_BASE_H
|
|
#include "windows_base.h"
|
|
#endif
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* MMRESULT: */
|
|
typedef UINT MMRESULT;
|
|
#define TIMERR_BASE 96
|
|
#define TIMERR_NOERROR (0)
|
|
#define TIMERR_NOCANDO (TIMERR_BASE+1)
|
|
#define TIMERR_STRUCT (TIMERR_BASE+33)
|
|
|
|
/* Code Pages: */
|
|
#define CP_INSTALLED 0x00000001
|
|
#define CP_SUPPORTED 0x00000002
|
|
#define CP_ACP 0
|
|
#define CP_OEMCP 1
|
|
#define CP_MACCP 2
|
|
#define CP_THREAD_ACP 3
|
|
#define CP_SYMBOL 42
|
|
#define CP_UTF7 65000
|
|
#define CP_UTF8 65001
|
|
|
|
/* Format: */
|
|
#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100
|
|
#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000
|
|
#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
|
|
#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200
|
|
#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800
|
|
#define FORMAT_MESSAGE_FROM_STRING 0x00000400
|
|
|
|
/* Language ID: */
|
|
#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD )(p))
|
|
#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff)
|
|
#define SUBLANGID(lgid) ((WORD)(lgid) >> 10)
|
|
|
|
#define LANG_NEUTRAL 0x00
|
|
#define LANG_INVARIANT 0x7f
|
|
#define LANG_ENGLISH 0x09
|
|
#define LANG_GERMAN 0x07
|
|
|
|
#define SUBLANG_NEUTRAL 0x00
|
|
#define SUBLANG_DEFAULT 0x01
|
|
#define SUBLANG_SYS_DEFAULT 0x02
|
|
#define SUBLANG_CUSTOM_DEFAULT 0x03
|
|
#define SUBLANG_CUSTOM_UNSPECIFIED 0x04
|
|
#define SUBLANG_UI_CUSTOM_DEFAULT 0x05
|
|
#define SUBLANG_ENGLISH_US 0x01
|
|
#define SUBLANG_ENGLISH_UK 0x02
|
|
#define SUBLANG_GERMAN 0x01
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* Structures: */
|
|
/* Time: */
|
|
typedef struct _SYSTEMTIME {
|
|
WORD wYear;
|
|
WORD wMonth;
|
|
WORD wDayOfWeek;
|
|
WORD wDay;
|
|
WORD wHour;
|
|
WORD wMinute;
|
|
WORD wSecond;
|
|
WORD wMilliseconds;
|
|
} SYSTEMTIME, *PSYSTEMTIME;
|
|
typedef PSYSTEMTIME LPSYSTEMTIME;
|
|
|
|
typedef struct _TIME_ZONE_INFORMATION {
|
|
LONG Bias;
|
|
WCHAR StandardName[32];
|
|
SYSTEMTIME StandardDate;
|
|
LONG StandardBias;
|
|
WCHAR DaylightName[32];
|
|
SYSTEMTIME DaylightDate;
|
|
LONG DaylightBias;
|
|
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION;
|
|
typedef PTIME_ZONE_INFORMATION LPTIME_ZONE_INFORMATION;
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* Functions: */
|
|
/*
|
|
* I could've implemented them in assembly, they're like 4 lines, but this is
|
|
* avoiding the cost of a function call, if optimizations are turned on.
|
|
*/
|
|
#ifdef WIN32_BYTESWAP_MACROS
|
|
#define _byteswap_ulong(x) (((unsigned long)(x) << 24) | \
|
|
(((unsigned long)(x) << 8) & 0xff0000) | \
|
|
(((unsigned long)(x) >> 8) & 0xff00) | \
|
|
((unsigned long)(x) >> 24))
|
|
#define _byteswap_uint64(x) (((unsigned __int64)(x) << 56) | \
|
|
(((unsigned __int64)(x) << 40) & 0xff000000000000ULL) | \
|
|
(((unsigned __int64)(x) << 24) & 0xff0000000000ULL) | \
|
|
(((unsigned __int64)(x) << 8) & 0xff00000000ULL) | \
|
|
(((unsigned __int64)(x) >> 8) & 0xff000000ULL) | \
|
|
(((unsigned __int64)(x) >> 24) & 0xff0000ULL) | \
|
|
(((unsigned __int64)(x) >> 40) & 0xff00ULL) | \
|
|
((unsigned __int64)(x) >> 56))
|
|
#else
|
|
unsigned short __cdecl _byteswap_ushort(unsigned short Number);
|
|
unsigned long __cdecl _byteswap_ulong (unsigned long Number);
|
|
unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 Number);
|
|
#endif
|
|
|
|
unsigned int _rotl(unsigned int value, int shift);
|
|
unsigned __int64 _rotl64(unsigned __int64 value, int shift);
|
|
unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask);
|
|
unsigned char _BitScanForward64(unsigned long * Index, unsigned __int64 Mask);
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* UTF-16 <-> UTF-8 conversion Functions: */
|
|
int WINAPI WideCharToMultiByte(
|
|
UINT CodePage,
|
|
DWORD dwFlags,
|
|
LPCWSTR lpWideCharStr,
|
|
int cchWideChar,
|
|
LPSTR lpMultiByteStr,
|
|
int cbMultiByte,
|
|
LPCSTR lpDefaultChar,
|
|
LPBOOL lpUsedDefaultChar);
|
|
int WINAPI MultiByteToWideChar(
|
|
UINT CodePage,
|
|
DWORD dwFlags,
|
|
LPCSTR lpMultiByteStr,
|
|
int cbMultiByte,
|
|
LPWSTR lpWideCharStr,
|
|
int cchWideChar);
|
|
int WINAPI lstrlenA(
|
|
LPCSTR lpString);
|
|
int WINAPI lstrlenW(
|
|
LPCWSTR lpString);
|
|
LPCSTR WINAPI lstrcpyA(
|
|
LPCSTR lpString1,
|
|
LPCSTR lpString2);
|
|
LPCWSTR WINAPI lstrcpyW(
|
|
LPCWSTR lpString1,
|
|
LPCWSTR lpString2);
|
|
|
|
/* ========================================================================== */
|
|
/* Time: */
|
|
void WINAPI GetSystemTime(
|
|
LPSYSTEMTIME lpSystemTime);
|
|
void WINAPI GetLocalTime(
|
|
LPSYSTEMTIME lpSystemTime);
|
|
BOOL WINAPI QueryProcessCycleTime(
|
|
HANDLE hProcess,
|
|
PULONG64 CycleTime);
|
|
BOOL WINAPI SystemTimeToFileTime(
|
|
const SYSTEMTIME * lpSystemTime,
|
|
LPFILETIME lpFileTime);
|
|
BOOL WINAPI FileTimeToSystemTime(
|
|
const FILETIME * lpFileTime,
|
|
LPSYSTEMTIME lpSystemTime);
|
|
LONG WINAPI CompareFileTime(
|
|
const FILETIME * lpFileTime1,
|
|
const FILETIME * lpFileTime2);
|
|
void WINAPI GetSystemTimeAsFileTime(
|
|
LPFILETIME lpSystemTimeAsFileTime);
|
|
BOOL WINAPI SystemTimeToTzSpecificLocalTime(
|
|
LPTIME_ZONE_INFORMATION lpTimeZone,
|
|
LPSYSTEMTIME lpUniversalTime,
|
|
LPSYSTEMTIME lpLocalTime);
|
|
DWORD timeGetTime(void);
|
|
|
|
/* ========================================================================== */
|
|
/* Environment: */
|
|
BOOL WINAPI SetEnvironmentVariableA(
|
|
LPCSTR lpName,
|
|
LPCSTR lpValue);
|
|
BOOL WINAPI SetEnvironmentVariableW(
|
|
LPCWSTR lpName,
|
|
LPCWSTR lpValue);
|
|
DWORD WINAPI GetEnvironmentVariableA(
|
|
LPCSTR lpName,
|
|
LPCSTR lpBuffer,
|
|
DWORD nSize);
|
|
DWORD WINAPI GetEnvironmentVariableW(
|
|
LPCWSTR lpName,
|
|
LPCWSTR lpBuffer,
|
|
DWORD nSize);
|
|
|
|
/* ========================================================================== */
|
|
/* Misc Functions: */
|
|
BOOL WINAPI DisableThreadLibraryCalls(
|
|
HMODULE hModule);
|
|
DWORD WINAPI GetLastError(void);
|
|
void WINAPI Sleep(
|
|
DWORD dwMilliseconds);
|
|
DWORD WINAPI SleepEx(
|
|
DWORD dwMilliseconds,
|
|
BOOL bAlertable);
|
|
HMODULE WINAPI GetModuleHandleA(
|
|
LPCSTR lpModuleName);
|
|
HMODULE WINAPI GetModuleHandleW(
|
|
LPCWSTR lpModuleName);
|
|
DWORD WINAPI FormatMessageA(
|
|
DWORD dwFlags,
|
|
LPCVOID lpSource,
|
|
DWORD dwMessageId,
|
|
DWORD dwLanguageId,
|
|
LPSTR lpBuffer,
|
|
DWORD nSize,
|
|
va_list *Arguments);
|
|
DWORD WINAPI FormatMessageW(
|
|
DWORD dwFlags,
|
|
LPCVOID lpSource,
|
|
DWORD dwMessageId,
|
|
DWORD dwLanguageId,
|
|
LPWSTR lpBuffer,
|
|
DWORD nSize,
|
|
va_list *Arguments);
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* Timer Functions: */
|
|
DWORD WINAPI GetTickCount(void);
|
|
ULONGLONG WINAPI GetTickCount64(void);
|
|
BOOL WINAPI QueryPerformanceFrequency(
|
|
LARGE_INTEGER *lpFrequency);
|
|
BOOL WINAPI QueryPerformanceCounter(
|
|
LARGE_INTEGER *lpPerformanceCount);
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* Multi Media Timer: */
|
|
#define TIMERR_NOERROR (0) /* no error */
|
|
#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */
|
|
#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */
|
|
|
|
typedef struct timecaps_tag {
|
|
UINT wPeriodMin; /* minimum period supported */
|
|
UINT wPeriodMax; /* maximum period supported */
|
|
} TIMECAPS, *PTIMECAPS, *NPTIMECAPS, *LPTIMECAPS;
|
|
typedef UINT MMRESULT;
|
|
|
|
MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc);
|
|
MMRESULT WINAPI timeBeginPeriod(UINT uPeriod);
|
|
MMRESULT WINAPI timeEndPeriod(UINT uPeriod);
|
|
|
|
|
|
/* ========================================================================== */
|
|
/* DLL Functions: */
|
|
HMODULE WINAPI LoadLibraryA(
|
|
LPCSTR lpFileName);
|
|
HMODULE WINAPI LoadLibraryW(
|
|
LPCWSTR lpFileName);
|
|
HMODULE WINAPI LoadLibraryExA(
|
|
LPCSTR lpLibFileName,
|
|
HANDLE hFile,
|
|
DWORD dwFlags);
|
|
HMODULE WINAPI LoadLibraryExW(
|
|
LPCWSTR lpLibFileName,
|
|
HANDLE hFile,
|
|
DWORD dwFlags);
|
|
FARPROC WINAPI GetProcAddress(
|
|
HMODULE hModule,
|
|
LPCSTR lProcName);
|
|
PROC WINAPI wglGetProcAddress(
|
|
LPCSTR lpszProc);
|
|
BOOL WINAPI FreeLibrary(
|
|
HMODULE hModule);
|
|
|
|
/* ========================================================================== */
|
|
/* Libc Replacements: */
|
|
PVOID SecureZeroMemory(
|
|
PVOID ptr,
|
|
SIZE_T cnt);
|
|
|
|
VOID __stosb(
|
|
PBYTE Destination,
|
|
BYTE Value,
|
|
SIZE_T Count);
|
|
|
|
VOID __stosw(
|
|
PWORD Destination,
|
|
WORD Value,
|
|
SIZE_T Count);
|
|
|
|
VOID __stosd(
|
|
PDWORD Destination,
|
|
DWORD Value,
|
|
SIZE_T Count);
|
|
|
|
VOID __stosq(
|
|
PDWORD64 Destination,
|
|
DWORD64 Value,
|
|
SIZE_T Count);
|
|
|
|
#pragma intrinsic(__stosb)
|
|
#pragma intrinsic(__stosw)
|
|
#pragma intrinsic(__stosd)
|
|
#pragma intrinsic(__stosq)
|
|
|
|
FORCEINLINE PVOID SecureZeroMemory(
|
|
PVOID ptr,
|
|
SIZE_T cnt)
|
|
{
|
|
volatile char* vptr = (volatile char*)ptr;
|
|
|
|
#if defined(_M_AMD64)
|
|
__stosb((PBYTE)((DWORD64)vptr), 0, cnt);
|
|
#else
|
|
while (cnt)
|
|
{
|
|
# if !defined(_M_CEE) && (defined(_M_ARM) || defined(_M_ARM64))
|
|
__iso_volatile_store8(vptr, 0);
|
|
# else
|
|
* vptr = 0;
|
|
# endif
|
|
|
|
vptr++;
|
|
cnt--;
|
|
}
|
|
|
|
#endif // _M_AMD64
|
|
|
|
return ptr;
|
|
}
|
|
|
|
_NODISCARD _Check_return_
|
|
int __cdecl memcmp(
|
|
_In_reads_bytes_(_Size) void const* _Buf1,
|
|
_In_reads_bytes_(_Size) void const* _Buf2,
|
|
_In_ size_t _Size
|
|
);
|
|
|
|
_CRT_INSECURE_DEPRECATE_MEMORY(memmove_s)
|
|
_VCRTIMP void* __cdecl memmove(
|
|
_Out_writes_bytes_all_opt_(_Size) void* _Dst,
|
|
_In_reads_bytes_opt_(_Size) void const* _Src,
|
|
_In_ size_t _Size
|
|
);
|
|
|
|
void* __cdecl memcpy(
|
|
_Out_writes_bytes_all_(_Size) void* _Dst,
|
|
_In_reads_bytes_(_Size) void const* _Src,
|
|
_In_ size_t _Size
|
|
);
|
|
|
|
void* __cdecl memset(
|
|
_Out_writes_bytes_all_(_Size) void* _Dst,
|
|
_In_ int _Val,
|
|
_In_ size_t _Size
|
|
);
|
|
|
|
|
|
#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
|
|
#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
|
|
#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
|
|
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
|
|
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
|
|
|
|
#define MoveMemory RtlMoveMemory
|
|
#define CopyMemory RtlCopyMemory
|
|
#define FillMemory RtlFillMemory
|
|
#define ZeroMemory RtlZeroMemory
|
|
|
|
UINT WINAPI GetDoubleClickTime(VOID);
|
|
BOOL WINAPI SetDoubleClickTime(UINT);
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
/* Enable all warnings */
|
|
#if defined(_MSC_VER)
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
#endif /* WINDOWS_MISC_H */
|
|
#endif /* _WINDOWS_ */
|
|
|