Поиск персонажа в UNICODE_STRING - PullRequest
0 голосов
/ 09 июля 2019

Существует 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 ]

1 голос
/ 09 июля 2019

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))
    {
        ...
    }
    ...
}
1 голос
/ 09 июля 2019

Что-то вроде этого, вероятно, будет работать: просто помните, что длина 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'$')
    {
        ...
    }
}
...