⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dirctl.c

📁 I want to provide an example file system driver for Windows NT/2000/XP. For some time I have worked
💻 C
📖 第 1 页 / 共 3 页
字号:
            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 + -