Ошибка загрузки анклава: не удалось открыть файл с помощью CreateFile()

Я пытаюсь написать простой проект SGX для начала. Итак, у меня есть основная подпрограмма хост-приложения, которую я в значительной степени скопировал из блога Ларса Рихтера:

#define ENCLAVE_FILE _T("Enclave.signed.dll")
#include <tchar.h>
#include <cstdio>
#include "sgx_urts.h"
#include "Enclave_u.h"

int main()
{
    sgx_enclave_id_t   eid;
    sgx_status_t       ret = SGX_SUCCESS;
    sgx_launch_token_t token = { 0 };
    int updated = 0;

    ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL);

    if (ret != SGX_SUCCESS) {
        printf("\nApp: error %#x, failed to create enclave.\n", ret);
    }


    scanf("\n");

    return 0;
}

Он хорошо компилируется (я использую компилятор Intel C++ 17.0 с Visual Studio 2015), но не загружает анклав. Я получаю следующее сообщение об ошибке:

[sgx_create_enclavew ..\urts\win\urts.cpp:195] Couldn't open file with CreateFile()

App: error 0x200f, failed to create enclave.

5 ответов

Решение

Перейдите в настройки проекта app_test_save. В разделе " Отладка" измените рабочий каталог на " $(SolutionDir)Debug". Этот ответ предполагает, что оба проекта app_test_save и enclave_test_save принадлежат одному и тому же решению.

Ошибка в основном означает, что она не может найти ваш файл.dll. Выполните dir /a/s, чтобы найти Enclave.signed.dll, затем измените имя соответствующим образом. Когда вы создаете анклав, он генерирует подписанный файл.dll. Если ваше имя анклава Enclave12, тогда имя DLL-файла Enclave12.signed.dll. Вы исправите это, тогда вы должны быть в порядке.

Согласно этому: https://software.intel.com/en-us/forums/intel-software-guard-extensions-intel-sgx/topic/623738

Если вы используете локальный отладчик SGX, убедитесь, что изменили "текущий рабочий каталог", указывая на $(OutDir) вместо $(ProjectDir).

Свойства конфигурации -> Отладка -> Рабочий каталог -> $(OutDir).

Как указал Нейл, sgx_create_enclave не смог найти dll, когда программа запускалась из отладчика Visual Studio. Он работал нормально, когда я непосредственно запускал исполняемый файл в папке "Debug".

Таким образом, простой прием, чтобы заставить его работать в обоих настройках, состоит в следующем:

#define ENCLAVE_FILE _T("../Debug/Enclave.signed.dll")

Да, у меня была такая же проблема пару месяцев назад, и теперь она работает. Это либо окольный путь, либо ошибочный путь, либо программа действительно не хочет, чтобы мы записывали файлы постепенно. Кажется глупым, потому что есть МНОГО ситуаций, когда вам нужно создать копию, но вы не хотите использовать CreateFile() для создания полной копии ваших данных для записи в памяти, чтобы вы могли сохранить ее за один вызов. Я предлагаю вам попробовать настройки в настройке проекта app_test_save и просто отобразить несколько настроек, и это может сработать. Раньше я работал над несколькими проектами Службы разработки корпоративных приложений и, поверьте мне, я несколько раз сбрасывал все настройки, чтобы все работало правильно. Надеюсь, вы тоже сможете внести несколько корректировок и снова заставить его работать. Ваше здоровье.

Другие вопросы по тегам