EtwpCaptureString

NTSTATUS __stdcall EtwpCaptureString(_UNICODE_STRING *UserString, _UNICODE_STRING *CapturedString){
  NTSTATUS v4; 
  char PreviousMode; 
  __int64 Length; 
  wchar_t *Buffer; 
  VOID **PoolWithTag; 
  INT8 *v9; 

  v4 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  RtlInitUnicodeString(CapturedString, 0i64);
  if( PreviousMode )
  {
    Length = UserString->Length;
    if( (_WORD)Length )
    {
      Buffer = UserString->Buffer;
      if( ((unsigned __int8)Buffer & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)Buffer + Length > 0x7FFFFFFF0000i64 || (wchar_t *)((char *)Buffer + Length) < Buffer )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  PoolWithTag = ExAllocatePoolWithTag(1ui64, UserString->Length + 2i64, 1350005829i64);
  v9 = (INT8 *)PoolWithTag;
  if( !PoolWithTag
    || (memmove(PoolWithTag, UserString->Buffer, UserString->Length),
        *(_WORD *)&v9[2 * ((unsigned __int64)UserString->Length >> 1)] = 0,
        !RtlCreateUnicodeString((INT64)CapturedString, v9)) )
  {
    v4 = -1073741801;
  }
  if( v9 )
    ExFreePoolWithTag(v9, 0);
  return v4;
}

Referenced by:

EtwpAcquireLoggerContext
EtwpFlushTrace
EtwpSetSoftRestartInformation
EtwpStartLogger
EtwpUpdateTrace