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