* You should have received a copy of the GNU Lesser General Public Licence
* along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
-#include <ntifs.h>
#include "btrfs_drv.h"
FAST_IO_DISPATCH FastIoDispatch;
TRACE("STUB: release_file_for_create_section\n");
}
-static BOOLEAN STDCALL fast_query_basic_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_BASIC_INFORMATION buf,
- PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+static BOOLEAN STDCALL fast_query_basic_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_BASIC_INFORMATION fbi,
+ PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ fcb* fcb;
+ ccb* ccb;
- TRACE("STUB: fast_query_basic_info\n");
+ TRACE("(%p, %u, %p, %p, %p)\n", FileObject, wait, fbi, IoStatus, DeviceObject);
- return FALSE;
+ if (!FileObject)
+ return FALSE;
+
+ fcb = FileObject->FsContext;
+
+ if (!fcb)
+ return FALSE;
+
+ ccb = FileObject->FsContext2;
+
+ if (!ccb)
+ return FALSE;
+
+ if (!(ccb->access & (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES)))
+ return FALSE;
+
+ if (fcb->ads) {
+ if (!ccb || !ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb)
+ return FALSE;
+
+ fcb = ccb->fileref->parent->fcb;
+ }
+
+ FsRtlEnterFileSystem();
+
+ if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+ FsRtlExitFileSystem();
+ return FALSE;
+ }
+
+ fbi->CreationTime.QuadPart = unix_time_to_win(&fcb->inode_item.otime);
+ fbi->LastAccessTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_atime);
+ fbi->LastWriteTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_mtime);
+ fbi->ChangeTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_ctime);
+ fbi->FileAttributes = fcb->atts;
+
+ IoStatus->Status = STATUS_SUCCESS;
+ IoStatus->Information = sizeof(FILE_BASIC_INFORMATION);
+
+ ExReleaseResourceLite(fcb->Header.Resource);
+
+ FsRtlExitFileSystem();
+
+ return TRUE;
}
-static BOOLEAN STDCALL fast_query_standard_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_STANDARD_INFORMATION buf,
- PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+static BOOLEAN STDCALL fast_query_standard_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_STANDARD_INFORMATION fsi,
+ PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ fcb* fcb;
+ ccb* ccb;
+ BOOL ads;
+ ULONG adssize;
- TRACE("STUB: fast_query_standard_info\n");
+ TRACE("(%p, %u, %p, %p, %p)\n", FileObject, wait, fsi, IoStatus, DeviceObject);
- return FALSE;
+ if (!FileObject)
+ return FALSE;
+
+ fcb = FileObject->FsContext;
+ ccb = FileObject->FsContext2;
+
+ if (!fcb)
+ return FALSE;
+
+ FsRtlEnterFileSystem();
+
+ if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+ FsRtlExitFileSystem();
+ return FALSE;
+ }
+
+ ads = fcb->ads;
+
+ if (ads) {
+ struct _fcb* fcb2;
+
+ if (!ccb || !ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb) {
+ ExReleaseResourceLite(fcb->Header.Resource);
+ FsRtlExitFileSystem();
+ return FALSE;
+ }
+
+ adssize = fcb->adsdata.Length;
+
+ fcb2 = ccb->fileref->parent->fcb;
+
+ ExReleaseResourceLite(fcb->Header.Resource);
+
+ fcb = fcb2;
+
+ if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+ FsRtlExitFileSystem();
+ return FALSE;
+ }
+
+ fsi->AllocationSize.QuadPart = fsi->EndOfFile.QuadPart = adssize;
+ fsi->NumberOfLinks = fcb->inode_item.st_nlink;
+ fsi->Directory = S_ISDIR(fcb->inode_item.st_mode);
+ } else {
+ fsi->AllocationSize.QuadPart = S_ISDIR(fcb->inode_item.st_mode) ? 0 : sector_align(fcb->inode_item.st_size, fcb->Vcb->superblock.sector_size);
+ fsi->EndOfFile.QuadPart = S_ISDIR(fcb->inode_item.st_mode) ? 0 : fcb->inode_item.st_size;
+ fsi->NumberOfLinks = fcb->inode_item.st_nlink;
+ fsi->Directory = S_ISDIR(fcb->inode_item.st_mode);
+ }
+
+ fsi->DeletePending = ccb->fileref ? ccb->fileref->delete_on_close : FALSE;
+
+ IoStatus->Status = STATUS_SUCCESS;
+ IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION);
+
+ ExReleaseResourceLite(fcb->Header.Resource);
+
+ FsRtlExitFileSystem();
+
+ return TRUE;
}
static BOOLEAN STDCALL fast_io_query_open(PIRP Irp, PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, PDEVICE_OBJECT DeviceObject) {
return FALSE;
}
-static NTSTATUS STDCALL fast_io_acquire_for_mod_write(PFILE_OBJECT FileObject, PLARGE_INTEGER EndingOffset, struct _ERESOURCE **ResourceToRelease, PDEVICE_OBJECT DeviceObject){
- TRACE("STUB: fast_io_acquire_for_mod_write\n");
- return STATUS_NOT_IMPLEMENTED;
+static NTSTATUS STDCALL fast_io_acquire_for_mod_write(PFILE_OBJECT FileObject, PLARGE_INTEGER EndingOffset, struct _ERESOURCE **ResourceToRelease, PDEVICE_OBJECT DeviceObject) {
+ fcb* fcb;
+
+ TRACE("(%p, %llx, %p, %p)\n", FileObject, EndingOffset->QuadPart, ResourceToRelease, DeviceObject);
+
+ fcb = FileObject->FsContext;
+
+ if (!fcb)
+ return STATUS_INVALID_PARAMETER;
+
+ *ResourceToRelease = fcb->Header.PagingIoResource;
+
+ if (!ExAcquireResourceSharedLite(*ResourceToRelease, FALSE))
+ return STATUS_CANT_WAIT;
+
+ return STATUS_SUCCESS;
}
static BOOLEAN STDCALL fast_io_read_compressed(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PVOID Buffer, PMDL *MdlChain, PIO_STATUS_BLOCK IoStatus, struct _COMPRESSED_DATA_INFO *CompressedDataInfo, ULONG CompressedDataInfoLength, PDEVICE_OBJECT DeviceObject){
static NTSTATUS STDCALL fast_io_acquire_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject){
TRACE("STUB: fast_io_acquire_for_ccflush\n");
- return STATUS_NOT_IMPLEMENTED;
+ return STATUS_SUCCESS;
}
static NTSTATUS STDCALL fast_io_release_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject){
TRACE("STUB: fast_io_release_for_ccflush\n");
- return STATUS_NOT_IMPLEMENTED;
+ return STATUS_SUCCESS;
+}
+
+#ifdef DEBUG
+static BOOLEAN STDCALL fast_io_read(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %x, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+
+ return FsRtlCopyRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_write(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %x, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+
+ return FsRtlCopyWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_mdl_read(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PMDL* MdlChain, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+
+ return FsRtlMdlReadDev(FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_mdl_read_complete(PFILE_OBJECT FileObject, PMDL* MdlChain, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %p)\n", FileObject, MdlChain, DeviceObject);
+
+ return FsRtlMdlReadCompleteDev(FileObject, MdlChain, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_prepare_mdl_write(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PMDL* MdlChain, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+
+ return FsRtlPrepareMdlWriteDev(FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
}
+static BOOLEAN STDCALL fast_io_mdl_write_complete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL* MdlChain, PDEVICE_OBJECT DeviceObject) {
+ TRACE("(%p, %p, %p, %p)\n", FileObject, FileOffset, MdlChain, DeviceObject);
+
+ return FsRtlMdlWriteCompleteDev(FileObject, FileOffset, MdlChain, DeviceObject);
+}
+#endif
+
void __stdcall init_fast_io_dispatch(FAST_IO_DISPATCH** fiod) {
RtlZeroMemory(&FastIoDispatch, sizeof(FastIoDispatch));
FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
FastIoDispatch.FastIoCheckIfPossible = fast_io_check_if_possible;
- FastIoDispatch.FastIoRead = FsRtlCopyRead;
- FastIoDispatch.FastIoWrite = FsRtlCopyWrite;
FastIoDispatch.FastIoQueryBasicInfo = fast_query_basic_info;
FastIoDispatch.FastIoQueryStandardInfo = fast_query_standard_info;
FastIoDispatch.FastIoLock = fast_io_lock;
FastIoDispatch.FastIoDetachDevice = fast_io_detach_device;
FastIoDispatch.FastIoQueryNetworkOpenInfo = fast_io_query_network_open_info;
FastIoDispatch.AcquireForModWrite = fast_io_acquire_for_mod_write;
- FastIoDispatch.MdlRead = FsRtlMdlReadDev;
- FastIoDispatch.MdlReadComplete = FsRtlMdlReadCompleteDev;
- FastIoDispatch.PrepareMdlWrite = FsRtlPrepareMdlWriteDev;
- FastIoDispatch.MdlWriteComplete = FsRtlMdlWriteCompleteDev;
FastIoDispatch.FastIoReadCompressed = fast_io_read_compressed;
FastIoDispatch.FastIoWriteCompressed = fast_io_write_compressed;
FastIoDispatch.MdlReadCompleteCompressed = fast_io_mdl_read_complete_compressed;
FastIoDispatch.AcquireForCcFlush = fast_io_acquire_for_ccflush;
FastIoDispatch.ReleaseForCcFlush = fast_io_release_for_ccflush;
+#ifdef DEBUG
+ FastIoDispatch.FastIoRead = fast_io_read;
+ FastIoDispatch.FastIoWrite = fast_io_write;
+ FastIoDispatch.MdlRead = fast_io_mdl_read;
+ FastIoDispatch.MdlReadComplete = fast_io_mdl_read_complete;
+ FastIoDispatch.PrepareMdlWrite = fast_io_prepare_mdl_write;
+ FastIoDispatch.MdlWriteComplete = fast_io_mdl_write_complete;
+#else
+ FastIoDispatch.FastIoRead = FsRtlCopyRead;
+ FastIoDispatch.FastIoWrite = FsRtlCopyWrite;
+ FastIoDispatch.MdlRead = FsRtlMdlReadDev;
+ FastIoDispatch.MdlReadComplete = FsRtlMdlReadCompleteDev;
+ FastIoDispatch.PrepareMdlWrite = FsRtlPrepareMdlWriteDev;
+ FastIoDispatch.MdlWriteComplete = FsRtlMdlWriteCompleteDev;
+#endif
+
*fiod = &FastIoDispatch;
-}
\ No newline at end of file
+}