From 74471efe09ce66146ab95bf783d09f5ffcd1139f Mon Sep 17 00:00:00 2001 From: wj32 Date: Sat, 28 Aug 2010 03:45:00 +0000 Subject: [PATCH] fixed PH_SYMBOL_PROVIDER_DELAY_INIT git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3538 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/phlib/include/ph.h | 1 + 2.x/trunk/phlib/include/phbase.h | 7 +++++++ 2.x/trunk/phlib/symprv.c | 11 ++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/2.x/trunk/phlib/include/ph.h b/2.x/trunk/phlib/include/ph.h index 6a7b1c75f..86f0275ea 100644 --- a/2.x/trunk/phlib/include/ph.h +++ b/2.x/trunk/phlib/include/ph.h @@ -1802,6 +1802,7 @@ typedef struct _PH_SYMBOL_PROVIDER PH_QUEUED_LOCK ModulesListLock; HANDLE ProcessHandle; BOOLEAN IsRealHandle; + BOOLEAN IsRegistered; #ifdef PH_SYMBOL_PROVIDER_DELAY_INIT PH_INITONCE InitOnce; #endif diff --git a/2.x/trunk/phlib/include/phbase.h b/2.x/trunk/phlib/include/phbase.h index 8288f6504..c6720265e 100644 --- a/2.x/trunk/phlib/include/phbase.h +++ b/2.x/trunk/phlib/include/phbase.h @@ -604,6 +604,13 @@ FORCEINLINE BOOLEAN PhBeginInitOnce( return PhfBeginInitOnce(InitOnce); } +FORCEINLINE BOOLEAN PhTestInitOnce( + __in PPH_INITONCE InitOnce + ) +{ + return InitOnce->State == PH_INITONCE_INITIALIZED; +} + // string #ifndef BASESUP_PRIVATE diff --git a/2.x/trunk/phlib/symprv.c b/2.x/trunk/phlib/symprv.c index 682c884a7..8d252282a 100644 --- a/2.x/trunk/phlib/symprv.c +++ b/2.x/trunk/phlib/symprv.c @@ -198,6 +198,8 @@ PPH_SYMBOL_PROVIDER PhCreateSymbolProvider( symbolProvider->ProcessHandle = fakeHandle; } + symbolProvider->IsRegistered = FALSE; + #ifdef PH_SYMBOL_PROVIDER_DELAY_INIT PhInitializeInitOnce(&symbolProvider->InitOnce); #else @@ -218,7 +220,10 @@ VOID NTAPI PhpSymbolProviderDeleteProcedure( if (SymCleanup_I) { PH_LOCK_SYMBOLS(); - SymCleanup_I(symbolProvider->ProcessHandle); + + if (symbolProvider->IsRegistered) + SymCleanup_I(symbolProvider->ProcessHandle); + PH_UNLOCK_SYMBOLS(); } @@ -244,6 +249,8 @@ VOID PhpRegisterSymbolProvider( PH_LOCK_SYMBOLS(); SymInitialize_I(SymbolProvider->ProcessHandle, NULL, FALSE); PH_UNLOCK_SYMBOLS(); + + SymbolProvider->IsRegistered = TRUE; } PhEndInitOnce(&SymbolProvider->InitOnce); @@ -254,6 +261,8 @@ VOID PhpRegisterSymbolProvider( PH_LOCK_SYMBOLS(); SymInitialize_I(SymbolProvider->ProcessHandle, NULL, FALSE); PH_UNLOCK_SYMBOLS(); + + SymbolProvider->IsRegistered = TRUE; } #endif }