Для применения конкретных функций на конкретных ОС и их билдах можно. А как для меня, - в топку эти NLS таблицы, в подавляющем большинстве случаев у нас можно обойтись более простой реализацией, как это сделано в ReactOS. В общем случае, конечно, лучше придерживаться официальной документации. Но, поверьте мне, без реверса, на одном MSDN, далеко не уедешь, подобные вопросы будут возникать бесконечно.
В SP2(free) не падает, а в SP3(free) даже DbgPrint с UNICODE_STRING падает; при APC_LEVEL, конечно. Помоему, в checked версии SP2 тоже падает. Еще вариант, помимо второго потока: запускать worker'а при каждом уведомлении; он всегда на PASSIVE_LEVEL, но в контексте System.
Сам только что наткнулся на подобную проблему. Есть подозрение что RtlCompareUnicodeString все же можно вызывать на APC_LEVEL. На этом IRQL можно работать с pageable памятью Чисто ошибка документации. Решение: писать свою ф-цию сравнения на основе RtlUpcaseUnicodeChar, которую можно вызывать на APC_LEVEL. Здесь не надо буфер освобождать.