LINUX.ORG.RU

исходный код «shim/MokManager.c» и его mok_reset_prompt()

 , mokmanager, ,


0

1

добрый день, друзья!

тут нужны специалисты по C в совокупности с небольшим знанием UEFI, и свежей головой :-) ..

помоготе мне пожалуйста понять вешь.. думаю это какая-то простая вешь, но всё равно у меня тут возник СТУПОР в её понимании.. :-(

проблема: не погу понять при каких условиях Меню Программы будет показывать пользователю команду «Reset MOK» [эта команда должна вызвать функцию mok_reset_prompt()]

или... перефразирую свой вопрос: что именно должен сделать пользователь этой Программы, чтобы Программа смогла бы начать выполнять функцию mok_reset_prompt() ?

вот исходный код: https://github.com/rhinstaller/shim/blob/0.8/MokManager.c

--------------------------------------------------

что мы уже знаем:

функция «efi_main(...)» один раз вызывает функцию «check_mok_request(...)»

в свою очередь функция «check_mok_request(...)» один раз вызывает функцию «enter_mok_menu(...)»

функция «enter_mok_menu(...)» способена вызвать *нужную**нам* функцию «mok_reset_prompt(...)» , НО при определённых условиях...

вот эти условия:

if (MokNew || MokAuth) {
    if (!MokNew) {
        // в этом случае -- всё будет норм!

в этом случае (зная всё это) я могу ещё раз перефразировать свой вопрос: какие действия должен сделать пользователь (пользователь(!) а не программист), чтобы переменная «MokAuth» была бы НЕнулевой и одновременно с ней переменная «MokNew» была бы нулевой?

всем заранее спасибо! :-) я в нас верю :-)

##################################################

разгадка квеста:

1. исходный код «shim/MokManager.c» и его mok_reset_prompt() (комментарий)

2. исходный код «shim/MokManager.c» и его mok_reset_prompt() (комментарий)

★★★★★

Последнее исправление: user_id_68054 (всего исправлений: 6)
Ответ на: комментарий от mos

> в савокупности со небольшим

могу предложить спеллчекер.

поправил ^_^

есть ещё орфоошибки? :-)

user_id_68054 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

MokAuth != 0, MokNew == 0

если я даж изменю исходный код...

...то всё равно у меня нет возможности сделать Майкросовскую цифровую подпись :) .

тивизация же! ну?

поэтому остаётся только понять: как этого условия добиться :-) без изменения исходного кода

user_id_68054 ★★★★★
() автор топика
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

что будет когда выполнится следующий код:

if (false || true) {
    if (!false) {
        // в этом случае -- всё будет норм!

anonymous
()
Ответ на: комментарий от anonymous

будет:

if (false || true) {
    if (!false) {
        // тот самый случай -- когда всё норм!
        menu_strings[i] = L"Reset MOK";
        menu_item[i] = MOK_RESET_MOK;
        i++;
    }
}

// а затем:

int choice = 0;
choice = console_select(... , menu_strings, ...);

// пользователь нажмёт на нужную строчку и ...

switch (menu_item[choice]) {
// ... ... ...
case MOK_RESET_MOK:
    mok_reset_prompt(); // <--- вот этого мы хотим добиться! :)
    break;
// ... ... ...
}
user_id_68054 ★★★★★
() автор топика
Последнее исправление: user_id_68054 (всего исправлений: 4)
Ответ на: комментарий от anonymous

ну а далее:

вызов функции «mok_reset_prompt()» приведёт к вызову функции «store_keys(NULL, 0, ...)» [вот именно с такими нулевыми аргументами!]

и это заставит произойти:

uefi_call_wrapper(RT->SetVariable, 5, L"MokList",
        &shim_lock_guid,
        EFI_VARIABLE_NON_VOLATILE
        | EFI_VARIABLE_BOOTSERVICE_ACCESS,
        0, NULL)

то есть некоторая переменная в UEFI под названием «MokList» — обнулится! :)

user_id_68054 ★★★★★
() автор топика
Последнее исправление: user_id_68054 (всего исправлений: 2)

вообщем частично разрбоался!

суть такая:

UEFI-переменная «MokAuth» должна быть выставленна в некое-нужное значение — ещё *ДО* запуска программы «MokManager»...

...и даже ДО запуска самой (более главной) программы «shim»!

вот фрагмент начального кода shim.c [ https://github.com/rhinstaller/shim/blob/0.8/shim.c#L1772 ] :

/*
 * If the OS has set any of these variables we need to drop into MOK and
 * handle them appropriately
 */
EFI_STATUS check_mok_request(EFI_HANDLE image_handle)
{
	EFI_STATUS efi_status;

	if (check_var(L"MokNew") || check_var(L"MokSB") ||
	    check_var(L"MokPW") || check_var(L"MokAuth") ||
	    check_var(L"MokDel") || check_var(L"MokDB")) {
		efi_status = start_image(image_handle, MOK_MANAGER);

		if (efi_status != EFI_SUCCESS) {
			perror(L"Failed to start MokManager: %r\n", efi_status);
			return efi_status;
		}
	}

	return EFI_SUCCESS;
}

но остаётся не совсем ясно следущее:

правильно ли я понимаю что эти переменные нужно инициализировать через:

«/sys/firmware/efi/efivars/» (файловая система «efivarfs» )

в *уже* успешно загруженной операционной системе.

или же я должен как-то инициализировать эти переменные в момент ДО загрузки «shim»? :) через UEFI Shell ?

%) %)

user_id_68054 ★★★★★
() автор топика
Последнее исправление: user_id_68054 (всего исправлений: 1)

похоже разобрался окончаттельно!


для манипуляции переменными — используется программа «mokutil».. которая судя по всему работает в уже загруженной операционной системе, и меняет переменные через «efi_set_variable(...)»

(#include <efivar.h>)

ура, товарищи! :-) всем виртуального пива :-D

user_id_68054 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.