IoGetDeviceInterfaceAlias

NTSTATUS __stdcall IoGetDeviceInterfaceAlias(
        _UNICODE_STRING *SymbolicLinkName,
        _GUID *AliasInterfaceClassGuid,
        _UNICODE_STRING *AliasSymbolicLinkName){
  VOID **v6; 
  VOID **v7; 
  WCHAR *v8; 
  int v9; 
  WCHAR *v10; 
  int ObjectProperty; 
  UINT64 v12; 
  INT64 v13; 
  _ETHREAD *CurrentThread; 
  VOID **PoolWithTag; 
  WCHAR *v16; 
  WCHAR *v17; 
  WCHAR *v18; 
  WCHAR *v19; 
  VOID **v20; 
  char v21; 
  UINT64 v22; 
  WCHAR *v24; 
  int v25; 
  WCHAR *v26; 
  WCHAR *DesiredAccess; 
  WCHAR *DesiredAccessa; 
  INT64 Create; 
  UINT64 *v30; 
  UINT64 *v31; 
  UINT8 Matched; 
  char DeviceInterfaceName[11]; 
  _DWORD v34[5]; 
  VOID *DeviceInterfaceKey; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  WCHAR GuidString[40]; 

  Matched = 0;
  DeviceInterfaceKey = 0i64;
  DeviceInterfaceName[0] = 0;
  v34[0] = 0;
  v6 = 0i64;
  v34[3] = 0;
  v7 = 0i64;
  *(_QWORD *)&v34[1] = 0i64;
  v8 = 0i64;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  if( !SymbolicLinkName || !SymbolicLinkName->Buffer || !SymbolicLinkName->Length )
  {
    ObjectProperty = -1073741811;
    goto LABEL_25;
  }
  v9 = PnpUnicodeStringToWstr((__int16 **)&v34[1], 0i64, &SymbolicLinkName->Length);
  v8 = *(WCHAR **)&v34[1];
  ObjectProperty = v9;
  if( v9 >= 0 )
  {
    if( CmValidateDeviceInterfaceName(v10) < 0 )
    {
      ObjectProperty = -1073741811;
      goto LABEL_29;
    }
    SeCaptureSubjectContext((INT64)&SubjectContext);
    ObjectProperty = PiPnpRtlApplyMandatoryFilters(*(&stru_140CF2E80 + 607), v8, 3, 0i64, &SubjectContext, &Matched);
    SeReleaseSubjectContext(&SubjectContext);
    if( ObjectProperty >= 0 )
    {
      if( !Matched )
      {
        ObjectProperty = -1073741790;
        goto LABEL_29;
      }
      ObjectProperty = PnpStringFromGuid(AliasInterfaceClassGuid, GuidString, v12);
      if( ObjectProperty >= 0 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --CurrentThread->Tcb.KernelApcDisable;
        ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v13);
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x190ui64, 538996816i64);
        v6 = PoolWithTag;
        if( PoolWithTag )
        {
          v16 = *(WCHAR **)&v34[1];
          ObjectProperty = PnpGetObjectProperty(
                             *(&stru_140CF2E80 + 1214),
                             *(INT64 *)&v34[1],
                             3i64,
                             0i64,
                             0i64,
                             (INT64)&DEVPKEY_Device_InstanceId,
                             (INT64)v34,
                             (INT64)PoolWithTag);
          if( ObjectProperty < 0 )
          {
LABEL_24:
            ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
            v8 = *(WCHAR **)&v34[1];
LABEL_25:
            if( v7 )
              ExFreePoolWithTag(v7, 0);
            if( v6 )
              ExFreePoolWithTag(v6, 0);
            goto LABEL_29;
          }
          if( v34[0] != 18 )
          {
            ObjectProperty = -1073741585;
            goto LABEL_24;
          }
          *(_DWORD *)&DeviceInterfaceName[3] = 128;
          v7 = ExAllocatePoolWithTag(1ui64, 0x100ui64, 538996816i64);
          if( v7 )
          {
            DesiredAccess = (WCHAR *)&DeviceInterfaceName[3];
            ObjectProperty = CmGetDeviceInterfaceReferenceString(v17, v16, (UINT64)v7, (UINT64 *)0x80);
            if( ObjectProperty != -1073741789 )
              goto LABEL_14;
            ExFreePoolWithTag(v7, 0);
            v7 = ExAllocatePoolWithTag(1ui64, 2i64 * *(unsigned int *)&DeviceInterfaceName[3], 538996816i64);
            if( v7 )
            {
              DesiredAccess = (WCHAR *)&DeviceInterfaceName[3];
              ObjectProperty = CmGetDeviceInterfaceReferenceString(
                                 v24,
                                 v16,
                                 (UINT64)v7,
                                 (UINT64 *)*(unsigned int *)&DeviceInterfaceName[3]);
LABEL_14:
              if( ObjectProperty == -1073741772 )
              {
                ObjectProperty = 0;
                ExFreePoolWithTag(v7, 0);
                v7 = 0i64;
              }
              if( ObjectProperty < 0 )
                goto LABEL_24;
              ObjectProperty = CmGetDeviceInterfacePathFormat(v18, (UINT8 *)v16);
              if( ObjectProperty < 0 )
                goto LABEL_24;
              *(_DWORD *)&DeviceInterfaceName[7] = 512;
              v20 = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
              if( v20 )
              {
                v21 = DeviceInterfaceName[0];
                LODWORD(v30) = 512;
                LOBYTE(DesiredAccess) = DeviceInterfaceName[0];
                ObjectProperty = CmGetDeviceInterfaceName(
                                   v19,
                                   GuidString,
                                   (WCHAR *)v6,
                                   (UINT8)v7,
                                   DesiredAccess,
                                   (UINT64)v20,
                                   v30);
                if( ObjectProperty != -1073741789 )
                {
LABEL_20:
                  if( ObjectProperty >= 0 )
                  {
                    ObjectProperty = RtlInitUnicodeStringEx(AliasSymbolicLinkName, (WCHAR *)v20);
                    if( ObjectProperty >= 0 )
                    {
                      LOBYTE(Create) = 0;
                      LODWORD(DesiredAccessa) = 131097;
                      ObjectProperty = CmOpenDeviceInterfaceRegKey(
                                         *(&stru_140CF2E80 + 607),
                                         (const WCHAR *)v20,
                                         48i64,
                                         v22,
                                         (INT64)DesiredAccessa,
                                         Create,
                                         &DeviceInterfaceKey,
                                         0i64);
                      if( ObjectProperty < 0 )
                        RtlFreeAnsiString(AliasSymbolicLinkName);
                      else
                        ZwClose((_HANDLE)DeviceInterfaceKey);
                    }
                  }
                  goto LABEL_24;
                }
                ExFreePoolWithTag(v20, 0);
                v25 = *(_DWORD *)&DeviceInterfaceName[7];
                v20 = ExAllocatePoolWithTag(1ui64, 2i64 * *(unsigned int *)&DeviceInterfaceName[7], 538996816i64);
                if( v20 )
                {
                  LODWORD(v31) = v25;
                  LOBYTE(DesiredAccessa) = v21;
                  ObjectProperty = CmGetDeviceInterfaceName(
                                     v26,
                                     GuidString,
                                     (WCHAR *)v6,
                                     (UINT8)v7,
                                     DesiredAccessa,
                                     (UINT64)v20,
                                     v31);
                  goto LABEL_20;
                }
              }
            }
          }
        }
        ObjectProperty = -1073741670;
        goto LABEL_24;
      }
    }
  }
LABEL_29:
  PnpUnicodeStringToWstrFree(v8, (__int64)SymbolicLinkName);
  return ObjectProperty;
}

Referenced by:

PiCMGetDeviceInterfaceAlias