wine-staging/patches/wineboot-DriveSerial/0001-wineboot-Assign-a-drive-serial-number-during-prefix-.patch

71 lines
2.3 KiB
Diff
Raw Normal View History

From 738b377c97704144b9e750c284155d0c7ac7bd4a Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
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 <shlwapi.h>
#include <shellapi.h>
2019-07-10 15:58:48 -07:00
#include <setupapi.h>
+#include <ntsecapi.h>
2019-07-10 15:58:48 -07:00
#include <newdev.h>
#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