RtlOemStringToUnicodeString

NTSTATUS __stdcall RtlOemStringToUnicodeString(
        _UNICODE_STRING *DestinationString,
        const _STRING *SourceString,
        UINT8 AllocateDestinationString){
  unsigned int v6; 
  wchar_t *StringRoutine; 
  UINT32 v8; 
  int v9; 
  unsigned __int64 v11; 
  UINT64 BytesInOemString; 
  UINT64 BytesInUnicodeString; 

  LODWORD(BytesInUnicodeString) = 0;
  v6 = RtlxOemStringToUnicodeSize(&SourceString->Length);
  if( v6 > 0xFFFE )
    return -1073741584;
  DestinationString->Length = v6 - 2;
  if( AllocateDestinationString )
  {
    DestinationString->MaximumLength = v6;
    StringRoutine = (wchar_t *)ExpAllocateStringRoutine(v6);
    DestinationString->Buffer = StringRoutine;
    if( !StringRoutine )
      return -1073741801;
  }
  else
  {
    v11 = (unsigned __int16)(v6 - 2) + 2i64;
    if( v11 > DestinationString->MaximumLength || v11 < 2 )
      return -2147483643;
  }
  LODWORD(BytesInOemString) = SourceString->Length;
  v9 = RtlOemToUnicodeN(
         DestinationString->Buffer,
         DestinationString->Length,
         &BytesInUnicodeString,
         SourceString->Buffer,
         BytesInOemString);
  if( v9 >= 0 )
  {
    DestinationString->Buffer[(unsigned __int64)(unsigned int)BytesInUnicodeString >> 1] = 0;
    v9 = 0;
  }
  if( v9 < 0 )
  {
    if( AllocateDestinationString )
    {
      ExFreePoolWithTag(DestinationString->Buffer, v8);
      DestinationString->Buffer = 0i64;
    }
  }
  return v9;
}

Referenced by:

No references.