diff --git a/src/sys/driver.h b/src/sys/driver.h index c39b1e04..7ad3d42e 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -643,7 +643,6 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode) if (0 == RefCount) FspFileNodeDelete(FileNode); } -VOID FspFileNodeSetExternalFileName(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); @@ -655,6 +654,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PBOOLEAN PDeletePending); +VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, diff --git a/src/sys/file.c b/src/sys/file.c index 16c8b0e4..2431c4eb 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -9,7 +9,6 @@ NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, ULONG ExtraSize, FSP_FILE_NODE **PFileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); -VOID FspFileNodeSetExternalFileName(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); @@ -21,6 +20,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PBOOLEAN PDeletePending); +VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, @@ -33,7 +33,6 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFileNodeCreate) #pragma alloc_text(PAGE, FspFileNodeDelete) -#pragma alloc_text(PAGE, FspFileNodeSetExternalFileName) #pragma alloc_text(PAGE, FspFileNodeAcquireSharedF) #pragma alloc_text(PAGE, FspFileNodeTryAcquireSharedF) #pragma alloc_text(PAGE, FspFileNodeAcquireExclusiveF) @@ -43,6 +42,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); #pragma alloc_text(PAGE, FspFileNodeReleaseOwnerF) #pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeClose) +#pragma alloc_text(PAGE, FspFileNodeRename) #pragma alloc_text(PAGE, FspFileNodeGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeSetFileInfo) @@ -112,17 +112,6 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode) FspFree(FileNode); } -VOID FspFileNodeSetExternalFileName(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName) -{ - PAGED_CODE(); - - if (0 != FileNode->ExternalFileName) - FspFree(FileNode->ExternalFileName); - - FileNode->FileName = *NewFileName; - FileNode->ExternalFileName = NewFileName->Buffer; -} - VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -372,6 +361,30 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, *PDeletePending = Deleted && DeletePending; } +VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName) +{ + PAGED_CODE(); + + PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; + BOOLEAN Deleted, Inserted; + + FspFsvolDeviceLockContextTable(FsvolDeviceObject); + + FspFsvolDeviceDeleteContextByName(FsvolDeviceObject, &FileNode->FileName, &Deleted); + ASSERT(Deleted); + + if (0 != FileNode->ExternalFileName) + FspFree(FileNode->ExternalFileName); + FileNode->FileName = *NewFileName; + FileNode->ExternalFileName = NewFileName->Buffer; + + FspFsvolDeviceInsertContextByName(FsvolDeviceObject, &FileNode->FileName, FileNode, + &FileNode->ContextByNameElementStorage, &Inserted); + ASSERT(Inserted); + + FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); +} + VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo) { PAGED_CODE(); diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index e02057d8..2a62ea49 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -884,21 +884,13 @@ NTSTATUS FspFsvolSetRenameInformationSuccess( FSP_FILE_NODE *FileNode = FileObject->FsContext; FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); UNICODE_STRING NewFileName; - BOOLEAN Deleted, Inserted; NewFileName.Length = NewFileName.MaximumLength = Request->Req.SetInformation.Info.Rename.NewFileName.Size - sizeof(WCHAR); NewFileName.Buffer = FspAllocMustSucceed(NewFileName.Length); RtlCopyMemory(NewFileName.Buffer, Request->Buffer + Request->FileName.Size, NewFileName.Length); - FspFsvolDeviceLockContextTable(FsvolDeviceObject); - FspFsvolDeviceDeleteContextByName(FsvolDeviceObject, &FileNode->FileName, &Deleted); - ASSERT(Deleted); - FspFileNodeSetExternalFileName(FileNode, &NewFileName); - FspFsvolDeviceInsertContextByName(FsvolDeviceObject, &FileNode->FileName, FileNode, - &FileNode->ContextByNameElementStorage, &Inserted); - ASSERT(Inserted); - FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); + FspFileNodeRename(FileNode, &NewFileName); FspIopRequestContext(Request, RequestFileNode) = 0; FspIopRequestContext(Request, RequestDeviceObject) = 0;