AslStringAnsiToUnicode

INT64 __stdcall AslStringAnsiToUnicode(WCHAR **UnicodeBuffer, INT8 *AnsiBuffer){
  INT8 v2; 
  unsigned int v4; 
  VOID *v5; 
  INT64 v6; 
  unsigned __int16 v7; 
  unsigned int v8; 
  wchar_t *Buffer; 
  NTSTATUS v10; 
  UNICODE_STRING v12; 
  struct _STRING DestinationString; 
  DestinationString = 0i64;
  RtlInitAnsiString(&DestinationString, AnsiBuffer, v2);
  v4 = RtlxAnsiStringToUnicodeSize(&DestinationString);
  v7 = v4;
  *UnicodeBuffer = 0i64;
  v12 = 0i64;
  if( v4 > 0xFFFF )
  {
    v8 = -1073741811;
    AslLogCallPrintf(1ui64, "AslStringAnsiToUnicode", 0x184ui64, "Ansi string is too long to convert at %d", v4);
LABEL_3:
    Buffer = v12.Buffer;
    goto LABEL_9;
  }
  v12.Buffer = (wchar_t *)AslAlloc(v5, v4, v6);
  if( !v12.Buffer )
  {
    v8 = -1073741801;
    AslLogCallPrintf(1ui64, "AslStringAnsiToUnicode", 0x18Bui64, "Out of memory");
    return v8;
  }
  v12.MaximumLength = v7;
  v12.Length = 0;
  v10 = RtlAnsiStringToUnicodeString(&v12, &DestinationString, 0);
  v8 = v10;
  if( v10 < 0 )
  {
    AslLogCallPrintf(1ui64, "AslStringAnsiToUnicode", 0x194ui64, "RtlAnsiStringToUnicodeString failed [%x]", v10);
    goto LABEL_3;
  }
  Buffer = 0i64;
  *UnicodeBuffer = v12.Buffer;
  v8 = 0;
LABEL_9:
  if( Buffer )
    ExFreePoolWithTag(Buffer, 0x74705041u);
  return v8;
}

Referenced by:

AslpFileGet16BitDescription
AslpFileGet16BitModuleName
AslpFileGetClrVersionAttribute
AslpFileGetExportName