我想使用文件的现有句柄或使用文件ID来打开文件的备用数据流。我发现的唯一方法是全名(文件名+ ADS名称)。 我担心在操作过程中文件被重命名。从文件句柄或文件ID打开备用数据流(ADS)
有没有办法做到这一点?
我想使用文件的现有句柄或使用文件ID来打开文件的备用数据流。我发现的唯一方法是全名(文件名+ ADS名称)。 我担心在操作过程中文件被重命名。从文件句柄或文件ID打开备用数据流(ADS)
有没有办法做到这一点?
这是很容易做NtOpenFile
或NtCreateFile
例如开放现有的ADS上hFile
NTSTATUS OpenADS(PHANDLE FileHandle, ACCESS_MASK DesiredAccess, HANDLE hFile, PCWSTR Name)
{
IO_STATUS_BLOCK iosb;
UNICODE_STRING ObjectName;
RtlInitUnicodeString(&ObjectName, Name);
OBJECT_ATTRIBUTES oa = { sizeof(oa), hFile, &ObjectName };
return NtOpenFile(FileHandle, DesiredAccess, &oa, &iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT);
}
其中Name
像L":test_stream"
(与:
开始)
谢谢!你知道是否有方法使用文件ID和流名直接打开ADS?我的意思是不使用ID首先打开文件。 – michael
@michael - no。直接通过id和流名称你不能打开流文件。任何使用'FILE_OPEN_BY_FILE_ID'的方法都需要在'OBJECT_ATTRIBUTES'中有一些打开的文件。你问是否可能从文件句柄打开相对 - 是的 - 可能的,我显示代码。有可能通过文件打开文件** it ** id - 是的。但哟反正这里需要一些已经打开的文件。相对通过文件ID和流名称打开 - 不可能 – RbMm
如果我有卷的句柄,如何使用文件ID和流名称打开ADS(无需首先打开文件)? – michael
如果匿名数据流(即“file.ext”与“file.ext :: $ DATA”相同)在没有删除共享的情况下打开,则不能在您上重命名,至少不能从用户模式。如果是这种情况,并且您更愿意使用Windows API而不是直接进行系统调用,那么您可以将工作目录设置为该文件的目录并使用相对开放。 Windows在调用'NtCreateFile'时将使用进程工作目录句柄作为['OBJECT_ATTRIBUTES'](https://msdn.microsoft.com/en-us/library/ff557749)中的'RootDirectory'句柄。 – eryksun