Skip to content

Instantly share code, notes, and snippets.

@likecyber
Created July 13, 2024 12:08
Show Gist options
  • Save likecyber/85f2eb77f77230c03538dbf8d47d94b3 to your computer and use it in GitHub Desktop.
Save likecyber/85f2eb77f77230c03538dbf8d47d94b3 to your computer and use it in GitHub Desktop.
A simple Golang function for getting Windows's SMBIOS UUID.
package main
import (
"fmt"
"syscall"
"unsafe"
)
const (
RSMB = 0x52534D42
)
var (
libKernel32 = syscall.NewLazyDLL("kernel32.dll")
procGetSystemFirmwareTable = libKernel32.NewProc("GetSystemFirmwareTable").Addr()
)
func getSmbiosUuid() (string, error) {
bufferSize, _, err := syscall.SyscallN(procGetSystemFirmwareTable, RSMB, 0, 0, 0)
if bufferSize == 0 {
return "", fmt.Errorf("failed to get buffer size: %w", err)
} else if bufferSize < 8 {
return "", fmt.Errorf("buffer size unexpected: expected >= 8 bytes, received %d bytes", bufferSize)
}
buffer := make([]byte, bufferSize)
bufferSize, _, err = syscall.SyscallN(procGetSystemFirmwareTable, RSMB, 0, uintptr(unsafe.Pointer(&buffer[0])), bufferSize)
if bufferSize == 0 {
return "", fmt.Errorf("failed to get buffer data: %w", err)
} else if bufferSize != uintptr(len(buffer)) {
return "", fmt.Errorf("buffer size mismatched: expected %d bytes, received %d bytes", uintptr(len(buffer)), bufferSize)
}
for offset := 8; offset < len(buffer); {
structureType := buffer[offset]
structureLength := int(buffer[offset+1])
if structureType == 1 {
if structureLength >= 24 {
return fmt.Sprintf(
"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
buffer[offset+11], buffer[offset+10], buffer[offset+9], buffer[offset+8], buffer[offset+13], buffer[offset+12], buffer[offset+15], buffer[offset+14],
buffer[offset+16], buffer[offset+17], buffer[offset+18], buffer[offset+19], buffer[offset+20], buffer[offset+21], buffer[offset+22], buffer[offset+23],
), nil
} else {
return "", fmt.Errorf("failed to get BIOS UUID: UUID field not found")
}
} else if structureType == 127 {
return "", fmt.Errorf("failed to get BIOS UUID: System Information structure not found")
}
for offset += structureLength + 2; offset < len(buffer); offset++ {
if buffer[offset-1] == 0x00 && buffer[offset-2] == 0x00 {
break
}
}
}
return "", fmt.Errorf("failed to get BIOS UUID: structure not found or invalid buffer")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment