Windows内核函数 - ANSI_STRIN字符串与UNICODE_STRING字符串相互转换

发布于:2024-05-20 ⋅ 阅读:(124) ⋅ 点赞:(0)

        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);


 


网站公告

今日签到

点亮在社区的每一天
去签到