AdtpEtwBuildString

NTSTATUS __stdcall AdtpEtwBuildString(
        _EVENT_DATA_DESCRIPTOR *pEtwDataDescriptor,
        _UNICODE_STRING *pUnicodeString,
        PWCHAR pszStringBuffer,
        UINT64 *pdwCurBufferIndex,
        UINT8 *pFreeWhenDone){
  unsigned int Length; 
  unsigned __int16 MaximumLength; 
  unsigned int v9; 
  bool v10; 
  UINT8 *Buffer; 
  __int64 v12; 
  NTSTATUS result; 
  Length = pUnicodeString->Length;
  MaximumLength = pUnicodeString->MaximumLength;
  v9 = (Length >> 1) + 1;
  v10 = MaximumLength == (unsigned __int16)Length;
  if( MaximumLength > (unsigned __int16)Length )
  {
    Buffer = (UINT8 *)pUnicodeString->Buffer;
    if( !*(_WORD *)&Buffer[2 * (Length >> 1)] )
    {
LABEL_8:
      pEtwDataDescriptor->Ptr = (unsigned __int64)Buffer;
      pEtwDataDescriptor->Size = 2 * v9;
      result = 0;
      pEtwDataDescriptor->Reserved = 0;
      return result;
    }
    v10 = MaximumLength == (unsigned __int16)Length;
  }
  if( v10 && v9 > 1 )
  {
    Buffer = (UINT8 *)pUnicodeString->Buffer;
    if( !*(_WORD *)&Buffer[2 * (Length >> 1) - 2] )
    {
      v9 = Length >> 1;
      goto LABEL_8;
    }
  }
  v12 = *(unsigned int *)pdwCurBufferIndex;
  if( (unsigned int)v12 + v9 < 0x400 )
  {
    Buffer = (UINT8 *)&pszStringBuffer[v12];
    *(_DWORD *)pdwCurBufferIndex = v12 + v9;
LABEL_7:
    memmove(Buffer, (UINT8 *)pUnicodeString->Buffer, (unsigned __int16)Length);
    *(_WORD *)&Buffer[2 * v9 - 2] = 0;
    goto LABEL_8;
  }
  Buffer = (UINT8 *)ExAllocatePoolWithTag(PagedPool, 2i64 * v9, 0x6B416553ui64);
  if( Buffer )
  {
    *pFreeWhenDone = 1;
    LOWORD(Length) = pUnicodeString->Length;
    goto LABEL_7;
  }
  return -1073741801;
}

Referenced by:

AdtpPackageParameters