RtlStringCbCopy Функция комплекта драйверов Windows - PullRequest
1 голос
/ 19 апреля 2011

Согласно документации MSDN, функция безопасной строки RtlStringCbCopy должна выглядеть следующим образом:

NTSTATUS RtlStringCbCopy(
  __out  LPTSTR pszDest,
  __in   size_t cbDest,
  __in   LPCTSTR pszSrc)

Но когда я компилирую свой код, ddk говорит:

1> C: \ работа \ mydevdrv \ шлейфу \ driver.cpp (421) : ошибка C2664: 'RtlStringCbCopyW': невозможно преобразовать параметр 1 из Связь LPTSTR с NTSTRSAFE_PWSTR Исполняемый файл - i386 \ loopback.sys 1> ссылка : ошибка LNK1181: невозможно открыть вход файл 'c: \ work \ mydevdrv \ loopback \ objchk _wxp_x86 \ i386 \ driver.obj 'СТРОИТЬ: Время окончания: вторник, 19 апреля 20:21:51 2011

Кажется, он ожидает, что первый аргумент будет иметь тип NTSTRSAFE_PWSTR вместо LPTSTR. Но этот тип NTSTRSAFE_PWSTR никогда не упоминается в документе MSDN. Так какой тип я должен использовать?

Мой вызов этой функции выглядит так:

RtlStringCbCopyW((LPTSTR)pIrp->UserBuffer, 1024 ,L"return value from driver");

1 Ответ

2 голосов
/ 19 апреля 2011

Ваш звонок неправильный.

Это должно читаться следующим образом:

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 - это статический анализатор кода. В этом контексте это, вероятно, означает, что «вывод гарантированно завершается нулем».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...