33# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44#
55
6+ from qiling import Qiling
67from qiling .os .const import *
78from .const import *
89from .utils import *
1415 "Time" : POINTER , # OUT PTR(EFI_TIME)
1516 "Capabilities" : POINTER # OUT PTR(EFI_TIME_CAPABILITIES)
1617})
17- def hook_GetTime (ql , address , params ):
18+ def hook_GetTime (ql : Qiling , address : int , params ):
1819 return EFI_SUCCESS
1920
2021@dxeapi (params = {
2122 "Time" : POINTER # IN PTR(EFI_TIME)
2223})
23- def hook_SetTime (ql , address , params ):
24+ def hook_SetTime (ql : Qiling , address : int , params ):
2425 return EFI_SUCCESS
2526
2627@dxeapi (params = {
2728 "Enabled" : POINTER , # OUT PTR(BOOLEAN)
2829 "Pending" : POINTER , # OUT PTR(BOOLEAN)
2930 "Time" : POINTER # OUT PTR(EFI_TIME)
3031})
31- def hook_GetWakeupTime (ql , address , params ):
32+ def hook_GetWakeupTime (ql : Qiling , address : int , params ):
3233 return EFI_SUCCESS
3334
3435@dxeapi (params = {
3536 "Enable" : BOOL , # BOOLEAN
3637 "Time" : POINTER # PTR(EFI_TIME)
3738})
38- def hook_SetWakeupTime (ql , address , params ):
39+ def hook_SetWakeupTime (ql : Qiling , address : int , params ):
3940 return EFI_SUCCESS
4041
4142@dxeapi (params = {
@@ -44,14 +45,14 @@ def hook_SetWakeupTime(ql, address, params):
4445 "DescriptorVersion" : UINT , # UINT32
4546 "VirtualMap" : POINTER # PTR(EFI_MEMORY_DESCRIPTOR)
4647})
47- def hook_SetVirtualAddressMap (ql , address , params ):
48+ def hook_SetVirtualAddressMap (ql : Qiling , address : int , params ):
4849 return EFI_SUCCESS
4950
5051@dxeapi (params = {
5152 "DebugDisposition" : UINT , # UINTN
5253 "Address" : POINTER # OUT PTR(PTR(VOID))
5354})
54- def hook_ConvertPointer (ql , address , params ):
55+ def hook_ConvertPointer (ql : Qiling , address : int , params ):
5556 return EFI_SUCCESS
5657
5758@dxeapi (params = {
@@ -61,28 +62,36 @@ def hook_ConvertPointer(ql, address, params):
6162 "DataSize" : POINTER , # IN OUT PTR(UINTN)
6263 "Data" : POINTER # OUT PTR(VOID)
6364})
64- def hook_GetVariable (ql , address , params ):
65+ def hook_GetVariable (ql : Qiling , address : int , params ):
6566 name = params ['VariableName' ]
67+
6668 if name in ql .env :
6769 var = ql .env [name ]
6870 read_len = read_int64 (ql , params ['DataSize' ])
71+
6972 if params ['Attributes' ] != 0 :
7073 write_int64 (ql , params ['Attributes' ], 0 )
74+
7175 write_int64 (ql , params ['DataSize' ], len (var ))
76+
7277 if read_len < len (var ):
7378 return EFI_BUFFER_TOO_SMALL
79+
7480 if params ['Data' ] != 0 :
7581 ql .mem .write (params ['Data' ], var )
82+
7683 return EFI_SUCCESS
84+
7785 ql .log .warning (f'variable with name { name } not found' )
86+
7887 return EFI_NOT_FOUND
7988
8089@dxeapi (params = {
8190 "VariableNameSize" : POINTER , # IN OUT PTR(UINTN)
8291 "VariableName" : POINTER , # IN OUT PTR(CHAR16)
8392 "VendorGuid" : GUID # IN OUT PTR(EFI_GUID)
8493})
85- def hook_GetNextVariableName (ql , address , params ):
94+ def hook_GetNextVariableName (ql : Qiling , address : int , params ):
8695 var_name_size = params ["VariableNameSize" ]
8796 var_name = params ["VariableName" ]
8897
@@ -124,14 +133,14 @@ def hook_GetNextVariableName(ql, address, params):
124133 "DataSize" : UINT , # UINTN
125134 "Data" : POINTER # PTR(VOID)
126135})
127- def hook_SetVariable (ql , address , params ):
136+ def hook_SetVariable (ql : Qiling , address : int , params ):
128137 ql .env [params ['VariableName' ]] = bytes (ql .mem .read (params ['Data' ], params ['DataSize' ]))
129138 return EFI_SUCCESS
130139
131140@dxeapi (params = {
132141 "HighCount" : POINTER # OUT PTR(UINT32)
133142})
134- def hook_GetNextHighMonotonicCount (ql , address , params ):
143+ def hook_GetNextHighMonotonicCount (ql : Qiling , address : int , params ):
135144 ql .os .monotonic_count += 0x0000000100000000
136145 hmc = ql .os .monotonic_count
137146 hmc = (hmc >> 32 ) & 0xffffffff
@@ -144,7 +153,7 @@ def hook_GetNextHighMonotonicCount(ql, address, params):
144153 "DataSize" : UINT , # UINTN
145154 "ResetData" : POINTER # PTR(VOID)
146155})
147- def hook_ResetSystem (ql , address , params ):
156+ def hook_ResetSystem (ql : Qiling , address : int , params ):
148157 ql .emu_stop ()
149158
150159 return EFI_SUCCESS
@@ -154,7 +163,7 @@ def hook_ResetSystem(ql, address, params):
154163 "CapsuleCount" : UINT , # UINTN
155164 "ScatterGatherList" : ULONGLONG # EFI_PHYSICAL_ADDRESS
156165})
157- def hook_UpdateCapsule (ql , address , params ):
166+ def hook_UpdateCapsule (ql : Qiling , address : int , params ):
158167 return EFI_SUCCESS
159168
160169@dxeapi (params = {
@@ -163,7 +172,7 @@ def hook_UpdateCapsule(ql, address, params):
163172 "MaximumCapsuleSize" : POINTER , # OUT PTR(UINT64)
164173 "ResetType" : POINTER # OUT PTR(EFI_RESET_TYPE)
165174})
166- def hook_QueryCapsuleCapabilities (ql , address , params ):
175+ def hook_QueryCapsuleCapabilities (ql : Qiling , address : int , params ):
167176 return EFI_SUCCESS
168177
169178@dxeapi (params = {
@@ -172,7 +181,7 @@ def hook_QueryCapsuleCapabilities(ql, address, params):
172181 "RemainingVariableStorageSize" : POINTER , # OUT PTR(UINT64)
173182 "MaximumVariableSize" : POINTER # OUT PTR(UINT64)
174183})
175- def hook_QueryVariableInfo (ql , address , params ):
184+ def hook_QueryVariableInfo (ql : Qiling , address : int , params ):
176185 return EFI_SUCCESS
177186
178187def initialize (ql , gRT : int ):
0 commit comments