Здравствуйте, Аноним, Вы писали:
А>Задача: нужно выполнить определенные действия над файлом, открыв его по 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.
Задача: нужно выполнить определенные действия над файлом, открыв его по ID (т.е. получить HANDLE на него или как-то напрямую по его ID).
Я знаю, что HANDLE на файл можно получить при помощи функции OpenFileById, но ее встроенная в студию реализация появляется только с Vist-ы, а мне нужно это сделать на XP.
Пробовал как написано в MSDN использовать библиотеку fileextd.lib, но при попытке открытия файла возвращается значение INVALID_PARAMETER, причем тот же самый код, скомпилированный под висту без использования этой либы работает вполне нормально.
Может быть кто-нибудь может подсказать, как можно получить HANDLE файла по его ID без использования этой функции или хотя бы предположить чем вызвана ошибка при использовании функции из fileextd.lib.
Примерный код открытия файла по ID, который я использовал:
TmpFile – имя файла на том же диске (как и требует OpenFileById).
TmpFileHandle = CreateFile( TmpFile.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (TmpFileHandle == INVALID_HANDLE_VALUE)
{
hResult = HRESULT_FROM_WIN32(GetLastError());
printf(“CreateFile 1 Error = 0x%X”, hResult);
}
//
//открыть сам файл для получения его описателя
//
HANDLE hTargFile = CreateFile( szFileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hTargFile == INVALID_HANDLE_VALUE)
{
hResult = HRESULT_FROM_WIN32(GetLastError());
printf(“CreateFile 2 Error = 0x%X”, hResult);
}
//
//получить буфер с Object ID
//
BY_HANDLE_FILE_INFORMATION HFI;
bRes = GetFileInformationByHandle( hTargFile, &HFI);
if(!bRes)
{
hResult = HRESULT_FROM_WIN32(GetLastError());
printf(“GetFileInformationByHandle Error = 0x%X”, hResult);
}
CloseHandle(hTargFile);
//
//создать 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);
20.05.09 20:37: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Используй Native API (например, NtOpenFile) и не парься, работать будет везде.
Здравствуйте, ABar, Вы писали:
AB>Можно использовать и OpenFileById функцию. На XP в том варианте, который Вы привели, у меня возвращала FALSE. Подсказку я нашел по этой ссылке: http://social.msdn.microsoft.com/forums/en-US/windowssearch/thread/4b71fcb3-bea9-4cfb-bdb7-2f1a91522ea6/ .
AB>Ключевой момент:
AB>Соответственно, нужно под структуру выделить 24 байта и указать такой размер. У меня после этого счастье наступило. Кстати, в этой майкрософтской либе OpenFileById вызывает NtCreateFile, соответственно, код, использующий OpenFileById без проблем работает и в 2K.
Спасибо, Ваш ответ действительно помог решить проблему.
PS Извиняюсь, что задал вопрос несколько сумбурно и как "Аноним", конец рабочего дня + спешка