talm

Форк
0
69 строк · 1.5 Кб
1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4

5
package uki
6

7
import (
8
	"bytes"
9
	"encoding/binary"
10
	"errors"
11
	"os"
12
	"strings"
13
)
14

15
// DiscoverKernelVersion reads kernel version from the kernel image.
16
//
17
// This only works for x86 kernel images.
18
//
19
// Based on https://www.kernel.org/doc/html/v5.6/x86/boot.html.
20
func DiscoverKernelVersion(kernelPath string) (string, error) {
21
	f, err := os.Open(kernelPath)
22
	if err != nil {
23
		return "", err
24
	}
25

26
	defer f.Close() //nolint:errcheck
27

28
	header := make([]byte, 1024)
29

30
	_, err = f.Read(header)
31
	if err != nil {
32
		return "", err
33
	}
34

35
	// check header magic
36
	if string(header[0x202:0x206]) != "HdrS" {
37
		return "", errors.New("invalid kernel image")
38
	}
39

40
	setupSects := header[0x1f1]
41
	versionOffset := binary.LittleEndian.Uint16(header[0x20e:0x210])
42

43
	if versionOffset == 0 {
44
		return "", errors.New("no kernel version")
45
	}
46

47
	if versionOffset > uint16(setupSects)*0x200 {
48
		return "", errors.New("invalid kernel version offset")
49
	}
50

51
	versionOffset += 0x200
52

53
	version := make([]byte, 256)
54

55
	_, err = f.ReadAt(version, int64(versionOffset))
56
	if err != nil {
57
		return "", err
58
	}
59

60
	idx := bytes.IndexByte(version, 0)
61
	if idx == -1 {
62
		return "", errors.New("invalid kernel version")
63
	}
64

65
	versionString := string(version[:idx])
66
	versionString, _, _ = strings.Cut(versionString, " ")
67

68
	return versionString, nil
69
}
70

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.