有一个UNICODE_STRING,我想检查其中是否有定义的字符(更好的是:$结尾)。
我们正在使用OpenPasswordFilter,并希望检查所提交的帐户是用户还是计算机。如果它是一台计算机,并在末尾用“ $”定义,则应省略检查。
NTSTATUS PsamPasswordNotificationRoutine(
PUNICODE_STRING UserName,
ULONG RelativeId,
PUNICODE_STRING NewPassword
)
{...}
在C#中,我会使用类似的东西:
char lastchar = UserName[UserName.Length - 1];
if (lastchar <> '$') {
....
答案 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))
{
...
}
...
}