我想使用文件的現有句柄或使用文件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