@@ -27,42 +27,48 @@ DWORD WINAPI MmpReleasePostponedTlsWorker(PVOID) {
2727
2828 EnterCriticalSection (&MmpPostponedTlsLock);
2929
30- auto iter = MmpPostponedTlsList->begin ();
30+ if (MmpPostponedTlsList) {
31+ auto iter = MmpPostponedTlsList->begin ();
3132
32- while (iter != MmpPostponedTlsList->end ()) {
33- const auto & item = *iter;
34- GetExitCodeThread (item.hThread , &code);
33+ while (iter != MmpPostponedTlsList->end ()) {
34+ const auto & item = *iter;
35+ GetExitCodeThread (item.hThread , &code);
3536
36- if (code == STILL_ACTIVE) {
37- ++iter;
38- }
39- else {
37+ if (code == STILL_ACTIVE) {
38+ ++iter;
39+ }
40+ else {
4041
41- RtlAcquireSRWLockExclusive (&MmpGlobalDataPtr->MmpTls ->MmpTlsListLock );
42+ RtlAcquireSRWLockExclusive (&MmpGlobalDataPtr->MmpTls ->MmpTlsListLock );
4243
43- auto TlspMmpBlock = (PVOID*)item.lpOldTlsVector ->ModuleTlsData ;
44- auto entry = MmpGlobalDataPtr->MmpTls ->MmpTlsList .Flink ;
45- while (entry != &MmpGlobalDataPtr->MmpTls ->MmpTlsList ) {
44+ auto TlspMmpBlock = (PVOID*)item.lpOldTlsVector ->ModuleTlsData ;
45+ auto entry = MmpGlobalDataPtr->MmpTls ->MmpTlsList .Flink ;
46+ while (entry != &MmpGlobalDataPtr->MmpTls ->MmpTlsList ) {
4647
47- auto p = CONTAINING_RECORD (entry, TLS_ENTRY, TlsEntryLinks);
48- RtlFreeHeap (RtlProcessHeap (), 0 , TlspMmpBlock[p->TlsDirectory .Characteristics ]);
48+ auto p = CONTAINING_RECORD (entry, TLS_ENTRY, TlsEntryLinks);
49+ RtlFreeHeap (RtlProcessHeap (), 0 , TlspMmpBlock[p->TlsDirectory .Characteristics ]);
4950
50- entry = entry->Flink ;
51- }
51+ entry = entry->Flink ;
52+ }
5253
53- RtlFreeHeap (RtlProcessHeap (), 0 , CONTAINING_RECORD (item.lpTlsRecord ->TlspLdrBlock , TLS_VECTOR, TLS_VECTOR::ModuleTlsData));
54- RtlFreeHeap (RtlProcessHeap (), 0 , item.lpTlsRecord );
55- RtlFreeHeap (RtlProcessHeap (), 0 , item.lpOldTlsVector );
54+ RtlFreeHeap (RtlProcessHeap (), 0 , CONTAINING_RECORD (item.lpTlsRecord ->TlspLdrBlock , TLS_VECTOR, TLS_VECTOR::ModuleTlsData));
55+ RtlFreeHeap (RtlProcessHeap (), 0 , item.lpTlsRecord );
56+ RtlFreeHeap (RtlProcessHeap (), 0 , item.lpOldTlsVector );
5657
57- RtlReleaseSRWLockExclusive (&MmpGlobalDataPtr->MmpTls ->MmpTlsListLock );
58+ RtlReleaseSRWLockExclusive (&MmpGlobalDataPtr->MmpTls ->MmpTlsListLock );
59+
60+ CloseHandle (item.hThread );
61+ iter = MmpPostponedTlsList->erase (iter);
62+ }
5863
59- CloseHandle (item.hThread );
60- iter = MmpPostponedTlsList->erase (iter);
6164 }
6265
66+ waitTime = MmpPostponedTlsList->empty () ? INFINITE : 1000 ;
67+ }
68+ else {
69+ LeaveCriticalSection (&MmpPostponedTlsLock);
70+ break ;
6371 }
64-
65- waitTime = MmpPostponedTlsList->empty () ? INFINITE : 1000 ;
6672
6773 LeaveCriticalSection (&MmpPostponedTlsLock);
6874 }
@@ -100,16 +106,35 @@ VOID WINAPI MmpQueuePostponedTls(PMMP_TLSP_RECORD record) {
100106
101107 EnterCriticalSection (&MmpPostponedTlsLock);
102108
103- MmpPostponedTlsList->push_back (item);
104- SetEvent (MmpPostponedTlsEvent);
109+ if (MmpPostponedTlsList) {
110+ MmpPostponedTlsList->push_back (item);
111+ SetEvent (MmpPostponedTlsEvent);
112+ }
113+ else {
114+ RtlFreeHeap (RtlProcessHeap (), 0 , item.lpOldTlsVector );
115+ }
105116
106117 LeaveCriticalSection (&MmpPostponedTlsLock);
107118}
108119
120+ VOID OnExit () {
121+ EnterCriticalSection (&MmpPostponedTlsLock);
122+
123+ MmpPostponedTlsList->~vector ();
124+ HeapFree (RtlProcessHeap (), 0 , MmpPostponedTlsList);
125+ MmpPostponedTlsList = nullptr ;
126+
127+ CloseHandle (MmpPostponedTlsEvent);
128+
129+ LeaveCriticalSection (&MmpPostponedTlsLock);
130+ }
131+
109132VOID MmpTlsFiberInitialize () {
110133 InitializeCriticalSection (&MmpPostponedTlsLock);
111134 MmpPostponedTlsEvent = CreateEvent (nullptr , FALSE , FALSE , nullptr );
112135 MmpPostponedTlsList = new (HeapAlloc (GetProcessHeap (), 0 , sizeof (std::vector<MMP_POSTPONED_TLS>))) std::vector<MMP_POSTPONED_TLS>();
136+
137+ atexit (OnExit);
113138
114139 CreateThread (nullptr , 0 , MmpReleasePostponedTlsWorker_Wrap, nullptr , 0 , nullptr );
115140}
0 commit comments