Skip to content

Commit 8842543

Browse files
committed
MmpTls #40
1 parent b409e6d commit 8842543

File tree

1 file changed

+30
-48
lines changed

1 file changed

+30
-48
lines changed

MemoryModule/MmpTls.cpp

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)