IopSymlinkProcessReparse

VOID __stdcall IopSymlinkProcessReparse(
        PIRP Irp,
        _FILE_OBJECT *FileObject,
        _REPARSE_DATA_BUFFER *ReparseBuffer,
        UINT8 StopOnSymlink,
        INT64 a5){
  unsigned __int64 Information; 
  __int64 v8; 
  _ECP_LIST *UserBuffer; 
  int ECP; 
  _RELATIVE_SYMLINK_INFO *MostRecentlyUsedName; 
  UINT16 MatchingComponentsLengthR; 
  VOID *SymlinkInfo; 

  Information = Irp->IoStatus.Information;
  if( Information - 2684354563u <= 0x16 && (v8 = 4194817i64, _bittest64(&v8, Information - 2684354563u)) )
  {
    if( !StopOnSymlink )
      IopGraftName(Irp, FileObject, ReparseBuffer);
  }
  else if( Information > 2 )
  {
    UserBuffer = (_ECP_LIST *)Irp->UserBuffer;
    SymlinkInfo = 0i64;
    ECP = IopSymlinkGetECP(UserBuffer, &SymlinkInfo);
    if( ECP < 0
      || (MostRecentlyUsedName = IopSymlinkGetMostRecentlyUsedName((_RELATIVE_SYMLINK_INFO *)SymlinkInfo),
          MatchingComponentsLengthR = IopFindMatchingComponentsLengthR(
                                        &FileObject->FileName,
                                        &MostRecentlyUsedName->OpenedName),
          ECP = IopSymlinkRememberJunction(MatchingComponentsLengthR, FileObject, Irp, (_UNICODE_STRING *)SymlinkInfo),
          ECP < 0) )
    {
      Irp->IoStatus.Status = ECP;
    }
  }
}

Referenced by:

IopParseDevice