def __str__(self): return """ Header (Windows) ---------------- VendorGuid= {{{}}} Size = 0x{:08X} DataOffset= 0x{:08X} DataSize = 0x{:08X} Attributes= 0x{:08X} """.format( EFI_GUID_STR(self.guid), self.Size, self.DataOffset, self.DataSize, self.Attributes )
def getEFIvariables_NtEnumerateSystemEnvironmentValuesEx2(nvram_buf): start = 0 buffer = nvram_buf bsize = len(buffer) header_fmt = "<IIII16s" header_size = struct.calcsize(header_fmt) variables = dict() off = 0 while (off + header_size) < bsize: efi_var_hdr = EFI_HDR_WIN( *struct.unpack_from(header_fmt, buffer[off:off + header_size])) next_var_offset = off + efi_var_hdr.Size efi_var_buf = buffer[off:next_var_offset] efi_var_data = buffer[off + efi_var_hdr.DataOffset:off + efi_var_hdr.DataOffset + efi_var_hdr.DataSize] #efi_var_name = "".join( buffer[ start + header_size : start + efi_var_hdr.DataOffset ] ).decode('utf-16-le') str_fmt = "{:d}s".format(efi_var_hdr.DataOffset - header_size) s, = struct.unpack( str_fmt, buffer[off + header_size:off + efi_var_hdr.DataOffset]) if sys.version_info[0] < 3: efi_var_name = unicode(s, "utf-16-le", errors="replace").split(u'\u0000')[0] else: efi_var_name = str(s, "utf-16-le", errors="replace").split(u'\u0000')[0] if efi_var_name not in variables.keys(): variables[efi_var_name] = [] # off, buf, hdr, data, guid, attrs variables[efi_var_name].append( (off, efi_var_buf, efi_var_hdr, efi_var_data, EFI_GUID_STR(efi_var_hdr.guid), efi_var_hdr.Attributes)) if 0 == efi_var_hdr.Size: break off = next_var_offset return variables