mirror of
https://github.com/mirror/processhacker
synced 2026-06-08 16:03:24 +00:00
removed PH_MUTEX
git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3516 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
@@ -107,10 +107,6 @@ small size and good performance. Although the queued lock
|
||||
is a reader-writer lock, it can be used as a mutex simply by using
|
||||
the exclusive acquire/release functions.
|
||||
|
||||
For mutexes with blocking expected, the PH_MUTEX is an alternative.
|
||||
Currently the PH_MUTEX is the same as PH_QUEUED_LOCK, although it was
|
||||
RTL_CRITICAL_SECTION originally.
|
||||
|
||||
Events can be used through PH_EVENT. This object does not create a
|
||||
kernel event object until needed, and testing its state is very
|
||||
fast.
|
||||
|
||||
@@ -38,7 +38,7 @@ static PPH_SYMBOL_PROVIDER DebugConsoleSymbolProvider;
|
||||
static PPH_HASHTABLE ObjectListSnapshot = NULL;
|
||||
#ifdef DEBUG
|
||||
static PPH_LIST NewObjectList = NULL;
|
||||
static PH_MUTEX NewObjectListLock;
|
||||
static PH_QUEUED_LOCK NewObjectListLock;
|
||||
#endif
|
||||
|
||||
VOID PhShowDebugConsole()
|
||||
@@ -259,7 +259,7 @@ static VOID PhpDebugCreateObjectHook(
|
||||
__in PPH_OBJECT_TYPE ObjectType
|
||||
)
|
||||
{
|
||||
PhAcquireMutex(&NewObjectListLock);
|
||||
PhAcquireQueuedLockExclusive(&NewObjectListLock);
|
||||
|
||||
if (NewObjectList)
|
||||
{
|
||||
@@ -267,7 +267,7 @@ static VOID PhpDebugCreateObjectHook(
|
||||
PhAddItemList(NewObjectList, Object);
|
||||
}
|
||||
|
||||
PhReleaseMutex(&NewObjectListLock);
|
||||
PhReleaseQueuedLockExclusive(&NewObjectListLock);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -499,7 +499,7 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
0, PhpLoadCurrentProcessSymbolsCallback, DebugConsoleSymbolProvider);
|
||||
|
||||
#ifdef DEBUG
|
||||
PhInitializeMutex(&NewObjectListLock);
|
||||
PhInitializeQueuedLock(&NewObjectListLock);
|
||||
PhDbgCreateObjectHook = PhpDebugCreateObjectHook;
|
||||
#endif
|
||||
|
||||
@@ -553,7 +553,7 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
STOPWATCH stopwatch;
|
||||
ULONG i;
|
||||
PPH_STRING testString;
|
||||
PH_MUTEX testMutex;
|
||||
RTL_CRITICAL_SECTION testCriticalSection;
|
||||
PH_FAST_LOCK testFastLock;
|
||||
PH_QUEUED_LOCK testQueuedLock;
|
||||
|
||||
@@ -575,21 +575,21 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
|
||||
wprintf(L"Referencing: %ums\n", PhGetMillisecondsStopwatch(&stopwatch));
|
||||
|
||||
// Mutex
|
||||
// Critical section
|
||||
|
||||
PhInitializeMutex(&testMutex);
|
||||
PhAcquireMutex(&testMutex);
|
||||
PhReleaseMutex(&testMutex);
|
||||
RtlInitializeCriticalSection(&testCriticalSection);
|
||||
RtlEnterCriticalSection(&testCriticalSection);
|
||||
RtlLeaveCriticalSection(&testCriticalSection);
|
||||
PhStartStopwatch(&stopwatch);
|
||||
|
||||
for (i = 0; i < 10000000; i++)
|
||||
{
|
||||
PhAcquireMutex(&testMutex);
|
||||
PhReleaseMutex(&testMutex);
|
||||
RtlEnterCriticalSection(&testCriticalSection);
|
||||
RtlLeaveCriticalSection(&testCriticalSection);
|
||||
}
|
||||
|
||||
PhStopStopwatch(&stopwatch);
|
||||
PhDeleteMutex(&testMutex);
|
||||
RtlDeleteCriticalSection(&testCriticalSection);
|
||||
|
||||
wprintf(L"Mutex: %ums\n", PhGetMillisecondsStopwatch(&stopwatch));
|
||||
|
||||
@@ -890,9 +890,9 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
else if (WSTR_IEQUAL(command, L"objmknew"))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
PhAcquireMutex(&NewObjectListLock);
|
||||
PhAcquireQueuedLockExclusive(&NewObjectListLock);
|
||||
PhpDeleteNewObjectList();
|
||||
PhReleaseMutex(&NewObjectListLock);
|
||||
PhReleaseQueuedLockExclusive(&NewObjectListLock);
|
||||
|
||||
// Creation needs to be done outside of the lock,
|
||||
// otherwise a deadlock will occur.
|
||||
@@ -904,9 +904,9 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
else if (WSTR_IEQUAL(command, L"objdelnew"))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
PhAcquireMutex(&NewObjectListLock);
|
||||
PhAcquireQueuedLockExclusive(&NewObjectListLock);
|
||||
PhpDeleteNewObjectList();
|
||||
PhReleaseMutex(&NewObjectListLock);
|
||||
PhReleaseQueuedLockExclusive(&NewObjectListLock);
|
||||
#else
|
||||
wprintf(commandDebugOnly);
|
||||
#endif
|
||||
@@ -916,12 +916,12 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
#ifdef DEBUG
|
||||
ULONG i;
|
||||
|
||||
PhAcquireMutex(&NewObjectListLock);
|
||||
PhAcquireQueuedLockExclusive(&NewObjectListLock);
|
||||
|
||||
if (!NewObjectList)
|
||||
{
|
||||
wprintf(L"Object creation hooking not active.\n");
|
||||
PhReleaseMutex(&NewObjectListLock);
|
||||
PhReleaseQueuedLockExclusive(&NewObjectListLock);
|
||||
goto EndCommand;
|
||||
}
|
||||
|
||||
@@ -930,7 +930,7 @@ NTSTATUS PhpDebugConsoleThreadStart(
|
||||
PhpPrintObjectInfo(PhObjectToObjectHeader(NewObjectList->Items[i]), 1);
|
||||
}
|
||||
|
||||
PhReleaseMutex(&NewObjectListLock);
|
||||
PhReleaseQueuedLockExclusive(&NewObjectListLock);
|
||||
#else
|
||||
wprintf(commandDebugOnly);
|
||||
#endif
|
||||
|
||||
@@ -67,7 +67,7 @@ static BOOLEAN SearchStop;
|
||||
static PPH_STRING SearchString;
|
||||
static PPH_LIST SearchResults = NULL;
|
||||
static ULONG SearchResultsAddIndex;
|
||||
static PH_MUTEX SearchResultsLock;
|
||||
static PH_QUEUED_LOCK SearchResultsLock = PH_QUEUED_LOCK_INIT;
|
||||
|
||||
static ULONG64 SearchPointer;
|
||||
static BOOLEAN UseSearchPointer;
|
||||
@@ -242,7 +242,6 @@ static INT_PTR CALLBACK PhpFindObjectsDlgProc(
|
||||
SearchString = PhGetWindowText(GetDlgItem(hwndDlg, IDC_FILTER));
|
||||
SearchResults = PhCreateList(128);
|
||||
SearchResultsAddIndex = 0;
|
||||
PhInitializeMutex(&SearchResultsLock);
|
||||
|
||||
SearchThreadHandle = PhCreateThread(0, PhpFindObjectsThreadStart, NULL);
|
||||
|
||||
@@ -481,7 +480,7 @@ static INT_PTR CALLBACK PhpFindObjectsDlgProc(
|
||||
|
||||
ExtendedListView_SetRedraw(lvHandle, FALSE);
|
||||
|
||||
PhAcquireMutex(&SearchResultsLock);
|
||||
PhAcquireQueuedLockExclusive(&SearchResultsLock);
|
||||
|
||||
for (i = SearchResultsAddIndex; i < SearchResults->Count; i++)
|
||||
{
|
||||
@@ -505,7 +504,7 @@ static INT_PTR CALLBACK PhpFindObjectsDlgProc(
|
||||
|
||||
SearchResultsAddIndex = i;
|
||||
|
||||
PhReleaseMutex(&SearchResultsLock);
|
||||
PhReleaseQueuedLockExclusive(&SearchResultsLock);
|
||||
|
||||
ExtendedListView_SetRedraw(lvHandle, TRUE);
|
||||
}
|
||||
@@ -516,7 +515,6 @@ static INT_PTR CALLBACK PhpFindObjectsDlgProc(
|
||||
SendMessage(hwndDlg, WM_PH_SEARCH_UPDATE, 0, 0);
|
||||
|
||||
PhDereferenceObject(SearchString);
|
||||
PhDeleteMutex(&SearchResultsLock);
|
||||
|
||||
NtWaitForSingleObject(SearchThreadHandle, FALSE, NULL);
|
||||
NtClose(SearchThreadHandle);
|
||||
@@ -563,7 +561,7 @@ static BOOLEAN NTAPI EnumModulesCallback(
|
||||
PhPrintPointer(searchResult->HandleString, Module->BaseAddress);
|
||||
memset(&searchResult->Info, 0, sizeof(SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX));
|
||||
|
||||
PhAcquireMutex(&SearchResultsLock);
|
||||
PhAcquireQueuedLockExclusive(&SearchResultsLock);
|
||||
|
||||
PhAddItemList(SearchResults, searchResult);
|
||||
|
||||
@@ -571,7 +569,7 @@ static BOOLEAN NTAPI EnumModulesCallback(
|
||||
if (SearchResults->Count % 40 == 0)
|
||||
PostMessage(PhFindObjectsWindowHandle, WM_PH_SEARCH_UPDATE, 0, 0);
|
||||
|
||||
PhReleaseMutex(&SearchResultsLock);
|
||||
PhReleaseQueuedLockExclusive(&SearchResultsLock);
|
||||
}
|
||||
|
||||
PhDereferenceObject(lowerFileName);
|
||||
@@ -677,7 +675,7 @@ static NTSTATUS PhpFindObjectsThreadStart(
|
||||
PhPrintPointer(searchResult->HandleString, (PVOID)searchResult->Handle);
|
||||
searchResult->Info = *handleInfo;
|
||||
|
||||
PhAcquireMutex(&SearchResultsLock);
|
||||
PhAcquireQueuedLockExclusive(&SearchResultsLock);
|
||||
|
||||
PhAddItemList(SearchResults, searchResult);
|
||||
|
||||
@@ -685,7 +683,7 @@ static NTSTATUS PhpFindObjectsThreadStart(
|
||||
if (SearchResults->Count % 40 == 0)
|
||||
PostMessage(PhFindObjectsWindowHandle, WM_PH_SEARCH_UPDATE, 0, 0);
|
||||
|
||||
PhReleaseMutex(&SearchResultsLock);
|
||||
PhReleaseQueuedLockExclusive(&SearchResultsLock);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <settingsp.h>
|
||||
|
||||
PPH_HASHTABLE PhSettingsHashtable;
|
||||
PH_QUEUED_LOCK PhSettingsLock;
|
||||
PH_QUEUED_LOCK PhSettingsLock = PH_QUEUED_LOCK_INIT;
|
||||
|
||||
PPH_LIST PhIgnoredSettings;
|
||||
|
||||
@@ -38,7 +38,6 @@ VOID PhSettingsInitialization()
|
||||
PhpSettingsHashtableHashFunction,
|
||||
128
|
||||
);
|
||||
PhInitializeQueuedLock(&PhSettingsLock);
|
||||
PhIgnoredSettings = PhCreateList(4);
|
||||
|
||||
PhpAddIntegerSetting(L"AllowOnlyOneInstance", L"0");
|
||||
|
||||
@@ -50,7 +50,7 @@ VOID PhpRemoveProcessItemService(
|
||||
PPH_OBJECT_TYPE PhServiceItemType;
|
||||
|
||||
PPH_HASHTABLE PhServiceHashtable;
|
||||
PH_QUEUED_LOCK PhServiceHashtableLock;
|
||||
PH_QUEUED_LOCK PhServiceHashtableLock = PH_QUEUED_LOCK_INIT;
|
||||
|
||||
PHAPPAPI PH_CALLBACK PhServiceAddedEvent;
|
||||
PHAPPAPI PH_CALLBACK PhServiceModifiedEvent;
|
||||
@@ -73,7 +73,6 @@ BOOLEAN PhServiceProviderInitialization()
|
||||
PhpServiceHashtableHashFunction,
|
||||
40
|
||||
);
|
||||
PhInitializeQueuedLock(&PhServiceHashtableLock);
|
||||
|
||||
PhInitializeCallback(&PhServiceAddedEvent);
|
||||
PhInitializeCallback(&PhServiceModifiedEvent);
|
||||
|
||||
+48
-46
@@ -50,50 +50,17 @@ NTSTATUS PhpQueryObjectThreadStart(
|
||||
|
||||
HANDLE PhQueryObjectThreadHandle = NULL;
|
||||
PVOID PhQueryObjectFiber = NULL;
|
||||
PH_MUTEX PhQueryObjectMutex;
|
||||
PH_QUEUED_LOCK PhQueryObjectMutex;
|
||||
HANDLE PhQueryObjectStartEvent = NULL;
|
||||
HANDLE PhQueryObjectCompletedEvent = NULL;
|
||||
PH_QUERY_OBJECT_CONTEXT PhQueryObjectContext;
|
||||
|
||||
PPH_STRING PhObjectTypeNames[MAX_OBJECT_TYPE_NUMBER];
|
||||
PPH_STRING PhObjectTypeNames[MAX_OBJECT_TYPE_NUMBER] = { 0 };
|
||||
PPH_GET_CLIENT_ID_NAME PhHandleGetClientIdName = PhStdGetClientIdName;
|
||||
|
||||
static PPH_STRING HkcuPrefix;
|
||||
static PPH_STRING HkcucrPrefix;
|
||||
|
||||
VOID PhHandleInfoInitialization()
|
||||
{
|
||||
PhInitializeMutex(&PhQueryObjectMutex);
|
||||
|
||||
memset(PhObjectTypeNames, 0, sizeof(PhObjectTypeNames));
|
||||
|
||||
{
|
||||
PTOKEN_USER tokenUser;
|
||||
PPH_STRING stringSid = NULL;
|
||||
|
||||
if (PhCurrentTokenQueryHandle)
|
||||
{
|
||||
if (NT_SUCCESS(PhGetTokenUser(
|
||||
PhCurrentTokenQueryHandle,
|
||||
&tokenUser
|
||||
)))
|
||||
{
|
||||
stringSid = PhSidToStringSid(tokenUser->User.Sid);
|
||||
PhFree(tokenUser);
|
||||
}
|
||||
}
|
||||
|
||||
if (stringSid)
|
||||
{
|
||||
HkcuPrefix = PhConcatStrings2(L"\\Registry\\User\\", stringSid->Buffer);
|
||||
HkcucrPrefix = PhConcatStrings2(HkcuPrefix->Buffer, L"_Classes");
|
||||
}
|
||||
else
|
||||
{
|
||||
HkcuPrefix = PhCreateString(L"..."); // some random string that won't ever get matched
|
||||
HkcucrPrefix = PhCreateString(L"...");
|
||||
}
|
||||
}
|
||||
// Nothing
|
||||
}
|
||||
|
||||
PPH_GET_CLIENT_ID_NAME PhSetHandleClientIdFunction(
|
||||
@@ -353,8 +320,43 @@ PPH_STRING PhFormatNativeKeyName(
|
||||
#define HKU_PREFIX L"\\Registry\\User"
|
||||
#define HKU_PREFIX_LENGTH 14
|
||||
|
||||
static PH_INITONCE initOnce = PH_INITONCE_INIT;
|
||||
static PPH_STRING hkcuPrefix;
|
||||
static PPH_STRING hkcucrPrefix;
|
||||
|
||||
PPH_STRING newName;
|
||||
|
||||
if (PhBeginInitOnce(&initOnce))
|
||||
{
|
||||
PTOKEN_USER tokenUser;
|
||||
PPH_STRING stringSid = NULL;
|
||||
|
||||
if (PhCurrentTokenQueryHandle)
|
||||
{
|
||||
if (NT_SUCCESS(PhGetTokenUser(
|
||||
PhCurrentTokenQueryHandle,
|
||||
&tokenUser
|
||||
)))
|
||||
{
|
||||
stringSid = PhSidToStringSid(tokenUser->User.Sid);
|
||||
PhFree(tokenUser);
|
||||
}
|
||||
}
|
||||
|
||||
if (stringSid)
|
||||
{
|
||||
hkcuPrefix = PhConcatStrings2(L"\\Registry\\User\\", stringSid->Buffer);
|
||||
hkcucrPrefix = PhConcatStrings2(hkcuPrefix->Buffer, L"_Classes");
|
||||
}
|
||||
else
|
||||
{
|
||||
hkcuPrefix = PhCreateString(L"..."); // some random string that won't ever get matched
|
||||
hkcucrPrefix = PhCreateString(L"...");
|
||||
}
|
||||
|
||||
PhEndInitOnce(&initOnce);
|
||||
}
|
||||
|
||||
if (PhStartsWithString2(Name, HKCR_PREFIX, TRUE))
|
||||
{
|
||||
newName = PhConcatStrings2(L"HKCR", &Name->Buffer[HKCR_PREFIX_LENGTH]);
|
||||
@@ -363,16 +365,16 @@ PPH_STRING PhFormatNativeKeyName(
|
||||
{
|
||||
newName = PhConcatStrings2(L"HKLM", &Name->Buffer[HKLM_PREFIX_LENGTH]);
|
||||
}
|
||||
else if (PhStartsWithString(Name, HkcucrPrefix, TRUE))
|
||||
else if (PhStartsWithString(Name, hkcucrPrefix, TRUE))
|
||||
{
|
||||
newName = PhConcatStrings2(
|
||||
L"HKCU\\Software\\Classes",
|
||||
&Name->Buffer[HkcucrPrefix->Length / 2]
|
||||
&Name->Buffer[hkcucrPrefix->Length / 2]
|
||||
);
|
||||
}
|
||||
else if (PhStartsWithString(Name, HkcuPrefix, TRUE))
|
||||
else if (PhStartsWithString(Name, hkcuPrefix, TRUE))
|
||||
{
|
||||
newName = PhConcatStrings2(L"HKCU", &Name->Buffer[HkcuPrefix->Length / 2]);
|
||||
newName = PhConcatStrings2(L"HKCU", &Name->Buffer[hkcuPrefix->Length / 2]);
|
||||
}
|
||||
else if (PhStartsWithString2(Name, HKU_PREFIX, TRUE))
|
||||
{
|
||||
@@ -1118,7 +1120,7 @@ CleanupExit:
|
||||
|
||||
BOOLEAN PhpHeadQueryObjectHack()
|
||||
{
|
||||
PhAcquireMutex(&PhQueryObjectMutex);
|
||||
PhAcquireQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
|
||||
// Create a query thread if we don't have one.
|
||||
if (!PhQueryObjectThreadHandle)
|
||||
@@ -1127,7 +1129,7 @@ BOOLEAN PhpHeadQueryObjectHack()
|
||||
|
||||
if (!PhQueryObjectThreadHandle)
|
||||
{
|
||||
PhReleaseMutex(&PhQueryObjectMutex);
|
||||
PhReleaseQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@@ -1144,7 +1146,7 @@ BOOLEAN PhpHeadQueryObjectHack()
|
||||
FALSE
|
||||
)))
|
||||
{
|
||||
PhReleaseMutex(&PhQueryObjectMutex);
|
||||
PhReleaseQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@@ -1159,7 +1161,7 @@ BOOLEAN PhpHeadQueryObjectHack()
|
||||
FALSE
|
||||
)))
|
||||
{
|
||||
PhReleaseMutex(&PhQueryObjectMutex);
|
||||
PhReleaseQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@@ -1192,7 +1194,7 @@ NTSTATUS PhpTailQueryObjectHack(
|
||||
status = PhQueryObjectContext.Status;
|
||||
returnLength = PhQueryObjectContext.ReturnLength;
|
||||
|
||||
PhReleaseMutex(&PhQueryObjectMutex);
|
||||
PhReleaseQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
|
||||
if (ReturnLength)
|
||||
*ReturnLength = returnLength;
|
||||
@@ -1213,7 +1215,7 @@ NTSTATUS PhpTailQueryObjectHack(
|
||||
PhQueryObjectFiber = NULL;
|
||||
}
|
||||
|
||||
PhReleaseMutex(&PhQueryObjectMutex);
|
||||
PhReleaseQueuedLockExclusive(&PhQueryObjectMutex);
|
||||
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
@@ -321,78 +321,6 @@ FORCEINLINE PVOID PhAllocateCopy(
|
||||
return copy;
|
||||
}
|
||||
|
||||
// mutex
|
||||
|
||||
//#define PH_MUTEX_IS_CRITICAL_SECTION
|
||||
|
||||
#ifdef PH_MUTEX_IS_CRITICAL_SECTION
|
||||
typedef RTL_CRITICAL_SECTION PH_MUTEX, *PPH_MUTEX;
|
||||
#else
|
||||
typedef PH_QUEUED_LOCK PH_MUTEX, *PPH_MUTEX;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Initializes a mutex object.
|
||||
*
|
||||
* \param Mutex A pointer to a mutex object.
|
||||
*/
|
||||
FORCEINLINE VOID PhInitializeMutex(
|
||||
__out PPH_MUTEX Mutex
|
||||
)
|
||||
{
|
||||
#ifdef PH_MUTEX_IS_CRITICAL_SECTION
|
||||
RtlInitializeCriticalSection(Mutex);
|
||||
#else
|
||||
PhInitializeQueuedLock(Mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees resources used by a mutex object.
|
||||
*
|
||||
* \param Mutex A pointer to a mutex object.
|
||||
*/
|
||||
FORCEINLINE VOID PhDeleteMutex(
|
||||
__inout PPH_MUTEX Mutex
|
||||
)
|
||||
{
|
||||
#ifdef PH_MUTEX_IS_CRITICAL_SECTION
|
||||
RtlDeleteCriticalSection(Mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Acquires a mutex.
|
||||
*
|
||||
* \param Mutex A pointer to a mutex object.
|
||||
*/
|
||||
FORCEINLINE VOID PhAcquireMutex(
|
||||
__inout PPH_MUTEX Mutex
|
||||
)
|
||||
{
|
||||
#ifdef PH_MUTEX_IS_CRITICAL_SECTION
|
||||
RtlEnterCriticalSection(Mutex);
|
||||
#else
|
||||
PhAcquireQueuedLockExclusive(Mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases a mutex.
|
||||
*
|
||||
* \param Mutex A pointer to a mutex object.
|
||||
*/
|
||||
FORCEINLINE VOID PhReleaseMutex(
|
||||
__inout PPH_MUTEX Mutex
|
||||
)
|
||||
{
|
||||
#ifdef PH_MUTEX_IS_CRITICAL_SECTION
|
||||
RtlLeaveCriticalSection(Mutex);
|
||||
#else
|
||||
PhReleaseQueuedLockExclusive(Mutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
// event
|
||||
|
||||
#define PH_EVENT_SET 0x1
|
||||
|
||||
@@ -44,7 +44,7 @@ static ULONG PhpAutoPoolTlsIndex;
|
||||
|
||||
#ifdef DEBUG
|
||||
LIST_ENTRY PhDbgObjectListHead;
|
||||
PH_QUEUED_LOCK PhDbgObjectListLock;
|
||||
PH_QUEUED_LOCK PhDbgObjectListLock = PH_QUEUED_LOCK_INIT;
|
||||
PPH_CREATE_OBJECT_HOOK PhDbgCreateObjectHook = NULL;
|
||||
#endif
|
||||
|
||||
@@ -58,7 +58,6 @@ NTSTATUS PhInitializeRef()
|
||||
|
||||
#ifdef DEBUG
|
||||
InitializeListHead(&PhDbgObjectListHead);
|
||||
PhInitializeQueuedLock(&PhDbgObjectListLock);
|
||||
#endif
|
||||
|
||||
PhInitializeFreeList(
|
||||
|
||||
+24
-22
@@ -47,7 +47,10 @@ VOID PhpFreeSymbolModule(
|
||||
PPH_OBJECT_TYPE PhSymbolProviderType;
|
||||
|
||||
HANDLE PhNextFakeHandle;
|
||||
PH_MUTEX PhSymMutex;
|
||||
PH_FAST_LOCK PhSymMutex = PH_FAST_LOCK_INIT;
|
||||
|
||||
#define PH_LOCK_SYMBOLS() PhAcquireFastLockExclusive(&PhSymMutex)
|
||||
#define PH_UNLOCK_SYMBOLS() PhReleaseFastLockExclusive(&PhSymMutex)
|
||||
|
||||
_SymInitialize SymInitialize_I;
|
||||
_SymCleanup SymCleanup_I;
|
||||
@@ -85,7 +88,6 @@ BOOLEAN PhSymbolProviderInitialization()
|
||||
return FALSE;
|
||||
|
||||
PhNextFakeHandle = (HANDLE)0;
|
||||
PhInitializeMutex(&PhSymMutex);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -217,9 +219,9 @@ VOID NTAPI PhpSymbolProviderDeleteProcedure(
|
||||
|
||||
if (SymCleanup_I)
|
||||
{
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
SymCleanup_I(symbolProvider->ProcessHandle);
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
}
|
||||
|
||||
for (i = 0; i < symbolProvider->ModulesList->Count; i++)
|
||||
@@ -241,9 +243,9 @@ VOID PhpRegisterSymbolProvider(
|
||||
{
|
||||
if (SymInitialize_I)
|
||||
{
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
SymInitialize_I(SymbolProvider->ProcessHandle, NULL, FALSE);
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
}
|
||||
|
||||
PhEndInitOnce(&SymbolProvider->InitOnce);
|
||||
@@ -251,9 +253,9 @@ VOID PhpRegisterSymbolProvider(
|
||||
#else
|
||||
if (SymInitialize_I)
|
||||
{
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
SymInitialize_I(SymbolProvider->ProcessHandle, NULL, FALSE);
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -306,7 +308,7 @@ BOOLEAN PhGetLineFromAddress(
|
||||
|
||||
line.SizeOfStruct = sizeof(IMAGEHLP_LINEW64);
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
|
||||
if (SymGetLineFromAddrW64_I)
|
||||
{
|
||||
@@ -341,7 +343,7 @@ BOOLEAN PhGetLineFromAddress(
|
||||
}
|
||||
}
|
||||
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
|
||||
if (!result)
|
||||
return FALSE;
|
||||
@@ -476,7 +478,7 @@ PPH_STRING PhGetSymbolFromAddress(
|
||||
|
||||
// Get the symbol name.
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
|
||||
// Note that we don't care whether this call
|
||||
// succeeds or not, based on the assumption that
|
||||
@@ -512,7 +514,7 @@ PPH_STRING PhGetSymbolFromAddress(
|
||||
PhpSymbolInfoAnsiToUnicode(symbolInfo, symbolInfoA);
|
||||
}
|
||||
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
|
||||
// Find the module name.
|
||||
|
||||
@@ -654,7 +656,7 @@ BOOLEAN PhGetSymbolFromName(
|
||||
|
||||
// Get the symbol information.
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
|
||||
if (SymFromNameW_I)
|
||||
{
|
||||
@@ -693,7 +695,7 @@ BOOLEAN PhGetSymbolFromName(
|
||||
result = FALSE;
|
||||
}
|
||||
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
|
||||
if (!result)
|
||||
return FALSE;
|
||||
@@ -728,7 +730,7 @@ BOOLEAN PhLoadModuleSymbolProvider(
|
||||
if (!fileName)
|
||||
return FALSE;
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
baseAddress = SymLoadModule64_I(
|
||||
SymbolProvider->ProcessHandle,
|
||||
NULL,
|
||||
@@ -737,7 +739,7 @@ BOOLEAN PhLoadModuleSymbolProvider(
|
||||
BaseAddress,
|
||||
Size
|
||||
);
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
PhDereferenceObject(fileName);
|
||||
|
||||
// Add the module to the list, even if we couldn't load
|
||||
@@ -800,14 +802,14 @@ VOID PhSetOptionsSymbolProvider(
|
||||
PhpRegisterSymbolProvider(SymbolProvider);
|
||||
#endif
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
|
||||
options = SymGetOptions_I();
|
||||
options &= ~Mask;
|
||||
options |= Value;
|
||||
SymSetOptions_I(options);
|
||||
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
}
|
||||
|
||||
VOID PhSetSearchPathSymbolProvider(
|
||||
@@ -822,7 +824,7 @@ VOID PhSetSearchPathSymbolProvider(
|
||||
PhpRegisterSymbolProvider(SymbolProvider);
|
||||
#endif
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
|
||||
if (SymSetSearchPathW_I)
|
||||
{
|
||||
@@ -837,7 +839,7 @@ VOID PhSetSearchPathSymbolProvider(
|
||||
PhDereferenceObject(path);
|
||||
}
|
||||
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
}
|
||||
|
||||
BOOLEAN PhStackWalk(
|
||||
@@ -862,7 +864,7 @@ BOOLEAN PhStackWalk(
|
||||
if (!GetModuleBaseRoutine)
|
||||
GetModuleBaseRoutine = SymGetModuleBase64_I;
|
||||
|
||||
PhAcquireMutex(&PhSymMutex);
|
||||
PH_LOCK_SYMBOLS();
|
||||
result = StackWalk64_I(
|
||||
MachineType,
|
||||
ProcessHandle,
|
||||
@@ -874,7 +876,7 @@ BOOLEAN PhStackWalk(
|
||||
GetModuleBaseRoutine,
|
||||
TranslateAddress
|
||||
);
|
||||
PhReleaseMutex(&PhSymMutex);
|
||||
PH_UNLOCK_SYMBOLS();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user