IopRegisterDeviceInterface

INT64 __stdcall IopRegisterDeviceInterface(
        WCHAR *DeviceInstanceName,
        GUID *InterfaceClassGuid,
        WCHAR *ReferenceString,
        UINT8 UserModeFormat,
        WCHAR **SymbolicLinkName,
        UINT64 *PdoFlags){
  WCHAR **v7; 
  WCHAR **v8; 
  WCHAR **v9; 
  CHAR *v10; 
  int v11; 
  int DeviceInterfaceName; 
  WCHAR *PoolWithTag; 
  _ETHREAD *CurrentThread; 
  __int64 v15; 
  char v16; 
  int ObjectProperty; 
  int v18; 
  ULONG_PTR v19; 
  char v20; 
  __int64 v21; 
  _ETHREAD *v23; 
  ULONG_PTR v24; 
  int v25; 
  unsigned int v26; 
  WCHAR *v27; 
  size_t v28; 
  size_t v29; 
  char v30; 
  UINT8 v31; 
  unsigned int v32; 
  ULONG_PTR BugCheckParameter2; 
  PVOID v34; 
  PVOID v35; 
  PVOID v36; 
  int v37; 
  ULONG v38; 
  int v39; 
  HANDLE Handle; 
  WCHAR *v41; 
  PVOID P; 
  GUID Source2; 
  wchar_t Str2[40]; 
  __int16 v45[40]; 
  v34 = 0i64;
  Handle = 0i64;
  *SymbolicLinkName = 0i64;
  v7 = 0i64;
  v35 = 0i64;
  v8 = 0i64;
  LOBYTE(v37) = 0;
  P = 0i64;
  v9 = 0i64;
  v30 = 0;
  BugCheckParameter2 = 0i64;
  v36 = 0i64;
  v39 = 0;
  v38 = 0;
  v31 = UserModeFormat;
  v41 = ReferenceString;
  Source2 = 0i64;
  PnpStringFromGuid((int *)InterfaceClassGuid, Str2);
  DeviceInterfaceName = v11;
  if( v11 < 0 )
    goto LABEL_46;
  v32 = 512;
  PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x400ui64, 0x20207050ui64);
  *SymbolicLinkName = PoolWithTag;
  if( !PoolWithTag )
    goto LABEL_45;
  LODWORD(v28) = 512;
  DeviceInterfaceName = CmGetDeviceInterfaceName(
                          (__int64)&v32,
                          Str2,
                          DeviceInstanceName,
                          v41,
                          0,
                          PoolWithTag,
                          v28,
                          &v32);
  if( DeviceInterfaceName != -1073741789 )
    goto LABEL_4;
  ExFreePoolWithTag(*SymbolicLinkName, 0);
  v26 = v32;
  v27 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2i64 * v32, 0x20207050ui64);
  *SymbolicLinkName = v27;
  if( !v27 )
  {
LABEL_45:
    DeviceInterfaceName = -1073741670;
    goto LABEL_46;
  }
  LODWORD(v29) = v26;
  DeviceInterfaceName = CmGetDeviceInterfaceName((__int64)&v32, Str2, DeviceInstanceName, v41, 0, v27, v29, &v32);
