AdtpBuildUlongString

NTSTATUS __stdcall AdtpBuildUlongString(
        UINT64 Value,
        _UNICODE_STRING *pResultantString,
        _EVENT_DATA_DESCRIPTOR *pEtwDataDescriptor,
        PWCHAR pszStringBuffer,
        UINT64 *pdwCurBufferIndex,
        UINT8 *pFreeWhenDone){
  unsigned int v8; 
  __int64 v10; 
  wchar_t *PoolWithTag; 
  UINT8 v12; 
  __int64 v13; 
  v8 = Value;
  if( !pEtwDataDescriptor && !pResultantString )
    return -1073741811;
  if( pszStringBuffer
    && pdwCurBufferIndex
    && (v10 = *(unsigned int *)pdwCurBufferIndex, (unsigned int)(v10 + 11) < 0x400) )
  {
    PoolWithTag = &pszStringBuffer[v10];
    *(_DWORD *)pdwCurBufferIndex = v10 + 11;
    v12 = 0;
  }
  else
  {
    v12 = 1;
    PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x16ui64, 0x6B416553ui64);
    if( !PoolWithTag )
      return -1073741801;
  }
  *pFreeWhenDone = v12;
  ultow(v8, PoolWithTag, 10);
  v13 = -1i64;
  do
    ++v13;
  while( PoolWithTag[v13] );
  if( pEtwDataDescriptor )
  {
    pEtwDataDescriptor->Ptr = (unsigned __int64)PoolWithTag;
    *(_QWORD *)&pEtwDataDescriptor->Size = (unsigned int)(2 * v13 + 2);
  }
  else
  {
    pResultantString->MaximumLength = 22;
    pResultantString->Length = 2 * v13;
    pResultantString->Buffer = PoolWithTag;
  }
  return 0;
}

Referenced by:

AdtpBuildRegistryValueString
AdtpPackageParameters