[PATCH 3/3] ntdll: Use the machine ID for the system UUID on Linux.

Hans Leidekker hans at codeweavers.com
Tue Jul 2 08:28:35 CDT 2019


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/ntdll/nt.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 7cfe57c9bd..1211234293 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -101,6 +101,7 @@ struct smbios_system {
     BYTE product;
     BYTE version;
     BYTE serial;
+    BYTE uuid[16];
 };
 
 struct smbios_board {
@@ -2064,6 +2065,45 @@ static size_t get_smbios_string(const char *path, char *str, size_t size)
     return len;
 }
 
+static void get_system_uuid( GUID *uuid )
+{
+    static const unsigned char hex[] =
+    {
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,        /* 0x00 */
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,        /* 0x10 */
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,        /* 0x20 */
+        0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,        /* 0x30 */
+        0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,  /* 0x40 */
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,        /* 0x50 */
+        0,10,11,12,13,14,15                     /* 0x60 */
+    };
+    int fd;
+
+    memset( uuid, 0xff, sizeof(*uuid) );
+    if ((fd = open( "/var/lib/dbus/machine-id", O_RDONLY )) != -1)
+    {
+        unsigned char buf[32], *p = buf;
+        if (read( fd, buf, sizeof(buf) ) == sizeof(buf))
+        {
+            uuid->Data1 = hex[p[6]] << 28 | hex[p[7]] << 24 | hex[p[4]] << 20 | hex[p[5]] << 16 |
+                          hex[p[2]] << 12 | hex[p[3]] << 8  | hex[p[0]] << 4  | hex[p[1]];
+
+            uuid->Data2 = hex[p[10]]  << 12 | hex[p[11]] << 8 | hex[p[8]] << 4 | hex[p[9]];
+            uuid->Data3 = hex[p[14]] << 12 | hex[p[15]] << 8 | hex[p[12]] << 4 | hex[p[13]];
+
+            uuid->Data4[0] = hex[p[16]] << 4 | hex[p[17]];
+            uuid->Data4[1] = hex[p[18]] << 4 | hex[p[19]];
+            uuid->Data4[2] = hex[p[20]] << 4 | hex[p[21]];
+            uuid->Data4[3] = hex[p[22]] << 4 | hex[p[23]];
+            uuid->Data4[4] = hex[p[24]] << 4 | hex[p[25]];
+            uuid->Data4[5] = hex[p[26]] << 4 | hex[p[27]];
+            uuid->Data4[6] = hex[p[28]] << 4 | hex[p[29]];
+            uuid->Data4[7] = hex[p[30]] << 4 | hex[p[31]];
+        }
+        close( fd );
+    }
+}
+
 static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, ULONG *required_len)
 {
     switch (sfti->ProviderSignature)
@@ -2163,6 +2203,7 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
             system->product = system_product_len ? ++string_count : 0;
             system->version = system_version_len ? ++string_count : 0;
             system->serial = system_serial_len ? ++string_count : 0;
+            get_system_uuid( (GUID *)system->uuid );
             buffer += sizeof(struct smbios_system);
 
             copy_smbios_string(&buffer, system_vendor, system_vendor_len);
-- 
2.11.0




More information about the wine-devel mailing list