@@ -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 )
157163BOOL 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+ }
0 commit comments