Я пытаюсь использовать RtlStringCbPrintfW (безопасная версия swprintf) и получил неожиданные результаты при добавлении int в строку. Если я добавляю одну и ту же строку после int - все работает. Итак, мой код:
WCHAR buffer[256];
LPCWSTR pszFormat = L"%s %d";
WCHAR* pszTxt = dataPath.Buffer;//*
status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1);
Когда массив буфера просмотра я вижу, что '?' находятся:
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 правильно?
%wZ
Символ типа поля должен использоваться для структуры UNICODE_STRING.
Документация для 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);
buffer
вы получаете?