@@ -115,26 +115,7 @@ PMMP_TLSP_RECORD MmpFindTlspRecordLockHeld() {
115115
116116 auto p = CONTAINING_RECORD (entry, MMP_TLSP_RECORD, InMmpThreadLocalStoragePointer);
117117
118- if (p->UniqueThread == NtCurrentProcess () && p->TlspLdrBlock == teb->ThreadLocalStoragePointer ) {
119- PVOID cookie;
120- LdrLockLoaderLock (LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, nullptr , &cookie);
121-
122- auto size = CONTAINING_RECORD (p->TlspLdrBlock , TLS_VECTOR, ModuleTlsData)->Length ;
123- if ((HANDLE)(ULONG_PTR)size != NtCurrentThreadId ()) {
124- RtlCopyMemory (
125- p->TlspMmpBlock ,
126- p->TlspLdrBlock ,
127- size * sizeof (PVOID)
128- );
129- }
130-
131- teb->ThreadLocalStoragePointer = p->TlspMmpBlock ;
132- p->UniqueThread = NtCurrentThreadId ();
133-
134- LdrUnlockLoaderLock (LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, cookie);
135- return p;
136- }
137- else if (p->UniqueThread == NtCurrentThreadId ()) {
118+ if (p->UniqueThread == NtCurrentThreadId ()) {
138119 assert (p->TlspMmpBlock == teb->ThreadLocalStoragePointer );
139120 return p;
140121 }
@@ -145,23 +126,10 @@ PMMP_TLSP_RECORD MmpFindTlspRecordLockHeld() {
145126 return nullptr ;
146127}
147128
148- DWORD NTAPI MmpUserThreadStart (LPVOID lpThreadParameter) {
149-
150- THREAD_CONTEXT Context;
129+ DWORD MmpAllocateTlsLockHeld () {
151130 bool success = false ;
152131 PMMP_TLSP_RECORD record = nullptr ;
153132
154- __try {
155- RtlCopyMemory (
156- &Context,
157- lpThreadParameter,
158- sizeof (Context)
159- );
160- }
161- __except (EXCEPTION_EXECUTE_HANDLER) {
162- return GetExceptionCode ();
163- }
164-
165133 if (!NtCurrentTeb ()->ThreadLocalStoragePointer ) {
166134 goto __skip_tls;
167135 }
@@ -250,6 +218,34 @@ DWORD NTAPI MmpUserThreadStart(LPVOID lpThreadParameter) {
250218 InterlockedIncrement (&MmpGlobalDataPtr->MmpTls ->MmpActiveThreadCount );
251219
252220__skip_tls:
221+ return ERROR_SUCCESS;
222+ }
223+
224+ DWORD NTAPI MmpUserThreadStart (LPVOID lpThreadParameter) {
225+
226+ THREAD_CONTEXT Context;
227+
228+ __try {
229+ RtlCopyMemory (
230+ &Context,
231+ lpThreadParameter,
232+ sizeof (Context)
233+ );
234+ }
235+ __except (EXCEPTION_EXECUTE_HANDLER) {
236+ return GetExceptionCode ();
237+ }
238+
239+ PVOID cookie;
240+ LdrLockLoaderLock (LDR_LOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, nullptr , &cookie);
241+
242+ __try {
243+ MmpAllocateTlsLockHeld ();
244+ }
245+ __finally {
246+ LdrUnlockLoaderLock (LDR_UNLOCK_LOADER_LOCK_FLAG_RAISE_ON_ERRORS, cookie);
247+ }
248+
253249 return Context.ThreadStartRoutine (Context.ThreadParameter );
254250}
255251
@@ -544,20 +540,6 @@ NTSTATUS NTAPI HookNtSetInformationProcess(
544540
545541 ProcessTlsInformation->ThreadData [i].Flags = Tls->ThreadData [i].Flags ;
546542 ProcessTlsInformation->ThreadData [i].ThreadId = Tls->ThreadData [i].ThreadId ;
547-
548- if (!found && Tls->ThreadData [i].Flags == 2 ) {
549- auto const & LdrTls = Tls->ThreadData [i];
550- auto record = PMMP_TLSP_RECORD (RtlAllocateHeap (RtlProcessHeap (), 0 , sizeof (MMP_TLSP_RECORD)));
551- assert (record);
552-
553- record->TlspLdrBlock = LdrTls.TlsVector ;
554- record->TlspMmpBlock = (PVOID*)MmpAllocateTlsp ();
555- record->UniqueThread = NtCurrentProcess ();
556-
557- assert (record->TlspMmpBlock );
558- InsertTailList (&MmpGlobalDataPtr->MmpTls ->MmpThreadLocalStoragePointer , &record->InMmpThreadLocalStoragePointer );
559- }
560-
561543 }
562544 LeaveCriticalSection (&MmpGlobalDataPtr->MmpTls ->MmpTlspLock );
563545
0 commit comments