IopDeviceObjectFromSymbolicName

_DEVICE_OBJECT *__stdcall IopDeviceObjectFromSymbolicName(_UNICODE_STRING *SymbolicLinkName){
  _DEVICE_OBJECT *v1; 
  VOID **PoolWithTag; 
  WCHAR *v4; 
  NTSTATUS ObjectProperty; 
  _UNICODE_STRING DestinationString; 
  INT64 v8; 
  INT64 v9; 

  v1 = 0i64;
  LODWORD(v8) = 0;
  v9 = 0i64;
  DestinationString = 0i64;
  if( SymbolicLinkName )
  {
    if( SymbolicLinkName->Buffer )
    {
      if( SymbolicLinkName->Length )
      {
        if( (int)PnpUnicodeStringToWstr((__int16 **)&v9, 0i64, &SymbolicLinkName->Length) >= 0 )
        {
          PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x190ui64, 1198550608i64);
          v4 = (WCHAR *)PoolWithTag;
          if( PoolWithTag )
          {
            ObjectProperty = PnpGetObjectProperty(
                               *(&stru_140CF2E80 + 1214),
                               v9,
                               3i64,
                               0i64,
                               0i64,
                               (INT64)&DEVPKEY_Device_InstanceId,
                               (INT64)&v8,
                               (INT64)PoolWithTag);
            PnpUnicodeStringToWstrFree((void *)v9, (__int64)SymbolicLinkName);
            if( ObjectProperty >= 0 && (_DWORD)v8 == 18 && RtlInitUnicodeStringEx(&DestinationString, v4) >= 0 )
              v1 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag((__int64)&DestinationString, 0x746C6644u);
            ExFreePoolWithTag(v4, 0x47706E50u);
          }
        }
      }
    }
  }
  return v1;
}

Referenced by:

IopGetSessionIdFromSymbolicName