Здравствуйте.
Пару дней назад я спрашивал насчет OpenFileById, получив исчерпывающий ответ решил, что счастье настало… Но было то счастье не долго.
Возникла необходимость удалить файл, который был открыт OpenFileById и вновь натолкнулся на проблему…
Выполняемые действия:
FILE_ID_DESCRIPTOR FileID;
//
//значение HFI получено с помощью GetFileInformation
//
//
// TmpFileHandle – HANDLE временного файла создаваемого рядом с целевым
// (хинт на том для OpenFileById)
//
FileID.FileId.LowPart = HFI.nFileIndexLow;
FileID.FileId.HighPart = HFI.nFileIndexHigh;
FileID.Type = FileIdType;
FileID.dwSize = FILE_ID_DESCRIPTOR_SIZE; //24 байта, чтобы работало
//
//открыть файл по ID и вернуть HANDLE
//
hFile = OpenFileById(
TmpFileHandle,
&FileID,
GENERIC_READ | GENERIC_WRITE | DELETE,
FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
NULL,
0);
if (hFile == INVALID_HANDLE_VALUE)
{
hResult = HRESULT_FROM_WIN32(GetLastError());
}
//
//отметим файл на удаление
//
FILE_DISPOSITION_INFO FDI;
FDI.DeleteFile = TRUE;
bRes = SetFileInformationByHandle(hFile, FileDispositionInfo, &FDI, sizeof(FDI));
if(!bRes)
{
hResult = HRESULT_FROM_WIN32(GetLastError());
}
В результате SetFileInformationByHandle возвращает код 87 (Неверный параметр). ОС — WinVista.
Причем если файл открыть штатным способом (CreateFile), то все прекрассно работает.
Может быть, кто-нибудь подскажет в чем тут ошибка?
PS Пробовал аналогичные действия делать через NtSetInformationFile, результат тот же.