IopSymlinkUpdateECP
INT64 __fastcall IopSymlinkUpdateECP(IRP *a1, VOID *a2, INT16 a3, const UNICODE_STRING *a4, INT16 a5, INT16 a6){
_RELATIVE_SYMLINK_INFO *v6;
UNICODE_STRING *v10;
__int64 Length;
INT16 v12;
_RELATIVE_SYMLINK_INFO *v13;
_RELATIVE_SYMLINK_INFO *i;
_RELATIVE_SYMLINK_INFO *PoolWithTag;
_RELATIVE_SYMLINK_INFO *v16;
INT16 v17;
int v19;
_RELATIVE_SYMLINK_INFO *SymlinkInfo;
PVOID v21;
PVOID EcpContext;
struct _ECP_LIST *ExtraCreateParameter;
EcpContext = a2;
v6 = (_RELATIVE_SYMLINK_INFO *)a2;
SymlinkInfo = 0i64;
ExtraCreateParameter = 0i64;
IoGetIrpExtraCreateParameter(a1, &ExtraCreateParameter);
IopSymlinkGetECP(ExtraCreateParameter, &SymlinkInfo);
Length = a4->Length;
v12 = a6;
if( v6->OpenedName.MaximumLength >= (unsigned __int16)Length )
{
RtlCopyUnicodeString(&v6->OpenedName, (UNICODE_STRING *)a4, v10);
}
else
{
v13 = SymlinkInfo;
v21 = 0i64;
if( SymlinkInfo == v6 )
{
IopSymlinkRemoveECP(ExtraCreateParameter, (_RELATIVE_SYMLINK_INFO **)&EcpContext);
v19 = IopSymlinkAllocateAndAddECP(a1, &v21, a4->Length);
if( v19 < 0 )
{
FsRtlFreeExtraCreateParameter(EcpContext);
return(unsigned int)v19;
}
v6 = (_RELATIVE_SYMLINK_INFO *)EcpContext;
v16 = (_RELATIVE_SYMLINK_INFO *)v21;
}
else
{
for( i = SymlinkInfo->InteriorMountPoint; i != v6; i = i->InteriorMountPoint )
v13 = i;
PoolWithTag = (_RELATIVE_SYMLINK_INFO *)ExAllocatePoolWithTag(PagedPool, Length + 32, 0x69536F49ui64);
v16 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
v13->InteriorMountPoint = PoolWithTag;
}
IopSymlinkInitializeSymlinkInfo(
(INT64)v16,
a4->Length + 32,
a4->Buffer,
a4->Length,
a3,
0i64,
0,
0,
v12,
(INT64)v6->InteriorMountPoint);
if( v6 == v13 )
{
v6->InteriorMountPoint = 0i64;
FsRtlFreeExtraCreateParameter(v6);
}
else
{
ExFreePoolWithTag(v6, 0x69536F49u);
}
v6 = v16;
}
v17 = a5;
v6->Flags = v12;
v6->DeviceNameLength = v17;
v6->ExposedNamespaceLength = a3;
if( (v6->Flags & 1) == 0 )
IopSymlinkFreeRelatedMountPointChain((INT64)v6);
return 0i64;
}Referenced by:
IopGraftName
IopParseDevice
IopSymlinkApplyToOpenedName
IopSymlinkRememberJunction