IopBuildGlobalSymbolicLinkString

NTSTATUS __stdcall IopBuildGlobalSymbolicLinkString(_UNICODE_STRING *SymbolicLink, _UNICODE_STRING *GlobalString){
  wchar_t *PoolWithTag; 
  NTSTATUS DeviceInterfaceSymbolicLinkName; 
  __int64 v6; 
  _UNICODE_STRING *v7; 
  __int64 v9; 
  unsigned int v10; 
  WCHAR *OutString; 
  PoolWithTag = 0i64;
  OutString = 0i64;
  DeviceInterfaceSymbolicLinkName = PnpUnicodeStringToWstr(&OutString, 0i64, SymbolicLink);
  if( DeviceInterfaceSymbolicLinkName < 0 )
    goto LABEL_9;
  v10 = 512;
  PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x400ui64, 0x20207050ui64);
  if( !PoolWithTag )
    goto LABEL_15;
  DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(v6, OutString, PoolWithTag, 0x200u, &v10);
  if( DeviceInterfaceSymbolicLinkName != -1073741789 )
    goto LABEL_4;
  ExFreePoolWithTag(PoolWithTag, 0);
  PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 2i64 * v10, 0x20207050ui64);
  if( !PoolWithTag )
  {
LABEL_15:
    DeviceInterfaceSymbolicLinkName = -1073741670;
    goto LABEL_9;
  }
  DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(v9, OutString, PoolWithTag, v10, &v10);
LABEL_4:
  if( DeviceInterfaceSymbolicLinkName < 0 )
  {
    if( DeviceInterfaceSymbolicLinkName == -1073741773 )
      DeviceInterfaceSymbolicLinkName = -1073741811;
  }
  else if( 2 * v10 + 20 > 0xFFFF )
  {
    DeviceInterfaceSymbolicLinkName = -1073741675;
  }
  else
  {
    DeviceInterfaceSymbolicLinkName = IopAllocateUnicodeString(GlobalString, 2 * v10 + 20);
    if( DeviceInterfaceSymbolicLinkName < 0 )
      goto LABEL_9;
    DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, (PWCHAR)L"\\GLOBAL??\\");
    v7 = GlobalString;
    if( DeviceInterfaceSymbolicLinkName >= 0 )
    {
      DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, PoolWithTag);
      if( DeviceInterfaceSymbolicLinkName >= 0 )
        goto LABEL_9;
      v7 = GlobalString;
    }
    RtlFreeAnsiString(v7);
  }
LABEL_9:
  PnpUnicodeStringToWstrFree(OutString, SymbolicLink);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return DeviceInterfaceSymbolicLinkName;
}

Referenced by:

IopProcessSetInterfaceState