Skip to content

Commit 61729ff

Browse files
author
Dan Dees
committed
ImportTable.cpp/h - Finish support for resolver callbacks
// flag to prepend or append the resolver list MmRegisterImportTableResolver // new function to clear resolver list MmClearImportTableResolvers // expose function to remove a resolver MmRemoveImportTableResolver
1 parent b3bc698 commit 61729ff

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

MemoryModule/ImportTable.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,10 @@ NTSTATUS MemoryResolveImportTable(
132132
return status;
133133
}
134134

135-
HANDLE WINAPI MmRegisterImportTableResolver(
135+
extern "C" HANDLE WINAPI MmRegisterImportTableResolver(
136136
_In_ MM_IAT_RESOLVER_ENTRY LoadLibraryProv,
137-
_In_ MM_IAT_FREE_ENTRY FreeLibraryProv) {
137+
_In_ MM_IAT_FREE_ENTRY FreeLibraryProv,
138+
_In_ int do_append) {
138139

139140
HANDLE heap = RtlProcessHeap();
140141
PMM_IAT_RESOLVER resolver = static_cast<PMM_IAT_RESOLVER>(RtlAllocateHeap(heap, 0, sizeof(MM_IAT_RESOLVER)));
@@ -145,15 +146,20 @@ HANDLE WINAPI MmRegisterImportTableResolver(
145146
resolver->ReferenceCount = 1;
146147
resolver->LoadLibraryProv = LoadLibraryProv;
147148
resolver->FreeLibraryProv = FreeLibraryProv;
148-
InsertTailList(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList, &resolver->InMmpIatResolverList);
149+
if (do_append) {
150+
InsertTailList(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList, &resolver->InMmpIatResolverList);
151+
}
152+
else {
153+
InsertHeadList(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList, &resolver->InMmpIatResolverList);
154+
}
149155

150156
LeaveCriticalSection(&MmpGlobalDataPtr->MmpIat->MmpIatResolverListLock);
151157
}
152158

153159
return resolver;
154160
}
155161

156-
_Success_(return)
162+
extern "C" _Success_(return)
157163
BOOL WINAPI MmRemoveImportTableResolver(_In_ HANDLE hMmIatResolver) {
158164

159165
HANDLE heap = RtlProcessHeap();
@@ -176,3 +182,16 @@ BOOL WINAPI MmRemoveImportTableResolver(_In_ HANDLE hMmIatResolver) {
176182

177183
return RtlFreeHeap(heap, 0, hMmIatResolver);
178184
}
185+
186+
extern "C" void MmClearImportTableResolvers() {
187+
EnterCriticalSection(&MmpGlobalDataPtr->MmpIat->MmpIatResolverListLock);
188+
while (!IsListEmpty(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList)) {
189+
const auto entry = RemoveTailList(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList);
190+
if (!IsListEmpty(&MmpGlobalDataPtr->MmpIat->MmpIatResolverList)) {
191+
// Don't delete head
192+
const auto resolver = CONTAINING_RECORD(entry, MM_IAT_RESOLVER, InMmpIatResolverList);
193+
RtlFreeHeap(RtlProcessHeap(), 0, resolver);
194+
}
195+
} // while
196+
LeaveCriticalSection(&MmpGlobalDataPtr->MmpIat->MmpIatResolverListLock);
197+
}

MemoryModule/ImportTable.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@ NTSTATUS MemoryResolveImportTable(
2222
_In_ PMEMORYMODULE hMemoryModule
2323
);
2424

25+
extern "C" {
26+
2527
HANDLE WINAPI MmRegisterImportTableResolver(
2628
_In_ MM_IAT_RESOLVER_ENTRY LoadLibraryProv,
27-
_In_ MM_IAT_FREE_ENTRY FreeLibraryProv
29+
_In_ MM_IAT_FREE_ENTRY FreeLibraryProv,
30+
_In_ int do_append
2831
);
2932

3033
_Success_(return)
3134
BOOL WINAPI MmRemoveImportTableResolver(_In_ HANDLE hMmIatResolver);
35+
36+
void MmClearImportTableResolvers() ;
37+
38+
}

MemoryModule/MemoryModulePP.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@ LdrQuerySystemMemoryModuleFeatures
1616

1717
MmpGlobalDataPtr
1818
GetMmpGlobalDataPtr
19+
20+
MmRegisterImportTableResolver
21+
MmRemoveImportTableResolver
22+
MmClearImportTableResolvers

0 commit comments

Comments
 (0)