1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
From 3f08109213bf0262d30fa4ecb957aa2bfb0ce2fa Mon Sep 17 00:00:00 2001
From: Paul Gofman <pgofman@codeweavers.com>
Date: Fri, 7 Feb 2025 22:28:26 +0300
Subject: [PATCH 4/5] wineboot: Generate better DigitalProductId.
Signed-off-by: Vasiliy Stelmachenok <ventureo@cachyos.org>
---
programs/wineboot/wineboot.c | 46 ++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index d6b7d566240..b8ccc3bf116 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -78,6 +78,8 @@
#include <shellapi.h>
#include <setupapi.h>
#include <newdev.h>
+#include <wincrypt.h>
+#include "ntsecapi.h"
#include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1850,6 +1852,49 @@ static void usage( int status )
exit( status );
}
+static void create_digitalproductid(void)
+{
+ BYTE digital_product_id[0xa4];
+ char product_id[256];
+ LSTATUS status;
+ unsigned int i;
+ DWORD size;
+ DWORD type;
+ HKEY key;
+ if ((status = RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion",
+ 0, KEY_ALL_ACCESS, &key )))
+ return;
+ size = sizeof(product_id);
+ status = RegQueryValueExA( key, "ProductId", NULL, &type, (BYTE *)product_id, &size );
+ if (status) goto done;
+ if (!size) goto done;
+ if (product_id[size - 1])
+ {
+ if (size == sizeof(product_id)) goto done;
+ product_id[size++] = 0;
+ }
+ if (!RegQueryValueExA( key, "DigitalProductId", NULL, &type, NULL, &size ) && size == sizeof(digital_product_id))
+ {
+ if (RegQueryValueExA( key, "DigitalProductId", NULL, &type, digital_product_id, &size ))
+ goto done;
+ for (i = 0; i < size; ++i)
+ if (digital_product_id[i]) break;
+ if (i < size) goto done;
+ }
+ memset( digital_product_id, 0, sizeof(digital_product_id) );
+ *(DWORD *)digital_product_id = sizeof(digital_product_id);
+ digital_product_id[4] = 3;
+ strcpy( (char *)digital_product_id + 8, product_id );
+ *(DWORD *)(digital_product_id + 0x20) = 0x0cec;
+ *(DWORD *)(digital_product_id + 0x34) = 0x0cec;
+ strcpy( (char *)digital_product_id + 0x24, "[TH] X19-99481" );
+ digital_product_id[0x42] = 8;
+ RtlGenRandom( digital_product_id + 0x38, 0x18 );
+ RegSetValueExA( key, "DigitalProductId", 0, REG_BINARY, digital_product_id, sizeof(digital_product_id) );
+done:
+ RegCloseKey( key );
+}
+
int __cdecl main( int argc, char *argv[] )
{
/* First, set the current directory to SystemRoot */
@@ -1959,6 +2004,7 @@ int __cdecl main( int argc, char *argv[] )
}
if (init || update) update_wineprefix( update );
+ create_digitalproductid();
create_volatile_environment_registry_key();
ProcessRunKeys( HKEY_LOCAL_MACHINE, L"RunOnce", TRUE, TRUE );
--
2.48.1
|