DDK提供了ANSI_STRING字符串与UNICODE_STRING字符串像话转换的相关函数。
(1). 将UNICODE_STRING字符串转换成ANSI_STRING字符串。
DDK对于这种转换提供的函数是 RtlUnicodeStringToAnsiString
NTSTATUS RtlUnicodeStringToAnsiString(
IN OUT PANSI_STRING DestinationString,
IN PCUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString
);
// DestinationString: 需要被转换的目的字符串
// SourceString: 需要转换的源字符串
// AllocateDestinationString: 是否需要对被转换的字符串分配内存。
// 返回值:指明是否转换成功
(2). 将ANSI_STRING字符串转换成UNICODE_STRING字符串
DDK对于这种转换提供的函数是 RtlAnsiStringToUnicodeString, 其声明是:
NTSTATUS RtlAnsiStringToUnicodeString(
IN OUT PUNICODE_STRING DestinationString,
IN PCANSI_STRING SourceString,
IN BOOLEAN AllocateDestinationString
);
// DestinationString: 需要被转换的目的字符串
// SourceString: 需要转换的源字符串
// AllocateDestinationString: 是否需要对被转换的字符串分配内存。
// 返回值:指明是否转换成功
以下的代码演示了如何实现 ANSI_STRING 字符串与 UNICODE_STRING字符串的相互转换。
// (1). 将UNICODE_STRING字符串转换成ANSI_STRING字符串
// 初始化 UnicodeStr1
UNICODE_STRING UnicodeStr1;
RtlInitUnicodeString(&UnicodeStr1, L"Hello World");
ANSI_STRING AnsiStr1;
NTSTATUS nStatus = RtlUnicodeStringToAnsiString(&AnsiStr1, &UnicodeStr1, TRUE);
if (NT_SUCCESS(nStatus))
{
KdPrint(("Conver unicode to ansi successfully!\n"));
KdPrint(("Result: %Z\n", &AnsiStr1));
}
else
{
KdPrint(("Conver unicode to ansi unsuccessfully!\n"));
}
// 销毁 AnsiStr1
RtlFreeAnsiString(&AnsiStr1);
// (1). 将ANSI_STRING字符串转换成UNICODE_STRING字符串
// 初始化AnsiStr2;
ANSI_STRING AnsiStr2;
RtlInitString(&AnsiStr2, "Hello World");
UNICODE_STRING UnicodeStr2;
nStatus = RtlAnsiStringToUnicodeString(&UnicodeStr2, &AnsiStr2, TRUE);
if (NT_SUCCESS(nStatus))
{
KdPrint(("Conver ansi to unicode successfully!\n"));
KdPrint(("Result: %wZ\n", &UnicodeStr2));
}
else
{
KdPrint(("Conver ansi to unicode unsuccessfully!\n"));
}
// 销毁 UnicodeStr2
RtlFreeUnicodeString(&UnicodeStr2);