swprintf неожиданные результаты

0

Я пытаюсь использовать RtlStringCbPrintfW (безопасная версия swprintf) и получил неожиданные результаты при добавлении int в строку. Если я добавляю одну и ту же строку после int - все работает. Итак, мой код:

WCHAR buffer[256];

    LPCWSTR pszFormat = L"%s %d";

    WCHAR* pszTxt = dataPath.Buffer;//*

    status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);
  • Здесь dataPath - UNICODE_STRING. Поэтому dataPath.Buffer - PWCH
    Здесь см. Это значение буфера: buffer = wchar_t [168] "\ Device\HarddiskVolume2\foo\Data?? C???"

Когда массив буфера просмотра я вижу, что '?' находятся:

0xcc00 '?'
0xcccc '?'

то после того, как некоторые байты фактически являются целевым значением 1. Значение dataPath.Buffer:

   +0x048 DataPath         : _UNICODE_STRING "\Device\HarddiskVolume2\foo\Data"
      +0x000 Length           : 0x8c
      +0x002 MaximumLength    : 0x8c
      +0x008 Buffer           : 0xffffc000'01cd1d00  "\Device\HarddiskVolume2\foo\Data"

Итак, каков резонанс, нулевой конец char? Не следует автоматически обрабатывать swprintf правильно?

Теги:

2 ответа

0
Лучший ответ
%wZ 

Символ типа поля должен использоваться для структуры UNICODE_STRING.

2

Документация для UNICODE_STRING которую вы UNICODE_STRING, указывает, что Buffer не обязательно завершается нуль, а для формата %s требуется строка с нулевым завершением.

Вы можете ограничить длину строки, напечатанной с помощью %s, указав точность:

WCHAR* pszTxt = dataPath.Buffer;
int Len = dataPath.Length;

RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s %d", Len, pszTxt, 1);
  • 0
    А почему этот не работает? RtlStringCbPrintfW (буфер, sizeof (буфер), L "%. * S% s", dataPath.Length, dataPath.Buffer, L "\\"); ..L "\\" прекращено
  • 0
    Что не WPRK? Какое значение buffer вы получаете?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню