首先尝试Windows驱动程序开发。假设 WCHAR 数组不是以空值结尾的,如何将 WCHAR 数组(来自用户空间)转换为 UNICODE_STRING(在内核模式下) ?
我是否应该验证它是否以 null 结尾并且它是否没有分配新的缓冲区(为 null 增加 2)然后使用 RtlAnsiXXX 函数?什么是正确的方法?
谢谢!
首先尝试Windows驱动程序开发。假设 WCHAR 数组不是以空值结尾的,如何将 WCHAR 数组(来自用户空间)转换为 UNICODE_STRING(在内核模式下) ?
我是否应该验证它是否以 null 结尾并且它是否没有分配新的缓冲区(为 null 增加 2)然后使用 RtlAnsiXXX 函数?什么是正确的方法?
谢谢!
要从 wchar 数组初始化 UNICODE_STRING,请使用 RtlInitUnicodeString。
WCHAR 数组必须以 null 结尾。
因此,如果您检查并且 wchar-string 不是以 null 结尾的,您应该分配一个新缓冲区(+sizeof(WCHAR) for null),复制数组内容,然后调用 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 数组不必以 NULL 结尾。UNICODE_STRING 结构是为计数字符串设计的,因此,它适用于非 NULL 终止的 WCHAR 数组——当然,您必须知道长度。
例如,您可以使用RtlInitEmptyUnicodeString。