632 Irp = IrpContext->Irp;
637 fi = IoStackLocation->
Parameters.QueryDirectory.FileInformationClass;
643 FileIndex = IoStackLocation->
Parameters.QueryDirectory.FileIndex;
648 IoStackLocation)->
Parameters.QueryDirectory.FileInformationClass;
651 IoStackLocation)->
Parameters.QueryDirectory.Length;
654 IoStackLocation)->
Parameters.QueryDirectory.FileName;
657 IoStackLocation)->
Parameters.QueryDirectory.FileIndex;
686 FcbResourceAcquired =
TRUE;
690 if (
Ccb->DirectorySearchPattern.Buffer !=
NULL) {
698 Ccb->DirectorySearchPattern.Length =
699 Ccb->DirectorySearchPattern.MaximumLength =
702 Ccb->DirectorySearchPattern.Buffer =
706 if (
Ccb->DirectorySearchPattern.Buffer ==
NULL) {
707 DEBUG(
DL_ERR, (
"Ex2QueryDirectory: failed to allocate SerarchPattern.\n"));
713 Ccb->DirectorySearchPattern.Buffer,
714 Ccb->DirectorySearchPattern.MaximumLength);
717 &(
Ccb->DirectorySearchPattern),
726 }
else if (
Ccb->DirectorySearchPattern.Buffer !=
NULL) {
735 Ccb->DirectorySearchPattern.Length =
736 Ccb->DirectorySearchPattern.MaximumLength = 2;
738 Ccb->DirectorySearchPattern.Buffer =
741 if (
Ccb->DirectorySearchPattern.Buffer ==
NULL) {
742 DEBUG(
DL_ERR, (
"Ex2QueryDirectory: failed to allocate SerarchPattern (1st).\n"));
748 Ccb->DirectorySearchPattern.Buffer,
749 Ccb->DirectorySearchPattern.MaximumLength);
753 Ccb->DirectorySearchPattern.Buffer,
757 if (IndexSpecified) {
758 Ccb->filp.f_pos = FileIndex;
761 Ccb->filp.f_pos = FileIndex = 0;
769 fc.efc_irp = IrpContext;
777 #ifdef EXT2_HTREE_INDEX 785 if (rc != ERR_BAD_DX_DIR) {
796 if (
Mcb->Inode.i_size <=
Ccb->filp.f_pos) {
808 DEBUG(
DL_ERR, (
"Ex2QueryDirectory: failed to allocate pDir.\n"));
816 DEBUG(
DL_CP, (
"Ex2QueryDirectory: Dir: %wZ Index=%xh Pattern : %wZ.\n",
817 &
Fcb->
Mcb->FullName, FileIndex, &
Ccb->DirectorySearchPattern));
819 while ((ByteOffset < Mcb->Inode.i_size) &&
839 if (pDir->rec_len == 0) {
846 goto ProcessNextEntry;
850 if ((pDir->name_len == 1 && pDir->name[0] ==
'.') ||
851 (pDir->name_len == 2 && pDir->name[0] ==
'.' && pDir->name[1] ==
'.' )) {
852 goto ProcessNextEntry;
855 Oem.Buffer = pDir->name;
856 Oem.Length = (pDir->name_len & 0xff);
857 Oem.MaximumLength = Oem.Length;
860 goto ProcessNextEntry;
866 DEBUG(
DL_CP, (
"Ext2QueryDirectory: failed to count unicode length for inode: %xh\n",
889 "allocate InodeFileName.\n"));
901 DEBUG(
DL_ERR, (
"Ex2QueryDirectory: Ext2OEMtoUnicode failed with %xh.\n",
Status));
906 DEBUG(
DL_CP, (
"Ex2QueryDirectory: process inode: %xh / %wZ (%d).\n",
907 pDir->inode, &Unicode, Unicode.
Length));
910 &(
Ccb->DirectorySearchPattern)) ?
912 &(
Ccb->DirectorySearchPattern),
917 &(
Ccb->DirectorySearchPattern),
945 if (
fc.efc_start == 0) {
975 }
else if (!
fc.efc_start) {
989 if (FcbResourceAcquired) {
1003 if (!IrpContext->ExceptionInProgress) {
1019 IrpContext->Irp->IoStatus.Information =
fc.efc_start;
struct _EXT2_FCB * PEXT2_FCB
BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBuffer)
#define IRP_CONTEXT_FLAG_WAIT
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IsMcbDirectory(Mcb)
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ BOOLEAN _In_ ULONG _In_opt_ PULONG _In_ BOOLEAN RestartScan
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
#define SL_INDEX_SPECIFIED
#define DEC_MEM_COUNT(_i, _p, _s)
IN BOOLEAN OUT PSTR Buffer
#define CEILING_ALIGNED(T, A, B)
#define STATUS_INVALID_PARAMETER
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ BOOLEAN ReturnSingleEntry
#define STATUS_INVALID_DEVICE_REQUEST
NTSTATUS Ext2LockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
BOOLEAN NTAPI FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
_In_ PDEVICE_OBJECT DeviceObject
int ext3_dx_readdir(struct file *filp, filldir_t filldir, void *context)
NTFSIDENTIFIER Identifier
#define STATUS_NOT_A_DIRECTORY
NTSTATUS Ext2QueueRequest(IN PEXT2_IRP_CONTEXT IrpContext)
NTSTATUS Ext2ProcessEntry(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_FCB Dcb, IN FILE_INFORMATION_CLASS FileInformationClass, IN ULONG in, IN PVOID Buffer, IN ULONG UsedLength, IN ULONG Length, IN ULONG FileIndex, IN PUNICODE_STRING pName, OUT PULONG EntrySize, IN BOOLEAN Single)
#define STATUS_INVALID_USER_BUFFER
#define IsFileDeleted(Mcb)
#define INC_MEM_COUNT(_i, _p, _s)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
ULONG Ext2OEMToUnicodeSize(IN PEXT2_VCB Vcb, IN PANSI_STRING Oem)
#define EXT3_HAS_COMPAT_FEATURE(sb, mask)
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
static int Ext2FillEntry(void *context, const char *name, int namlen, ULONG offset, __u32 ino, unsigned int d_type)
_Must_inspect_result_ _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
#define STATUS_NO_MORE_FILES
#define IsMcbSymLink(Mcb)
#define STATUS_ACCESS_DENIED
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define STATUS_UNSUCCESSFUL
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
NTSTATUS Ext2CompleteIrpContext(IN PEXT2_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
NTSTATUS Ext2OEMToUnicode(IN PEXT2_VCB Vcb, IN OUT PUNICODE_STRING Oem, IN POEM_STRING Unicode)
#define EXT2_DENTRY_MAGIC
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
struct _FileName FileName
#define SL_RETURN_SINGLE_ENTRY
#define EXT3_FEATURE_COMPAT_DIR_INDEX
#define STATUS_BUFFER_OVERFLOW
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
#define STATUS_NO_SUCH_FILE
UNICODE_STRING * PUNICODE_STRING
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define VCB_VOLUME_LOCKED
static unsigned ext3_rec_len_from_disk(__le16 dlen)
#define STATUS_VOLUME_DISMOUNTED
#define IsExt2FsDevice(DO)
#define RtlZeroMemory(Destination, Length)
VOID Ext2FreePool(IN PVOID P, IN ULONG Tag)
#define RtlCopyMemory(Destination, Source, Length)
struct _EXT2_VCB * PEXT2_VCB
BOOLEAN Ext2IsWearingCloak(IN PEXT2_VCB Vcb, IN POEM_STRING OemName)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
struct _EXT2_CCB * PEXT2_CCB
PVOID Ext2AllocatePool(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
PVOID Ext2GetUserBuffer(IN PIRP Irp)
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset