使用NT本机功能NtCreateFile
,可以使用FILE_OPEN_BY_FILE_ID
创建选项通过ID打开文件。但是,这样做会忽略DELETE
访问标志。如果我设置了该文件,它将正常打开,但是任何删除或重命名文件的尝试都将失败(例如,通过设置FILE_DELETE_ON_CLOSE
或将FILE_RENAME_INFORMATION
类与NtSetInformationFile
结合使用)。
是否无法删除以这种方式打开的文件?还有其他删除ID而不是名称的文件的方法吗?
我正在寻找ntfs-4源代码并在code中查看下一个NtfsSetRenameInfo
的说法>>
// // Do a quick check that the caller is allowed to do the rename. // The opener must have opened the main data stream by name and this can't be // a system file. // if (!FlagOn( Ccb->Flags, CCB_FLAG_OPEN_AS_FILE ) || (Lcb == NULL) || (NtfsSegmentNumber( &Fcb->FileReference ) < FIRST_USER_FILE_NUMBER)) { DebugTrace( -1, Dbg, ("NtfsSetRenameInfo: Exit -> %08lx\n", STATUS_INVALID_PARAMETER) ); return STATUS_INVALID_PARAMETER; }
FileDispositionInformation
和FILE_DELETE_ON_CLOSE
选项(1)的相同情况
if (FlagOn( Ccb->Flags, CCB_FLAG_DELETE_ON_CLOSE )) { if (FlagOn( Ccb->Flags, CCB_FLAG_OPEN_AS_FILE )) {
因此,如果未在文件上设置
CCB_FLAG_OPEN_AS_FILE
,则ntfs出于某种原因将不允许重命名或删除文件。 (按ID打开文件时未设置)
除了RbMm的答案,我还找到了Alex Carp的博客文章Some Limitations Using Files Opened By ID,它解释了这样做的理由。