PUNICODE_STRING str = L"abc";
Это неправильно. Это же структура в C, а не класс в С++, она не может сама себя проинициализировать конструктором. Своими действиями ничего кроме BSOD ты не получишь. К тому же у тебя указатель! Даже в C++, если это не smart pointer, получил бы по рукам.
Надо так
PUNICODE_STRING str;
int len_in_wchar;
RtlInitUnicodeString(&str,L"My super string");
len_in_wchar = (str->Length)/sizeof WCHAR;
Если сравнить надо в режиме ядра, то
RtlCompareUnicodeString(
IN PUNICODE_STRING String1,
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInSensitive
);
И как их преобразовывают в *char и обратно.
NTSTATUS
RtlUnicodeStringToAnsiString(
IN OUT PANSI_STRING DestinationString,
IN PUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString
);
А вобще со структурой UNICODE_STRING можно и напрямую работать, она открытая. Все длинны там в байтах, а Buffer- указатель на массив WCHAR символов.