AslStringUpcaseToMultiByteN

NTSTATUS __stdcall AslStringUpcaseToMultiByteN(PSTR DestinationAnsiBuffer, PWCHAR Source){
  const WCHAR *v2; 
  unsigned __int16 MaximumLength; 
  VOID *v5; 
  INT64 v6; 
  NTSTATUS v7; 
  NTSTATUS v8; 
  const CHAR *v10; 
  UINT64 v11; 
  UNICODE_STRING SourceString; 
  STRING v13; 
  struct _UNICODE_STRING DestinationString; 
  *(_DWORD *)(&v13.MaximumLength + 1) = 0;
  DestinationString = 0i64;
  *(_QWORD *)&SourceString.Length = 0i64;
  RtlInitUnicodeString(&DestinationString, v2, (WCHAR)v2);
  MaximumLength = DestinationString.MaximumLength;
  SourceString.Buffer = (wchar_t *)AslAlloc(v5, DestinationString.MaximumLength, v6);
  if( !SourceString.Buffer )
  {
    v8 = -1073741801;
    AslLogCallPrintf(1ui64, "AslStringUpcaseToMultiByteN", 0x414ui64, "Out of memory");
    return v8;
  }
  SourceString.MaximumLength = MaximumLength;
  SourceString.Length = 0;
  v7 = RtlUpcaseUnicodeString(&SourceString, &DestinationString, 0);
  v8 = v7;
  if( v7 < 0 )
  {
    v10 = "RtlUpcaseUnicodeString failed [%x]";
    v11 = 1053i64;
  }
  else
  {
    v13.Buffer = DestinationAnsiBuffer;
    *(_DWORD *)&v13.Length = 0x1000000;
    v7 = RtlUnicodeStringToAnsiString(&v13, &SourceString, 0);
    v8 = v7;
    if( v7 >= 0 )
    {
      v8 = 0;
      DestinationAnsiBuffer[v13.Length] = 0;
      goto LABEL_5;
    }
    v10 = "RtlUnicodeStringToAnsiString failed [%x]";
    v11 = 1068i64;
  }
  AslLogCallPrintf(1ui64, "AslStringUpcaseToMultiByteN", v11, v10, v7);
LABEL_5:
  if( SourceString.Buffer )
    ExFreePoolWithTag(SourceString.Buffer, 0x74705041u);
  return v8;
}

Referenced by:

SdbpFindFirstIndexedWildCardTag
SdbpFindNextIndexedWildCardTag