Программирование UEFI EFI_USER_MANAGER_PROTOCOL

Я использую следующую команду, чтобы найти EFI_USER_MANAGER_PROTOCOL:

Status = gBS->LocateHandle(ByProtocol, &gEfiUserManagerProtocolGuid, NULL, &bufferSizeu, handlesu);

Я получаю EFI_ERROR - EFI_NOT_FOUND.

Теперь я пытаюсь установить протокол, а затем открыть протокол:

  Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle, &gEfiUserManagerProtocolGuid, NULL, NULL);

Протокол успешно открыт, и я пытаюсь вызвать функцию current():

Status = users->Current(users, &User);

Компьютер зависает и никаких ошибок не показывает.

Как я могу это исправить?


person yakovlev.it    schedule 02.06.2014    source источник


Ответы (1)


Чтобы устранить проблему, вам нужно проверить, как вы вызываете InstallMultipleProtocolInterfaces — похоже, вы не предоставили экземпляр протокола (на самом деле вы предоставили NULL). Поэтому, когда вы находите экземпляр протокола, вы находите то, что вы туда поместили, то есть NULL, поэтому ваша переменная «users» имеет значение NULL, и система зависает, когда вы ее используете.

Пожалуйста, найдите в спецификации UEFI описание InstallMultipleProtocolInterfaces: первый элемент (после Handle) всегда является указателем на GUID протокола, а второй элемент всегда является указателем на интерфейс протокола. Эти пары используются для вызова службы загрузки InstallProtocolInterface() для добавления интерфейса протокола к Handle.

Я бы сделал что-то вроде:

Status = gBS->InstallMultipleProtocolInterfaces (
    &ImageHandle,
    &gEfiUserManagerProtocolGuid,
    &mUserManager,
    NULL);

где mUserManager будет вашей структурой интерфейса протокола. Поскольку вы владеете интерфейсом протокола, вы можете проверить, указывает ли адрес обнаруженного протокола на фактическое местоположение структуры.

person sun2sirius    schedule 03.06.2014