2017-09-10 99 views
0

我想使用文件的現有句柄或使用文件ID來打開文件的備用數據流。我發現的唯一方法是全名(文件名+ ADS名稱)。 我擔心在操作過程中文件被重命名。從文件句柄或文件ID打開備用數據流(ADS)

有沒有辦法做到這一點?

+0

如果匿名數據流(即「file.ext」與「file.ext :: $ DATA」相同)在沒有刪除共享的情況下打開,則不能在您上重命名,至少不能從用戶模式。如果是這種情況,並且您更願意使用Windows API而不是直接進行系統調用,那麼您可以將工作目錄設置爲該文件的目錄並使用相對開放。 Windows在調用'NtCreateFile'時將使用進程工作目錄句柄作爲['OBJECT_ATTRIBUTES'](https://msdn.microsoft.com/en-us/library/ff557749)中的'RootDirectory'句柄。 – eryksun

回答

1

這是很容易做NtOpenFileNtCreateFile

例如開放現有的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); 
} 

其中NameL":test_stream"(與:開始)

+0

謝謝!你知道是否有方法使用文件ID和流名直接打開ADS?我的意思是不使用ID首先打開文件。 – michael

+0

@michael - no。直接通過id和流名稱你不能打開流文件。任何使用'FILE_OPEN_BY_FILE_ID'的方法都需要在'OBJECT_ATTRIBUTES'中有一些打開的文件。你問是否可能從文件句柄打開相對 - 是的 - 可能的,我顯示代碼。有可能通過文件打開文件** it ** id - 是的。但喲反正這裏需要一些已經打開的文件。相對通過文件ID和流名稱打開 - 不可能 – RbMm

+0

如果我有卷的句柄,如何使用文件ID和流名稱打開ADS(無需首先打開文件)? – michael

相關問題