File Index Symbol Index

/*********************************************************************************** * * * processthreadsapi.h -- ApiSet Contract for api-ms-win-core-processthreads-l1 * * * * Copyright (c) Microsoft Corporation. All rights reserved. * * * ***********************************************************************************/
#ifdef _MSC_VER
#pragma once
#endif // _MSC_VER
#ifndef _PROCESSTHREADSAPI_H_
#define _PROCESSTHREADSAPI_H_
#include <apiset.h>
#include <apisetcconv.h>
#include <minwindef.h>
#include <minwinbase.h>
#ifdef __cplusplus
extern
"C"
{
#endif
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
typedef
struct
_PROCESS_INFORMATION
{
HANDLE
hProcess
;
HANDLE
hThread
;
DWORD
dwProcessId
;
DWORD
dwThreadId
; }
PROCESS_INFORMATION
, *
PPROCESS_INFORMATION
, *
LPPROCESS_INFORMATION
;
typedef
struct
_STARTUPINFOA
{
DWORD
cb
;
LPSTR
lpReserved
;
LPSTR
lpDesktop
;
LPSTR
lpTitle
;
DWORD
dwX
;
DWORD
dwY
;
DWORD
dwXSize
;
DWORD
dwYSize
;
DWORD
dwXCountChars
;
DWORD
dwYCountChars
;
DWORD
dwFillAttribute
;
DWORD
dwFlags
;
WORD
wShowWindow
;
WORD
cbReserved2
;
LPBYTE
lpReserved2
;
HANDLE
hStdInput
;
HANDLE
hStdOutput
;
HANDLE
hStdError
; }
STARTUPINFOA
, *
LPSTARTUPINFOA
;
typedef
struct
_STARTUPINFOW
{
DWORD
cb
;
LPWSTR
lpReserved
;
LPWSTR
lpDesktop
;
LPWSTR
lpTitle
;
DWORD
dwX
;
DWORD
dwY
;
DWORD
dwXSize
;
DWORD
dwYSize
;
DWORD
dwXCountChars
;
DWORD
dwYCountChars
;
DWORD
dwFillAttribute
;
DWORD
dwFlags
;
WORD
wShowWindow
;
WORD
cbReserved2
;
LPBYTE
lpReserved2
;
HANDLE
hStdInput
;
HANDLE
hStdOutput
;
HANDLE
hStdError
; }
STARTUPINFOW
, *
LPSTARTUPINFOW
;
#ifdef UNICODE
typedef
STARTUPINFOW
STARTUPINFO
;
typedef
LPSTARTUPINFOW
LPSTARTUPINFO
;
#else
typedef STARTUPINFOA STARTUPINFO;
typedef LPSTARTUPINFOA LPSTARTUPINFO; #endif // UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
DWORD
QueueUserAPC
( );
#endif /* _WIN32_WINNT >= 0x0400 || _WIN32_WINDOWS > 0x0400 */
BOOL
GetProcessTimes
( );
HANDLE
GetCurrentProcess
( );
DWORD
GetCurrentProcessId
( );
ExitProcess
( );
BOOL
TerminateProcess
( );
BOOL
GetExitCodeProcess
( );
BOOL
SwitchToThread
( );
_Ret_maybenull_
HANDLE
CreateThread
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
_Ret_maybenull_
HANDLE
CreateRemoteThread
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
HANDLE
GetCurrentThread
( );
DWORD
GetCurrentThreadId
( );
_Ret_maybenull_
HANDLE
OpenThread
( );
BOOL
SetThreadPriority
( );
BOOL
SetThreadPriorityBoost
( );
BOOL
GetThreadPriorityBoost
( );
int
GetThreadPriority
( );
ExitThread
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
TerminateThread
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
_Success_(return != 0)
BOOL
GetExitCodeThread
( );
DWORD
SuspendThread
( );
DWORD
ResumeThread
( );
#ifndef TLS_OUT_OF_INDEXES
#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) #endif
_Must_inspect_result_
DWORD
TlsAlloc
( );
LPVOID
TlsGetValue
( );
BOOL
TlsSetValue
( );
BOOL
TlsFree
( );
BOOL
CreateProcessA
( );
BOOL
CreateProcessW
( );
#ifdef UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA #endif // !UNICODE
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
SetProcessShutdownParameters
( );
DWORD
GetProcessVersion
( );
GetStartupInfoW
( );
#ifdef UNICODE
#define GetStartupInfo GetStartupInfoW #endif
BOOL
CreateProcessAsUserW
( );
#ifdef UNICODE
#define CreateProcessAsUser CreateProcessAsUserW #endif
//
// TODO: neerajsi-2013/12/08 - this should be moved to official documentation.
//
// These are shorthand ways of referring to the thread token, the process token,
// or the "effective token" (the thread token if it exists, otherwise the
// process token), respectively. These handles only have TOKEN_QUERY and
// TOKEN_QUERY_SOURCE access in Windows 8 (use TOKEN_ACCESS_PSEUDO_HANDLE to
// determine the granted access on the target version of Windows). These handles
// do not need to be closed.
//
#if !defined(MIDL_PASS)
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
HANDLE
GetCurrentProcessToken
( ) {
return
(
HANDLE
)(
LONG_PTR
) -
4
; }
HANDLE
GetCurrentThreadToken
( ) {
return
(
HANDLE
)(
LONG_PTR
) -
5
; }
HANDLE
GetCurrentThreadEffectiveToken
( ) {
return
(
HANDLE
)(
LONG_PTR
) -
6
; }
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN8) #endif // !defined(MIDL_PASS)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
_Must_inspect_result_
BOOL
SetThreadToken
( );
BOOL
OpenProcessToken
( );
BOOL
OpenThreadToken
( );
BOOL
SetPriorityClass
( );
DWORD
GetPriorityClass
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
SetThreadStackGuarantee
( );
BOOL
ProcessIdToSessionId
( );
typedef
struct
_PROC_THREAD_ATTRIBUTE_LIST *
PPROC_THREAD_ATTRIBUTE_LIST
, *
LPPROC_THREAD_ATTRIBUTE_LIST
;
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= 0x0501)
DWORD
GetProcessId
( );
#endif // _WIN32_WINNT >= 0x0501
#if (_WIN32_WINNT >= 0x0502)
DWORD
GetThreadId
( );
#endif // _WIN32_WINNT >= 0x0502
#if (_WIN32_WINNT >= 0x0600)
FlushProcessWriteBuffers
( );
#endif // _WIN32_WINNT >= 0x0600
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#if (_WIN32_WINNT >= 0x0600)
#pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
DWORD
GetProcessIdOfThread
( );
_Success_(return != FALSE)
BOOL
InitializeProcThreadAttributeList
( );
DeleteProcThreadAttributeList
( );
#define PROCESS_AFFINITY_ENABLE_AUTO_UPDATE 0x00000001UL
BOOL
SetProcessAffinityUpdateMode
( );
BOOL
QueryProcessAffinityUpdateMode
( );
#define PROC_THREAD_ATTRIBUTE_REPLACE_VALUE 0x00000001
BOOL
UpdateProcThreadAttribute
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#endif // (_WIN32_WINNT >= 0x0600)
#pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
_Ret_maybenull_
HANDLE
CreateRemoteThreadEx
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#if !defined(MIDL_PASS)
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= 0x0602)
GetCurrentThreadStackLimits
( );
#endif
BOOL
GetThreadContext
( );
#if (_WIN32_WINNT >= 0x0602)
BOOL
GetProcessMitigationPolicy
( );
#endif
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
SetThreadContext
( );
#if (_WIN32_WINNT >= 0x0602)
BOOL
SetProcessMitigationPolicy
( );
#endif
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#endif// defined(MIDL_PASS)
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
BOOL
FlushInstructionCache
( );
BOOL
GetThreadTimes
( );
HANDLE
OpenProcess
( );
BOOL
IsProcessorFeaturePresent
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#if (_WIN32_WINNT >= 0x0501)
#pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
GetProcessHandleCount
( );
#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#pragma endregion
#endif // (_WIN32_WINNT >= 0x0501)
#if (_WIN32_WINNT >= 0x0502)
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
DWORD
GetCurrentProcessorNumber
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#endif // (_WIN32_WINNT >= 0x0502)
#if (_WIN32_WINNT >= 0x0601)
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
BOOL
SetThreadIdealProcessorEx
( );
BOOL
GetThreadIdealProcessorEx
( );
GetCurrentProcessorNumberEx
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
#endif // (_WIN32_WINNT >= 0x0601)
#pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
BOOL
GetProcessPriorityBoost
( );
BOOL
SetProcessPriorityBoost
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
BOOL
GetThreadIOPendingFlag
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP) #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
BOOL
GetSystemTimes
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP) #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
//
// Thread information classes.
//
typedef
enum
_THREAD_INFORMATION_CLASS
{
ThreadMemoryPriority
,
ThreadAbsoluteCpuPriority
,
ThreadDynamicCodePolicy
,
ThreadPowerThrottling
,
ThreadInformationClassMax
}
THREAD_INFORMATION_CLASS
;
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
typedef
struct
_MEMORY_PRIORITY_INFORMATION
{
ULONG
MemoryPriority
; }
MEMORY_PRIORITY_INFORMATION
, *
PMEMORY_PRIORITY_INFORMATION
;
BOOL
GetThreadInformation
( );
BOOL
SetThreadInformation
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS3)
#define THREAD_POWER_THROTTLING_CURRENT_VERSION 1
#define THREAD_POWER_THROTTLING_EXECUTION_SPEED 0x1
#define THREAD_POWER_THROTTLING_VALID_FLAGS (THREAD_POWER_THROTTLING_EXECUTION_SPEED)
typedef
struct
_THREAD_POWER_THROTTLING_STATE
{
ULONG
Version
;
ULONG
ControlMask
;
ULONG
StateMask
; }
THREAD_POWER_THROTTLING_STATE
;
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS3)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#if (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE)
BOOL
IsProcessCritical
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINBLUE)
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10)
BOOL
SetProtectedPolicy
( );
BOOL
QueryProtectedPolicy
( );
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN10)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
DWORD
SetThreadIdealProcessor
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Application Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM)
typedef
enum
_PROCESS_INFORMATION_CLASS
{
ProcessMemoryPriority
,
ProcessMemoryExhaustionInfo
,
ProcessAppMemoryInfo
,
ProcessInPrivateInfo
,
ProcessPowerThrottling
,
ProcessReservedValue1
,
// Used to be for ProcessActivityThrottlePolicyInfo
ProcessTelemetryCoverageInfo
,
ProcessProtectionLevelInfo
,
ProcessLeapSecondInfo
,
ProcessInformationClassMax
}
PROCESS_INFORMATION_CLASS
;
typedef
struct
_APP_MEMORY_INFORMATION
{
ULONG64
AvailableCommit
;
ULONG64
PrivateCommitUsage
;
ULONG64
PeakPrivateCommitUsage
;
ULONG64
TotalCommitUsage
; }
APP_MEMORY_INFORMATION
, *
PAPP_MEMORY_INFORMATION
;
//
// Constants and structures needed to enable the fail fast on commit failure
// feature.
//
#define PME_CURRENT_VERSION 1
typedef
enum
_PROCESS_MEMORY_EXHAUSTION_TYPE
{
PMETypeFailFastOnCommitFailure
,
PMETypeMax
}
PROCESS_MEMORY_EXHAUSTION_TYPE
, *
PPROCESS_MEMORY_EXHAUSTION_TYPE
;
#define PME_FAILFAST_ON_COMMIT_FAIL_DISABLE 0x0
#define PME_FAILFAST_ON_COMMIT_FAIL_ENABLE 0x1
typedef
struct
_PROCESS_MEMORY_EXHAUSTION_INFO
{
USHORT
Version
;
USHORT
Reserved
;
PROCESS_MEMORY_EXHAUSTION_TYPE
Type
;
ULONG_PTR
Value
; }
PROCESS_MEMORY_EXHAUSTION_INFO
, *
PPROCESS_MEMORY_EXHAUSTION_INFO
;
#define PROCESS_POWER_THROTTLING_CURRENT_VERSION 1
#define PROCESS_POWER_THROTTLING_EXECUTION_SPEED 0x1
#define PROCESS_POWER_THROTTLING_VALID_FLAGS (PROCESS_POWER_THROTTLING_EXECUTION_SPEED)
typedef
struct
_PROCESS_POWER_THROTTLING_STATE
{
ULONG
Version
;
ULONG
ControlMask
;
ULONG
StateMask
; }
PROCESS_POWER_THROTTLING_STATE
, *
PPROCESS_POWER_THROTTLING_STATE
;
typedef
struct
PROCESS_PROTECTION_LEVEL_INFORMATION
{
DWORD
ProtectionLevel
; }
PROCESS_PROTECTION_LEVEL_INFORMATION
;
#define PROCESS_LEAP_SECOND_INFO_FLAG_ENABLE_SIXTY_SECOND 0x1
#define PROCESS_LEAP_SECOND_INFO_VALID_FLAGS (PROCESS_LEAP_SECOND_INFO_FLAG_ENABLE_SIXTY_SECOND)
typedef
struct
_PROCESS_LEAP_SECOND_INFO
{
ULONG
Flags
;
ULONG
Reserved
; }
PROCESS_LEAP_SECOND_INFO
, *
PPROCESS_LEAP_SECOND_INFO
;
#if (_WIN32_WINNT >= 0x0602)
BOOL
SetProcessInformation
( );
BOOL
GetProcessInformation
( );
#endif //(_WIN32_WINNT >= 0x0602)
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10)
_Success_(return != FALSE)
BOOL
GetSystemCpuSetInformation
( );
_Success_(return != FALSE)
BOOL
GetProcessDefaultCpuSets
( );
_Success_(return != FALSE)
BOOL
SetProcessDefaultCpuSets
( );
_Success_(return != FALSE)
BOOL
GetThreadSelectedCpuSets
( );
_Success_(return != FALSE)
BOOL
SetThreadSelectedCpuSets
( );
#endif // (_WIN32_WINNT >= WIN32_WINNT_WIN10)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion #pragma region Desktop Family or OneCore Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
BOOL
CreateProcessAsUserA
( );
#ifndef UNICODE
#define CreateProcessAsUser CreateProcessAsUserA
#endif
BOOL
GetProcessShutdownParameters
( );
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
#pragma endregion
HRESULT
SetThreadDescription
( );
HRESULT
GetThreadDescription
( );
#ifdef __cplusplus
}
#endif
#endif // _PROCESSTHREADSAPI_H_