IopBuildGlobalSymbolicLinkString

NTSTATUS __stdcall IopBuildGlobalSymbolicLinkString(
        _UNICODE_STRING *SymbolicLink,
        _UNICODE_STRING *GlobalString,
        INT64 a3,
        UINT64 a4){
  VOID **PoolWithTag; 
  NTSTATUS DeviceInterfaceSymbolicLinkName; 
  WCHAR *v8; 
  _UNICODE_STRING *v9; 
  WCHAR *v11; 
  WCHAR *SymbolicLinkName; 

  PoolWithTag = 0i64;
  SymbolicLinkName = 0i64;
  DeviceInterfaceSymbolicLinkName = PnpUnicodeStringToWstr((__int16 **)&SymbolicLinkName, 0i64, &SymbolicLink->Length);
  if( DeviceInterfaceSymbolicLinkName < 0 )
    goto LABEL_8;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
  if( !PoolWithTag )
    goto LABEL_13;
  DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(
                                      v8,
                                      SymbolicLinkName,
                                      (UINT64)PoolWithTag,
                                      (UINT64 *)0x200);
  if( DeviceInterfaceSymbolicLinkName != -1073741789 )
    goto LABEL_4;
  ExFreePoolWithTag(PoolWithTag, 0);
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
  if( !PoolWithTag )
  {
LABEL_13:
    DeviceInterfaceSymbolicLinkName = -1073741670;
    goto LABEL_8;
  }
  DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(
                                      v11,
                                      SymbolicLinkName,
                                      (UINT64)PoolWithTag,
                                      (UINT64 *)0x200);
LABEL_4:
  if( DeviceInterfaceSymbolicLinkName < 0 )
  {
    if( DeviceInterfaceSymbolicLinkName == -1073741773 )
      DeviceInterfaceSymbolicLinkName = -1073741811;
  }
  else
  {
    DeviceInterfaceSymbolicLinkName = IopAllocateUnicodeString(GlobalString, 0x414u);
    if( DeviceInterfaceSymbolicLinkName < 0 )
      goto LABEL_8;
    DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, (WCHAR *)L"\\GLOBAL??\\");
    v9 = GlobalString;
    if( DeviceInterfaceSymbolicLinkName >= 0 )
    {
      DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, (WCHAR *)PoolWithTag);
      if( DeviceInterfaceSymbolicLinkName >= 0 )
        goto LABEL_8;
      v9 = GlobalString;
    }
    RtlFreeAnsiString(v9);
  }
LABEL_8:
  PnpUnicodeStringToWstrFree(SymbolicLinkName, (__int64)SymbolicLink);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return DeviceInterfaceSymbolicLinkName;
}

Referenced by:

IopProcessSetInterfaceState