Nano Hash - криптовалюты, майнинг, программирование

Какова цель вызова API Win32 CreateFile2?

Они добавили новый вызов API в Windows 8 под названием CreateFile2, который, насколько я могу судить, делает то же самое, что и существующая функция CreateFile, только несколько иначе упаковывает свои параметры.

Что было добавлено, чтобы сделать это необходимым, так как я ничего не вижу в документации.

08.11.2012

  • CreateFile2 может использоваться приложением store/metro, тогда как CreateFile предназначено только для настольных приложений, поэтому, по-видимому, в первом случае проводится дополнительный аудит безопасности. 08.11.2012
  • Ну, я так и думал, но потом подумал, что им не понадобится новая функция для этого, она может просто возвращать отказ для вещей, которые не разрешены при запуске на winrt. 08.11.2012
  • @ J99 Потребность здесь не имеет значения. Возможно, они могли бы сделать это по-вашему. Но, возможно, было проще и чище сделать это с новой функцией. 08.11.2012

Ответы:


1

CreateFile на самом деле может сделать гораздо больше, чем просто открыть файл. CreateFile2 был создан, чтобы ограничить «поверхностную область» функции только функциями, разрешенными для приложений UWP, и поскольку инструмент WACK не может действительно отличить «хорошее» использование от «плохого» использования функции импорта, только то, что он вообще используется.

Типичный шаблон, который я использую в своих библиотеках C++, выглядит следующим образом. Я использую шаблон RAII для поддержки дескриптора файла при использовании обработки исключений C++ (в дополнение просто быть хорошим современной практикой написания кода на C++):

#include <assert.h>
#include <memory>

struct handle_closer
    { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) CloseHandle(h); } };

using ScopedHandle = std::unique_ptr<void, handle_closer>;

inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }

Причина, по которой у меня есть safe_handle, заключается в том, что CreateFile и CreateFile2 определены для возврата INVALID_HANDLE_VALUE (-1) вместо возврата 0 в случае ошибки. Большинство других функций Win32, возвращающих дескрипторы, возвращают 0 в случае сбоя, и я подтвердил, что не бывает случаев, когда '0' является допустимым дескриптором Win32.

Для чтения я использую:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN, nullptr)));
#endif
if (!hFile)
   // Error

Важно использовать FILE_SHARE_READ вместо 0 для параметра dwShareMode для чтения. Приложения UWP не имеют эксклюзивного доступа для чтения к существующим файлам, поэтому вызовы завершатся сбоем, если вы используете «эксклюзивный» режим общего доступа (т. е. 0).

И для записи файла:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr)));
#endif
if (!hFile)
    // Error!

Для записи я запрашиваю разрешение DELETE, потому что я использую SetFileInformationByHandle с FILE_DISPOSITION_INFO для очистки в случае сбоя процесса вывода файла. См. scoped.h.

См. методы кодирования двойного назначения для игр для получения дополнительной информации.

27.03.2018
  • Важно использовать FILE_SHARE_READ вместо 0 для приложений UWP — это жемчужина информации. 17.03.2019

  • 2

    Из-за мультиплексирования флагов создания файлов, флагов атрибутов файлов и флагов QoS безопасности в один параметр DWORD (dwFlagsAndAttributes) для CreateFile невозможно добавить дополнительные флаги в CreateFile. Дополнительные флаги для операции создания должны быть добавлены только в CreateFile2. Например, флаг FILE_FLAG_OPEN_REQUIRING_OPLOCK. Этот флаг задокументирован FltCreateFile — режим ядра

    14.09.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..