LABEL_4:
  if( DeviceInterfaceName < 0 )
    goto LABEL_46;
  if( PdoFlags )
    *(_DWORD *)PdoFlags = PipCheckForDenyExecute(Str2) != 0 ? 0x800000 : 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v15 = -1i64;
  --*((_WORD *)CurrentThread + 242);
  ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
  if( (int)PiDmGetObject(3i64, *SymbolicLinkName, (INT64 *)&BugCheckParameter2) >= 0 )
  {
    v23 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v23 + 242);
    v24 = BugCheckParameter2;
    ExAcquirePushLockSharedEx(BugCheckParameter2, 0i64);
    v25 = *(_DWORD *)(v24 + 32);
    ExReleasePushLockEx(v24, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    v16 = v25 & 1;
  }
  else
  {
    v16 = v37;
  }
  DeviceInterfaceName = PiDmAddCacheReferenceForObject(4ui64, Str2, (CHAR **)&v36);
  if( DeviceInterfaceName < 0 )
    goto LABEL_27;
  DeviceInterfaceName = PiDmAddCacheReferenceForObject(1ui64, DeviceInstanceName, (CHAR **)&v35);
  if( DeviceInterfaceName < 0 )
    goto LABEL_27;
  ObjectProperty = PnpGetObjectProperty(
                     PiPnpRtlCtx,
                     (__int64)DeviceInstanceName,
                     1i64,
                     0i64,
                     0i64,
                     (__int64)&DEVPKEY_Device_ContainerId,
                     &v39,
                     (unsigned __int64)&Source2,
                     16,
                     &v38,
                     0);
  DeviceInterfaceName = ObjectProperty;
  if( ObjectProperty == -1073741275 )
  {
    Source2 = 0i64;
  }
  else if( ObjectProperty < 0 )
  {
    goto LABEL_27;
  }
  if( PnpIsNullGuid(&Source2)
    || (PnpStringFromGuid((int *)&Source2, (wchar_t *)v45), DeviceInterfaceName = v18, v18 >= 0)
    && (DeviceInterfaceName = PiDmAddCacheReferenceForObject(5ui64, (WCHAR *)v45, (CHAR **)&v34),
        DeviceInterfaceName >= 0) )
  {
    if( v16
      || (DeviceInterfaceName = PiPnpRtlBeginOperation((__int64 **)&P), DeviceInterfaceName >= 0)
      && (DeviceInterfaceName = CmCreateDeviceInterface(PiPnpRtlCtx, *SymbolicLinkName, 2, &Handle, &v30, 0),
          DeviceInterfaceName >= 0) )
    {
      v19 = BugCheckParameter2;
      if( BugCheckParameter2 )
      {
LABEL_22:
        PiDmListAddObject(0, (UINT64)v36, v19, 0i64);
        v20 = v30;
        do
          ++v15;
        while( DeviceInstanceName[v15] );
        DeviceInterfaceName = PnpSetObjectProperty(
                                PiPnpRtlCtx,
                                (__int64)*SymbolicLinkName,
                                3u,
                                (__int64)Handle,
                                0i64,
                                (__int64)&DEVPKEY_Device_InstanceId,
                                18,
                                (__int64)DeviceInstanceName,
                                2 * (int)v15 + 2,
                                v30 != 0 ? 0x20000 : 0);
        if( DeviceInterfaceName < 0 )
        {
          if( v20 )
            CmDeleteDeviceInterface(PiPnpRtlCtx, *SymbolicLinkName, 0);
        }
        else
        {
          PiDmListAddObject(1u, (UINT64)v35, v19, 0i64);
          if( v34 )
            PiDmListAddObject(2u, (UINT64)v34, v19, 0i64);
        }
        goto LABEL_27;
      }
      DeviceInterfaceName = PiDmGetObject(3i64, *SymbolicLinkName, (INT64 *)&BugCheckParameter2);
      if( DeviceInterfaceName >= 0 )
      {
        v19 = BugCheckParameter2;
        goto LABEL_22;
      }
    }
  }
LABEL_27:
  ExReleaseResourceLite(&PnpRegistryDeviceResource);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( DeviceInterfaceName >= 0 )
  {
    if( !v31 )
      DeviceInterfaceName = CmSetDeviceInterfacePathFormat(v21, *SymbolicLinkName, 1);
    v7 = (WCHAR **)v34;
    v8 = (WCHAR **)v35;
    v9 = (WCHAR **)v36;
    goto LABEL_31;
  }
  v7 = (WCHAR **)v34;
  v8 = (WCHAR **)v35;
  v9 = (WCHAR **)v36;
LABEL_46:
  if( *SymbolicLinkName )
  {
    ExFreePoolWithTag(*SymbolicLinkName, 0);
    *SymbolicLinkName = 0i64;
  }
LABEL_31:
  if( Handle )
    ZwClose(Handle);
  if( P )
    PiPnpRtlEndOperation(P);
  if( BugCheckParameter2 )
    PiDmObjectRelease((CHAR *)BugCheckParameter2);
  if( v9 )
  {
    PiDmRemoveCacheReferenceForObject(*((unsigned int *)v9 + 7), v9[2], v10);
    PiDmObjectRelease((CHAR *)v9);
  }
  if( v8 )
  {
    PiDmRemoveCacheReferenceForObject(*((unsigned int *)v8 + 7), v8[2], v10);
    PiDmObjectRelease((CHAR *)v8);
  }
  if( v7 )
  {
    PiDmRemoveCacheReferenceForObject(*((unsigned int *)v7 + 7), v7[2], v10);
    PiDmObjectRelease((CHAR *)v7);
  }
  return(unsigned int)DeviceInterfaceName;
}

Referenced by:

IoRegisterDeviceInterface
PiCMRegisterDeviceInterface
PiDevCfgConfigureDeviceInterfaces
PiSwIrpInterfaceRegister