{
PWCHARp, pp, ps;
ULONG i = 0;
SIZE_Tn;
ULONGCount = 0;
/* Validate the key information */if (KeyValueInformation->Type != REG_MULTI_SZ) returnSTATUS_INVALID_PARAMETER;
/* Set the pointers */
p = (PWCHAR)((ULONG_PTR)KeyValueInformation +
KeyValueInformation->DataOffset);
pp = (PWCHAR)((ULONG_PTR)p + KeyValueInformation->DataLength);
/* Loop the data */while (p != pp)
{
/* If we find a NULL, that means one string is done */if (!*p)
{
/* Add to our string count */
Count++;
/* Check for a double-NULL, which means we're done */if (((p + 1) == pp) || !(*(p + 1))) break;
}
/* Go to the next character */
p++;
}
/* If we looped the whole list over, we missed increment a string, do it */if (p == pp) Count++;
/* Allocate the list now that we know how big it is */
*UnicodeStringList = ExAllocatePoolWithTag(PagedPool,
sizeof(UNICODE_STRING) * Count,
'sUpP');
if (!(*UnicodeStringList)) returnSTATUS_INSUFFICIENT_RESOURCES;
/* Set pointers for second loop */
ps = p = (PWCHAR)((ULONG_PTR)KeyValueInformation +
KeyValueInformation->DataOffset);
/* Loop again, to do the copy this time */while (p != pp)
{
/* If we find a NULL, that means one string is done */if (!*p)
{
/* Check how long this string is */
n = (ULONG_PTR)p - (ULONG_PTR)ps + sizeof(UNICODE_NULL);
/* Allocate the buffer */
(*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool,
n,
'sUpP');
if (!(*UnicodeStringList)[i].Buffer)
{
/* Back out of everything */PnpFreeUnicodeStringList(*UnicodeStringList, i);
returnSTATUS_INSUFFICIENT_RESOURCES;
}
/* Copy the string into the buffer */RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n);
/* Set the lengths */
(*UnicodeStringList)[i].MaximumLength = (USHORT)n;
(*UnicodeStringList)[i].Length = (USHORT)(n - sizeof(UNICODE_NULL));
/* One more entry done */
i++;
/* Check for a double-NULL, which means we're done */if (((p + 1) == pp) || !(*(p + 1))) break;
/* New string */
ps = p + 1;
}
/* New string */
p++;
}
/* Check if we've reached the last string */if (p == pp)
{
/* Calculate the string length */
n = (ULONG_PTR)p - (ULONG_PTR)ps;
/* Allocate the buffer for it */
(*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool,
n +
sizeof(UNICODE_NULL),
'sUpP');
if (!(*UnicodeStringList)[i].Buffer)
{
/* Back out of everything */PnpFreeUnicodeStringList(*UnicodeStringList, i);
returnSTATUS_INSUFFICIENT_RESOURCES;
}
/* Make sure there's an actual string here */if (n) RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n);
/* Null-terminate the string ourselves */
(*UnicodeStringList)[i].Buffer[n / sizeof(WCHAR)] = UNICODE_NULL;
/* Set the lenghts */
(*UnicodeStringList)[i].Length = (USHORT)n;
(*UnicodeStringList)[i].MaximumLength = (USHORT)(n + sizeof(UNICODE_NULL));
}
/* And we're done */
*UnicodeStringCount = Count;
returnSTATUS_SUCCESS;
}
Generated on Sat May 26 2012 06:06:38 for ReactOS by
1.7.6.1
ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.