Пример #1
0
        public HiiIfrOpCode(IfrRawDataBlock raw) : base(raw)
        {
            EFI_IFR_OP_HEADER hdr = data.ToIfrType <EFI_IFR_OP_HEADER>();

            this.OpCode      = hdr.OpCode;
            this.HasOwnScope = hdr.Scope == 1 ? true : false;
        }
Пример #2
0
        private void ParseIfrScope(HiiIfrOpCode parent, ref uint offset)
        {
            // Parse all IFR opcodes of this scope..
            while (offset < data_payload.Length)
            {
                EFI_IFR_OP_HEADER ifr_hdr = data_payload.ToIfrType <EFI_IFR_OP_HEADER>(offset);
                if (data_payload.Length < ifr_hdr.Length + offset)
                {
                    throw new Exception("Payload length invalid");
                }

                IfrRawDataBlock raw_data = new IfrRawDataBlock(data_payload.Bytes, data_payload.Offset + offset, ifr_hdr.Length);
                HiiIfrOpCode    ifr_element;

                switch (ifr_hdr.OpCode)
                {
                    // OpCodes which have more data rather just the header (each type has a specific class type)..
                    #region IFR OpCodes (more than just the header)
                case EFI_IFR_OPCODE_e.EFI_IFR_FORM_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_FORM>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_SUBTITLE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_SUBTITLE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_TEXT_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_TEXT>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_IMAGE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_IMAGE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_ONE_OF_OP: ifr_element = new HiiIfrOpCodeWithEfiIfrNumericValue <EFI_IFR_ONE_OF>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_CHECKBOX_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_CHECKBOX>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_NUMERIC_OP: ifr_element = new HiiIfrOpCodeWithEfiIfrNumericValue <EFI_IFR_NUMERIC>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_PASSWORD_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_PASSWORD>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_ONE_OF_OPTION_OP: ifr_element = new HiiIfrOpCodeWithEfiIfrTypeValue <EFI_IFR_ONE_OF_OPTION>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_ACTION_OP: ifr_element = new HiiIfrOpCodeAction(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_RESET_BUTTON_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_RESET_BUTTON>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_FORM_SET_OP: ifr_element = new HiiIfrOpCodeFormSet(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_REF_OP: ifr_element = new HiiIfrOpCodeRef(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_NO_SUBMIT_IF_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_NO_SUBMIT_IF>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_INCONSISTENT_IF_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_INCONSISTENT_IF>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_EQ_ID_VAL_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_EQ_ID_VAL>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_EQ_ID_ID_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_EQ_ID_ID>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_EQ_ID_VAL_LIST_OP: ifr_element = new HiiIfrOpCodeEqIdList(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_RULE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_RULE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_DATE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_DATE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_TIME_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_TIME>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_STRING_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_STRING>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_REFRESH_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_REFRESH>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_ANIMATION_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_ANIMATION>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_ORDERED_LIST_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_ORDERED_LIST>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_VARSTORE_OP: ifr_element = new HiiIfrOpCodeWithAsciiNullTerminatedString <EFI_IFR_VARSTORE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_VARSTORE_NAME_VALUE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_VARSTORE_NAME_VALUE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_VARSTORE_EFI_OP: ifr_element = new HiiIfrOpCodeWithAsciiNullTerminatedString <EFI_IFR_VARSTORE_EFI>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_VARSTORE_DEVICE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_VARSTORE_DEVICE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_GET_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_GET>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_SET_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_SET>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_RULE_REF_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_RULE_REF>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_QUESTION_REF1_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_QUESTION_REF1>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_UINT8_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_UINT8>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_UINT16_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_UINT16>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_UINT32_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_UINT32>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_UINT64_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_UINT64>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_TO_STRING_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_TO_STRING>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_FIND_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_FIND>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_STRING_REF1_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_STRING_REF1>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_QUESTION_REF3_OP: ifr_element = new HiiIfrOpCodeQuestionRef(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_SPAN_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_SPAN>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_DEFAULT_OP: ifr_element = new HiiIfrOpCodeWithEfiIfrTypeValue <EFI_IFR_DEFAULT>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_DEFAULTSTORE_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_DEFAULTSTORE>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_FORM_MAP_OP: ifr_element = new HiiIfrOpCodeFormMap(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_GUID_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_GUID>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_SECURITY_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_SECURITY>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_REFRESH_ID_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_REFRESH_ID>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_WARNING_IF_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_WARNING_IF>(raw_data); break;

                case EFI_IFR_OPCODE_e.EFI_IFR_MATCH2_OP: ifr_element = new HiiIfrOpCode <EFI_IFR_MATCH2>(raw_data); break;

                    #endregion
                    // OpCode which consists of the header only (there is no special structure, we just use the header itself)..
                    #region IFR OpCodes (just the header)
                case EFI_IFR_OPCODE_e.EFI_IFR_SUPPRESS_IF_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_LOCKED_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_AND_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_OR_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_NOT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_GRAY_OUT_IF_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_DISABLE_IF_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TO_LOWER_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TO_UPPER_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MAP_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_VERSION_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_END_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MATCH_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_READ_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_WRITE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_EQUAL_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_NOT_EQUAL_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_GREATER_THAN_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_GREATER_EQUAL_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_LESS_THAN_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_LESS_EQUAL_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_BITWISE_AND_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_BITWISE_OR_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_BITWISE_NOT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_SHIFT_LEFT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_SHIFT_RIGHT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_ADD_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_SUBTRACT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MULTIPLY_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_DIVIDE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MODULO_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_QUESTION_REF2_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TRUE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_FALSE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TO_UINT_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TO_BOOLEAN_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MID_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_TOKEN_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_STRING_REF2_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_CONDITIONAL_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_ZERO_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_ONE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_ONES_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_UNDEFINED_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_LENGTH_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_DUP_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_THIS_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_VALUE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_CATENATE_OP:
                case EFI_IFR_OPCODE_e.EFI_IFR_MODAL_TAG_OP:
                    #endregion
                    ifr_element = new HiiIfrOpCode <EFI_IFR_OP_HEADER>(raw_data);
                    break;

                // All OpCodes that are unknown to this application must consist of at least the header, but will rise an error message..
                default:
                    //raw_data.GenerateAndLogDump(ifr_hdr.OpCode.ToString());
                    LogMessage(LogSeverity.UNIMPLEMENTED, ifr_hdr.OpCode.ToString());
                    ifr_element = new HiiIfrOpCode <EFI_IFR_OP_HEADER>(raw_data);
                    break;
                }

                // add element as child..
                if (parent == null)
                {
                    this.Childs.Add(ifr_element);
                }
                else
                {
                    parent.Childs.Add(ifr_element);
                }

                offset += ifr_hdr.Length;

                if (ifr_element.OpCode == EFI_IFR_OPCODE_e.EFI_IFR_END_OP)
                {
                    return; // Scope is done!
                }
                else if (ifr_element.HasOwnScope)
                {
                    ParseIfrScope(ifr_element, ref offset);
                }
            }
        }