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;
NTSTATUS v16;
UINT64 NewLength;
UINT64 MaxLength;
Buffer = FileObject->FileName.Buffer;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, SymlinkInfo->OpenedName.Length, 0x63466F49ui64);
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((UINT8 *)OutBuffer, (UINT8 *)SymlinkInfo->OpenedName.Buffer, SymlinkInfo->DeviceNameLength);
memmove(
(UINT8 *)PoolWithTag,
(UINT8 *)SymlinkInfo->OpenedName.Buffer + SymlinkInfo->DeviceNameLength,
SymlinkInfo->OpenedName.Length - (unsigned __int64)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(NewLength) = SymlinkInfo->DeviceNameLength >> 1;
v16 = IopReplaceSymlinkPath(
OutBuffer,
(unsigned int)NewLength,
FileObject,
ReparseBuffer,
NewLength,
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