第七64ビットカーネルを話す。カーネル文字列のプログラミング上の注意事項

String型のプログラミングメモリ

ディアンは、UNICODE_STRINGを説明します

1.1はじめに

私たちの文字は、char型のカーネルでワイド文字の種類が...あるwchar_tのいる
狭い文字ではなく、カーネルを使用すると、私たちが使用することを可能にする二つの新しい構造を提供しながら、これは推奨されません。..
されていません。
UNICODE_STRING
ANSI_STRING

ただ、どのようなボディ構造の紹介。

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

UNICODE_STRINGカーネルは実際の構造である。
何について:
パラメータのひとつ:\バイト0のない文字列のバイト数は、ノートの端部であるバイト数の
パラメータ2:バイトバッファの最大数場合。バッファメモリストリングのバイト数である
たwcslen(バッファ)+はsizeof(wchar_t型 ) の端部に\ 0と言うことである。
3つの:.バッファ記憶バッファ・ポインタ・ストリングのパラメータ。

1.2文字列操作関数

今、私たちはこれらの構造を持っていること。文字列操作を提供するために、対応する関数が存在しますので。
我々はWDKドキュメントの時間に、この構造をクエリとして。
ここではあるだろう関連項目私たちに文字列操作に関連する一連の機能を教えてください。

関数名 効果
RtlUnicodeStringInit セキュリティの初期化UNICODE_STRING。安全でないRtlinitUnicodeStringを持っています。セキュアな動詞は、元に戻します
RtlStringCbCopyUnicodeString wchar_t型のバッファにコピーされたバイトUNICODE_STRINGの寸法、
RtlUnicodeStringCat UNICODE_STRIGNステッチ
RtlUnicodeStringCatString PCTSTRのUNICODE_STRINGの文字列の連結。
RtlUnicodeStringCbCatN UNICODE_STRING 2つの構造が渡されます。もう一つのパラメータは。このパラメータは、ステッチを完了までも無くスプライシングされたスプライスしたいバイト数を指定します。

WDK特定のクエリ機能は、ドキュメントを助けることができます。

1.3UNICODE_STRINGの使用

彼はここでUNICODE_STRINGの使用はを見てする必要がありますと述べました。

1.3.1は、スタック上のバ​​ッファを初期化します

UNICODE_STRING TestUCString = [0];
WCHAR wzData[0x100] = L"Hello World""

RtlInitUnicodeString(&TetUCString,wzData);

そのような初期化方法は、バッファのUNICODE_STRINGは、スタックメモリへのポインタです。

擬似コード:
バッファ= wzDataは、
最も重要なことは、この時点であなたは、このRTL UNICODE_STRINGのコピー機能を使用して動作させることができるということです
メモリがありますので。

RtlUnicodeStringCopyStringは、このメモリにコピーすることができます。

1.3.2グローバル初期化

UNICODE_STRING ustr;
RtlUnicodeStringInit(&ustr,L"HelloWorld");

この時、グローバル定常領域にバッファ・ポインタ内のUNICODE_STRING のHelloWorldに。この時点で、あなたは、コピー機能が間違っていることになる使用ようにします。これは、ブルースクリーンかもしれません

1.3.3は、ヒープバッファを初期化します。

UNICODE_STRING ustr = {0};
ULONG length = (wcslen(L"HelloWorld") + ) * sizeof(WCHAR);
ustr.Buffer = ExAllocatePoolWithTag(PagedPool,MAX_PATH 8 sizeof(WCHAR),"niBI");

if (ustr.Buffer == NULL)
    return ;

清空缓存
RtlZeroMemory(ustr.Buffer,MAX_PATH *sizeof(WCHAR));

wcscpy(ustr.Buffer,L"HelloWorld");
ustr.length = length;
ustr.Maximumlength = MAX_PATH * sizeof(WCHAR);

DbgPrint("%wZ",&ustr);
ExFreePool(ustr.Buffer); 

バッファのUNICODE_STRINGの上にヒープメモリを指す。このメモリは、私たちの割り当てです。

おすすめ

転載: www.cnblogs.com/iBinary/p/10990678.html