IoGetDeviceInterfaceAlias

NTSTATUS __stdcall IoGetDeviceInterfaceAlias(
        UNICODE_STRING *SymbolicLinkName,
        GUID *AliasInterfaceClassGuid,
        UNICODE_STRING *AliasSymbolicLinkName){
  void *v6; 
  void *v7; 
  WCHAR *v8; 
  int v9; 
  __int64 v10; 
  NTSTATUS ObjectProperty; 
  NTSTATUS v12; 
  int v13; 
  _ETHREAD *CurrentThread; 
  VOID *PoolWithTag; 
  WCHAR *v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  wchar_t *v20; 
  char v21; 
  __int64 v22; 
  __int64 v24; 
  unsigned int v25; 
  __int64 v26; 
  size_t v27; 
  size_t v28; 
  __int16 v29; 
  unsigned int v30; 
  unsigned int v31; 
  int v32; 
  WCHAR *OutString; 
  ULONG v34; 
  HANDLE Handle; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  __int16 v37[40]; 
  v29 = 0;
  Handle = 0i64;
  v32 = 0;
  v6 = 0i64;
  v34 = 0;
  v7 = 0i64;
  OutString = 0i64;
  v8 = 0i64;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  if( !SymbolicLinkName || !SymbolicLinkName->Buffer || !SymbolicLinkName->Length )
  {
    ObjectProperty = -1073741811;
    goto LABEL_25;
  }
  v9 = PnpUnicodeStringToWstr(&OutString, 0i64, SymbolicLinkName);
  v8 = OutString;
  ObjectProperty = v9;
  if( v9 >= 0 )
  {
    if( (int)CmValidateDeviceInterfaceName(v10, OutString) < 0 )
    {
      ObjectProperty = -1073741811;
      goto LABEL_29;
    }
    SeCaptureSubjectContext(&SubjectContext);
    PiPnpRtlApplyMandatoryFilters();
    ObjectProperty = v12;
    SeReleaseSubjectContext(&SubjectContext);
    if( ObjectProperty >= 0 )
    {
      if( !(_BYTE)v29 )
      {
        ObjectProperty = -1073741790;
        goto LABEL_29;
      }
      PnpStringFromGuid((int *)AliasInterfaceClassGuid, (wchar_t *)v37);
      ObjectProperty = v13;
      if( v13 >= 0 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)CurrentThread + 242);
        ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x20207050ui64);
        v6 = PoolWithTag;
        if( PoolWithTag )
        {
          v16 = OutString;
          ObjectProperty = PnpGetObjectProperty(
                             PiPnpRtlCtx,
                             (__int64)OutString,
                             3i64,
                             0i64,
                             0i64,
                             (__int64)&DEVPKEY_Device_InstanceId,
                             &v32,
                             (unsigned __int64)PoolWithTag,
                             400,
                             &v34,
                             0);
          if( ObjectProperty < 0 )
          {
LABEL_24:
            ExReleaseResourceLite(&PnpRegistryDeviceResource);
            KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
            v8 = OutString;
LABEL_25:
            if( v7 )
              ExFreePoolWithTag(v7, 0);
            if( v6 )
              ExFreePoolWithTag(v6, 0);
            goto LABEL_29;
          }
          if( v32 != 18 )
          {
            ObjectProperty = -1073741585;
            goto LABEL_24;
          }
          v30 = 128;
          v7 = ExAllocatePoolWithTag(PagedPool, 0x100ui64, 0x20207050ui64);
          if( v7 )
          {
            ObjectProperty = CmGetDeviceInterfaceReferenceString(v17, v16, (wchar_t *)v7, 0x80u, &v30);
            if( ObjectProperty != -1073741789 )
              goto LABEL_14;
            ExFreePoolWithTag(v7, 0);
            v7 = ExAllocatePoolWithTag(PagedPool, 2i64 * v30, 0x20207050ui64);
            if( v7 )
            {
              ObjectProperty = CmGetDeviceInterfaceReferenceString(v24, v16, (wchar_t *)v7, v30, &v30);
LABEL_14:
              if( ObjectProperty == -1073741772 )
              {
                ObjectProperty = 0;
                ExFreePoolWithTag(v7, 0);
                v7 = 0i64;
              }
              if( ObjectProperty < 0 )
                goto LABEL_24;
              ObjectProperty = CmGetDeviceInterfacePathFormat(v18, v16, (_BYTE *)&v29 + 1);
              if( ObjectProperty < 0 )
                goto LABEL_24;
              v31 = 512;
              v20 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x400ui64, 0x20207050ui64);
              if( v20 )
              {
                v21 = HIBYTE(v29);
                LODWORD(v27) = 512;
                ObjectProperty = CmGetDeviceInterfaceName(
                                   v19,
                                   (const WCHAR *)v37,
                                   (const wchar_t *)v6,
                                   (const wchar_t *)v7,
                                   SHIBYTE(v29),
                                   v20,
                                   v27,
                                   &v31);
                if( ObjectProperty != -1073741789 )
                {
LABEL_20:
                  if( ObjectProperty >= 0 )
                  {
                    ObjectProperty = RtlInitUnicodeStringEx(AliasSymbolicLinkName, v20);
                    if( ObjectProperty >= 0 )
                    {
                      ObjectProperty = CmOpenDeviceInterfaceRegKey(
                                         PiPnpRtlCtx,
                                         v20,
                                         0x30u,
                                         v22,
                                         131097,
                                         0,
                                         (__int64)&Handle,
                                         0i64);
                      if( ObjectProperty < 0 )
                        RtlFreeAnsiString(AliasSymbolicLinkName);
                      else
                        ZwClose(Handle);
                    }
                  }
                  goto LABEL_24;
                }
                ExFreePoolWithTag(v20, 0);
                v25 = v31;
                v20 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 2i64 * v31, 0x20207050ui64);
                if( v20 )
                {
                  LODWORD(v28) = v25;
                  ObjectProperty = CmGetDeviceInterfaceName(
                                     v26,
                                     (const WCHAR *)v37,
                                     (const wchar_t *)v6,
                                     (const wchar_t *)v7,
                                     v21,
                                     v20,
                                     v28,
                                     &v31);
                  goto LABEL_20;
                }
              }
            }
          }
        }
        ObjectProperty = -1073741670;
        goto LABEL_24;
      }
    }
  }
LABEL_29:
  PnpUnicodeStringToWstrFree(v8, SymbolicLinkName);
  return ObjectProperty;
}

Referenced by:

PiCMGetDeviceInterfaceAlias