2014-07-09 4 views
0

RtlStringCbPrintfW (swprintf의 안전한 버전)을 사용하려고 시도 중이며 문자열에 int를 추가 할 때 예기치 않은 결과가 발생합니다. int - all 뒤에 동일한 문자열을 추가하면. 그래서 내 코드는 다음과 같습니다swprintf 예기치 않은 결과가

WCHAR buffer[256]; 

    LPCWSTR pszFormat = L"%s %d"; 

    WCHAR* pszTxt = dataPath.Buffer;//* 

    status = RtlStringCbPrintfW(buffer, sizeof(buffer), pszFormat, pszTxt, 1); 
  • 데이터 경로는 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" 

그래서 RESON은, 무엇을 종료 null의 문자? swprintf로 자동 처리되지 않아야합니까?

답변

2

Buffer은 반드시 널로 끝나야하는 것은 아니며 %s 형식에는 널로 끝나는 문자열이 필요하다는 내용의 문서로 연결되는 UNICODE_STRING의 설명서.

당신은 정밀도를 지정하여 %s에 인쇄 된 문자열의 길이를 제한 할 수 있습니다

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

RtlStringCbPrintfW(buffer, sizeof(buffer), L"%.*s %d", Len, pszTxt, 1); 
+0

왜 이것이 작동하지 않습니까? RtlStringCbPrintfW (버퍼 \t \t \t를 sizeof (버퍼) \t \t \t L "%. * S %의 S" \t \t \t dataPath.Length, \t \t \t dataPath.Buffer, \t \t \t L "\ \ "); ..L "\\"은 null로 끝납니다 –

+0

wprk가 아닌 것은 무엇입니까? 'buffer'의 가치는 무엇입니까? –

+0

"\ Device \ HarddiskVolume2 \ foo \ Data ?? C ???"와 유사합니다. . 나는 정확한 답을 발견했다. UNICODE_STRING에 대한 spetial parametr % wZ가있다. 작동한다. 그래서 해결된다. –

관련 문제