[RTL]: Document, define, implement, and export RtlSetThreadIsCritical.

svn path=/trunk/; revision=55310
This commit is contained in:
Alex Ionescu 2012-01-30 01:14:33 +00:00
parent 64cab88494
commit 4e3bf71826
6 changed files with 61 additions and 6 deletions

View file

@ -895,7 +895,7 @@
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
//@ stdcall RtlSetSecurityObjectEx
//@ stdcall RtlSetThreadErrorMode
//@ stdcall RtlSetThreadIsCritical
@ stdcall RtlSetThreadIsCritical(long ptr long)
//@ stdcall RtlSetThreadPoolStartFunc
@ stdcall RtlSetTimeZoneInformation(ptr)
//@ stdcall RtlSetTimer

View file

@ -895,7 +895,7 @@
@ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr)
;@ stdcall RtlSetSecurityObjectEx
;@ stdcall RtlSetThreadErrorMode
;@ stdcall RtlSetThreadIsCritical
@ stdcall RtlSetThreadIsCritical(long ptr long)
;@ stdcall RtlSetThreadPoolStartFunc
@ stdcall RtlSetTimeZoneInformation(ptr)
;@ stdcall RtlSetTimer

View file

@ -2406,6 +2406,15 @@ RtlSetProcessIsCritical(
IN BOOLEAN NeedBreaks
);
NTSYSAPI
NTSTATUS
NTAPI
RtlSetThreadIsCritical(
IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue OPTIONAL,
IN BOOLEAN NeedBreaks
);
NTSYSAPI
ULONG
NTAPI

View file

@ -53,6 +53,7 @@ typedef struct _SM_EXEC_PGM_MSG
RTL_USER_PROCESS_INFORMATION ProcessInformation;
BOOLEAN DebugFlag;
} SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG;
C_ASSERT(sizeof(SM_EXEC_PGM_MSG) == 0x48);
typedef struct _SM_LOAD_DEFERED_SUBSYSTEM_MSG
{

View file

@ -362,16 +362,19 @@ RtlSetProcessIsCritical(IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue OPTIONAL,
IN BOOLEAN NeedBreaks)
{
ULONG BreakOnTermination = FALSE;
ULONG BreakOnTermination;
if (OldValue)
*OldValue = FALSE;
/* Initialize to FALSE */
if (OldValue) *OldValue = FALSE;
/* Fail, if the critical breaks flag is required but is not set */
if (NeedBreaks == TRUE &&
if ((NeedBreaks) &&
!(NtCurrentPeb()->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS))
{
return STATUS_UNSUCCESSFUL;
}
/* Check if the caller wants the old value */
if (OldValue)
{
/* Query and return the old break on termination flag for the process */

View file

@ -150,6 +150,48 @@ RtlpFreeUserStack(IN HANDLE Process,
/* FUNCTIONS ***************************************************************/
/*
* @implemented
*/
NTSTATUS
NTAPI
RtlSetThreadIsCritical(IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue OPTIONAL,
IN BOOLEAN NeedBreaks)
{
ULONG BreakOnTermination;
/* Initialize to FALSE */
if (OldValue) *OldValue = FALSE;
/* Fail, if the critical breaks flag is required but is not set */
if ((NeedBreaks) &&
!(NtCurrentPeb()->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS))
{
return STATUS_UNSUCCESSFUL;
}
/* Check if the caller wants the old value */
if (OldValue)
{
/* Query and return the old break on termination flag for the process */
ZwQueryInformationThread(NtCurrentThread(),
ThreadBreakOnTermination,
&BreakOnTermination,
sizeof(ULONG),
NULL);
*OldValue = (BOOLEAN)BreakOnTermination;
}
/* Set the break on termination flag for the process */
BreakOnTermination = NewValue;
return ZwSetInformationThread(NtCurrentThread(),
ThreadBreakOnTermination,
&BreakOnTermination,
sizeof(ULONG));
}
/*
@implemented
*/