首页
社区
课程
招聘
[讨论] WTSEnumerateSessionsExA 当用户名为中文时不能正确获取
发表于: 2023-2-28 14:51 6045

[讨论] WTSEnumerateSessionsExA 当用户名为中文时不能正确获取

2023-2-28 14:51
6045


WTSEnumerateSessionsExA 函数 遇到用户名为中文时获取不正确的名称
WTSEnumerateSessionsExW 函数 获取用户名是正确的
反汇编



STRSAFEAPI StringCchLengthW(
[in] STRSAFE_PCNZWCH psz,
[in] size_t cchMax,
[out] size_t *pcchLength
);
确定字符串是否超过指定的长度(以字符为单位)。
[in] psz
要检查其长度的字符串。
[in] cchMax
psz 中允许的最大字符数,包括终止 null 字符。 此值不能超过
[out] pcchLength
psz 中的字符数,不包括终止 null 字符。 仅当 pcch 不 为 NULL 且函数成功时,此值才有效
StringCchLengthW获取的是字符长度 当遇见中文时 字符串长度不等于字节长度 出现错误


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (13)
雪    币: 6124
活跃值: (4656)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
你在说什么,A底层也是调用W,windows底层是unicode,编码的问题非要赖api
2023-2-28 15:05
0
雪    币: 630
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
黑洛 你在说什么,A底层也是调用W,windows底层是unicode,编码的问题非要赖api
A底层是W,但A不兼容中文
2023-2-28 16:39
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4

确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。

2023-3-1 09:17
0
雪    币: 6124
活跃值: (4656)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
Boring勇哥 确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。
那有没有可能你把unicode改成多字节字节集就没有问题了呢?
2023-3-1 15:04
0
雪    币: 4491
活跃值: (2484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6


最后于 2023-3-1 16:46 被Foodie编辑 ,原因: 。
2023-3-1 16:30
0
雪    币: 4491
活跃值: (2484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Boring勇哥 确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。
确实是,把 StringCchLengthW 换成 RtlUnicodeToMultiByteSize 就可以了。
2023-3-1 16:56
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
黑洛 那有没有可能你把unicode改成多字节字节集就没有问题了呢?

建议你看看WTSEnumerateSessionsExA的反汇编,自己调用一下StringCchLengthW和RtlUnicodeToMultiByteN试试。

我把项目的字符集设置成了多字节,但它仍然不工作。

最后于 2023-3-1 18:52 被Boring勇哥编辑 ,原因:
2023-3-1 18:51
0
雪    币: 4361
活跃值: (4343)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
	if (S_OK == StringCchLengthW(wcs , STRSAFE_MAX_CCH, &size))
	{
		PCHAR buf = (PCHAR)LocalAlloc(0x40 , size + 1);
		ULONG newSize;
		NTSTATUS status = RtlUnicodeToMultiByteN(buf,size+1,&newSize,wcs,sizeof(wcs));
		printf("%s\n",buf);
		LocalFree(buf);
	}


修改为


if (S_OK == StringCchLengthW(wcs , STRSAFE_MAX_CCH, &size))

{

PCHAR buf = (PCHAR)LocalAlloc(0x40 , size*2 + 1);     // 1 UNICODE = 2 x CHAR

ULONG newSize;

NTSTATUS status = RtlUnicodeToMultiByteN(buf,size*2+1,&newSize,wcs,sizeof(wcs));

printf("%s\n",buf);

LocalFree(buf);

}


2023-3-1 22:38
0
雪    币: 203
活跃值: (1114)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
10

。。。感觉楼主没有进行过系统化的开发训练,这是windows开发的常识。
字符串相关的API结尾带A说明本接口只支持解析ASCII码,W结尾说明支持解析UNICODE码。

windows的API命名除了极少数是历史原因导致的无法更改名称,只能将错就错了,99.9%的API名称的前缀后缀都是有标准含义的。

最后于 2023-3-2 14:36 被palkiver编辑 ,原因:
2023-3-2 14:32
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
palkiver 。。。感觉楼主没有进行过系统化的开发训练,这是windows开发的常识。字符串相关的API结尾带A说明本接口只支持解析ASCII码,W结尾说明支持解析UNICODE码。windows的API命名除了极 ...
你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。
参考:https://en.wikipedia.org/wiki/Chinese_Character_Code_for_Information_Interchange
https://learn.microsoft.com/en-us/windows/win32/intl/unicode-in-the-windows-api
2023-3-2 17:21
0
雪    币: 6124
活跃值: (4656)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
Boring勇哥 你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。 参考:https://en.wikipedia.org/wiki/Chinese_Charac ...
看过了,系统实现确实有问题
2023-3-2 18:01
0
雪    币: 203
活跃值: (1114)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
13
Boring勇哥 你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。 参考:https://en.wikipedia.org/wiki/Chinese_Charac ...
我没搞错,你非要说这么严格的话,那就严格来说ansi在不同的操作系统中以及不同国家代表着不同的编码方式,开发人员很多时候不能假定用户环境,最好的办法就是将A理解为ASCII,非ASCII直接上UNICODE,这是最保险的方式。
2023-3-2 18:23
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
palkiver 我没搞错,你非要说这么严格的话,那就严格来说ansi在不同的操作系统中以及不同国家代表着不同的编码方式,开发人员很多时候不能假定用户环境,最好的办法就是将A理解为ASCII,非ASCII直接上UNIC ...
你说的对,使用宽字符是一个好的做法,微软也推荐使用。
2023-3-2 19:23
0
游客
登录 | 注册 方可回帖
返回
//