文字以上」タグアーカイブ

RtlUnicodeString.. 系の一部のAPI は 32767 文字以上を設定できないみたいです。

どうも、みむらです。

ちょっとカーネルモードドライバを書いていまして、
RtlUnicodeStringPrintf 関数で文字列を設定する時に、
変数のサイズを 32767 文字以上に設定すると
STATUS_INVALID_PARAMETER になって動かないことがありました。

まさかと思って 32766 にすると動く。

コードとしてはこんな感じ:

UNICODE_STRING text = {0};

text.MaximumLength = 32767;
text.Buffer = ExAllocatePoolWithTag(PagedPool, text.MaximumLength, 0x3939);
text.Length = 0;

// STATUS_INVALID_PARAMETER で失敗する。
RtlUnicodeStringPrintf(&text,L"HELLO");


// STATUS_SUCCESS になって text に "HELLO" が代入される。
text.MaximumLength = 32766;
RtlUnicodeStringPrintf(&text,L"HELLO");

ExFreePoolWithTag(text.Buffer,0x3939);

でもって、同じ文字列操作系の命令でも

RtlUnicodeStringCat は動く。

 

もちろん、 UNICODE_STRING は

typedef struct _UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

こんな感じで定義されてる。 ( http://msdn.microsoft.com/ja-jp/library/ff564879(v=vs.85).aspx )

 

謎い。

 

ってことで MSDN の説明を注意深く読んでみました。

・・・そうしましたら、双方の “DestinationString” の説明に差を見つけました。

 

RtlUnicodeStringPrintf:

DestinationString [out]
A pointer to a UNICODE_STRING structure that receives a formatted string. RtlUnicodeStringPrintf creates this string from the formatting string that pszFormat specifies and the function’s argument list. The maximum number of characters in the string is NTSTRSAFE_UNICODE_STRING_MAX_CCH.

RtlUnicodeStringCat:

DestinationString [in, out]
A pointer to a UNICODE_STRING structure. This structure includes a buffer that, on input, contains a destination string to which the source string will be concatenated. On output, this buffer is the destination buffer that contains the entire resultant string. The source string is added to the end of the destination string. The maximum number of bytes in the structure’s string buffer is NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof(WCHAR).

 

・・・なんと。。。

 

でもって ntstrsafe.h に定義されている NTSTRSAFE_UNICODE_STRING_MAX_CCH を見てみますと、

#define NTSTRSAFE_UNICODE_STRING_MAX_CCH    (0xffff / sizeof(wchar_t)) 

こんな感じで書いてあるんですね。

 

何で双方に違いがあるのかはよく分かりませんが・・。

でも、0xffff 文字書き込めるものと 0x7fff までしか書き込めないものとがある、

ということで。。

もし文字列操作系で、バッファサイズは足りているのに格納できない場合

NTSTRSAFE_UNICODE_STRING_MAX_CCH をオーバーしていないか確認してみると良いかもしれません。