首先尝试在Windows驱动程序开发。 如何将WCHAR数组(来自用户空间)转换为UNICODE_STRING(在内核模式下),假定WCHAR数组是而不是以空终止?将WCHAR *转换为UNICODE STRING
我应该验证它是否以null结束,如果它没有分配一个新的缓冲区(+2为null),然后使用RtlAnsiXXX函数?什么是正确的方法?
谢谢!
首先尝试在Windows驱动程序开发。 如何将WCHAR数组(来自用户空间)转换为UNICODE_STRING(在内核模式下),假定WCHAR数组是而不是以空终止?将WCHAR *转换为UNICODE STRING
我应该验证它是否以null结束,如果它没有分配一个新的缓冲区(+2为null),然后使用RtlAnsiXXX函数?什么是正确的方法?
谢谢!
要从wchar数组初始化UNICODE_STRING,请使用RtlInitUnicodeString。
WCHAR阵列必须以空终止。因此,如果您选中并且wchar-string不是空终止,则应该为空分配一个新缓冲区(+ sizeof(WCHAR)),复制数组内容,然后调用RtlInitUnicodeString。
要检查是否从用户模式WCHAR-string是空值终止我使用:
BOOLEAN IsStringTerminated(PWCHAR Array, USHORT ArrayLength, USHORT *StringLength)
{
BOOLEAN bStringIsTerminated = FALSE;
USHORT uiIndex = 0;
*StringLength = 0;
while(uiIndex < ArrayLength && bStringIsTerminated == FALSE)
{
if(Array[uiIndex] == L'\0')
{
*StringLength = uiIndex + 1;
bStringIsTerminated = TRUE;
}
else
{
uiIndex++;
}
}
return bStringIsTerminated;
}
的WCHAR阵列不必须是空终止的。 UNICODE_STRING结构被设计用于计数的字符串,因此,可以与非NULL结尾的WCHAR数组一起工作 - 当然,您将必须知道长度。
例如,您可以使用RtlInitEmptyUnicodeString。
谢谢!因此,假设来自用户空间(irp-> AssociatedIrp.SystemBuffer)的缓冲区不是空终止的,我应该使用什么内核模式函数来分配新的whcar缓冲区? ExAllocatePoolWithTag? – user1782427
是的您可以使用ExAllocatePool。 – ladan