1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#ifndef __FORM_CALLBACK_PROTOCOL_H__
#define __FORM_CALLBACK_PROTOCOL_H__
#ifdef __cplusplus
extern "C" {
#endif
#if EFI_SPECIFICATION_VERSION>0x20000 && !defined(GUID_VARIABLE_DEFINITION)
#pragma message("The EFI_FORM_CALLBACK_PROTOCOL protocol is only supported for the UEFI 2.0 projects")
#pragma message("UEFI 2.1 projects must use HiiConfigAccess.h header instead")
#pragma message("The supported version of the UEFI specification is defined by the EFI_SPECIFICATION_VERSION SDL token")
#error the protocol is depricated
#else
#include <EFI.h>
#define EFI_FORM_CALLBACK_PROTOCOL_GUID \
{ 0xf3e4543d, 0xcf35, 0x6cef, 0x35, 0xc4, 0x4f, 0xe6, 0x34, 0x4d, 0xfc, 0x54 }
GUID_VARIABLE_DECLARATION(gEfiFormCallbackProtocolGuid,EFI_FORM_CALLBACK_PROTOCOL_GUID);
#ifndef GUID_VARIABLE_DEFINITION
#include <Protocol/Hii.h>
typedef struct _EFI_FORM_CALLBACK_PROTOCOL EFI_FORM_CALLBACK_PROTOCOL;
//This flags are different from IFR Flags
#define RESET_REQUIRED 1 //callback operation resulted in an eventual reset to be done upon exit of the browser
#define EXIT_REQUIRED 2 //after the processing of the callback results - exit the browser
#define SAVE_REQUIRED 4 //after the processing of the callback results - save the NV data
#define NV_CHANGED 8 //processing of the callback results - turn the NV flag on
#define NV_NOT_CHANGED 16 //after the processing of the callback results - turn the NV flag off
#pragma pack(push, 1)
typedef struct _EFI_IFR_PACKET {
EFI_HII_IFR_PACK *IfrData;
EFI_HII_STRING_PACK *StringData;
} EFI_IFR_PACKET;
typedef struct _IFR_DATA_HDR{
UINT8 OpCode; //string, numeric, one-of, check box or text
UINT8 Length; //length of the EFI_IFR_DATA_ENTRY packet
UINT16 Flags; //Flags settings see above
} IFR_DATA_HDR;
typedef struct {
IFR_DATA_HDR Header;
UINT8 Data[1]; //The data in the form based on the op-code type
// If the OpCode is a OneOf or Numeric type - Data is a UINT16 value
// If the OpCode is a String type - Data is a CHAR16[x] type
// If the OpCode is a Checkbox type - Data is a UINT8 value
// If the OpCode is a NV Access type - Data is a EFI_IFR_NV_DATA structure
} EFI_IFR_DATA;
typedef struct {
UINT8 *NvRamMap; // If the flag of the op-code specified retrieval of a copy of the NVRAM map,
// this is a pointer to a buffer copy
UINT32 EntryCount; // Number of EFI_IFR_DATA_ENTRY entries
EFI_IFR_DATA Data[1]; // Data entries.
} EFI_IFR_DATA_ARRAY;
typedef union {
EFI_IFR_DATA_ARRAY DataArray; // Primarily used by those who call back to their drivers and use HII as a repository
EFI_IFR_PACKET DataPacket; // Primarily used by those which do not use HII as a repository
CHAR16 String[1]; // If returning an error - fill the string with null-terminated contents
} EFI_HII_CALLBACK_PACKET;
#pragma pack(pop)
// The following are a Callback Protocol functions
typedef EFI_STATUS (EFIAPI *EFI_FORM_CALLBACK) (
IN EFI_FORM_CALLBACK_PROTOCOL *This,
IN UINT16 KeyValue,
IN EFI_IFR_DATA_ARRAY *Data,
OUT EFI_HII_CALLBACK_PACKET **Packet );
typedef EFI_STATUS (EFIAPI *EFI_NV_READ) (
IN EFI_FORM_CALLBACK_PROTOCOL *This,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize,
OUT VOID *Buffer );
typedef EFI_STATUS (EFIAPI *EFI_NV_WRITE) (
IN EFI_FORM_CALLBACK_PROTOCOL *This,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Buffer,
OUT BOOLEAN *ResetRequired);
//the FormCallback Protocol structure
typedef struct _EFI_FORM_CALLBACK_PROTOCOL {
EFI_NV_READ NvRead;
EFI_NV_WRITE NvWrite;
EFI_FORM_CALLBACK Callback;
} EFI_FORM_CALLBACK_PROTOCOL;
#endif // #if EFI_SPECIFICATION_VERSION>0x20000
/****** DO NOT WRITE BELOW THIS LINE *******/
#endif // #ifndef GUID_VARIABLE_DEFINITION
#ifdef __cplusplus
}
#endif
#endif
|