Ваш звонок неправильный.
Это должно читаться следующим образом:
RtlStringCbCopyW( (wchar_t*) pIrp->UserBuffer, 1024 ,L"return ...");
Это связано с тем фактом, что «T» в LPTSTR означает «зависит от сборки Unicode». Драйверы режима ядра не используют это. Вы всегда должны знать, с какими строками вы действительно работаете, и не должны зависеть от хака 'unicode' в API win32.
Примечание: Win32 выполняет отображение типов T, имея все (/ большинство) функций в 2 вариантах. Версия W и A (DrawTextA / DrawTextW). Версия, к которой затем будет обращаться компилятор при вызове версии без постфикса, должна просто определять имя функции для соответствующей версии. (DrawText разрешает либо DrawTextA или DrawTextW). Это не очень надежно, и его лучше обойти в вашем коде, используя правильную функцию для строки, которую вы хотите передать.
NTSTRSAFE_PWSTR
определяется следующим образом:
typedef __nullterminated wchar_t* NTSTRSAFE_PWSTR;
__nullterminated
используется инструментом предварительной проверки для проверки параметров. Prefast - это статический анализатор кода. В этом контексте это, вероятно, означает, что «вывод гарантированно завершается нулем».