IopSymlinkApplyToOpenedName
NTSTATUS __stdcall IopSymlinkApplyToOpenedName(
_FILE_OBJECT *FileObject,
_RELATIVE_SYMLINK_INFO *SymlinkInfo,
_REPARSE_DATA_BUFFER *ReparseBuffer,
_IRP *Irp,
PWCHAR OutBuffer,
UINT64 OutBufferLength){
wchar_t *Buffer;
VOID **PoolWithTag;
_UNICODE_STRING *p_FileName;
unsigned int Length;
unsigned __int16 v15;
int v16;
UINT64 PathStart;
UINT64 MaxLength;
Buffer = FileObject->FileName.Buffer;
PoolWithTag = ExAllocatePoolWithTag(1ui64, SymlinkInfo->OpenedName.Length, 1665560393i64);
if( !PoolWithTag )
return -1073741670;
p_FileName = &FileObject->FileName;
Length = FileObject->FileName.Length;
if( Length > 2 && FileObject->FileName.Buffer[((unsigned __int64)FileObject->FileName.Length >> 1) - 1] == 92 )
{
if( ReparseBuffer->Reserved < 2u )
{
ExFreePoolWithTag(PoolWithTag, 0);
return -1073741811;
}
p_FileName->Length = Length - 2;
ReparseBuffer->Reserved -= 2;
}
memmove(OutBuffer, SymlinkInfo->OpenedName.Buffer, SymlinkInfo->DeviceNameLength);
memmove(
PoolWithTag,
(char *)SymlinkInfo->OpenedName.Buffer + SymlinkInfo->DeviceNameLength,
SymlinkInfo->OpenedName.Length - SymlinkInfo->DeviceNameLength);
FileObject->FileName.Buffer = (wchar_t *)PoolWithTag;
v15 = SymlinkInfo->OpenedName.Length - SymlinkInfo->DeviceNameLength;
FileObject->FileName.MaximumLength = v15;
p_FileName->Length = v15;
ExFreePoolWithTag(Buffer, 0);
LODWORD(MaxLength) = OutBufferLength;
LODWORD(PathStart) = SymlinkInfo->DeviceNameLength >> 1;
v16 = IopReplaceSymlinkPath(
OutBuffer,
(unsigned int)PathStart,
FileObject,
ReparseBuffer,
PathStart,
SymlinkInfo->DeviceNameLength,
MaxLength);
if( v16 >= 0 )
return IopSymlinkUpdateECP(
Irp,
SymlinkInfo,
0,
p_FileName,
SymlinkInfo->DeviceNameLength,
SymlinkInfo->Flags & 0xFFFE);
ExFreePoolWithTag(OutBuffer, 0);
return v16;
}Referenced by:
IopGraftName