| Предыдущий | Следующий |
| STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED | STATUS_THREADPOOL_RELEASED_DURING_OPERATION |
STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED
Отложенное освобождение DLL завершилось ошибкой после возврата обратного вызова
FreeLibraryWhenCallbackReturns откладывает уменьшение счётчика ссылок модуля до выхода выполнения из кода обратного вызова. Это не позволяет выгрузить DLL, пока её обратный вызов ещё работает. Сбой означает, что сохранённый дескриптор модуля или жизненный цикл подсчёта ссылок был недопустим на стадии завершения.
Не следует просто вызывать FreeLibrary ещё раз. Сначала определите, была ли получена ссылка на модуль, не освободил ли её другой путь и могут ли ожидающие обратные вызовы всё ещё входить в код этой DLL. Неправильная выгрузка может привести к использованию указателя инструкций после выгрузки.
Что следует проверить
- Зафиксируйте путь модуля, дескриптор модуля, место получения ссылки, объект обратного вызова и порядок завершения.
- Отмените или дождитесь завершения ожидающих обратных вызовов, прежде чем разрешать выгрузку содержащей их DLL.
- Для каждой явно полученной ссылки на модуль должен существовать один чётко принадлежащий ей отложенный или непосредственный вызов освобождения.
- Используйте
SetThreadpoolCallbackLibrary, если код обратного вызова может конкурировать с завершением DLL.
Ссылки
- Открытые спецификации Microsoft: значения NTSTATUS
- Microsoft: FreeLibraryWhenCallbackReturns
- Microsoft: SetThreadpoolCallbackLibrary
- Microsoft: DisassociateCurrentThreadFromCallback
Нужно найти другой код? Найти другой код состояния или ошибки.
