IopSymlinkUpdateECP
NTSTATUS __stdcall IopSymlinkUpdateECP(
PIRP Irp,
VOID *SymlinkInfoToUpdate,
UINT16 MountPointLength,
_UNICODE_STRING *OpenedName,
UINT16 DeviceNameLength,
UINT16 Flags){
_RELATIVE_SYMLINK_INFO *v6;
__int64 Length;
UINT16 v11;
_RELATIVE_SYMLINK_INFO *v12;
_RELATIVE_SYMLINK_INFO *i;
VOID **PoolWithTag;
_RELATIVE_SYMLINK_INFO *v15;
UINT16 v16;
int v18;
VOID *SymlinkInfo;
_RELATIVE_SYMLINK_INFO *v20;
_RELATIVE_SYMLINK_INFO *v21;
struct _ECP_LIST *ExtraCreateParameter;
v21 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfoToUpdate;
v6 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfoToUpdate;
SymlinkInfo = 0i64;
ExtraCreateParameter = 0i64;
IoGetIrpExtraCreateParameter(Irp, &ExtraCreateParameter);
IopSymlinkGetECP(ExtraCreateParameter, &SymlinkInfo);
Length = OpenedName->Length;
v11 = Flags;
if( v6->OpenedName.MaximumLength >= (unsigned __int16)Length )
{
RtlCopyUnicodeString(&v6->OpenedName, OpenedName);
}
else
{
v12 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfo;
v20 = 0i64;
if( SymlinkInfo == v6 )
{
IopSymlinkRemoveECP(ExtraCreateParameter, &v21);
v18 = IopSymlinkAllocateAndAddECP(Irp, &v20, OpenedName->Length);
if( v18 < 0 )
{
FsRtlFreeExtraCreateParameter(v21);
return v18;
}
v6 = v21;
v15 = v20;
}
else
{
for( i = (_RELATIVE_SYMLINK_INFO *)*((_QWORD *)SymlinkInfo + 1); i != v6; i = i->InteriorMountPoint )
v12 = i;
PoolWithTag = ExAllocatePoolWithTag(1ui64, Length + 32, 1767075657i64);
v15 = (_RELATIVE_SYMLINK_INFO *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
v12->InteriorMountPoint = (_RELATIVE_SYMLINK_INFO *)PoolWithTag;
}
IopSymlinkInitializeSymlinkInfo(
v15,
(unsigned int)OpenedName->Length + 32,
OpenedName->Buffer,
OpenedName->Length,
MountPointLength,
0i64,
0,
0,
v11,
v6->InteriorMountPoint);
if( v6 == v12 )
{
v6->InteriorMountPoint = 0i64;
FsRtlFreeExtraCreateParameter(v6);
}
else
{
ExFreePoolWithTag(v6, 0x69536F49u);
}
v6 = v15;
}
v16 = DeviceNameLength;
v6->Flags = v11;
v6->DeviceNameLength = v16;
v6->ExposedNamespaceLength = MountPointLength;
if( (v6->Flags & 1) == 0 )
IopSymlinkFreeRelatedMountPointChain(v6);
return 0;
}Referenced by:
IopGraftName
IopParseDevice
IopSymlinkApplyToOpenedName
IopSymlinkRememberJunction