From 738b377c97704144b9e750c284155d0c7ac7bd4a Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Mon, 25 May 2015 06:07:50 +0200 Subject: [PATCH] wineboot: Assign a drive serial number during prefix creation/update. --- programs/wineboot/wineboot.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 21be0f55fb0..b67b60974b4 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -76,6 +76,7 @@ #include #include #include +#include #include #include "resource.h" @@ -580,6 +581,36 @@ done: RegCloseKey( bios_key ); } +/* set a serial number for the disk containing windows */ +static void create_disk_serial_number(void) +{ + static const WCHAR filename[] = {'\\','.','w','i','n','d','o','w','s','-','s','e','r','i','a','l',0}; + DWORD serial, written; + WCHAR path[MAX_PATH]; + char buffer[16]; + HANDLE file; + + if (GetSystemDirectoryW( path, sizeof(path)/sizeof(path[0]) ) && path[1] == ':') + { + path[2] = 0; + lstrcatW( path, filename ); + if (!PathFileExistsW( path ) && RtlGenRandom( &serial, sizeof(serial) )) + { + WINE_TRACE( "Putting serial number of %08X into file %s\n", serial, wine_dbgstr_w(path) ); + file = CreateFileW( path, GENERIC_WRITE, FILE_SHARE_READ, NULL, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); + if (file == INVALID_HANDLE_VALUE) + WINE_ERR( "wine: failed to create %s.\n", wine_dbgstr_w(path) ); + else + { + sprintf( buffer, "%X\n", serial ); + WriteFile( file, buffer, strlen(buffer), &written, NULL ); + CloseHandle( file ); + } + } + } +} + /* create the volatile hardware registry keys */ static void create_hardware_registry_keys(void) { @@ -1590,6 +1621,7 @@ int __cdecl main( int argc, char *argv[] ) ResetEvent( event ); /* in case this is a restart */ create_user_shared_data(); + create_disk_serial_number(); create_hardware_registry_keys(); create_dynamic_registry_keys(); create_environment_registry_keys(); -- 2.26.2