99 lines
2.3 KiB
C++
99 lines
2.3 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
LowerThreadPriority.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Includes the following hooks:
|
||
|
|
||
|
SetThreadPriority: if the thread priority is THREAD_PRIORITY_TIME_CRITICAL,
|
||
|
change it to THREAD_PRIORITY_HIGHEST.
|
||
|
|
||
|
SetPriorityClass: if the process priority is HIGH_PRIORITY_CLASS or
|
||
|
REALTIME_PRIORITY_CLASS, change it to
|
||
|
NORMAL_PRIORITY_CLASS.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is a general purpose shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
05/23/2001 qzheng Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(LowerThreadPriority)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(SetThreadPriority)
|
||
|
APIHOOK_ENUM_ENTRY(SetPriorityClass)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(SetThreadPriority)(
|
||
|
HANDLE hThread,
|
||
|
int nPriority
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturnValue;
|
||
|
int nNewPriority;
|
||
|
|
||
|
LOGN( eDbgLevelInfo,
|
||
|
"Original SetThreadPriority(hThread: 0x%08lx, nPriority: %d).", hThread, nPriority );
|
||
|
|
||
|
nNewPriority = (nPriority == THREAD_PRIORITY_TIME_CRITICAL) ? THREAD_PRIORITY_HIGHEST : nPriority;
|
||
|
bReturnValue = ORIGINAL_API(SetThreadPriority)(hThread, nNewPriority);
|
||
|
|
||
|
if( bReturnValue && (nNewPriority != nPriority) ) {
|
||
|
LOGN( eDbgLevelInfo,
|
||
|
"New SetThreadPriority(hThread: 0x%08lx, nPriority: %d).", hThread, nNewPriority );
|
||
|
}
|
||
|
|
||
|
return bReturnValue;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(SetPriorityClass)(
|
||
|
HANDLE hProcess,
|
||
|
DWORD dwPriorityClass
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturnValue;
|
||
|
DWORD dwNewPriorityClass;
|
||
|
|
||
|
LOGN( eDbgLevelInfo,
|
||
|
"Original SetPriorityClass(hProcess: 0x%08lx, dwPriorityClass: %d).", hProcess, dwPriorityClass );
|
||
|
|
||
|
dwNewPriorityClass = ( (dwPriorityClass == HIGH_PRIORITY_CLASS) || (dwPriorityClass == REALTIME_PRIORITY_CLASS) ) ?
|
||
|
NORMAL_PRIORITY_CLASS : dwPriorityClass;
|
||
|
bReturnValue = ORIGINAL_API(SetPriorityClass)(hProcess, dwNewPriorityClass);
|
||
|
|
||
|
if( bReturnValue && (dwNewPriorityClass != dwPriorityClass) ) {
|
||
|
LOGN( eDbgLevelInfo,
|
||
|
"New SetPriorityClass (hProcess: 0x%08lx, dwPriorityClass: %d).", hProcess, dwNewPriorityClass );
|
||
|
}
|
||
|
|
||
|
return bReturnValue;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, SetThreadPriority)
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, SetPriorityClass)
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|