Re: Как работать с файлом по его ID или получить его HANDLE?
От: ABar Украина  
Дата: 20.05.09 19:47
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Задача: нужно выполнить определенные действия над файлом, открыв его по 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.