Здравствуйте, Аноним, Вы писали:
А>Задача: нужно выполнить определенные действия над файлом, открыв его по ID (т.е. получить HANDLE на него или как-то напрямую по его ID).
...
А>
А> //
А> //создать FILE_ID_DESCRIPTOR
А> //
А> FILE_ID_DESCRIPTOR FileID;
...
А> FileID.FileId.LowPart = HFI.nFileIndexLow;
А> FileID.FileId.HighPart = HFI.nFileIndexHigh;
А> FileID.Type = FileIdType;
А> FileID.dwSize = sizeof(FileID);
А> //
А> //открыть файл по ID и вернуть HANDLE
А> //
А> hFile = OpenFileById(
А> TmpFileHandle,
А> &FileID,
А> GENERIC_ALL,
А> FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
А> NULL,
А> 0);
А> if (hFile == INVALID_HANDLE_VALUE)
А> {
А> hResult = HRESULT_FROM_WIN32(GetLastError());
А> printf(“OpenFileById Error = 0x%X”, hResult);
А> }
А> CloseHandle(TmpFileHandle);
А>
Можно использовать и OpenFileById функцию. На XP в том варианте, который Вы привели, у меня возвращала FALSE. Подсказку я нашел по этой ссылке:
http://social.msdn.microsoft.com/forums/en-US/windowssearch/thread/4b71fcb3-bea9-4cfb-bdb7-2f1a91522ea6/ .
Ключевой момент:
// This value was determined by looking at the assembly code
// and has no actual corresponance to the structure size which
// is 16. Might be related to 64bit version?
fileIDDesc.dwSize = 24; // expected by OpenFileById
Соответственно, нужно под структуру выделить 24 байта и указать такой размер. У меня после этого счастье наступило. Кстати, в этой майкрософтской либе OpenFileById вызывает NtCreateFile, соответственно, код, использующий OpenFileById без проблем работает и в 2K.