Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 481 of file dirctl.c.
Referenced by NtfsFsdDirectoryControl().
{ PIRP Irp; //PDEVICE_OBJECT DeviceObject; //PDEVICE_EXTENSION DeviceExtension; //LONG BufferLength = 0; PUNICODE_STRING SearchPattern = NULL; //FILE_INFORMATION_CLASS FileInformationClass; ULONG FileIndex = 0; PUCHAR Buffer = NULL; PFILE_NAMES_INFORMATION Buffer0 = NULL; //PNTFS_FCB Fcb; PNTFS_CCB Ccb; // FCB TempFcb; BOOLEAN First = FALSE; PIO_STACK_LOCATION Stack; PFILE_OBJECT FileObject; //NTSTATUS Status = STATUS_SUCCESS; DPRINT1("NtfsQueryDirectory() called\n"); ASSERT(IrpContext); Irp = IrpContext->Irp; //DeviceObject = IrpContext->DeviceObject; //DeviceExtension = DeviceObject->DeviceExtension; Stack = IoGetCurrentIrpStackLocation(Irp); FileObject = Stack->FileObject; Ccb = (PNTFS_CCB)FileObject->FsContext2; //Fcb = (PNTFS_FCB)FileObject->FsContext; /* Obtain the callers parameters */ //BufferLength = Stack->Parameters.QueryDirectory.Length; SearchPattern = Stack->Parameters.QueryDirectory.FileName; //FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass; FileIndex = Stack->Parameters.QueryDirectory.FileIndex; if (SearchPattern != NULL) { if (!Ccb->DirectorySearchPattern) { First = TRUE; Ccb->DirectorySearchPattern = ExAllocatePoolWithTag(NonPagedPool, SearchPattern->Length + sizeof(WCHAR), TAG_NTFS); if (!Ccb->DirectorySearchPattern) { return(STATUS_INSUFFICIENT_RESOURCES); } memcpy(Ccb->DirectorySearchPattern, SearchPattern->Buffer, SearchPattern->Length); Ccb->DirectorySearchPattern[SearchPattern->Length / sizeof(WCHAR)] = 0; } } else if (!Ccb->DirectorySearchPattern) { First = TRUE; Ccb->DirectorySearchPattern = ExAllocatePoolWithTag(NonPagedPool, 2 * sizeof(WCHAR), TAG_NTFS); if (!Ccb->DirectorySearchPattern) { return(STATUS_INSUFFICIENT_RESOURCES); } Ccb->DirectorySearchPattern[0] = L'*'; Ccb->DirectorySearchPattern[1] = 0; } DPRINT("Search pattern '%S'\n", Ccb->DirectorySearchPattern); /* Determine directory index */ if (Stack->Flags & SL_INDEX_SPECIFIED) { Ccb->Entry = Ccb->CurrentByteOffset.u.LowPart; } else if (First || (Stack->Flags & SL_RESTART_SCAN)) { Ccb->Entry = 0; } /* Determine Buffer for result */ if (Irp->MdlAddress) { Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress); } else { Buffer = Irp->UserBuffer; } DPRINT("Buffer=%p tofind=%S\n", Buffer, Ccb->DirectorySearchPattern); #if 0 TempFcb.ObjectName = TempFcb.PathName; while (Status == STATUS_SUCCESS && BufferLength > 0) { Status = CdfsFindFile(DeviceExtension, &TempFcb, Fcb, Ccb->DirectorySearchPattern, &Ccb->Entry, NULL); DPRINT("Found %S, Status=%x, entry %x\n", TempFcb.ObjectName, Status, Ccb->Entry); if (NT_SUCCESS(Status)) { switch (FileInformationClass) { case FileNameInformation: Status = CdfsGetNameInformation(&TempFcb, DeviceExtension, (PFILE_NAMES_INFORMATION)Buffer, BufferLength); break; case FileDirectoryInformation: Status = CdfsGetDirectoryInformation(&TempFcb, DeviceExtension, (PFILE_DIRECTORY_INFORMATION)Buffer, BufferLength); break; case FileFullDirectoryInformation: Status = CdfsGetFullDirectoryInformation(&TempFcb, DeviceExtension, (PFILE_FULL_DIRECTORY_INFORMATION)Buffer, BufferLength); break; case FileBothDirectoryInformation: Status = NtfsGetBothDirectoryInformation(&TempFcb, DeviceExtension, (PFILE_BOTH_DIRECTORY_INFORMATION)Buffer, BufferLength); break; default: Status = STATUS_INVALID_INFO_CLASS; } if (Status == STATUS_BUFFER_OVERFLOW) { if (Buffer0) { Buffer0->NextEntryOffset = 0; } break; } } else { if (Buffer0) { Buffer0->NextEntryOffset = 0; } if (First) { Status = STATUS_NO_SUCH_FILE; } else { Status = STATUS_NO_MORE_FILES; } break; } Buffer0 = (PFILE_NAMES_INFORMATION)Buffer; Buffer0->FileIndex = FileIndex++; Ccb->Entry++; if (Stack->Flags & SL_RETURN_SINGLE_ENTRY) { break; } BufferLength -= Buffer0->NextEntryOffset; Buffer += Buffer0->NextEntryOffset; } #endif if (Buffer0) { Buffer0->NextEntryOffset = 0; } if (FileIndex > 0) { //Status = STATUS_SUCCESS; } // return(Status); return(STATUS_NO_MORE_FILES); }