From: Eric Pouech epouech@codeweavers.com
Project Kunai associates cloud account with a mix of various items, including board serial number, resulting in several machines being bound to the same cloud account.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/ntdll/unix/sha256.c | 2 ++ dlls/ntdll/unix/system.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+)
diff --git a/dlls/ntdll/unix/sha256.c b/dlls/ntdll/unix/sha256.c index 221bc3240bd..27f5f822535 100644 --- a/dlls/ntdll/unix/sha256.c +++ b/dlls/ntdll/unix/sha256.c @@ -21,6 +21,8 @@ #pragma makedep unix #endif
+#include "config.h" + #include <stdint.h> #include "unix_private.h"
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 80bbcfd4c70..b21bc71cd77 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -1639,6 +1639,13 @@ static void derive_machineid_to_uuid( GUID *uuid ) memcpy( uuid, out256, sizeof(*uuid) ); }
+static void fixup_missing_information( size_t *len, char *buffer, size_t buflen, GUID *uuid, const char *divert ) +{ + const unsigned *pu = (const unsigned *)uuid; + *len = snprintf(buffer, buflen, "%s%08x%08x%08x%08x", divert, pu[0], pu[1], pu[2], pu[3]); + if (*len >= buflen) *len = buflen - 1; +} + static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, ULONG *required_len ) { @@ -1702,6 +1709,16 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON chassis_args.asset_tag = chassis_asset_tag; #undef S
+ /* Some files above can only be readable by root. + * In that case, replace it by a simple derivation of machine GUID. + */ + if (!board_args.serial_len) + fixup_missing_information( &board_args.serial_len, board_serial, sizeof(board_serial), &system_args.uuid, "1" ); + if (!chassis_args.serial_len) + fixup_missing_information( &chassis_args.serial_len, chassis_serial, sizeof(chassis_serial), &system_args.uuid, "2" ); + if (!system_args.serial_len) + fixup_missing_information( &system_args.serial_len, system_serial, sizeof(system_serial), &system_args.uuid, "3" ); + return create_smbios_tables( sfti, available_len, required_len, &bios_args, &system_args, &board_args, &chassis_args ); }