WmipProbeAndCaptureGuidObjectAttributes

NTSTATUS __stdcall WmipProbeAndCaptureGuidObjectAttributes(
        _OBJECT_ATTRIBUTES *CapturedObjectAttributes,
        _UNICODE_STRING *CapturedGuidString,
        WCHAR *CapturedGuuffer,
        _OBJECT_ATTRIBUTES *ObjectAttributes){
  NTSTATUS v8; 
  __int64 v9; 
  unsigned __int64 ObjectName; 
  unsigned __int16 Length; 
  wchar_t *Buffer; 
  unsigned __int64 RootDirectory_low; 
  _UNICODE_STRING v15; 

  v8 = 0;
  if( IoIs32bitProcess(0i64) )
  {
    if( ((unsigned __int8)ObjectAttributes & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)&ObjectAttributes->Attributes > 0x7FFFFFFF0000i64
      || &ObjectAttributes->Attributes < (unsigned int *)ObjectAttributes )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
    CapturedObjectAttributes->Length = 48;
    CapturedObjectAttributes->RootDirectory = (void *)*(&ObjectAttributes->Length + 1);
    CapturedObjectAttributes->Attributes = HIDWORD(ObjectAttributes->RootDirectory);
    CapturedObjectAttributes->SecurityDescriptor = (void *)LODWORD(ObjectAttributes->ObjectName);
    CapturedObjectAttributes->SecurityQualityOfService = (void *)HIDWORD(ObjectAttributes->ObjectName);
    RootDirectory_low = LODWORD(ObjectAttributes->RootDirectory);
    if( !LODWORD(ObjectAttributes->RootDirectory) )
      return -1073741811;
    if( (RootDirectory_low & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( RootDirectory_low + 8 < RootDirectory_low )
      MEMORY[0x7FFFFFFF0000] = 0;
    CapturedGuidString->Length = *(_WORD *)RootDirectory_low;
    CapturedGuidString->MaximumLength = *(_WORD *)(RootDirectory_low + 2);
    CapturedGuidString->Buffer = (wchar_t *)*(unsigned int *)(RootDirectory_low + 4);
  }
  else
  {
    v9 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)ObjectAttributes < 0x7FFFFFFF0000i64 )
      v9 = (__int64)ObjectAttributes;
    *(_OWORD *)&CapturedObjectAttributes->Length = *(_OWORD *)v9;
    *(_OWORD *)&CapturedObjectAttributes->ObjectName = *(_OWORD *)(v9 + 16);
    *(_OWORD *)&CapturedObjectAttributes->SecurityDescriptor = *(_OWORD *)(v9 + 32);
    ObjectName = (unsigned __int64)CapturedObjectAttributes->ObjectName;
    if( !ObjectName )
      return -1073741811;
    *(_DWORD *)(&v15.MaximumLength + 1) = 0;
    if( ObjectName >= 0x7FFFFFFF0000i64 )
      ObjectName = 0x7FFFFFFF0000i64;
    *(_DWORD *)&v15.Length = *(_DWORD *)ObjectName;
    v15.Buffer = *(wchar_t **)(ObjectName + 8);
    *CapturedGuidString = v15;
  }
  if( CapturedObjectAttributes->SecurityDescriptor || CapturedObjectAttributes->SecurityQualityOfService )
    return -1073741811;
  Length = 90;
  if( CapturedGuidString->Length != 90 )
    return -1073741811;
  Buffer = CapturedGuidString->Buffer;
  if( (unsigned __int64)(Buffer + 45) > 0x7FFFFFFF0000i64 || Buffer + 45 < Buffer )
  {
    MEMORY[0x7FFFFFFF0000] = 0;
    Length = CapturedGuidString->Length;
    Buffer = CapturedGuidString->Buffer;
  }
  memmove(CapturedGuuffer, Buffer, Length);
  CapturedGuuffer[45] = 0;
  CapturedGuidString->Buffer = CapturedGuuffer;
  CapturedObjectAttributes->ObjectName = CapturedGuidString;
  return v8;
}

Referenced by:

WmipProbeWmiOpenGuidBlock