Created
July 13, 2024 12:08
-
-
Save likecyber/85f2eb77f77230c03538dbf8d47d94b3 to your computer and use it in GitHub Desktop.
A simple Golang function for getting Windows's SMBIOS UUID.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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