Wine Notes AnsiString and Unicode String

Windows下有两种字符的格式 UnicodeANSI, Windows下的很多API(Rtl系列, 之类的) 是需要认清二者的区别的

二者的对比

#ifndef __STRING_DEFINED__
#define __STRING_DEFINED__
typedef struct _STRING {
  USHORT Length;
  USHORT MaximumLength;
  PCHAR Buffer;
} STRING, *PSTRING;
#endif

typedef STRING ANSI_STRING;

PCHAR 是 char* 的一个定义 , 因而ANSI_STRING 每一个字符占一个字节(sizeof(char))

#ifndef __UNICODE_STRING_DEFINED__
#define __UNICODE_STRING_DEFINED__
typedef struct _UNICODE_STRING {
  USHORT Length;        /* bytes */
  USHORT MaximumLength; /* bytes */
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
#endif

typedef const UNICODE_STRING *PCUNICODE_STRING;

这里的 PWSTR 的定义是 WCHAR*, 即宽字符指针, 查看WCHAR的定义后知, WCHAR为 (unsigned short) 型(16bit char)

初始化WCHAR 的时候要用下面这种形式进行初始化:

WCHAR sample_1[] = L"Example";
WCHAR sample_2[] = {'E', 'x', 'a', 'm', 'p', 'l', 'e', 0};

一定要注意第二种形式最后的 0

WCHAR, char 之间的转换

二者之间的转换可以通过两个函数来完成, 先将char的字符串转为 ANSI_STRING, 然后将ANSI_STRING,转为UNICODE_STRING, 从而UNICODE_STRING中的Buffer即为转换后的结果

参考Sebastian Lackner 的Sample

通过 RtlInitAnsiStringfilename 的内容写入一个ANSI_STRING dospath 内, 然后调用 RtlAnsiStringToUnicodeString 并且设置 AllocateDestinationString 为 TRUE, 让这个函数自行分配内存给dospathW, 要注意这种方式分配的内存要用 RtlFreeUnicodeString 手动回收

Wine 下打印WCHAR

使用函数 wine_dbgstr_* 系列函数, 这里使用 wine_dbgstr_w, 打印宽字符

防止内存泄露

Back
@VOID001