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 }