// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. /*++ Module Name: pal.h Abstract: Rotor Platform Adaptation Layer (PAL) header file. This file defines all types and API calls required by the Rotor port of the Microsoft Common Language Runtime. Defines which control the behavior of this include file: UNICODE - define it to set the Ansi/Unicode neutral names to be the ...W names. Otherwise the neutral names default to be the ...A names. PAL_IMPLEMENTATION - define it when implementing the PAL. Otherwise leave it undefined when consuming the PAL. Note: some fields in structs have been renamed from the original SDK documentation names, with _PAL_Undefined appended. This leaves the structure layout identical to its Win32 version, but prevents PAL consumers from inadvertently referencing undefined fields. If you want to add a PAL_ wrapper function to a native function in here, you also need to edit palinternal.h and win32pal.h. --*/ #ifndef __PAL_H__ #define __PAL_H__ #ifdef PAL_STDCPP_COMPAT #include #include #include #include #include #include #include #endif #ifdef __cplusplus extern "C" { #endif // This macro is used to standardize the wide character string literals between UNIX and Windows. // Unix L"" is UTF32, and on windows it's UTF16. Because of built-in assumptions on the size // of string literals, it's important to match behaviour between Unix and Windows. Unix will be defined // as u"" (char16_t) #define W(str) u##str // Undefine the QUOTE_MACRO_L helper and redefine it in terms of u. // The reason that we do this is that quote macro is defined in ndp\common\inc, // not inside of coreclr sources. #define QUOTE_MACRO_L(x) QUOTE_MACRO_u(x) #define QUOTE_MACRO_u_HELPER(x) u###x #define QUOTE_MACRO_u(x) QUOTE_MACRO_u_HELPER(x) #include #include #include /******************* Processor-specific glue *****************************/ #ifndef _MSC_VER #if defined(__i686__) && !defined(_M_IX86) #define _M_IX86 600 #elif defined(__i586__) && !defined(_M_IX86) #define _M_IX86 500 #elif defined(__i486__) && !defined(_M_IX86) #define _M_IX86 400 #elif defined(__i386__) && !defined(_M_IX86) #define _M_IX86 300 #elif defined(__x86_64__) && !defined(_M_AMD64) #define _M_AMD64 100 #elif defined(__arm__) && !defined(_M_ARM) #define _M_ARM 7 #elif defined(__aarch64__) && !defined(_M_ARM64) #define _M_ARM64 1 #endif #if defined(_M_IX86) && !defined(_X86_) #define _X86_ #elif defined(_M_AMD64) && !defined(_AMD64_) #define _AMD64_ #elif defined(_M_ARM) && !defined(_ARM_) #define _ARM_ #elif defined(_M_ARM64) && !defined(_ARM64_) #define _ARM64_ #endif #endif // !_MSC_VER /******************* ABI-specific glue *******************************/ #ifdef __APPLE__ // Both PowerPC, i386 and x86_64 on Mac OS X use 16-byte alignment. #define STACK_ALIGN_BITS 4 #define STACK_ALIGN_REQ (1 << STACK_ALIGN_BITS) #endif #define MAX_PATH 260 #define _MAX_PATH 260 #define _MAX_DRIVE 3 /* max. length of drive component */ #define _MAX_DIR 256 /* max. length of path component */ #define _MAX_FNAME 256 /* max. length of file name component */ #define _MAX_EXT 256 /* max. length of extension component */ // In some Win32 APIs MAX_PATH is used for file names (even though 256 is the normal file system limit) // use _MAX_PATH_FNAME to indicate these cases #define MAX_PATH_FNAME MAX_PATH #define MAX_LONGPATH 1024 /* max. length of full pathname */ #define MAXSHORT 0x7fff #define MAXLONG 0x7fffffff #define MAXCHAR 0x7f #define MAXDWORD 0xffffffff // Sorting IDs. // // Note that the named locale APIs (eg CompareStringExEx) are recommended. // #define LANG_CHINESE 0x04 #define LANG_ENGLISH 0x09 #define LANG_JAPANESE 0x11 #define LANG_KOREAN 0x12 #define LANG_THAI 0x1e /******************* Compiler-specific glue *******************************/ #ifndef _MSC_VER #if defined(CORECLR) // Define this if the underlying platform supports true 2-pass EH. // At the same time, this enables running several PAL instances // side-by-side. #define FEATURE_PAL_SXS 1 #endif // CORECLR #endif // !_MSC_VER #if defined(_MSC_VER) || defined(__llvm__) #define DECLSPEC_ALIGN(x) __declspec(align(x)) #else #define DECLSPEC_ALIGN(x) #endif #define DECLSPEC_NORETURN PAL_NORETURN #if !defined(_MSC_VER) || defined(SOURCE_FORMATTING) #define __assume(x) (void)0 #define __annotation(x) #endif //!MSC_VER #define UNALIGNED #ifndef FORCEINLINE #if _MSC_VER < 1200 #define FORCEINLINE inline #else #define FORCEINLINE __forceinline #endif #endif #ifndef PAL_STDCPP_COMPAT #if __GNUC__ typedef __builtin_va_list va_list; /* We should consider if the va_arg definition here is actually necessary. Could we use the standard va_arg definition? */ #define va_start __builtin_va_start #define va_arg __builtin_va_arg #define va_copy __builtin_va_copy #define va_end __builtin_va_end #define VOID void #define PUB __attribute__((visibility("default"))) #else // __GNUC__ typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #if _MSC_VER >= 1400 #ifdef __cplusplus #define _ADDRESSOF(v) ( &reinterpret_cast(v) ) #else #define _ADDRESSOF(v) ( &(v) ) #endif #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define _crt_va_end(ap) ( ap = (va_list)0 ) #define va_start _crt_va_start #define va_arg _crt_va_arg #define va_end _crt_va_end #else // _MSC_VER #define va_start(ap,v) (ap = (va_list) (&(v)) + _INTSIZEOF(v)) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) #endif // _MSC_VER #define va_copy(dest,src) (dest = src) #endif // __GNUC__ #endif // !PAL_STDCPP_COMPAT /******************* PAL-Specific Entrypoints *****************************/ #define IsDebuggerPresent PAL_IsDebuggerPresent PALIMPORT BOOL PALAPI PAL_IsDebuggerPresent(VOID); #define MAXIMUM_SUSPEND_COUNT MAXCHAR #define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 #define UCHAR_MAX 0xff #define SHRT_MIN (-32768) #define SHRT_MAX 32767 #define USHRT_MAX 0xffff #define INT_MIN (-2147483647 - 1) #define INT_MAX 2147483647 #define UINT_MAX 0xffffffff #define LONG_MIN (-2147483647L - 1) #define LONG_MAX 2147483647L #define ULONG_MAX 0xffffffffUL #define FLT_MAX 3.402823466e+38F #define DBL_MAX 1.7976931348623157e+308 /* minimum signed 64 bit value */ #define _I64_MIN (I64(-9223372036854775807) - 1) /* maximum signed 64 bit value */ #define _I64_MAX I64(9223372036854775807) /* maximum unsigned 64 bit value */ #define _UI64_MAX UI64(0xffffffffffffffff) #define _I8_MAX SCHAR_MAX #define _I8_MIN SCHAR_MIN #define _I16_MAX SHRT_MAX #define _I16_MIN SHRT_MIN #define _I32_MAX INT_MAX #define _I32_MIN INT_MIN #define _UI8_MAX UCHAR_MAX #define _UI8_MIN UCHAR_MIN #define _UI16_MAX USHRT_MAX #define _UI16_MIN USHRT_MIN #define _UI32_MAX UINT_MAX #define _UI32_MIN UINT_MIN #ifdef PAL_STDCPP_COMPAT #undef NULL #endif #ifndef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif #endif #if defined(PAL_STDCPP_COMPAT) && !defined(__cplusplus) #define nullptr NULL #endif // defined(PAL_STDCPP_COMPAT) && !defined(__cplusplus) #ifndef PAL_STDCPP_COMPAT #if _WIN64 || _MSC_VER >= 1400 typedef __int64 time_t; #else typedef long time_t; #endif #define _TIME_T_DEFINED #endif // !PAL_STDCPP_COMPAT #if ENABLE_DOWNLEVEL_FOR_NLS #define MAKELCID(lgid, srtid) ((DWORD)((((DWORD)((WORD )(srtid))) << 16) | \ ((DWORD)((WORD )(lgid))))) #define LANGIDFROMLCID(lcid) ((WORD)(lcid)) #define SORTIDFROMLCID(lcid) ((WORD)((((DWORD)(lcid)) >> 16) & 0xf)) #define LANG_NEUTRAL 0x00 #define LANG_INVARIANT 0x7f #define SUBLANG_NEUTRAL 0x00 // language neutral #define SUBLANG_DEFAULT 0x01 // user default #define SORT_DEFAULT 0x0 // sorting default #define SUBLANG_SYS_DEFAULT 0x02 // system default #define MAKELANGID(p, s) ((((WORD )(s)) << 10) | (WORD )(p)) #define PRIMARYLANGID(lgid) ((WORD )(lgid) & 0x3ff) #define SUBLANGID(lgid) ((WORD )(lgid) >> 10) #define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT)) #define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)) #define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT)) #define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT)) #define LOCALE_NEUTRAL (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT)) #define LOCALE_US_ENGLISH (MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)) #define LOCALE_INVARIANT (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)) #define SUBLANG_ENGLISH_US 0x01 #define SUBLANG_CHINESE_TRADITIONAL 0x01 /* Chinese (Traditional) */ #endif // ENABLE_DOWNLEVEL_FOR_NLS #define CT_CTYPE1 0x00000001 /* ctype 1 information */ #define CT_CTYPE2 0x00000002 /* ctype 2 information */ #define CT_CTYPE3 0x00000004 /* ctype 3 information */ #define C1_UPPER 0x0001 /* upper case */ #define C1_LOWER 0x0002 /* lower case */ #define C1_DIGIT 0x0004 /* decimal digits */ #define C1_SPACE 0x0008 /* spacing characters */ #define C1_PUNCT 0x0010 /* punctuation characters */ #define C1_CNTRL 0x0020 /* control characters */ #define C1_BLANK 0x0040 /* blank characters */ #define C1_XDIGIT 0x0080 /* other digits */ #define C1_ALPHA 0x0100 /* any linguistic character */ #define C2_LEFTTORIGHT 0x0001 /* left to right */ #define C2_RIGHTTOLEFT 0x0002 /* right to left */ #define C2_EUROPENUMBER 0x0003 /* European number, digit */ #define C2_EUROPESEPARATOR 0x0004 /* European numeric separator */ #define C2_EUROPETERMINATOR 0x0005 /* European numeric terminator */ #define C2_ARABICNUMBER 0x0006 /* Arabic number */ #define C2_COMMONSEPARATOR 0x0007 /* common numeric separator */ #define C2_BLOCKSEPARATOR 0x0008 /* block separator */ #define C2_SEGMENTSEPARATOR 0x0009 /* segment separator */ #define C2_WHITESPACE 0x000A /* white space */ #define C2_OTHERNEUTRAL 0x000B /* other neutrals */ #define C2_NOTAPPLICABLE 0x0000 /* no implicit directionality */ #define C3_NONSPACING 0x0001 /* nonspacing character */ #define C3_DIACRITIC 0x0002 /* diacritic mark */ #define C3_VOWELMARK 0x0004 /* vowel mark */ #define C3_SYMBOL 0x0008 /* symbols */ #define C3_KATAKANA 0x0010 /* katakana character */ #define C3_HIRAGANA 0x0020 /* hiragana character */ #define C3_HALFWIDTH 0x0040 /* half width character */ #define C3_FULLWIDTH 0x0080 /* full width character */ #define C3_IDEOGRAPH 0x0100 /* ideographic character */ #define C3_KASHIDA 0x0200 /* Arabic kashida character */ #define C3_LEXICAL 0x0400 /* lexical character */ #define C3_ALPHA 0x8000 /* any ling. char (C1_ALPHA) */ #define C3_NOTAPPLICABLE 0x0000 /* ctype 3 is not applicable */ #define DLL_PROCESS_ATTACH 1 #define DLL_THREAD_ATTACH 2 #define DLL_THREAD_DETACH 3 #define DLL_PROCESS_DETACH 0 #define PAL_INITIALIZE_NONE 0x00 #define PAL_INITIALIZE_SYNC_THREAD 0x01 #define PAL_INITIALIZE_EXEC_ALLOCATOR 0x02 #define PAL_INITIALIZE_STD_HANDLES 0x04 #define PAL_INITIALIZE_REGISTER_SIGTERM_HANDLER 0x08 #define PAL_INITIALIZE_DEBUGGER_EXCEPTIONS 0x10 // PAL_Initialize() flags #define PAL_INITIALIZE (PAL_INITIALIZE_SYNC_THREAD | PAL_INITIALIZE_STD_HANDLES) // PAL_InitializeDLL() flags - don't start any of the helper threads #define PAL_INITIALIZE_DLL PAL_INITIALIZE_NONE // PAL_InitializeCoreCLR() flags #define PAL_INITIALIZE_CORECLR (PAL_INITIALIZE | PAL_INITIALIZE_EXEC_ALLOCATOR | PAL_INITIALIZE_REGISTER_SIGTERM_HANDLER | PAL_INITIALIZE_DEBUGGER_EXCEPTIONS) typedef DWORD (PALAPI *PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter); typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; /******************* PAL-Specific Entrypoints *****************************/ PALIMPORT int PALAPI PAL_Initialize( int argc, const char * const argv[]); PALIMPORT int PALAPI PAL_InitializeDLL(VOID); PALIMPORT DWORD PALAPI PAL_InitializeCoreCLR( const char *szExePath); PALIMPORT DWORD_PTR PALAPI PAL_EntryPoint( IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter); /// /// This function shuts down PAL WITHOUT exiting the current process. /// PALIMPORT void PALAPI PAL_Shutdown( void); /// /// This function shuts down PAL and exits the current process. /// PALIMPORT void PALAPI PAL_Terminate( void); /// /// This function shuts down PAL and exits the current process with /// the specified exit code. /// PALIMPORT void PALAPI PAL_TerminateEx( int exitCode); typedef VOID (*PSHUTDOWN_CALLBACK)(void); PALIMPORT VOID PALAPI PAL_SetShutdownCallback( IN PSHUTDOWN_CALLBACK callback); typedef VOID (*PPAL_STARTUP_CALLBACK)( char *modulePath, HMODULE hModule, PVOID parameter); PALIMPORT DWORD PALAPI PAL_RegisterForRuntimeStartup( IN DWORD dwProcessId, IN PPAL_STARTUP_CALLBACK pfnCallback, IN PVOID parameter, OUT PVOID *ppUnregisterToken); PALIMPORT DWORD PALAPI PAL_UnregisterForRuntimeStartup( IN PVOID pUnregisterToken); PALIMPORT BOOL PALAPI PAL_NotifyRuntimeStarted(VOID); static const int MAX_DEBUGGER_TRANSPORT_PIPE_NAME_LENGTH = 64; PALIMPORT void PALAPI PAL_GetTransportPipeName(char *name, DWORD id, const char *suffix); PALIMPORT void PALAPI PAL_InitializeDebug( void); PALIMPORT HINSTANCE PALAPI PAL_RegisterModule( IN LPCSTR lpLibFileName); PALIMPORT VOID PALAPI PAL_UnregisterModule( IN HINSTANCE hInstance); PALIMPORT BOOL PALAPI PAL_GetPALDirectoryW( OUT LPWSTR lpDirectoryName, IN OUT UINT* cchDirectoryName); #ifdef UNICODE #define PAL_GetPALDirectory PAL_GetPALDirectoryW #else #define PAL_GetPALDirectory PAL_GetPALDirectoryA #endif PALIMPORT BOOL PALAPI PAL_Random( IN BOOL bStrong, IN OUT LPVOID lpBuffer, IN DWORD dwLength); PALIMPORT BOOL PALAPI PAL_ProbeMemory( PVOID pBuffer, DWORD cbBuffer, BOOL fWriteAccess); /******************* winuser.h Entrypoints *******************************/ PALIMPORT LPSTR PALAPI CharNextA( IN LPCSTR lpsz); PALIMPORT LPSTR PALAPI CharNextExA( IN WORD CodePage, IN LPCSTR lpCurrentChar, IN DWORD dwFlags); #ifndef UNICODE #define CharNext CharNextA #define CharNextEx CharNextExA #endif #define MB_OK 0x00000000L #define MB_OKCANCEL 0x00000001L #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_YESNO 0x00000004L #define MB_RETRYCANCEL 0x00000005L #define MB_ICONHAND 0x00000010L #define MB_ICONQUESTION 0x00000020L #define MB_ICONEXCLAMATION 0x00000030L #define MB_ICONASTERISK 0x00000040L #define MB_ICONINFORMATION MB_ICONASTERISK #define MB_ICONSTOP MB_ICONHAND #define MB_ICONERROR MB_ICONHAND #define MB_DEFBUTTON1 0x00000000L #define MB_DEFBUTTON2 0x00000100L #define MB_DEFBUTTON3 0x00000200L #define MB_SYSTEMMODAL 0x00001000L #define MB_TASKMODAL 0x00002000L #define MB_SETFOREGROUND 0x00010000L #define MB_TOPMOST 0x00040000L #define MB_NOFOCUS 0x00008000L #define MB_SETFOREGROUND 0x00010000L #define MB_DEFAULT_DESKTOP_ONLY 0x00020000L // Note: this is the NT 4.0 and greater value. #define MB_SERVICE_NOTIFICATION 0x00200000L #define MB_TYPEMASK 0x0000000FL #define MB_ICONMASK 0x000000F0L #define MB_DEFMASK 0x00000F00L #define IDOK 1 #define IDCANCEL 2 #define IDABORT 3 #define IDRETRY 4 #define IDIGNORE 5 #define IDYES 6 #define IDNO 7 PALIMPORT int PALAPI MessageBoxW( IN LPVOID hWnd, // NOTE: diff from winuser.h IN LPCWSTR lpText, IN LPCWSTR lpCaption, IN UINT uType); #ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif /***************** wincon.h Entrypoints **********************************/ #define CTRL_C_EVENT 0 #define CTRL_BREAK_EVENT 1 #define CTRL_CLOSE_EVENT 2 // 3 is reserved! // 4 is reserved! #define CTRL_LOGOFF_EVENT 5 #define CTRL_SHUTDOWN_EVENT 6 typedef BOOL (PALAPI *PHANDLER_ROUTINE)( DWORD CtrlType ); #ifndef CORECLR PALIMPORT BOOL PALAPI GenerateConsoleCtrlEvent( IN DWORD dwCtrlEvent, IN DWORD dwProcessGroupId ); #endif // !CORECLR //end wincon.h Entrypoints // From win32.h #ifndef _CRTIMP #ifdef __llvm__ #define _CRTIMP #else // __llvm__ #define _CRTIMP __declspec(dllimport) #endif // __llvm__ #endif // _CRTIMP /******************* winbase.h Entrypoints and defines ************************/ PALIMPORT BOOL PALAPI AreFileApisANSI( VOID); typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; #define _SH_DENYWR 0x20 /* deny write mode */ #define FILE_READ_DATA ( 0x0001 ) // file & pipe #define FILE_APPEND_DATA ( 0x0004 ) // file #define GENERIC_READ (0x80000000L) #define GENERIC_WRITE (0x40000000L) #define FILE_SHARE_READ 0x00000001 #define FILE_SHARE_WRITE 0x00000002 #define FILE_SHARE_DELETE 0x00000004 #define CREATE_NEW 1 #define CREATE_ALWAYS 2 #define OPEN_EXISTING 3 #define OPEN_ALWAYS 4 #define TRUNCATE_EXISTING 5 #define FILE_ATTRIBUTE_READONLY 0x00000001 #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020 #define FILE_ATTRIBUTE_DEVICE 0x00000040 #define FILE_ATTRIBUTE_NORMAL 0x00000080 #define FILE_FLAG_WRITE_THROUGH 0x80000000 #define FILE_FLAG_NO_BUFFERING 0x20000000 #define FILE_FLAG_RANDOM_ACCESS 0x10000000 #define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000 #define FILE_BEGIN 0 #define FILE_CURRENT 1 #define FILE_END 2 #define STILL_ACTIVE (0x00000103L) #define INVALID_SET_FILE_POINTER ((DWORD)-1) PALIMPORT HANDLE PALAPI CreateFileW( IN LPCWSTR lpFileName, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes, IN HANDLE hTemplateFile); #ifdef UNICODE #define CreateFile CreateFileW #else #define CreateFile CreateFileA #endif PALIMPORT BOOL PALAPI LockFile( IN HANDLE hFile, IN DWORD dwFileOffsetLow, IN DWORD dwFileOffsetHigh, IN DWORD nNumberOfBytesToLockLow, IN DWORD nNumberOfBytesToLockHigh ); PALIMPORT BOOL PALAPI UnlockFile( IN HANDLE hFile, IN DWORD dwFileOffsetLow, IN DWORD dwFileOffsetHigh, IN DWORD nNumberOfBytesToUnlockLow, IN DWORD nNumberOfBytesToUnlockHigh ); PALIMPORT DWORD PALAPI SearchPathW( IN LPCWSTR lpPath, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart ); #ifdef UNICODE #define SearchPath SearchPathW #else #define SearchPath SearchPathA #endif // !UNICODE PALIMPORT BOOL PALAPI CopyFileW( IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists); #ifdef UNICODE #define CopyFile CopyFileW #else #define CopyFile CopyFileA #endif PALIMPORT BOOL PALAPI DeleteFileW( IN LPCWSTR lpFileName); #ifdef UNICODE #define DeleteFile DeleteFileW #else #define DeleteFile DeleteFileA #endif PALIMPORT BOOL PALAPI MoveFileW( IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName); #ifdef UNICODE #define MoveFile MoveFileW #else #define MoveFile MoveFileA #endif #define MOVEFILE_REPLACE_EXISTING 0x00000001 #define MOVEFILE_COPY_ALLOWED 0x00000002 PALIMPORT BOOL PALAPI MoveFileExW( IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN DWORD dwFlags); #ifdef UNICODE #define MoveFileEx MoveFileExW #else #define MoveFileEx MoveFileExA #endif PALIMPORT BOOL PALAPI CreateDirectoryW( IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes); #ifdef UNICODE #define CreateDirectory CreateDirectoryW #else #define CreateDirectory CreateDirectoryA #endif PALIMPORT BOOL PALAPI RemoveDirectoryW( IN LPCWSTR lpPathName); #ifdef UNICODE #define RemoveDirectory RemoveDirectoryW #else #define RemoveDirectory RemoveDirectoryA #endif typedef struct _BY_HANDLE_FILE_INFORMATION { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD dwVolumeSerialNumber; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD nNumberOfLinks; DWORD nFileIndexHigh; DWORD nFileIndexLow; } BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION; typedef struct _WIN32_FIND_DATAA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; CHAR cFileName[ MAX_PATH_FNAME ]; CHAR cAlternateFileName[ 14 ]; } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; typedef struct _WIN32_FIND_DATAW { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[ MAX_PATH_FNAME ]; WCHAR cAlternateFileName[ 14 ]; } WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW; #ifdef UNICODE typedef WIN32_FIND_DATAW WIN32_FIND_DATA; typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA; typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA; #else typedef WIN32_FIND_DATAA WIN32_FIND_DATA; typedef PWIN32_FIND_DATAA PWIN32_FIND_DATA; typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA; #endif PALIMPORT HANDLE PALAPI FindFirstFileW( IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData); #ifdef UNICODE #define FindFirstFile FindFirstFileW #else #define FindFirstFile FindFirstFileA #endif PALIMPORT BOOL PALAPI FindNextFileW( IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData); #ifdef UNICODE #define FindNextFile FindNextFileW #else #define FindNextFile FindNextFileA #endif PALIMPORT BOOL PALAPI FindClose( IN OUT HANDLE hFindFile); PALIMPORT DWORD PALAPI GetFileAttributesW( IN LPCWSTR lpFileName); #ifdef UNICODE #define GetFileAttributes GetFileAttributesW #else #define GetFileAttributes GetFileAttributesA #endif typedef enum _GET_FILEEX_INFO_LEVELS { GetFileExInfoStandard } GET_FILEEX_INFO_LEVELS; typedef enum _FINDEX_INFO_LEVELS { FindExInfoStandard, FindExInfoBasic, FindExInfoMaxInfoLevel } FINDEX_INFO_LEVELS; typedef enum _FINDEX_SEARCH_OPS { FindExSearchNameMatch, FindExSearchLimitToDirectories, FindExSearchLimitToDevices, FindExSearchMaxSearchOp } FINDEX_SEARCH_OPS; typedef struct _WIN32_FILE_ATTRIBUTE_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; } WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; PALIMPORT BOOL PALAPI GetFileAttributesExW( IN LPCWSTR lpFileName, IN GET_FILEEX_INFO_LEVELS fInfoLevelId, OUT LPVOID lpFileInformation); #ifdef UNICODE #define GetFileAttributesEx GetFileAttributesExW #endif PALIMPORT BOOL PALAPI SetFileAttributesW( IN LPCWSTR lpFileName, IN DWORD dwFileAttributes); #ifdef UNICODE #define SetFileAttributes SetFileAttributesW #else #define SetFileAttributes SetFileAttributesA #endif typedef LPVOID LPOVERLAPPED; // diff from winbase.h PALIMPORT BOOL PALAPI WriteFile( IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped); PALIMPORT BOOL PALAPI ReadFile( IN HANDLE hFile, OUT LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead, IN LPOVERLAPPED lpOverlapped); #define STD_INPUT_HANDLE ((DWORD)-10) #define STD_OUTPUT_HANDLE ((DWORD)-11) #define STD_ERROR_HANDLE ((DWORD)-12) PALIMPORT HANDLE PALAPI GetStdHandle( IN DWORD nStdHandle); PALIMPORT BOOL PALAPI SetEndOfFile( IN HANDLE hFile); PALIMPORT DWORD PALAPI SetFilePointer( IN HANDLE hFile, IN LONG lDistanceToMove, IN PLONG lpDistanceToMoveHigh, IN DWORD dwMoveMethod); PALIMPORT BOOL PALAPI SetFilePointerEx( IN HANDLE hFile, IN LARGE_INTEGER liDistanceToMove, OUT PLARGE_INTEGER lpNewFilePointer, IN DWORD dwMoveMethod); PALIMPORT DWORD PALAPI GetFileSize( IN HANDLE hFile, OUT LPDWORD lpFileSizeHigh); PALIMPORT BOOL PALAPI GetFileSizeEx( IN HANDLE hFile, OUT PLARGE_INTEGER lpFileSize); PALIMPORT BOOL PALAPI GetFileInformationByHandle( IN HANDLE hFile, OUT BY_HANDLE_FILE_INFORMATION* lpFileInformation); PALIMPORT LONG PALAPI CompareFileTime( IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2); PALIMPORT BOOL PALAPI SetFileTime( IN HANDLE hFile, IN CONST FILETIME *lpCreationTime, IN CONST FILETIME *lpLastAccessTime, IN CONST FILETIME *lpLastWriteTime); PALIMPORT BOOL PALAPI GetFileTime( IN HANDLE hFile, OUT LPFILETIME lpCreationTime, OUT LPFILETIME lpLastAccessTime, OUT LPFILETIME lpLastWriteTime); PALIMPORT VOID PALAPI GetSystemTimeAsFileTime( OUT LPFILETIME lpSystemTimeAsFileTime); typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME; PALIMPORT VOID PALAPI GetSystemTime( OUT LPSYSTEMTIME lpSystemTime); PALIMPORT BOOL PALAPI FileTimeToSystemTime( IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime); PALIMPORT BOOL PALAPI FileTimeToDosDateTime( IN CONST FILETIME *lpFileTime, OUT LPWORD lpFatDate, OUT LPWORD lpFatTime ); PALIMPORT BOOL PALAPI FlushFileBuffers( IN HANDLE hFile); #define FILE_TYPE_UNKNOWN 0x0000 #define FILE_TYPE_DISK 0x0001 #define FILE_TYPE_CHAR 0x0002 #define FILE_TYPE_PIPE 0x0003 #define FILE_TYPE_REMOTE 0x8000 PALIMPORT DWORD PALAPI GetFileType( IN HANDLE hFile); PALIMPORT UINT PALAPI GetConsoleCP( VOID); PALIMPORT UINT PALAPI GetConsoleOutputCP( VOID); PALIMPORT DWORD PALAPI GetFullPathNameW( IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart); #ifdef UNICODE #define GetFullPathName GetFullPathNameW #else #define GetFullPathName GetFullPathNameA #endif PALIMPORT DWORD PALAPI GetLongPathNameW( IN LPCWSTR lpszShortPath, OUT LPWSTR lpszLongPath, IN DWORD cchBuffer); #ifdef UNICODE #define GetLongPathName GetLongPathNameW #endif PALIMPORT DWORD PALAPI GetShortPathNameW( IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer); #ifdef UNICODE #define GetShortPathName GetShortPathNameW #endif PALIMPORT UINT PALAPI GetTempFileNameW( IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName); #ifdef UNICODE #define GetTempFileName GetTempFileNameW #else #define GetTempFileName GetTempFileNameA #endif PALIMPORT DWORD PALAPI GetTempPathW( IN DWORD nBufferLength, OUT LPWSTR lpBuffer); #ifdef UNICODE #define GetTempPath GetTempPathW #else #define GetTempPath GetTempPathA #endif PALIMPORT DWORD PALAPI GetCurrentDirectoryW( IN DWORD nBufferLength, OUT LPWSTR lpBuffer); #ifdef UNICODE #define GetCurrentDirectory GetCurrentDirectoryW #else #define GetCurrentDirectory GetCurrentDirectoryA #endif PALIMPORT BOOL PALAPI SetCurrentDirectoryW( IN LPCWSTR lpPathName); #ifdef UNICODE #define SetCurrentDirectory SetCurrentDirectoryW #else #define SetCurrentDirectory SetCurrentDirectoryA #endif // maximum length of the NETBIOS name (not including NULL) #define MAX_COMPUTERNAME_LENGTH 15 // maximum length of the username (not including NULL) #define UNLEN 256 PALIMPORT BOOL PALAPI GetUserNameW( OUT LPWSTR lpBuffer, // address of name buffer IN OUT LPDWORD nSize ); // address of size of name buffer PALIMPORT BOOL PALAPI GetComputerNameW( OUT LPWSTR lpBuffer, // address of name buffer IN OUT LPDWORD nSize); // address of size of name buffer #ifdef UNICODE #define GetUserName GetUserNameW #define GetComputerName GetComputerNameW #endif // UNICODE PALIMPORT HANDLE PALAPI CreateSemaphoreW( IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName); PALIMPORT HANDLE PALAPI CreateSemaphoreExW( IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName, IN /*_Reserved_*/ DWORD dwFlags, IN DWORD dwDesiredAccess); PALIMPORT HANDLE PALAPI OpenSemaphoreW( IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName); #ifdef UNICODE #define CreateSemaphore CreateSemaphoreW #define CreateSemaphoreEx CreateSemaphoreExW #else #define CreateSemaphore CreateSemaphoreA #define CreateSemaphoreEx CreateSemaphoreExA #endif PALIMPORT BOOL PALAPI ReleaseSemaphore( IN HANDLE hSemaphore, IN LONG lReleaseCount, OUT LPLONG lpPreviousCount); PALIMPORT HANDLE PALAPI CreateEventW( IN LPSECURITY_ATTRIBUTES lpEventAttributes, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName); #ifdef UNICODE #define CreateEvent CreateEventW #else #define CreateEvent CreateEventA #endif PALIMPORT BOOL PALAPI SetEvent( IN HANDLE hEvent); PALIMPORT BOOL PALAPI ResetEvent( IN HANDLE hEvent); PALIMPORT HANDLE PALAPI OpenEventW( IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName); #ifdef UNICODE #define OpenEvent OpenEventW #endif PALIMPORT HANDLE PALAPI CreateMutexW( IN LPSECURITY_ATTRIBUTES lpMutexAttributes, IN BOOL bInitialOwner, IN LPCWSTR lpName); #ifdef UNICODE #define CreateMutex CreateMutexW #else #define CreateMutex CreateMutexA #endif PALIMPORT HANDLE PALAPI OpenMutexW( IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName); #ifdef UNICODE #define OpenMutex OpenMutexW #else #define OpenMutex OpenMutexA #endif // UNICODE PALIMPORT BOOL PALAPI ReleaseMutex( IN HANDLE hMutex); PALIMPORT DWORD PALAPI GetCurrentProcessId( VOID); PALIMPORT DWORD PALAPI GetCurrentSessionId( VOID); PALIMPORT HANDLE PALAPI GetCurrentProcess( VOID); PALIMPORT DWORD PALAPI GetCurrentThreadId( VOID); // To work around multiply-defined symbols in the Carbon framework. #define GetCurrentThread PAL_GetCurrentThread PALIMPORT HANDLE PALAPI GetCurrentThread( VOID); #define STARTF_USESTDHANDLES 0x00000100 typedef struct _STARTUPINFOW { DWORD cb; LPWSTR lpReserved_PAL_Undefined; LPWSTR lpDesktop_PAL_Undefined; LPWSTR lpTitle_PAL_Undefined; DWORD dwX_PAL_Undefined; DWORD dwY_PAL_Undefined; DWORD dwXSize_PAL_Undefined; DWORD dwYSize_PAL_Undefined; DWORD dwXCountChars_PAL_Undefined; DWORD dwYCountChars_PAL_Undefined; DWORD dwFillAttribute_PAL_Undefined; DWORD dwFlags; WORD wShowWindow_PAL_Undefined; WORD cbReserved2_PAL_Undefined; LPBYTE lpReserved2_PAL_Undefined; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOW, *LPSTARTUPINFOW; typedef struct _STARTUPINFOA { DWORD cb; LPSTR lpReserved_PAL_Undefined; LPSTR lpDesktop_PAL_Undefined; LPSTR lpTitle_PAL_Undefined; DWORD dwX_PAL_Undefined; DWORD dwY_PAL_Undefined; DWORD dwXSize_PAL_Undefined; DWORD dwYSize_PAL_Undefined; DWORD dwXCountChars_PAL_Undefined; DWORD dwYCountChars_PAL_Undefined; DWORD dwFillAttribute_PAL_Undefined; DWORD dwFlags; WORD wShowWindow_PAL_Undefined; WORD cbReserved2_PAL_Undefined; LPBYTE lpReserved2_PAL_Undefined; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOA, *LPSTARTUPINFOA; #ifdef UNICODE typedef STARTUPINFOW STARTUPINFO; typedef LPSTARTUPINFOW LPSTARTUPINFO; #else typedef STARTUPINFOA STARTUPINFO; typedef LPSTARTUPINFOW LPSTARTUPINFO; #endif #define CREATE_NEW_CONSOLE 0x00000010 #define NORMAL_PRIORITY_CLASS 0x00000020 typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId_PAL_Undefined; } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; PALIMPORT BOOL PALAPI CreateProcessW( IN LPCWSTR lpApplicationName, IN LPWSTR lpCommandLine, IN LPSECURITY_ATTRIBUTES lpProcessAttributes, IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN BOOL bInheritHandles, IN DWORD dwCreationFlags, IN LPVOID lpEnvironment, IN LPCWSTR lpCurrentDirectory, IN LPSTARTUPINFOW lpStartupInfo, OUT LPPROCESS_INFORMATION lpProcessInformation); #ifdef UNICODE #define CreateProcess CreateProcessW #else #define CreateProcess CreateProcessA #endif PALIMPORT PAL_NORETURN VOID PALAPI ExitProcess( IN UINT uExitCode); PALIMPORT BOOL PALAPI TerminateProcess( IN HANDLE hProcess, IN UINT uExitCode); PALIMPORT BOOL PALAPI GetExitCodeProcess( IN HANDLE hProcess, IN LPDWORD lpExitCode); PALIMPORT BOOL PALAPI GetProcessTimes( IN HANDLE hProcess, OUT LPFILETIME lpCreationTime, OUT LPFILETIME lpExitTime, OUT LPFILETIME lpKernelTime, OUT LPFILETIME lpUserTime); #define MAXIMUM_WAIT_OBJECTS 64 #define WAIT_OBJECT_0 0 #define WAIT_ABANDONED 0x00000080 #define WAIT_ABANDONED_0 0x00000080 #define WAIT_TIMEOUT 258 #define WAIT_FAILED ((DWORD)0xFFFFFFFF) #define INFINITE 0xFFFFFFFF // Infinite timeout PALIMPORT DWORD PALAPI WaitForSingleObject( IN HANDLE hHandle, IN DWORD dwMilliseconds); PALIMPORT DWORD PALAPI WaitForSingleObjectEx( IN HANDLE hHandle, IN DWORD dwMilliseconds, IN BOOL bAlertable); PALIMPORT DWORD PALAPI WaitForMultipleObjects( IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds); PALIMPORT DWORD PALAPI WaitForMultipleObjectsEx( IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds, IN BOOL bAlertable); PALIMPORT RHANDLE PALAPI PAL_LocalHandleToRemote( IN HANDLE hLocal); PALIMPORT HANDLE PALAPI PAL_RemoteHandleToLocal( IN RHANDLE hRemote); #define DUPLICATE_CLOSE_SOURCE 0x00000001 #define DUPLICATE_SAME_ACCESS 0x00000002 PALIMPORT BOOL PALAPI DuplicateHandle( IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions); PALIMPORT VOID PALAPI Sleep( IN DWORD dwMilliseconds); PALIMPORT DWORD PALAPI SleepEx( IN DWORD dwMilliseconds, IN BOOL bAlertable); PALIMPORT BOOL PALAPI SwitchToThread( VOID); #define DEBUG_PROCESS 0x00000001 #define DEBUG_ONLY_THIS_PROCESS 0x00000002 #define CREATE_SUSPENDED 0x00000004 #define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 PALIMPORT HANDLE PALAPI CreateThread( IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId); PALIMPORT PAL_NORETURN VOID PALAPI ExitThread( IN DWORD dwExitCode); PALIMPORT BOOL PALAPI GetExitCodeThread( IN HANDLE hThread, IN LPDWORD lpExitCode); PALIMPORT DWORD PALAPI ResumeThread( IN HANDLE hThread); typedef VOID (PALAPI *PAPCFUNC)(ULONG_PTR dwParam); PALIMPORT DWORD PALAPI QueueUserAPC( IN PAPCFUNC pfnAPC, IN HANDLE hThread, IN ULONG_PTR dwData); #ifdef _X86_ // // *********************************************************************************** // // NOTE: These context definitions are replicated in ndp/clr/src/debug/inc/DbgTargetContext.h (for the // purposes manipulating contexts from different platforms during remote debugging). Be sure to keep those // definitions in sync if you make any changes here. // // *********************************************************************************** // #define SIZE_OF_80387_REGISTERS 80 #define CONTEXT_i386 0x00010000 #define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP #define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI #define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) #define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) #define MAXIMUM_SUPPORTED_EXTENSION 512 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x40L) #define CONTEXT_EXCEPTION_ACTIVE 0x8000000L #define CONTEXT_SERVICE_ACTIVE 0x10000000L #define CONTEXT_EXCEPTION_REQUEST 0x40000000L #define CONTEXT_EXCEPTION_REPORTING 0x80000000L // // This flag is set by the unwinder if it has unwound to a call // site, and cleared whenever it unwinds through a trap frame. // It is used by language-specific exception handlers to help // differentiate exception scopes during dispatching. // #define CONTEXT_UNWOUND_TO_CALL 0x20000000 typedef struct _FLOATING_SAVE_AREA { DWORD ControlWord; DWORD StatusWord; DWORD TagWord; DWORD ErrorOffset; DWORD ErrorSelector; DWORD DataOffset; DWORD DataSelector; BYTE RegisterArea[SIZE_OF_80387_REGISTERS]; DWORD Cr0NpxState; } FLOATING_SAVE_AREA; typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA; typedef struct _CONTEXT { ULONG ContextFlags; ULONG Dr0_PAL_Undefined; ULONG Dr1_PAL_Undefined; ULONG Dr2_PAL_Undefined; ULONG Dr3_PAL_Undefined; ULONG Dr6_PAL_Undefined; ULONG Dr7_PAL_Undefined; FLOATING_SAVE_AREA FloatSave; ULONG SegGs_PAL_Undefined; ULONG SegFs_PAL_Undefined; ULONG SegEs_PAL_Undefined; ULONG SegDs_PAL_Undefined; ULONG Edi; ULONG Esi; ULONG Ebx; ULONG Edx; ULONG Ecx; ULONG Eax; ULONG Ebp; ULONG Eip; ULONG SegCs; ULONG EFlags; ULONG Esp; ULONG SegSs; UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; ULONG ResumeEsp; } CONTEXT, *PCONTEXT, *LPCONTEXT; // To support saving and loading xmm register context we need to know the offset in the ExtendedRegisters // section at which they are stored. This has been determined experimentally since I have found no // documentation thus far but it corresponds to the offset we'd expect if a fxsave instruction was used to // store the regular FP state along with the XMM registers at the start of the extended registers section. // Technically the offset doesn't really matter if no code in the PAL or runtime knows what the offset should // be either (as long as we're consistent across GetThreadContext() and SetThreadContext() and we don't // support any other values in the ExtendedRegisters) but we might as well be as accurate as we can. #define CONTEXT_EXREG_XMM_OFFSET 160 typedef struct _KNONVOLATILE_CONTEXT { DWORD Edi; DWORD Esi; DWORD Ebx; DWORD Ebp; } KNONVOLATILE_CONTEXT, *PKNONVOLATILE_CONTEXT; typedef struct _KNONVOLATILE_CONTEXT_POINTERS { // The ordering of these fields should be aligned with that // of corresponding fields in CONTEXT // // (See FillRegDisplay in inc/regdisp.h for details) PDWORD Edi; PDWORD Esi; PDWORD Ebx; PDWORD Edx; PDWORD Ecx; PDWORD Eax; PDWORD Ebp; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; #elif defined(_AMD64_) // copied from winnt.h #define CONTEXT_AMD64 0x100000 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x40L) #define CONTEXT_EXCEPTION_ACTIVE 0x8000000 #define CONTEXT_SERVICE_ACTIVE 0x10000000 #define CONTEXT_EXCEPTION_REQUEST 0x40000000 #define CONTEXT_EXCEPTION_REPORTING 0x80000000 typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; } M128A, *PM128A; typedef struct _XMM_SAVE_AREA32 { WORD ControlWord; WORD StatusWord; BYTE TagWord; BYTE Reserved1; WORD ErrorOpcode; DWORD ErrorOffset; WORD ErrorSelector; WORD Reserved2; DWORD DataOffset; WORD DataSelector; WORD Reserved3; DWORD MxCsr; DWORD MxCsr_Mask; M128A FloatRegisters[8]; M128A XmmRegisters[16]; BYTE Reserved4[96]; } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; #define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32) // // Context Frame // // This frame has a several purposes: 1) it is used as an argument to // NtContinue, 2) is is used to constuct a call frame for APC delivery, // and 3) it is used in the user level thread creation routines. // // // The flags field within this record controls the contents of a CONTEXT // record. // // If the context record is used as an input parameter, then for each // portion of the context record controlled by a flag whose value is // set, it is assumed that that portion of the context record contains // valid context. If the context record is being used to modify a threads // context, then only that portion of the threads context is modified. // // If the context record is used as an output parameter to capture the // context of a thread, then only those portions of the thread's context // corresponding to set flags will be returned. // // CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags. // // CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15. // // CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs. // // CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7. // // CONTEXT_MMX_REGISTERS specifies the floating point and extended registers // Mm0/St0-Mm7/St7 and Xmm0-Xmm15). // typedef struct DECLSPEC_ALIGN(16) _CONTEXT { // // Register parameter home addresses. // // N.B. These fields are for convience - they could be used to extend the // context record in the future. // DWORD64 P1Home; DWORD64 P2Home; DWORD64 P3Home; DWORD64 P4Home; DWORD64 P5Home; DWORD64 P6Home; // // Control flags. // DWORD ContextFlags; DWORD MxCsr; // // Segment Registers and processor flags. // WORD SegCs; WORD SegDs; WORD SegEs; WORD SegFs; WORD SegGs; WORD SegSs; DWORD EFlags; // // Debug registers // DWORD64 Dr0; DWORD64 Dr1; DWORD64 Dr2; DWORD64 Dr3; DWORD64 Dr6; DWORD64 Dr7; // // Integer registers. // DWORD64 Rax; DWORD64 Rcx; DWORD64 Rdx; DWORD64 Rbx; DWORD64 Rsp; DWORD64 Rbp; DWORD64 Rsi; DWORD64 Rdi; DWORD64 R8; DWORD64 R9; DWORD64 R10; DWORD64 R11; DWORD64 R12; DWORD64 R13; DWORD64 R14; DWORD64 R15; // // Program counter. // DWORD64 Rip; // // Floating point state. // union { XMM_SAVE_AREA32 FltSave; struct { M128A Header[2]; M128A Legacy[8]; M128A Xmm0; M128A Xmm1; M128A Xmm2; M128A Xmm3; M128A Xmm4; M128A Xmm5; M128A Xmm6; M128A Xmm7; M128A Xmm8; M128A Xmm9; M128A Xmm10; M128A Xmm11; M128A Xmm12; M128A Xmm13; M128A Xmm14; M128A Xmm15; }; }; // // Vector registers. // M128A VectorRegister[26]; DWORD64 VectorControl; // // Special debug control registers. // DWORD64 DebugControl; DWORD64 LastBranchToRip; DWORD64 LastBranchFromRip; DWORD64 LastExceptionToRip; DWORD64 LastExceptionFromRip; } CONTEXT, *PCONTEXT, *LPCONTEXT; // // Nonvolatile context pointer record. // typedef struct _KNONVOLATILE_CONTEXT_POINTERS { union { PM128A FloatingContext[16]; struct { PM128A Xmm0; PM128A Xmm1; PM128A Xmm2; PM128A Xmm3; PM128A Xmm4; PM128A Xmm5; PM128A Xmm6; PM128A Xmm7; PM128A Xmm8; PM128A Xmm9; PM128A Xmm10; PM128A Xmm11; PM128A Xmm12; PM128A Xmm13; PM128A Xmm14; PM128A Xmm15; } ; } ; union { PDWORD64 IntegerContext[16]; struct { PDWORD64 Rax; PDWORD64 Rcx; PDWORD64 Rdx; PDWORD64 Rbx; PDWORD64 Rsp; PDWORD64 Rbp; PDWORD64 Rsi; PDWORD64 Rdi; PDWORD64 R8; PDWORD64 R9; PDWORD64 R10; PDWORD64 R11; PDWORD64 R12; PDWORD64 R13; PDWORD64 R14; PDWORD64 R15; } ; } ; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; #elif defined(_ARM_) #define CONTEXT_ARM 0x00200000L // end_wx86 #define CONTEXT_CONTROL (CONTEXT_ARM | 0x1L) #define CONTEXT_INTEGER (CONTEXT_ARM | 0x2L) #define CONTEXT_FLOATING_POINT (CONTEXT_ARM | 0x4L) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x8L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) #define CONTEXT_EXCEPTION_ACTIVE 0x8000000L #define CONTEXT_SERVICE_ACTIVE 0x10000000L #define CONTEXT_EXCEPTION_REQUEST 0x40000000L #define CONTEXT_EXCEPTION_REPORTING 0x80000000L // // This flag is set by the unwinder if it has unwound to a call // site, and cleared whenever it unwinds through a trap frame. // It is used by language-specific exception handlers to help // differentiate exception scopes during dispatching. // #define CONTEXT_UNWOUND_TO_CALL 0x20000000 // // Specify the number of breakpoints and watchpoints that the OS // will track. Architecturally, ARM supports up to 16. In practice, // however, almost no one implements more than 4 of each. // #define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_WATCHPOINTS 1 typedef struct _NEON128 { ULONGLONG Low; LONGLONG High; } NEON128, *PNEON128; // // Context Frame // // This frame has a several purposes: 1) it is used as an argument to // NtContinue, 2) it is used to constuct a call frame for APC delivery, // and 3) it is used in the user level thread creation routines. // // // The flags field within this record controls the contents of a CONTEXT // record. // // If the context record is used as an input parameter, then for each // portion of the context record controlled by a flag whose value is // set, it is assumed that that portion of the context record contains // valid context. If the context record is being used to modify a threads // context, then only that portion of the threads context is modified. // // If the context record is used as an output parameter to capture the // context of a thread, then only those portions of the thread's context // corresponding to set flags will be returned. // // CONTEXT_CONTROL specifies Sp, Lr, Pc, and Cpsr // // CONTEXT_INTEGER specifies R0-R12 // // CONTEXT_FLOATING_POINT specifies Q0-Q15 / D0-D31 / S0-S31 // // CONTEXT_DEBUG_REGISTERS specifies up to 16 of DBGBVR, DBGBCR, DBGWVR, // DBGWCR. // typedef struct DECLSPEC_ALIGN(8) _CONTEXT { // // Control flags. // DWORD ContextFlags; // // Integer registers // DWORD R0; DWORD R1; DWORD R2; DWORD R3; DWORD R4; DWORD R5; DWORD R6; DWORD R7; DWORD R8; DWORD R9; DWORD R10; DWORD R11; DWORD R12; // // Control Registers // DWORD Sp; DWORD Lr; DWORD Pc; DWORD Cpsr; // // Floating Point/NEON Registers // DWORD Fpscr; DWORD Padding; union { NEON128 Q[16]; ULONGLONG D[32]; DWORD S[32]; }; // // Debug registers // DWORD Bvr[ARM_MAX_BREAKPOINTS]; DWORD Bcr[ARM_MAX_BREAKPOINTS]; DWORD Wvr[ARM_MAX_WATCHPOINTS]; DWORD Wcr[ARM_MAX_WATCHPOINTS]; DWORD Padding2[2]; } CONTEXT, *PCONTEXT, *LPCONTEXT; // // Nonvolatile context pointer record. // typedef struct _KNONVOLATILE_CONTEXT_POINTERS { PDWORD R4; PDWORD R5; PDWORD R6; PDWORD R7; PDWORD R8; PDWORD R9; PDWORD R10; PDWORD R11; PDWORD Lr; PULONGLONG D8; PULONGLONG D9; PULONGLONG D10; PULONGLONG D11; PULONGLONG D12; PULONGLONG D13; PULONGLONG D14; PULONGLONG D15; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; typedef struct _IMAGE_ARM_RUNTIME_FUNCTION_ENTRY { DWORD BeginAddress; DWORD EndAddress; union { DWORD UnwindData; struct { DWORD Flag : 2; DWORD FunctionLength : 11; DWORD Ret : 2; DWORD H : 1; DWORD Reg : 3; DWORD R : 1; DWORD L : 1; DWORD C : 1; DWORD StackAdjust : 10; }; }; } IMAGE_ARM_RUNTIME_FUNCTION_ENTRY, * PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY; #elif defined(_ARM64_) #define CONTEXT_ARM64 0x00400000L #define CONTEXT_CONTROL (CONTEXT_ARM64 | 0x1L) #define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x2L) #define CONTEXT_FLOATING_POINT (CONTEXT_ARM64 | 0x4L) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x8L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) #define CONTEXT_EXCEPTION_ACTIVE 0x8000000L #define CONTEXT_SERVICE_ACTIVE 0x10000000L #define CONTEXT_EXCEPTION_REQUEST 0x40000000L #define CONTEXT_EXCEPTION_REPORTING 0x80000000L // // This flag is set by the unwinder if it has unwound to a call // site, and cleared whenever it unwinds through a trap frame. // It is used by language-specific exception handlers to help // differentiate exception scopes during dispatching. // #define CONTEXT_UNWOUND_TO_CALL 0x20000000 // // Define initial Cpsr/Fpscr value // #define INITIAL_CPSR 0x10 #define INITIAL_FPSCR 0 // begin_ntoshvp // // Specify the number of breakpoints and watchpoints that the OS // will track. Architecturally, ARM64 supports up to 16. In practice, // however, almost no one implements more than 4 of each. // #define ARM64_MAX_BREAKPOINTS 8 #define ARM64_MAX_WATCHPOINTS 2 // // Context Frame // // This frame has a several purposes: 1) it is used as an argument to // NtContinue, 2) it is used to constuct a call frame for APC delivery, // and 3) it is used in the user level thread creation routines. // // // The flags field within this record controls the contents of a CONTEXT // record. // // If the context record is used as an input parameter, then for each // portion of the context record controlled by a flag whose value is // set, it is assumed that that portion of the context record contains // valid context. If the context record is being used to modify a threads // context, then only that portion of the threads context is modified. // // If the context record is used as an output parameter to capture the // context of a thread, then only those portions of the thread's context // corresponding to set flags will be returned. // // CONTEXT_CONTROL specifies Sp, Lr, Pc, and Cpsr // // CONTEXT_INTEGER specifies R0-R12 // // CONTEXT_FLOATING_POINT specifies Q0-Q15 / D0-D31 / S0-S31 // // CONTEXT_DEBUG_REGISTERS specifies up to 16 of DBGBVR, DBGBCR, DBGWVR, // DBGWCR. // typedef struct _NEON128 { ULONGLONG Low; LONGLONG High; } NEON128, *PNEON128; typedef struct DECLSPEC_ALIGN(16) _CONTEXT { // // Control flags. // /* +0x000 */ DWORD ContextFlags; // // Integer registers // /* +0x004 */ DWORD Cpsr; // NZVF + DAIF + CurrentEL + SPSel /* +0x008 */ union { struct { DWORD64 X0; DWORD64 X1; DWORD64 X2; DWORD64 X3; DWORD64 X4; DWORD64 X5; DWORD64 X6; DWORD64 X7; DWORD64 X8; DWORD64 X9; DWORD64 X10; DWORD64 X11; DWORD64 X12; DWORD64 X13; DWORD64 X14; DWORD64 X15; DWORD64 X16; DWORD64 X17; DWORD64 X18; DWORD64 X19; DWORD64 X20; DWORD64 X21; DWORD64 X22; DWORD64 X23; DWORD64 X24; DWORD64 X25; DWORD64 X26; DWORD64 X27; DWORD64 X28; }; DWORD64 X[29]; }; /* +0x0f0 */ DWORD64 Fp; /* +0x0f8 */ DWORD64 Lr; /* +0x100 */ DWORD64 Sp; /* +0x108 */ DWORD64 Pc; // // Floating Point/NEON Registers // /* +0x110 */ NEON128 V[32]; /* +0x310 */ DWORD Fpcr; /* +0x314 */ DWORD Fpsr; // // Debug registers // /* +0x318 */ DWORD Bcr[ARM64_MAX_BREAKPOINTS]; /* +0x338 */ DWORD64 Bvr[ARM64_MAX_BREAKPOINTS]; /* +0x378 */ DWORD Wcr[ARM64_MAX_WATCHPOINTS]; /* +0x380 */ DWORD64 Wvr[ARM64_MAX_WATCHPOINTS]; /* +0x390 */ } CONTEXT, *PCONTEXT, *LPCONTEXT; // // Nonvolatile context pointer record. // typedef struct _KNONVOLATILE_CONTEXT_POINTERS { PDWORD64 X19; PDWORD64 X20; PDWORD64 X21; PDWORD64 X22; PDWORD64 X23; PDWORD64 X24; PDWORD64 X25; PDWORD64 X26; PDWORD64 X27; PDWORD64 X28; PDWORD64 Fp; PDWORD64 Lr; PDWORD64 D8; PDWORD64 D9; PDWORD64 D10; PDWORD64 D11; PDWORD64 D12; PDWORD64 D13; PDWORD64 D14; PDWORD64 D15; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; #else #error Unknown architecture for defining CONTEXT. #endif PALIMPORT BOOL PALAPI GetThreadContext( IN HANDLE hThread, IN OUT LPCONTEXT lpContext); PALIMPORT BOOL PALAPI SetThreadContext( IN HANDLE hThread, IN CONST CONTEXT *lpContext); #define THREAD_BASE_PRIORITY_LOWRT 15 #define THREAD_BASE_PRIORITY_MAX 2 #define THREAD_BASE_PRIORITY_MIN (-2) #define THREAD_BASE_PRIORITY_IDLE (-15) #define THREAD_PRIORITY_LOWEST THREAD_BASE_PRIORITY_MIN #define THREAD_PRIORITY_BELOW_NORMAL (THREAD_PRIORITY_LOWEST+1) #define THREAD_PRIORITY_NORMAL 0 #define THREAD_PRIORITY_HIGHEST THREAD_BASE_PRIORITY_MAX #define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST-1) #define THREAD_PRIORITY_ERROR_RETURN (MAXLONG) #define THREAD_PRIORITY_TIME_CRITICAL THREAD_BASE_PRIORITY_LOWRT #define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE PALIMPORT int PALAPI GetThreadPriority( IN HANDLE hThread); PALIMPORT BOOL PALAPI SetThreadPriority( IN HANDLE hThread, IN int nPriority); PALIMPORT BOOL PALAPI GetThreadTimes( IN HANDLE hThread, OUT LPFILETIME lpCreationTime, OUT LPFILETIME lpExitTime, OUT LPFILETIME lpKernelTime, OUT LPFILETIME lpUserTime); #define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) PALIMPORT DWORD PALAPI TlsAlloc( VOID); PALIMPORT LPVOID PALAPI TlsGetValue( IN DWORD dwTlsIndex); PALIMPORT BOOL PALAPI TlsSetValue( IN DWORD dwTlsIndex, IN LPVOID lpTlsValue); PALIMPORT BOOL PALAPI TlsFree( IN DWORD dwTlsIndex); PALIMPORT void * PALAPI PAL_GetStackBase(VOID); PALIMPORT void * PALAPI PAL_GetStackLimit(VOID); PALIMPORT DWORD PALAPI PAL_GetLogicalCpuCountFromOS(VOID); PALIMPORT size_t PALAPI PAL_GetRestrictedPhysicalMemoryLimit(VOID); PALIMPORT BOOL PALAPI PAL_GetWorkingSetSize(size_t* val); PALIMPORT size_t PALAPI PAL_GetLogicalProcessorCacheSizeFromOS(VOID); typedef BOOL (*ReadMemoryWordCallback)(SIZE_T address, SIZE_T *value); PALIMPORT BOOL PALAPI PAL_VirtualUnwind(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *contextPointers); PALIMPORT BOOL PALAPI PAL_VirtualUnwindOutOfProc(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *contextPointers, DWORD pid, ReadMemoryWordCallback readMemCallback); #define GetLogicalProcessorCacheSizeFromOS PAL_GetLogicalProcessorCacheSizeFromOS /* PAL_CS_NATIVE_DATA_SIZE is defined as sizeof(PAL_CRITICAL_SECTION_NATIVE_DATA) */ #if defined(__APPLE__) && defined(__i386__) #define PAL_CS_NATIVE_DATA_SIZE 76 #elif defined(__APPLE__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 120 #elif defined(__FreeBSD__) && defined(_X86_) #define PAL_CS_NATIVE_DATA_SIZE 12 #elif defined(__FreeBSD__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 24 #elif defined(__linux__) && defined(_ARM_) #define PAL_CS_NATIVE_DATA_SIZE 80 #elif defined(__linux__) && defined(_ARM64_) #define PAL_CS_NATIVE_DATA_SIZE 116 #elif defined(__linux__) && defined(__i386__) #define PAL_CS_NATIVE_DATA_SIZE 76 #elif defined(__linux__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 96 #elif defined(__NetBSD__) && defined(__amd64__) #define PAL_CS_NATIVE_DATA_SIZE 96 #elif defined(__NetBSD__) && defined(__earm__) #define PAL_CS_NATIVE_DATA_SIZE 56 #elif defined(__NetBSD__) && defined(__i386__) #define PAL_CS_NATIVE_DATA_SIZE 56 #else #warning #error PAL_CS_NATIVE_DATA_SIZE is not defined for this architecture #endif // typedef struct _CRITICAL_SECTION { PVOID DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; ULONG_PTR SpinCount; BOOL bInternal; volatile DWORD dwInitState; union CSNativeDataStorage { BYTE rgNativeDataStorage[PAL_CS_NATIVE_DATA_SIZE]; VOID * pvAlign; // make sure the storage is machine-pointer-size aligned } csnds; } CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION; PALIMPORT VOID PALAPI EnterCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection); PALIMPORT VOID PALAPI LeaveCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection); PALIMPORT VOID PALAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection); PALIMPORT BOOL PALAPI InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); PALIMPORT VOID PALAPI DeleteCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection); PALIMPORT BOOL PALAPI TryEnterCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection); #define SEM_FAILCRITICALERRORS 0x0001 #define SEM_NOOPENFILEERRORBOX 0x8000 PALIMPORT UINT PALAPI SetErrorMode( IN UINT uMode); #define PAGE_NOACCESS 0x01 #define PAGE_READONLY 0x02 #define PAGE_READWRITE 0x04 #define PAGE_WRITECOPY 0x08 #define PAGE_EXECUTE 0x10 #define PAGE_EXECUTE_READ 0x20 #define PAGE_EXECUTE_READWRITE 0x40 #define PAGE_EXECUTE_WRITECOPY 0x80 #define MEM_COMMIT 0x1000 #define MEM_RESERVE 0x2000 #define MEM_DECOMMIT 0x4000 #define MEM_RELEASE 0x8000 #define MEM_RESET 0x80000 #define MEM_FREE 0x10000 #define MEM_PRIVATE 0x20000 #define MEM_MAPPED 0x40000 #define MEM_TOP_DOWN 0x100000 #define MEM_WRITE_WATCH 0x200000 #define MEM_RESERVE_EXECUTABLE 0x40000000 // reserve memory using executable memory allocator PALIMPORT HANDLE PALAPI CreateFileMappingW( IN HANDLE hFile, IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, IN DWORD flProtect, IN DWORD dwMaxmimumSizeHigh, IN DWORD dwMaximumSizeLow, IN LPCWSTR lpName); #ifdef UNICODE #define CreateFileMapping CreateFileMappingW #else #define CreateFileMapping CreateFileMappingA #endif #define SECTION_QUERY 0x0001 #define SECTION_MAP_WRITE 0x0002 #define SECTION_MAP_READ 0x0004 #define SECTION_ALL_ACCESS (SECTION_MAP_READ | SECTION_MAP_WRITE) // diff from winnt.h #define FILE_MAP_WRITE SECTION_MAP_WRITE #define FILE_MAP_READ SECTION_MAP_READ #define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS #define FILE_MAP_COPY SECTION_QUERY PALIMPORT HANDLE PALAPI OpenFileMappingW( IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName); #ifdef UNICODE #define OpenFileMapping OpenFileMappingW #else #define OpenFileMapping OpenFileMappingA #endif PALIMPORT LPVOID PALAPI MapViewOfFile( IN HANDLE hFileMappingObject, IN DWORD dwDesiredAccess, IN DWORD dwFileOffsetHigh, IN DWORD dwFileOffsetLow, IN SIZE_T dwNumberOfBytesToMap); PALIMPORT LPVOID PALAPI MapViewOfFileEx( IN HANDLE hFileMappingObject, IN DWORD dwDesiredAccess, IN DWORD dwFileOffsetHigh, IN DWORD dwFileOffsetLow, IN SIZE_T dwNumberOfBytesToMap, IN LPVOID lpBaseAddress); PALIMPORT BOOL PALAPI FlushViewOfFile( IN LPVOID lpBaseAddress, IN SIZE_T dwNumberOfBytesToFlush); PALIMPORT BOOL PALAPI UnmapViewOfFile( IN LPCVOID lpBaseAddress); PALIMPORT HMODULE PALAPI LoadLibraryW( IN LPCWSTR lpLibFileName); PALIMPORT HMODULE PALAPI LoadLibraryExW( IN LPCWSTR lpLibFileName, IN /*Reserved*/ HANDLE hFile, IN DWORD dwFlags); PALIMPORT void * PALAPI PAL_LoadLibraryDirect( IN LPCWSTR lpLibFileName); PALIMPORT HMODULE PALAPI PAL_RegisterLibraryDirect( IN void *dl_handle, IN LPCWSTR lpLibFileName); /*++ Function: PAL_LOADLoadPEFile Abstract Loads a PE file into memory. Properly maps all of the sections in the PE file. Returns a pointer to the loaded base. Parameters: IN hFile - The file to load Return value: A valid base address if successful. 0 if failure --*/ void * PALAPI PAL_LOADLoadPEFile(HANDLE hFile); /*++ PAL_LOADUnloadPEFile Unload a PE file that was loaded by PAL_LOADLoadPEFile(). Parameters: IN ptr - the file pointer returned by PAL_LOADLoadPEFile() Return value: TRUE - success FALSE - failure (incorrect ptr, etc.) --*/ BOOL PALAPI PAL_LOADUnloadPEFile(void * ptr); #ifdef UNICODE #define LoadLibrary LoadLibraryW #define LoadLibraryEx LoadLibraryExW #else #define LoadLibrary LoadLibraryA #define LoadLibraryEx LoadLibraryExA #endif typedef INT_PTR (PALAPI *FARPROC)(); PALIMPORT FARPROC PALAPI GetProcAddress( IN HMODULE hModule, IN LPCSTR lpProcName); PALIMPORT BOOL PALAPI FreeLibrary( IN OUT HMODULE hLibModule); PALIMPORT PAL_NORETURN VOID PALAPI FreeLibraryAndExitThread( IN HMODULE hLibModule, IN DWORD dwExitCode); PALIMPORT BOOL PALAPI DisableThreadLibraryCalls( IN HMODULE hLibModule); PALIMPORT DWORD PALAPI GetModuleFileNameW( IN HMODULE hModule, OUT LPWSTR lpFileName, IN DWORD nSize); #ifdef UNICODE #define GetModuleFileName GetModuleFileNameW #else #define GetModuleFileName GetModuleFileNameA #endif PALIMPORT DWORD PALAPI GetModuleFileNameExW( IN HANDLE hProcess, IN HMODULE hModule, OUT LPWSTR lpFilename, IN DWORD nSize ); #ifdef UNICODE #define GetModuleFileNameEx GetModuleFileNameExW #endif // Get base address of the module containing a given symbol PALAPI LPCVOID PAL_GetSymbolModuleBase(void *symbol); PALIMPORT LPVOID PALAPI VirtualAlloc( IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flAllocationType, IN DWORD flProtect); PALIMPORT BOOL PALAPI VirtualFree( IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD dwFreeType); PALIMPORT BOOL PALAPI VirtualProtect( IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flNewProtect, OUT PDWORD lpflOldProtect); typedef struct _MEMORYSTATUSEX { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLONG ullAvailPhys; DWORDLONG ullTotalPageFile; DWORDLONG ullAvailPageFile; DWORDLONG ullTotalVirtual; DWORDLONG ullAvailVirtual; DWORDLONG ullAvailExtendedVirtual; } MEMORYSTATUSEX, *LPMEMORYSTATUSEX; PALIMPORT BOOL PALAPI GlobalMemoryStatusEx( IN OUT LPMEMORYSTATUSEX lpBuffer); typedef struct _MEMORY_BASIC_INFORMATION { PVOID BaseAddress; PVOID AllocationBase_PAL_Undefined; DWORD AllocationProtect; SIZE_T RegionSize; DWORD State; DWORD Protect; DWORD Type; } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; PALIMPORT SIZE_T PALAPI VirtualQuery( IN LPCVOID lpAddress, OUT PMEMORY_BASIC_INFORMATION lpBuffer, IN SIZE_T dwLength); PALIMPORT VOID PALAPI RtlMoveMemory( IN PVOID Destination, IN CONST VOID *Source, IN SIZE_T Length); PALIMPORT VOID PALAPI RtlZeroMemory( IN PVOID Destination, IN SIZE_T Length); #define MoveMemory memmove #define CopyMemory memcpy #define FillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) #define ZeroMemory(Destination,Length) memset((Destination),0,(Length)) PALIMPORT HANDLE PALAPI GetProcessHeap( VOID); #define HEAP_ZERO_MEMORY 0x00000008 PALIMPORT HANDLE PALAPI HeapCreate( IN DWORD flOptions, IN SIZE_T dwInitialSize, IN SIZE_T dwMaximumSize); PALIMPORT LPVOID PALAPI HeapAlloc( IN HANDLE hHeap, IN DWORD dwFlags, IN SIZE_T dwBytes); PALIMPORT LPVOID PALAPI HeapReAlloc( IN HANDLE hHeap, IN DWORD dwFlags, IN LPVOID lpMem, IN SIZE_T dwBytes ); PALIMPORT BOOL PALAPI HeapFree( IN HANDLE hHeap, IN DWORD dwFlags, IN LPVOID lpMem); typedef enum _HEAP_INFORMATION_CLASS { HeapCompatibilityInformation, HeapEnableTerminationOnCorruption } HEAP_INFORMATION_CLASS; PALIMPORT BOOL PALAPI HeapSetInformation( IN OPTIONAL HANDLE HeapHandle, IN HEAP_INFORMATION_CLASS HeapInformationClass, IN PVOID HeapInformation, IN SIZE_T HeapInformationLength); #define LMEM_FIXED 0x0000 #define LMEM_MOVEABLE 0x0002 #define LMEM_ZEROINIT 0x0040 #define LPTR (LMEM_FIXED | LMEM_ZEROINIT) PALIMPORT HLOCAL PALAPI LocalAlloc( IN UINT uFlags, IN SIZE_T uBytes); PALIMPORT HLOCAL PALAPI LocalReAlloc( IN HLOCAL hMem, IN SIZE_T uBytes, IN UINT uFlags); PALIMPORT HLOCAL PALAPI LocalFree( IN HLOCAL hMem); PALIMPORT BOOL PALAPI FlushInstructionCache( IN HANDLE hProcess, IN LPCVOID lpBaseAddress, IN SIZE_T dwSize); #if ENABLE_DOWNLEVEL_FOR_NLS PALIMPORT BOOL PALAPI GetStringTypeExW( IN LCID Locale, IN DWORD dwInfoType, IN LPCWSTR lpSrcStr, IN int cchSrc, OUT LPWORD lpCharType); #ifdef UNICODE #define GetStringTypeEx GetStringTypeExW #endif #endif // ENABLE_DOWNLEVEL_FOR_NLS #define NORM_IGNORECASE 0x00000001 // ignore case #define NORM_IGNOREWIDTH 0x00020000 // ignore width #define NORM_LINGUISTIC_CASING 0x08000000 // use linguistic rules for casing #ifdef __APPLE__ #define NORM_IGNORENONSPACE 0x00000002 // ignore nonspacing chars #define NORM_IGNORESYMBOLS 0x00000004 // ignore symbols #define NORM_IGNOREKANATYPE 0x00010000 // ignore kanatype #define SORT_STRINGSORT 0x00001000 // use string sort method #endif // __APPLE__ typedef struct nlsversioninfo { DWORD dwNLSVersionInfoSize; DWORD dwNLSVersion; DWORD dwDefinedVersion; } NLSVERSIONINFO, *LPNLSVERSIONINFO; #define CSTR_LESS_THAN 1 #define CSTR_EQUAL 2 #define CSTR_GREATER_THAN 3 #if ENABLE_DOWNLEVEL_FOR_NLS PALIMPORT int PALAPI CompareStringW( IN LCID Locale, IN DWORD dwCmpFlags, IN LPCWSTR lpString1, IN int cchCount1, IN LPCWSTR lpString2, IN int cchCount2); #endif // ENABLE_DOWNLEVEL_FOR_NLS PALIMPORT int PALAPI CompareStringEx( IN LPCWSTR lpLocaleName, IN DWORD dwCmpFlags, IN LPCWSTR lpString1, IN int cchCount1, IN LPCWSTR lpString2, IN int cchCount2, IN LPNLSVERSIONINFO lpVersionInformation, IN LPVOID lpReserved, IN LPARAM lParam); #ifdef UNICODE #define CompareString CompareStringW #endif #define MAX_LEADBYTES 12 #define MAX_DEFAULTCHAR 2 PALIMPORT UINT PALAPI GetACP(void); typedef struct _cpinfo { UINT MaxCharSize; BYTE DefaultChar[MAX_DEFAULTCHAR]; BYTE LeadByte[MAX_LEADBYTES]; } CPINFO, *LPCPINFO; PALIMPORT BOOL PALAPI GetCPInfo( IN UINT CodePage, OUT LPCPINFO lpCPInfo); PALIMPORT BOOL PALAPI IsDBCSLeadByteEx( IN UINT CodePage, IN BYTE TestChar); PALIMPORT BOOL PALAPI IsDBCSLeadByte( IN BYTE TestChar); PALIMPORT BOOL PALAPI IsValidCodePage( IN UINT CodePage); #define MB_PRECOMPOSED 0x00000001 #define MB_ERR_INVALID_CHARS 0x00000008 PALIMPORT int PALAPI MultiByteToWideChar( IN UINT CodePage, IN DWORD dwFlags, IN LPCSTR lpMultiByteStr, IN int cbMultiByte, OUT LPWSTR lpWideCharStr, IN int cchWideChar); #define WC_NO_BEST_FIT_CHARS 0x00000400 PALIMPORT int PALAPI WideCharToMultiByte( IN UINT CodePage, IN DWORD dwFlags, IN LPCWSTR lpWideCharStr, IN int cchWideChar, OUT LPSTR lpMultiByteStr, IN int cbMultyByte, IN LPCSTR lpDefaultChar, OUT LPBOOL lpUsedDefaultChar); #if ENABLE_DOWNLEVEL_FOR_NLS PALIMPORT LANGID PALAPI GetSystemDefaultLangID( void); PALIMPORT LANGID PALAPI GetUserDefaultLangID( void); PALIMPORT BOOL PALAPI SetThreadLocale( IN LCID Locale); PALIMPORT LCID PALAPI GetThreadLocale( void); #endif //ENABLE_DOWNLEVEL_FOR_NLS // // Locale Types. // // These types are used for the GetLocaleInfo NLS API routine. // #ifdef __APPLE__ // // The following LCTypes may be used in combination with any other LCTypes. // // LOCALE_NOUSEROVERRIDE is also used in GetTimeFormat and // GetDateFormat. // // LOCALE_RETURN_NUMBER will return the result from GetLocaleInfo as a // number instead of a string. This flag is only valid for the LCTypes // beginning with LOCALE_I. // #define LOCALE_NOUSEROVERRIDE 0x80000000 /* do not use user overrides */ #define LOCALE_RETURN_NUMBER 0x20000000 /* return number instead of string */ #define LOCALE_RETURN_GENITIVE_NAMES 0x10000000 //Flag to return the Genitive forms of month names #define LOCALE_SLOCALIZEDDISPLAYNAME 0x00000002 // localized name of locale, eg "German (Germany)" in UI language #define LOCALE_SENGLISHDISPLAYNAME 0x00000072 // Display name (language + country usually) in English, eg "German (Germany)" #define LOCALE_SNATIVEDISPLAYNAME 0x00000073 // Display name in native locale language, eg "Deutsch (Deutschland) #define LOCALE_SLOCALIZEDLANGUAGENAME 0x0000006f // Language Display Name for a language, eg "German" in UI language #define LOCALE_SENGLISHLANGUAGENAME 0x00001001 // English name of language, eg "German" #define LOCALE_SNATIVELANGUAGENAME 0x00000004 // native name of language, eg "Deutsch" #define LOCALE_SLOCALIZEDCOUNTRYNAME 0x00000006 // localized name of country, eg "Germany" in UI language #define LOCALE_SENGLISHCOUNTRYNAME 0x00001002 // English name of country, eg "Germany" #define LOCALE_SNATIVECOUNTRYNAME 0x00000008 // native name of country, eg "Deutschland" // // The following LCTypes are mutually exclusive in that they may NOT // be used in combination with each other. // #define LOCALE_ILANGUAGE 0x00000001 /* language id */ #define LOCALE_SLANGUAGE 0x00000002 /* localized name of language */ #define LOCALE_SENGLANGUAGE 0x00001001 /* English name of language */ #define LOCALE_SABBREVLANGNAME 0x00000003 /* abbreviated language name */ #define LOCALE_SNATIVELANGNAME 0x00000004 /* native name of language */ #define LOCALE_ICOUNTRY 0x00000005 /* country code */ #define LOCALE_SCOUNTRY 0x00000006 /* localized name of country */ #define LOCALE_SENGCOUNTRY 0x00001002 /* English name of country */ #define LOCALE_SABBREVCTRYNAME 0x00000007 /* abbreviated country name */ #define LOCALE_SNATIVECTRYNAME 0x00000008 /* native name of country */ #define LOCALE_SLIST 0x0000000C /* list item separator */ #define LOCALE_IMEASURE 0x0000000D /* 0 = metric, 1 = US */ #define LOCALE_SDECIMAL 0x0000000E /* decimal separator */ #define LOCALE_STHOUSAND 0x0000000F /* thousand separator */ #define LOCALE_SGROUPING 0x00000010 /* digit grouping */ #define LOCALE_IDIGITS 0x00000011 /* number of fractional digits */ #define LOCALE_ILZERO 0x00000012 /* leading zeros for decimal */ #define LOCALE_INEGNUMBER 0x00001010 /* negative number mode */ #define LOCALE_SNATIVEDIGITS 0x00000013 /* native ascii 0-9 */ #define LOCALE_SCURRENCY 0x00000014 /* local monetary symbol */ #define LOCALE_SINTLSYMBOL 0x00000015 /* intl monetary symbol */ #define LOCALE_SMONDECIMALSEP 0x00000016 /* monetary decimal separator */ #define LOCALE_SMONTHOUSANDSEP 0x00000017 /* monetary thousand separator */ #define LOCALE_SMONGROUPING 0x00000018 /* monetary grouping */ #define LOCALE_ICURRDIGITS 0x00000019 /* # local monetary digits */ #define LOCALE_IINTLCURRDIGITS 0x0000001A /* # intl monetary digits */ #define LOCALE_ICURRENCY 0x0000001B /* positive currency mode */ #define LOCALE_INEGCURR 0x0000001C /* negative currency mode */ #define LOCALE_SSHORTDATE 0x0000001F /* short date format string */ #define LOCALE_SLONGDATE 0x00000020 /* long date format string */ #define LOCALE_STIMEFORMAT 0x00001003 /* time format string */ #define LOCALE_S1159 0x00000028 /* AM designator */ #define LOCALE_S2359 0x00000029 /* PM designator */ #define LOCALE_ICALENDARTYPE 0x00001009 /* type of calendar specifier */ #define LOCALE_IFIRSTDAYOFWEEK 0x0000100C /* first day of week specifier */ #define LOCALE_IFIRSTWEEKOFYEAR 0x0000100D /* first week of year specifier */ #define LOCALE_SDAYNAME1 0x0000002A /* long name for Monday */ #define LOCALE_SDAYNAME2 0x0000002B /* long name for Tuesday */ #define LOCALE_SDAYNAME3 0x0000002C /* long name for Wednesday */ #define LOCALE_SDAYNAME4 0x0000002D /* long name for Thursday */ #define LOCALE_SDAYNAME5 0x0000002E /* long name for Friday */ #define LOCALE_SDAYNAME6 0x0000002F /* long name for Saturday */ #define LOCALE_SDAYNAME7 0x00000030 /* long name for Sunday */ #define LOCALE_SABBREVDAYNAME1 0x00000031 /* abbreviated name for Monday */ #define LOCALE_SABBREVDAYNAME2 0x00000032 /* abbreviated name for Tuesday */ #define LOCALE_SABBREVDAYNAME3 0x00000033 /* abbreviated name for Wednesday */ #define LOCALE_SABBREVDAYNAME4 0x00000034 /* abbreviated name for Thursday */ #define LOCALE_SABBREVDAYNAME5 0x00000035 /* abbreviated name for Friday */ #define LOCALE_SABBREVDAYNAME6 0x00000036 /* abbreviated name for Saturday */ #define LOCALE_SABBREVDAYNAME7 0x00000037 /* abbreviated name for Sunday */ #define LOCALE_SMONTHNAME1 0x00000038 /* long name for January */ #define LOCALE_SMONTHNAME2 0x00000039 /* long name for February */ #define LOCALE_SMONTHNAME3 0x0000003A /* long name for March */ #define LOCALE_SMONTHNAME4 0x0000003B /* long name for April */ #define LOCALE_SMONTHNAME5 0x0000003C /* long name for May */ #define LOCALE_SMONTHNAME6 0x0000003D /* long name for June */ #define LOCALE_SMONTHNAME7 0x0000003E /* long name for July */ #define LOCALE_SMONTHNAME8 0x0000003F /* long name for August */ #define LOCALE_SMONTHNAME9 0x00000040 /* long name for September */ #define LOCALE_SMONTHNAME10 0x00000041 /* long name for October */ #define LOCALE_SMONTHNAME11 0x00000042 /* long name for November */ #define LOCALE_SMONTHNAME12 0x00000043 /* long name for December */ #define LOCALE_SMONTHNAME13 0x0000100E /* long name for 13th month (if exists) */ #define LOCALE_SABBREVMONTHNAME1 0x00000044 /* abbreviated name for January */ #define LOCALE_SABBREVMONTHNAME2 0x00000045 /* abbreviated name for February */ #define LOCALE_SABBREVMONTHNAME3 0x00000046 /* abbreviated name for March */ #define LOCALE_SABBREVMONTHNAME4 0x00000047 /* abbreviated name for April */ #define LOCALE_SABBREVMONTHNAME5 0x00000048 /* abbreviated name for May */ #define LOCALE_SABBREVMONTHNAME6 0x00000049 /* abbreviated name for June */ #define LOCALE_SABBREVMONTHNAME7 0x0000004A /* abbreviated name for July */ #define LOCALE_SABBREVMONTHNAME8 0x0000004B /* abbreviated name for August */ #define LOCALE_SABBREVMONTHNAME9 0x0000004C /* abbreviated name for September */ #define LOCALE_SABBREVMONTHNAME10 0x0000004D /* abbreviated name for October */ #define LOCALE_SABBREVMONTHNAME11 0x0000004E /* abbreviated name for November */ #define LOCALE_SABBREVMONTHNAME12 0x0000004F /* abbreviated name for December */ #define LOCALE_SABBREVMONTHNAME13 0x0000100F /* abbreviated name for 13th month (if exists) */ #define LOCALE_SPOSITIVESIGN 0x00000050 /* positive sign */ #define LOCALE_SNEGATIVESIGN 0x00000051 /* negative sign */ #define LOCALE_FONTSIGNATURE 0x00000058 /* font signature */ #define LOCALE_SISO639LANGNAME 0x00000059 /* ISO abbreviated language name */ #define LOCALE_SISO3166CTRYNAME 0x0000005A /* ISO abbreviated country name */ #define LOCALE_SENGCURRNAME 0x00001007 /* english name of currency */ #define LOCALE_SNATIVECURRNAME 0x00001008 /* native name of currency */ #define LOCALE_SYEARMONTH 0x00001006 /* year month format string */ #define LOCALE_IDIGITSUBSTITUTION 0x00001014 /* 0 = context, 1 = none, 2 = national */ #define LOCALE_SNAME 0x0000005C /* locale name [-