在UNICODE_STRING中搜索字符

时间:2019-07-09 11:15:54

标签: c++ string unicode unicode-string

有一个UNICODE_STRING,我想检查其中是否有定义的字符(更好的是:$结尾)。

我们正在使用OpenPasswordFilter,并希望检查所提交的帐户是用户还是计算机。如果它是一台计算机,并在末尾用“ $”定义,则应省略检查。

NTSTATUS PsamPasswordNotificationRoutine(
  PUNICODE_STRING UserName,
  ULONG RelativeId,
  PUNICODE_STRING NewPassword
)
{...}

来自https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nc-ntsecapi-psam_password_notification_routine

在C#中,我会使用类似的东西:

char lastchar = UserName[UserName.Length - 1];
if (lastchar <> '$') {
....

2 个答案:

答案 0 :(得分:1)

类似这样的方法可能会起作用: 请记住,PUNICODE_STRING的长度是字节数,而不是“字符”

if (UserName->Buffer)
{
    std::wstring w = std::wstring(reinterpret_cast<wchar_t*>(UserName->Buffer), UserName->Length / sizeof(wchar_t));

    if(w[w.size()-1] != L'$')
    {
        ...
    }
}

答案 1 :(得分:1)

UNICODE_STRING::Buffer是指向wchar_t[]数组的指针。您可以直接检查Buffer的内容,例如:

enum eAccountType {atUnknown, atUser, atComputer};

eAccountType GetAccountType(const wchar_t *UserName, int Length)
{
    return ((UserName) && (Length > 0))
        ? ((UserName[Length-1] == L'$') ? atComputer : atUser)
        : atUnknown;
}

eAccountType GetAccountType(const UNICODE_STRING &UserName)
{
    // UNICODE_STRING::Length is expressed in bytes, not in characters...
    return GetAccountType(UserName.Buffer, UserName.Length / sizeof(wchar_t));
}

NTSTATUS PsamPasswordNotificationRoutine(
    PUNICODE_STRING UserName,
    ULONG RelativeId,
    PUNICODE_STRING NewPassword
)
{
    ...
    if ((UserName) && (GetAccountType(*UserName) == atUser))
    {
        ...
    }
    ...
}