📄 dirctl.c
字号:
if (Length - UsedLength < QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR))
{
if (!UsedLength)
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
Status = STATUS_SUCCESS;
}
__leave;
}
InodeFileName.Length =
InodeFileName.MaximumLength =
InodeFileNameLength * 2;
InodeFileName.Buffer = FsdAllocatePool(
NonPagedPool,
InodeFileNameLength * 2,
'5iDR'
);
FsdCharToWchar(
InodeFileName.Buffer,
Inode->name,
InodeFileNameLength
);
if (FsRtlDoesNameContainWildCards(FileName) ?
FsRtlIsNameInExpression(
FileName,
&InodeFileName,
TRUE,
NULL
) :
!RtlCompareUnicodeString(
FileName,
&InodeFileName,
TRUE
)
)
{
switch (FileInformationClass)
{
case FileDirectoryInformation:
{
PFILE_DIRECTORY_INFORMATION Buffer;
Buffer = (PFILE_DIRECTORY_INFORMATION)
(UserBuffer + UsedLength);
/*
typedef struct _FILE_DIRECTORY_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
*/
Buffer->FileIndex = FileIndex;
Buffer->CreationTime.QuadPart = 0;
Buffer->LastAccessTime.QuadPart = 0;
Buffer->LastWriteTime.QuadPart = 0;
Buffer->ChangeTime.QuadPart = 0;
Buffer->EndOfFile.QuadPart =
be32_to_cpu(Inode->size);
Buffer->AllocationSize.QuadPart =
be32_to_cpu(Inode->size);
Buffer->FileAttributes = FILE_ATTRIBUTE_NORMAL;
if (FlagOn(be32_to_cpu(Inode->next), ROMFH_DIR))
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_DIRECTORY
);
}
#ifndef FSD_RO
if (FlagOn(Vcb->Flags, VCB_READ_ONLY))
#endif
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_READONLY
);
}
Buffer->FileNameLength = InodeFileNameLength * 2;
RtlCopyMemory(
Buffer->FileName,
InodeFileName.Buffer,
InodeFileNameLength * 2
);
UsedLength += QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR);
if (!ReturnSingleEntry)
{
Buffer->NextEntryOffset = QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR) +
UsedLength % 8;
}
else
{
Buffer->NextEntryOffset = 0;
}
UsedLength += UsedLength % 8;
NextEntryOffset = &Buffer->NextEntryOffset;
}
break;
case FileFullDirectoryInformation:
{
PFILE_FULL_DIR_INFORMATION Buffer;
Buffer = (PFILE_FULL_DIR_INFORMATION)
(UserBuffer + UsedLength);
/*
typedef struct _FILE_FULL_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaSize;
WCHAR FileName[1];
} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
*/
Buffer->FileIndex = FileIndex;
Buffer->CreationTime.QuadPart = 0;
Buffer->LastAccessTime.QuadPart = 0;
Buffer->LastWriteTime.QuadPart = 0;
Buffer->ChangeTime.QuadPart = 0;
Buffer->EndOfFile.QuadPart =
be32_to_cpu(Inode->size);
Buffer->AllocationSize.QuadPart =
be32_to_cpu(Inode->size);
Buffer->FileAttributes = FILE_ATTRIBUTE_NORMAL;
if (FlagOn(be32_to_cpu(Inode->next), ROMFH_DIR))
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_DIRECTORY
);
}
#ifndef FSD_RO
if (FlagOn(Vcb->Flags, VCB_READ_ONLY))
#endif
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_READONLY
);
}
Buffer->FileNameLength = InodeFileNameLength * 2;
Buffer->EaSize = 0;
RtlCopyMemory(
Buffer->FileName,
InodeFileName.Buffer,
InodeFileNameLength * 2
);
UsedLength += QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR);
if (!ReturnSingleEntry)
{
Buffer->NextEntryOffset = QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR) +
UsedLength % 8;
}
else
{
Buffer->NextEntryOffset = 0;
}
UsedLength += UsedLength % 8;
NextEntryOffset = &Buffer->NextEntryOffset;
}
break;
case FileBothDirectoryInformation:
{
PFILE_BOTH_DIR_INFORMATION Buffer;
Buffer = (PFILE_BOTH_DIR_INFORMATION)
(UserBuffer + UsedLength);
/*
typedef struct _FILE_BOTH_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaSize;
CCHAR ShortNameLength;
WCHAR ShortName[12];
WCHAR FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
*/
Buffer->FileIndex = FileIndex;
Buffer->CreationTime.QuadPart = 0;
Buffer->LastAccessTime.QuadPart = 0;
Buffer->LastWriteTime.QuadPart = 0;
Buffer->ChangeTime.QuadPart = 0;
Buffer->EndOfFile.QuadPart =
be32_to_cpu(Inode->size);
Buffer->AllocationSize.QuadPart =
be32_to_cpu(Inode->size);
Buffer->FileAttributes = FILE_ATTRIBUTE_NORMAL;
if (FlagOn(be32_to_cpu(Inode->next), ROMFH_DIR))
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_DIRECTORY
);
}
#ifndef FSD_RO
if (FlagOn(Vcb->Flags, VCB_READ_ONLY))
#endif
{
SetFlag(
Buffer->FileAttributes,
FILE_ATTRIBUTE_READONLY
);
}
Buffer->FileNameLength = InodeFileNameLength * 2;
Buffer->EaSize = 0;
// TODO: Present a short alias
// Here we would like to use RtlGenerate8dot3Name but
// I don't know how to use the argument
// PGENERATE_NAME_CONTEXT
// Buffer->ShortNameLength
// Buffer->ShortName
RtlCopyMemory(
Buffer->FileName,
InodeFileName.Buffer,
InodeFileNameLength * 2
);
UsedLength += QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR);
if (!ReturnSingleEntry)
{
Buffer->NextEntryOffset = QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR) +
UsedLength % 8;
}
else
{
Buffer->NextEntryOffset = 0;
}
UsedLength += UsedLength % 8;
NextEntryOffset = &Buffer->NextEntryOffset;
}
break;
case FileNamesInformation:
{
PFILE_NAMES_INFORMATION Buffer;
Buffer = (PFILE_NAMES_INFORMATION)
(UserBuffer + UsedLength);
/*
typedef struct _FILE_NAMES_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
*/
Buffer->FileIndex = FileIndex;
Buffer->FileNameLength = InodeFileNameLength * 2;
RtlCopyMemory(
Buffer->FileName,
InodeFileName.Buffer,
InodeFileNameLength * 2
);
UsedLength += QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR);
if (!ReturnSingleEntry)
{
Buffer->NextEntryOffset = QueryBlockLength +
InodeFileNameLength * 2 - sizeof(WCHAR) +
UsedLength % 8;
}
else
{
Buffer->NextEntryOffset = 0;
}
UsedLength += UsedLength % 8;
NextEntryOffset = &Buffer->NextEntryOffset;
}
break;
#if (VER_PRODUCTBUILD >= 2600)
case FileIdFullDirectoryInformation:
{
PFILE_ID_FULL_DIR_INFORMATION Buffer;
Buffer = (PFILE_ID_FULL_DIR_INFORMATION)
(UserBuffer + UsedLength);
/*
typedef struct _FILE_ID_FULL_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaSize;
LARGE_INTEGER FileId;
WCHAR FileName[1];
} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
*/
Buffer->FileIndex = FileIndex;
Buffer->CreationTime.QuadPart = 0;
Buffer->LastAccessTime.QuadPart = 0;
Buffer->LastWriteTime.QuadPart = 0;
Buffer->ChangeTime.QuadPart = 0;
Buffer->EndOfFile.QuadPart =
be32_to_cpu(Inode->size);
Buffer->AllocationSize.QuadPart =
be32_to_cpu(Inode->size);
Buffer->FileAttributes = FILE_ATTRIBUTE_NORMAL;
if (FlagOn(be32_to_cpu(Inode->next), ROMFH_DIR))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -