Ошибка загрузки анклава: не удалось открыть файл с помощью 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 и просто отобразить несколько настроек, и это может сработать. Раньше я работал над несколькими проектами Службы разработки корпоративных приложений и, поверьте мне, я несколько раз сбрасывал все настройки, чтобы все работало правильно. Надеюсь, вы тоже сможете внести несколько корректировок и снова заставить его работать. Ваше здоровье.