/*++ Copyright (c) 2000 Microsoft Corporation Module Name: Peb.c Abstract: Get the PEB for the current process safely Author: Neill Clift (neillc) 16-JUN-2000 Revision History: --*/ #include "ntrtlp.h" #if defined(ALLOC_PRAGMA) && defined(NTOS_KERNEL_RUNTIME) #pragma alloc_text(PAGE,RtlGetCurrentPeb) #pragma alloc_text(PAGE,RtlSetProcessIsCritical) #pragma alloc_text(PAGE,RtlSetThreadIsCritical) #endif PPEB RtlGetCurrentPeb ( VOID) { #if defined(NTOS_KERNEL_RUNTIME) PAGED_CODE (); return PsGetCurrentProcess ()->Peb; #else return NtCurrentTeb()->ProcessEnvironmentBlock; #endif } NTSYSAPI NTSTATUS STDAPIVCALLTYPE RtlSetProcessIsCritical( IN BOOLEAN NewValue, OUT PBOOLEAN OldValue OPTIONAL, IN BOOLEAN CheckFlag ) { PPEB Peb; ULONG Enable; NTSTATUS Status; if ( ARGUMENT_PRESENT(OldValue) ) { *OldValue = FALSE; } Peb = RtlGetCurrentPeb(); if ( CheckFlag && ! (Peb->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS) ) { return STATUS_UNSUCCESSFUL; } if ( ARGUMENT_PRESENT(OldValue) ) { NtQueryInformationProcess(NtCurrentProcess(), ProcessBreakOnTermination, &Enable, sizeof(Enable), NULL); *OldValue = (BOOLEAN) Enable; } Enable = NewValue; Status = NtSetInformationProcess(NtCurrentProcess(), ProcessBreakOnTermination, &Enable, sizeof(Enable)); return Status; } NTSYSAPI NTSTATUS STDAPIVCALLTYPE RtlSetThreadIsCritical( IN BOOLEAN NewValue, OUT PBOOLEAN OldValue OPTIONAL, IN BOOLEAN CheckFlag ) { PPEB Peb; ULONG Enable; NTSTATUS Status; if ( ARGUMENT_PRESENT(OldValue) ) { *OldValue = FALSE; } Peb = RtlGetCurrentPeb(); if ( CheckFlag && ! (Peb->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS) ) { return STATUS_UNSUCCESSFUL; } if ( ARGUMENT_PRESENT(OldValue) ) { NtQueryInformationThread(NtCurrentThread(), ThreadBreakOnTermination, &Enable, sizeof(Enable), NULL); *OldValue = (BOOLEAN) Enable; } Enable = NewValue; Status = NtSetInformationThread(NtCurrentThread(), ThreadBreakOnTermination, &Enable, sizeof(Enable)); return Status; } NTSYSAPI NTSTATUS NTAPI RtlCheckProcessParameters(PVOID p1, PWSTR p2, PULONG p3, ULONG v1) { while (*p2) { p3[2] = p3[1]; p3[1] = p3[0]; p3[0] = *p2; p2++; } v1 = * (volatile WCHAR *) p2; v1 *= ((PULONG) p1)[0]; p3[v1] += ((PULONG) p1)[2]; v1 += 2; p3[v1] = v1 * 3; return (NTSTATUS) 0xc0000578; }