IopSymlinkProcessReparse

VOID __stdcall IopSymlinkProcessReparse(
        IRP *Irp,
        FILE_OBJECT *FileObject,
        REPARSE_DATA_BUFFER *ReparseBuffer,
        UINT8 StopOnSymlink){
  unsigned __int64 v4; 
  __int64 v7; 
  _ECP_LIST *v8; 
  int ECP; 
  UNICODE_STRING *MostRecentlyUsedName; 
  INT16 MatchingComponentsLengthR; 
  INT64 v12; 
  v4 = *((_QWORD *)Irp + 7);
  if( v4 - 2684354563u <= 0x16 && (v7 = 4194817i64, _bittest64(&v7, v4 - 2684354563u)) )
  {
    if( !StopOnSymlink )
      IopGraftName(Irp, FileObject, ReparseBuffer);
  }
  else if( v4 > 2 )
  {
    v8 = (_ECP_LIST *)*((_QWORD *)Irp + 14);
    v12 = 0i64;
    ECP = IopSymlinkGetECP(v8, (_RELATIVE_SYMLINK_INFO **)&v12);
    if( ECP < 0
      || (MostRecentlyUsedName = (UNICODE_STRING *)IopSymlinkGetMostRecentlyUsedName(v12),
          MatchingComponentsLengthR = IopFindMatchingComponentsLengthR(&FileObject->FileName, MostRecentlyUsedName + 1),
          ECP = IopSymlinkRememberJunction(MatchingComponentsLengthR, FileObject, (INT64)Irp, (UNICODE_STRING *)v12),
          ECP < 0) )
    {
      *((_DWORD *)Irp + 12) = ECP;
    }
  }
}

Referenced by:

IopParseDevice