AslStringDuplicate

INT64 __stdcall AslStringDuplicate(WCHAR **Duplicate, WCHAR *Source){
  NTSTATUS v4; 
  unsigned int v5; 
  UINT64 v6; 
  NTSTATUS v7; 
  VOID *v8; 
  INT64 v9; 
  WCHAR *v10; 
  WCHAR *v11; 
  NTSTATUS v12; 
  UINT64 v14; 
  int v15; 
  SIZE_T v16; 
  ULONGLONG pullResult; 
  v16 = 0i64;
  pullResult = 0i64;
  *Duplicate = 0i64;
  if( !Source )
    return 0;
  v4 = RtlStringCchLengthW(Source, 0x7FFFFFFFui64, &v16);
  v5 = v4;
  if( v4 < 0 )
  {
    AslLogCallPrintf(1ui64, "AslStringDuplicate", 0x235ui64, "RtlStringCchLengthW failed [%x]", v4);
    return v5;
  }
  v6 = v16 + 1;
  if( v16 + 1 < v16 )
  {
    v5 = -1073741675;
    v14 = 576i64;
    v15 = -1073741675;
    goto LABEL_17;
  }
  v7 = RtlULongLongMult(v16 + 1, 2ui64, &pullResult);
  v5 = v7;
  if( v7 < 0 )
  {
    v15 = v7;
    v14 = 582i64;
LABEL_17:
    AslLogCallPrintf(1ui64, "AslStringDuplicate", v14, "SIZE_T arithmetic failed [%x]", v15);
    return v5;
  }
  v10 = (WCHAR *)AslAlloc(v8, pullResult, v9);
  v11 = v10;
  if( v10 )
  {
    v12 = RtlStringCchCopyW(v10, v6, Source);
    v5 = v12;
    if( v12 < 0 )
    {
      AslLogCallPrintf(1ui64, "AslStringDuplicate", 0x257ui64, "RtlStringCchCopyW failed [%x]", v12);
    }
    else
    {
      *Duplicate = v11;
      v11 = 0i64;
      v5 = 0;
    }
    if( v11 )
      ExFreePoolWithTag(v11, 0x74705041u);
  }
  else
  {
    v5 = -1073741801;
    AslLogCallPrintf(1ui64, "AslStringDuplicate", 0x24Dui64, "Out of memory");
  }
  return v5;
}

Referenced by:

AslFileMappingCreate
AslFileMappingCreateFromImageView
AslRegWildcardFindFirst
AslpFileMakeStringVersionAttributes
AslpFileVerQueryBlock
SdbpCheckMatchingRegistryValue