WmipTranslateFileHandle

NTSTATUS __stdcall WmipTranslateFileHandle(WMIFHTOINSTANCENAME *FhToInstanceName, UINT64 *OutBufferLen){
  VOID *v4; 
  int FilePDO; 
  VOID *v6; 
  unsigned __int16 Length; 
  unsigned int v8; 
  wchar_t *Buffer; 
  _UNICODE_STRING BaseName; 
  UINT64 BaseIndex; 
  PVOID Object; 
  _DEVICE_OBJECT *Pdo; 

  LODWORD(BaseIndex) = 0;
  *(_QWORD *)&BaseName.Length = 0i64;
  v4 = *(VOID **)FhToInstanceName;
  Pdo = 0i64;
  BaseName.Buffer = 0i64;
  FilePDO = WmipGetFilePDO(v4, 1, &Pdo);
  if( FilePDO < 0 )
    return FilePDO;
  v6 = (VOID *)*((_QWORD *)FhToInstanceName + 1);
  Object = 0i64;
  FilePDO = ObReferenceObjectByHandle(v6, 1ui64, WmipGuidObjectType, 1, &Object, 0i64);
  if( FilePDO >= 0 )
  {
    FilePDO = WmipGetGuidObjectInstanceInfo((_WMIGUIDOBJECT *)Object, (ULONG_PTR)Pdo, &BaseName, &BaseIndex);
    if( FilePDO < 0 )
    {
LABEL_12:
      if( Object )
        HalPutDmaAdapter((PADAPTER_OBJECT)Object);
      goto LABEL_14;
    }
    Length = BaseName.Length;
    v8 = BaseName.Length + 26;
    if( *(_DWORD *)OutBufferLen >= v8 )
    {
      Buffer = BaseName.Buffer;
      FhToInstanceName[4] = BaseIndex;
      *((_WORD *)FhToInstanceName + 10) = Length + 4;
      memmove((char *)FhToInstanceName + 22, Buffer, Length);
      *(_DWORD *)OutBufferLen = v8;
      *(WMIFHTOINSTANCENAME *)((char *)FhToInstanceName + 2 * ((unsigned __int64)Length >> 1) + 22) = 0;
    }
    else
    {
      if( *(_DWORD *)OutBufferLen < 4u )
      {
        FilePDO = -1073741823;
        goto LABEL_10;
      }
      *FhToInstanceName = v8;
      *(_DWORD *)OutBufferLen = 4;
    }
    FilePDO = 0;
LABEL_10:
    if( BaseName.Buffer )
      RtlFreeAnsiString(&BaseName);
    goto LABEL_12;
  }
LABEL_14:
  if( Pdo )
    HalPutDmaAdapter((PADAPTER_OBJECT)Pdo);
  return FilePDO;
}

Referenced by:

WmipIoControl