@@ -132,9 +132,10 @@ NTSTATUS MemoryResolveImportTable(
132
132
return status;
133
133
}
134
134
135
- HANDLE WINAPI MmRegisterImportTableResolver (
135
+ extern " C " HANDLE WINAPI MmRegisterImportTableResolver (
136
136
_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) {
138
139
139
140
HANDLE heap = RtlProcessHeap ();
140
141
PMM_IAT_RESOLVER resolver = static_cast <PMM_IAT_RESOLVER>(RtlAllocateHeap (heap, 0 , sizeof (MM_IAT_RESOLVER)));
@@ -145,15 +146,20 @@ HANDLE WINAPI MmRegisterImportTableResolver(
145
146
resolver->ReferenceCount = 1 ;
146
147
resolver->LoadLibraryProv = LoadLibraryProv;
147
148
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
+ }
149
155
150
156
LeaveCriticalSection (&MmpGlobalDataPtr->MmpIat ->MmpIatResolverListLock );
151
157
}
152
158
153
159
return resolver;
154
160
}
155
161
156
- _Success_ (return )
162
+ extern " C " _Success_(return )
157
163
BOOL WINAPI MmRemoveImportTableResolver (_In_ HANDLE hMmIatResolver) {
158
164
159
165
HANDLE heap = RtlProcessHeap ();
@@ -176,3 +182,16 @@ BOOL WINAPI MmRemoveImportTableResolver(_In_ HANDLE hMmIatResolver) {
176
182
177
183
return RtlFreeHeap (heap, 0 , hMmIatResolver);
178
184
}
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
+ }
0 commit comments