Я мог бы использовать CreateFile
для символического файла, чтобы получить дескриптор файла и
затем проверьте, существует файл или нет.
Если FILE_FLAG_OPEN_REPARSE_POINT
не указано в вызове CreateFile
, и вы получите дескриптор файла, это означает, что символическая ссылка / точка монтирования существует. поэтому уже не нужно проверять что-то. если вызов не удался, потому что цель не существует, последняя ошибка будет ERROR_FILE_NOT_FOUND
или ERROR_PATH_NOT_FOUND
(может быть также ERROR_BAD_PATHNAME
)
о FILE_FLAG_BACKUP_SEMANTICS
- это очень плохой дизайн CreateFile
API. это внутренний вызов API NtCreateFile
. FILE_FLAG_BACKUP_SEMANTICS
сопоставлен с FILE_OPEN_FOR_BACKUP_INTENT
CreateOptions флагом. этот флаг отмечен внутри IopCheckBackupRestorePrivilege
Эта функция будет определять, запрашивает ли звонящий какой-либо доступ
это может быть удовлетворено привилегиями резервного копирования или восстановления, и если да,
выполнить проверки привилегий. Если проверка привилегий прошла успешно, то
соответствующие биты будут перемещены из RemainingDesiredAccess
поле в структуре AccessState и помещены в
Ранее поле «Предоставленный доступ».
Обратите внимание, что в доступе не будет отказано, если у вызывающего абонента нет ни одной, ни обеих привилегий, поскольку ему может быть предоставлен требуемый доступ через
дескриптор безопасности на объекте.
, поэтому, даже если у вызывающей стороны нет ни одной, ни обеих привилегий резервного копирования или восстановления, это не создает проблем.
, но NtCreateFile
имеют следующие 2 параметра: FILE_DIRECTORY_FILE
и FILE_NON_DIRECTORY_FILE
- это позволяет указать, хотим ли мы создать / открыть файл или каталог. если мы (потенциальные) создаем новый элемент - нам нужно указать, хотим ли мы создавать каталог (FILE_DIRECTORY_FILE
должно быть установлено) или не каталог (FILE_NON_DIRECTORY_FILE
, но по умолчанию предполагается этот случай - так необязательно). когда мы открываем файл - оба эти флага являются необязательными - если мы не указываем оба - это означает, что нам все равно, открываем ли мы файл или каталог. если мы заботимся об этом - нужно указать один из этих флагов.
но если посмотреть на CreateFile
, то видно, что не существует опции, экспликация которой сопоставлена с FILE_DIRECTORY_FILE
или FILE_NON_DIRECTORY_FILE
. CreateFile
использовать для этой опции. FILE_FLAG_BACKUP_SEMANTICS
. это очень не логично с моей точки зрения, но как есть. когда FILE_FLAG_BACKUP_SEMANTICS
не установлено CreateFile
pass FILE_NON_DIRECTORY_FILE
опция для NtCreateFile
. когда он установлен - пропуск FILE_OPEN_FOR_BACKUP_INTENT
и , а не пропуск FILE_NON_DIRECTORY_FILE
это позволит вам открыть файл или каталог. и нет опции для набора FILE_DIRECTORY_FILE
- потому что этот CreatrFile
не может создать новый каталог.
поэтому вместо этого есть отдельная опция для FILE_DIRECTORY_FILE
и FILE_NON_DIRECTORY_FILE
, CreateFile
злоупотребления FILE_FLAG_BACKUP_SEMANTICS
, которые имеют здесь двойной смысл