Win API NTFS OpenFileByID выбрасывает исключение AccessViolationException
Строка OpenFileByID в test() дает мне System.AccessViolationException Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Я пытаюсь воспроизвести этот пример кода (см. Ответ), который я запускаю в Visual Studio Express 2013 для Windows Desktop. Но этот пример, похоже, не работает для меня. Это разрыв в строке OpenFileByID в test().
Короче говоря, я получаю идентификатор файла, а затем пытаюсь создать дескриптор файла из этого идентификатора. Позже я планирую использовать этот дескриптор для получения информации о файле. Причина, по которой я использую идентификаторы, заключается в том, что я могу восстанавливать неработающие ссылки, поскольку GUID целевого файла гораздо надежнее, чем его предполагаемое расположение. Помощь оценена!
Изменить: файл, который я пытаюсь открыть, представляет собой обычный текстовый файл на рабочем столе, ничего особенного.
1 ответ
Вы не проверяете, есть ли у вас действительный дескриптор тома, чего у вас может и не быть. Может быть источником вашего а / в.
Когда вы открываете корневой каталог, документ говорит, что вы не должны использовать FILE_ATTRIBUTE_NORMAL с любыми другими флагами - но вы используете его с FILE_FLAG_BACKUP_SEMANTICS. Чтобы использовать FILE_FLAG_BACKUP_SEMANTICS, вы должны получить привилегии для SE_BACKUP_NAME. Для этого вам нужно быть администратором или оператором резервного копирования. Я не могу представить, что тебе нужен этот флаг.
Вы можете получить дескриптор тома, открыв "\\.\C:" (например)... который отличается от этого дескриптора для корневой папки. Я обычно открываю его с помощью GenericRead, но если все, что вам нужно, это для OpenFileById, вы можете указать 0 для доступа.
Кроме того, добавление идентификаторов объектов к файлам не требуется. Ссылочный номер файла (FRN) является идентификатором главной таблицы файлов для этого файла. Это "другой" тип идентификатора, который можно передать в FILE_ID_DESCRIPTOR. Вы можете получить его из дескриптора открытого файла, вызывающего GetFileInformationByHandle - это nFileindexHigh и nFileIndexLow, превращенные в длинный int. Когда вы перемещаете файл, FRN остается (изменяется только родительский FRN). Кроме того, когда вы переименовываете файл, FRN не изменяется. Преимущество использования этого по сравнению с ObjectID состоит в том, что вы не изменяете громкость для отслеживания файла... и вам не нужно использовать DeviceIOControl - что-то вроде плохого сна взаимодействия.
Еще одна мысль - OpenFileByID не появлялся до Vista и Windows Server 2008. Вы там, верно?