Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2019
- 85 participants
- 778 discussions
[PATCH v3 1/2] include: add colordlg.h header file for color dialogs
by Vijay Kiran Kamuju 16 Nov '19
by Vijay Kiran Kamuju 16 Nov '19
16 Nov '19
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
include/Makefile.in | 1 +
include/colordlg.h | 62 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
create mode 100644 include/colordlg.h
diff --git a/include/Makefile.in b/include/Makefile.in
index c31fb50d7498..421e3d6c5988 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -60,6 +60,7 @@ SOURCES = \
cmdtxt.idl \
cmnquery.idl \
colinf.idl \
+ colordlg.h \
comcat.idl \
commctrl.h \
commctrl.rh \
diff --git a/include/colordlg.h b/include/colordlg.h
new file mode 100644
index 000000000000..330659f7a435
--- /dev/null
+++ b/include/colordlg.h
@@ -0,0 +1,62 @@
+/*
+ * Color Dialog definitions
+ *
+ * Copyright (C) 2019 Vijay Kiran Kamuju
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_COLORDLG_H
+#define __WINE_COLORDLG_H
+
+#define DLG_COLOR
+
+#define COLOR_HUESCROLL 700
+#define COLOR_SATSCROLL 701
+#define COLOR_LUMSCROLL 702
+#define COLOR_HUE 703
+#define COLOR_SAT 704
+#define COLOR_LUM 705
+#define COLOR_RED 706
+#define COLOR_GREEN 707
+#define COLOR_BLUE 708
+#define COLOR_CURRENT 709
+#define COLOR_RAINBOW 710
+#define COLOR_SAVE 711
+#define COLOR_ADD 712
+#define COLOR_SOLID 713
+#define COLOR_TUNE 714
+#define COLOR_SCHEMES 715
+#define COLOR_ELEMENT 716
+#define COLOR_SAMPLES 717
+#define COLOR_PALETTE 718
+#define COLOR_MIX 719
+#define COLOR_BOX1 720
+#define COLOR_CUSTOM1 721
+
+#define COLOR_HUEACCEL 723
+#define COLOR_SATACCEL 724
+#define COLOR_LUMACCEL 725
+#define COLOR_REDACCEL 726
+#define COLOR_GREENACCEL 727
+#define COLOR_BLUEACCEL 728
+
+#define COLOR_SOLID_LEFT 730
+#define COLOR_SOLID_RIGHT 731
+
+#define NUM_BASIC_COLORS 48
+#define NUM_CUSTOM_COLORS 16
+
+#endif /* __WINE_COLORDLG_H */
--
2.21.0
1
1
16 Nov '19
---
dlls/dssenh/Makefile.in | 5 +-
dlls/dssenh/cryptoprovconfig.h | 85 +++++
dlls/dssenh/dssenh.c | 96 ++++-
dlls/dssenh/dssenh.rgs | 28 ++
dlls/rsaenh/Makefile.in | 3 +-
dlls/rsaenh/cryptoprovconfig.h | 88 +++++
dlls/rsaenh/cryptoprovutils.c | 649 ++++++++++++++++++++++++++++++++
dlls/rsaenh/cryptoprovutils.h | 81 ++++
dlls/rsaenh/rsaenh.c | 656 +--------------------------------
9 files changed, 1026 insertions(+), 665 deletions(-)
create mode 100644 dlls/dssenh/cryptoprovconfig.h
create mode 100644 dlls/rsaenh/cryptoprovconfig.h
create mode 100644 dlls/rsaenh/cryptoprovutils.c
create mode 100644 dlls/rsaenh/cryptoprovutils.h
diff --git a/dlls/dssenh/Makefile.in b/dlls/dssenh/Makefile.in
index 54295f99ba..cb34ad3ae2 100644
--- a/dlls/dssenh/Makefile.in
+++ b/dlls/dssenh/Makefile.in
@@ -1,10 +1,13 @@
MODULE = dssenh.dll
IMPORTLIB = dssenh
IMPORTS = bcrypt crypt32 advapi32
+EXTRAINCL = -I$(top_srcdir)/dlls/
EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
- dssenh.c
+ dssenh.c \
+ ../rsaenh/cryptoprovutils.c \
+ ../rsaenh/handle.c
RC_SRCS = rsrc.rc
diff --git a/dlls/dssenh/cryptoprovconfig.h b/dlls/dssenh/cryptoprovconfig.h
new file mode 100644
index 0000000000..f6e307bc96
--- /dev/null
+++ b/dlls/dssenh/cryptoprovconfig.h
@@ -0,0 +1,85 @@
+/*
+ * dlls/rsaenh/cryptoprovconfig.h
+ * Definitions of some constants used by crypto provider.
+ * It is copied to build dir then included by cryptoprovutils.h,
+ * the build dir comes first in include search paths.
+ * So a new provider implementation only needs to provide its own
+ * cryptoprovconfig.h.
+ *
+ * Copyright 2002 TransGaming Technologies (David Hammerton)
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004, 2005 Michael Jung
+ * Copyright 2007 Vijay Kiran Kamuju
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_CRYPTOPROVCONFIG_H
+#define __WINE_CRYPTOPROVCONFIG_H
+#define DSSENH_MAGIC_KEY 0x73620457u
+#define DSSENH_MAX_KEY_SIZE 64
+#define DSSENH_MAX_BLOCK_SIZE 24
+#define DSSENH_MAGIC_CONTAINER 0x26384993u
+#define DSSENH_REGKEY "Software\\Wine\\Crypto\\DSS\\%s"
+
+#define CRYPTO_PROV_MAGIC_KEY DSSENH_MAGIC_KEY
+#define CRYPTO_PROV_MAX_KEY_SIZE DSSENH_MAX_KEY_SIZE
+#define CRYPTO_PROV_MAX_BLOCK_SIZE DSSENH_MAX_BLOCK_SIZE
+#define CRYPTO_PROV_MAGIC_CONTAINER DSSENH_MAGIC_CONTAINER
+#define CRYPTO_PROV_REGKEY DSSENH_REGKEY
+
+/******************************************************************************
+ * CRYPTKEY - key objects
+ */
+#define DSSENH_KEYSTATE_IDLE 0
+#define DSSENH_KEYSTATE_ENCRYPTING 1
+#define DSSENH_KEYSTATE_MASTERKEY 2
+typedef struct _DSSENH_SCHANNEL_INFO
+{
+ SCHANNEL_ALG saEncAlg;
+ SCHANNEL_ALG saMACAlg;
+ CRYPT_DATA_BLOB blobClientRandom;
+ CRYPT_DATA_BLOB blobServerRandom;
+} DSSENH_SCHANNEL_INFO;
+#define CRYPTO_PROV_SCHANNEL_INFO DSSENH_SCHANNEL_INFO
+
+/******************************************************************************
+ * KEYCONTAINER - key containers
+ */
+#define DSSENH_PERSONALITY_BASE 0u
+#define DSSENH_PERSONALITY_BASE_DH 1u
+#define DSSENH_PERSONALITY_ENHANCED 2u
+#define DSSENH_PERSONALITY_SCHANNEL 3u
+
+/******************************************************************************
+ * Used by new_key_container to determine the personality via provider name.
+ * The first entry in aProvNamePersonalityPairs should be the default
personality.
+ */
+typedef struct tagPROVNAMEPERSONALITYPAIR
+{
+ LPCSTR pszProvName;
+ DWORD dwPersonality;
+} PROVNAMEPERSONALITYPAIR;
+
+static const DWORD dwNProvNamePersonalityPairs = 0;
+static const PROVNAMEPERSONALITYPAIR aProvNamePersonalityPairs[6] =
+{
+ {"", DSSENH_PERSONALITY_ENHANCED},
+ {MS_DEF_DSS_PROV_A, DSSENH_PERSONALITY_BASE},
+ {MS_DEF_DSS_DH_PROV_A, DSSENH_PERSONALITY_BASE_DH},
+ {MS_DEF_DH_SCHANNEL_PROV_A, DSSENH_PERSONALITY_SCHANNEL}
+};
+
+#endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/dssenh/dssenh.c b/dlls/dssenh/dssenh.c
index 5dc5464724..a3c8af8f48 100644
--- a/dlls/dssenh/dssenh.c
+++ b/dlls/dssenh/dssenh.c
@@ -21,21 +21,39 @@
#include "windef.h"
#include "winbase.h"
+#include "winreg.h"
#include "wincrypt.h"
+#include "objbase.h"
+#include "rpcproxy.h"
+#include "rsaenh/handle.h"
+#include "rsaenh/cryptoprovutils.h"
#include "wine/debug.h"
+
WINE_DEFAULT_DEBUG_CHANNEL(dssenh);
-BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+static HINSTANCE instance;
+
+/******************************************************************************
+ * CSP's handle table (used by all acquired key containers)
+ */
+struct handle_table handle_table;
+
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID reserved)
{
- TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
+ TRACE("(0x%p, %d, %p)\n", hInstance, fdwReason, reserved);
switch (fdwReason)
{
- case DLL_WINE_PREATTACH:
- return FALSE; /* prefer native version */
case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hinstDLL);
+ instance = hInstance;
+ DisableThreadLibraryCalls(hInstance);
+ init_handle_table(&handle_table);
+ break;
+
+ case DLL_PROCESS_DETACH:
+ if (reserved) break;
+ destroy_handle_table(&handle_table);
break;
}
return TRUE;
@@ -46,8 +64,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD
fdwReason, LPVOID lpvReserved)
*/
HRESULT WINAPI DllRegisterServer(void)
{
- FIXME("Not implemented.\n");
- return E_UNEXPECTED;
+ return __wine_register_resources( instance );
}
/*****************************************************
@@ -55,8 +72,63 @@ HRESULT WINAPI DllRegisterServer(void)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
- FIXME("Not implemented.\n");
- return E_UNEXPECTED;
+ return __wine_unregister_resources( instance );
+}
+
+/******************************************************************************
+ * crypt_export_key [Internal]
+ *
+ * Export a key into a binary large object (BLOB). Called by CPExportKey and
+ * by store_key_pair.
+ *
+ * PARAMS
+ * pCryptKey [I] Key to be exported.
+ * hPubKey [I] Key used to encrypt sensitive BLOB data.
+ * dwBlobType [I] SIMPLEBLOB, PUBLICKEYBLOB or PRIVATEKEYBLOB.
+ * dwFlags [I] Currently none defined.
+ * force [I] If TRUE, the key is written no matter what the key's
+ * permissions are. Otherwise the key's permissions are
+ * checked before exporting.
+ * pbData [O] Pointer to a buffer where the BLOB will be written to.
+ * pdwDataLen [I/O] I: Size of buffer at pbData, O: Size of BLOB
+ *
+ * RETURNS
+ * Success: TRUE.
+ * Failure: FALSE.
+ */
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+ DWORD dwBlobType, DWORD dwFlags, BOOL force,
+ BYTE *pbData, DWORD *pdwDataLen)
+{
+ FIXME("stub\n");
+ return FALSE;
+}
+
+/******************************************************************************
+ * import_key [Internal]
+ *
+ * Import a BLOB'ed key into a key container, optionally storing the key's
+ * value to the registry.
+ *
+ * PARAMS
+ * hProv [I] Key container into which the key is to be imported.
+ * pbData [I] Pointer to a buffer which holds the BLOB.
+ * dwDataLen [I] Length of data in buffer at pbData.
+ * hPubKey [I] Key used to decrypt sensitive BLOB data.
+ * dwFlags [I] One of:
+ * CRYPT_EXPORTABLE: the imported key is marked exportable
+ * fStoreKey [I] If TRUE, the imported key is stored to the registry.
+ * phKey [O] Handle to the imported key.
+ *
+ * RETURNS
+ * Success: TRUE.
+ * Failure: FALSE.
+ */
+BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD
dwDataLen, HCRYPTKEY hPubKey,
+ DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey)
+{
+ FIXME("stub\n");
+ return FALSE;
}
/******************************************************************************
@@ -87,8 +159,7 @@ HRESULT WINAPI DllUnregisterServer(void)
BOOL WINAPI DSSENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
DWORD dwFlags, PVTableProvStruc pVTable)
{
- FIXME("stub\n");
- return FALSE;
+ return CRYPTO_PROV_CPAcquireContext(phProv, pszContainer,
dwFlags, pVTable);
}
/******************************************************************************
@@ -573,8 +644,7 @@ BOOL WINAPI DSSENH_CPImportKey(HCRYPTPROV hProv,
const BYTE *pbData, DWORD dwDat
*/
BOOL WINAPI DSSENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
{
- FIXME("stub\n");
- return FALSE;
+ return CRYPTO_PROV_CPReleaseContext(hProv, dwFlags);
}
/******************************************************************************
diff --git a/dlls/dssenh/dssenh.rgs b/dlls/dssenh/dssenh.rgs
index 19899cb516..e16d8e0bc7 100644
--- a/dlls/dssenh/dssenh.rgs
+++ b/dlls/dssenh/dssenh.rgs
@@ -16,6 +16,24 @@ HKLM
val 'Signature' = b deadbeef
val 'Type' = d 13
}
+ ForceRemove 'Microsoft Base DSS and
Diffie-Hellman Cryptographic Provider'
+ {
+ val 'Image Path' = s '%MODULE%'
+ val 'Signature' = b deadbeef
+ val 'Type' = d 13
+ }
+ ForceRemove 'Microsoft Base DSS Cryptographic Provider'
+ {
+ val 'Image Path' = s '%MODULE%'
+ val 'Signature' = b deadbeef
+ val 'Type' = d 3
+ }
+ ForceRemove 'Microsoft DH SChannel
Cryptographic Provider'
+ {
+ val 'Image Path' = s '%MODULE%'
+ val 'Signature' = b deadbeef
+ val 'Type' = d 18
+ }
}
NoRemove 'Provider Types'
{
@@ -24,6 +42,16 @@ HKLM
val 'Name' = s 'Microsoft Enhanced DSS
and Diffie-Hellman Cryptographic Provider'
val 'TypeName' = s 'DSS Signature with
Diffe-zhellman Key Exchange'
}
+ ForceRemove 'Type 003'
+ {
+ val 'Name' = s 'Microsoft Base DSS
Cryptographic Provider'
+ val 'TypeName' = s 'DSS Signature'
+ }
+ ForceRemove 'Type 018'
+ {
+ val 'Name' = s 'Microsoft DH SChannel
Cryptographic Provider'
+ val 'TypeName' = s 'Diffie-Hellman SChannel'
+ }
}
}
}
diff --git a/dlls/rsaenh/Makefile.in b/dlls/rsaenh/Makefile.in
index 80680d6622..dd8574fcaf 100644
--- a/dlls/rsaenh/Makefile.in
+++ b/dlls/rsaenh/Makefile.in
@@ -13,6 +13,7 @@ C_SRCS = \
rc2.c \
rc4.c \
rsa.c \
- rsaenh.c
+ rsaenh.c \
+ cryptoprovutils.c
RC_SRCS = rsrc.rc
diff --git a/dlls/rsaenh/cryptoprovconfig.h b/dlls/rsaenh/cryptoprovconfig.h
new file mode 100644
index 0000000000..667bb475ac
--- /dev/null
+++ b/dlls/rsaenh/cryptoprovconfig.h
@@ -0,0 +1,88 @@
+/*
+ * dlls/rsaenh/cryptoprovconfig.h
+ * Definitions of some constants used by crypto provider.
+ * It is copied to build dir then included by cryptoprovutils.h,
+ * the build dir comes first in include search paths.
+ * So a new provider implementation only needs to provide its own
+ * cryptoprovconfig.h.
+ *
+ * Copyright 2002 TransGaming Technologies (David Hammerton)
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004, 2005 Michael Jung
+ * Copyright 2007 Vijay Kiran Kamuju
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_CRYPTOPROVCONFIG_H
+#define __WINE_CRYPTOPROVCONFIG_H
+#define RSAENH_MAGIC_KEY 0x73620457u
+#define RSAENH_MAX_KEY_SIZE 64
+#define RSAENH_MAX_BLOCK_SIZE 24
+#define RSAENH_MAGIC_CONTAINER 0x26384993u
+#define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
+
+#define CRYPTO_PROV_MAGIC_KEY RSAENH_MAGIC_KEY
+#define CRYPTO_PROV_MAX_KEY_SIZE RSAENH_MAX_KEY_SIZE
+#define CRYPTO_PROV_MAX_BLOCK_SIZE RSAENH_MAX_BLOCK_SIZE
+#define CRYPTO_PROV_MAGIC_CONTAINER RSAENH_MAGIC_CONTAINER
+#define CRYPTO_PROV_REGKEY RSAENH_REGKEY
+
+/******************************************************************************
+ * CRYPTKEY - key objects
+ */
+#define RSAENH_KEYSTATE_IDLE 0
+#define RSAENH_KEYSTATE_ENCRYPTING 1
+#define RSAENH_KEYSTATE_MASTERKEY 2
+typedef struct _RSAENH_SCHANNEL_INFO
+{
+ SCHANNEL_ALG saEncAlg;
+ SCHANNEL_ALG saMACAlg;
+ CRYPT_DATA_BLOB blobClientRandom;
+ CRYPT_DATA_BLOB blobServerRandom;
+} RSAENH_SCHANNEL_INFO;
+#define CRYPTO_PROV_SCHANNEL_INFO RSAENH_SCHANNEL_INFO
+
+/******************************************************************************
+ * KEYCONTAINER - key containers
+ */
+#define RSAENH_PERSONALITY_BASE 0u
+#define RSAENH_PERSONALITY_STRONG 1u
+#define RSAENH_PERSONALITY_ENHANCED 2u
+#define RSAENH_PERSONALITY_SCHANNEL 3u
+#define RSAENH_PERSONALITY_AES 4u
+
+/******************************************************************************
+ * Used by new_key_container to determine the personality via provider name.
+ * The first entry in aProvNamePersonalityPairs should be the default
personality.
+ */
+typedef struct tagPROVNAMEPERSONALITYPAIR
+{
+ LPCSTR pszProvName;
+ DWORD dwPersonality;
+} PROVNAMEPERSONALITYPAIR;
+
+static const DWORD dwNProvNamePersonalityPairs = 6;
+static const PROVNAMEPERSONALITYPAIR aProvNamePersonalityPairs[6] =
+{
+ {"", RSAENH_PERSONALITY_STRONG},
+ {MS_DEF_PROV_A, RSAENH_PERSONALITY_BASE},
+ {MS_ENHANCED_PROV_A, RSAENH_PERSONALITY_ENHANCED},
+ {MS_DEF_RSA_SCHANNEL_PROV_A, RSAENH_PERSONALITY_SCHANNEL},
+ {MS_ENH_RSA_AES_PROV_A, RSAENH_PERSONALITY_AES},
+ {MS_ENH_RSA_AES_PROV_XP_A, RSAENH_PERSONALITY_AES}
+};
+
+#endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/rsaenh/cryptoprovutils.c b/dlls/rsaenh/cryptoprovutils.c
new file mode 100644
index 0000000000..c37c4e7925
--- /dev/null
+++ b/dlls/rsaenh/cryptoprovutils.c
@@ -0,0 +1,649 @@
+/*
+ * dlls/rsaenh/cryptoprovutils.c
+ * Utility functions to implement crypto privider.
+ *
+ * Copyright 2002 TransGaming Technologies (David Hammerton)
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004, 2005 Michael Jung
+ * Copyright 2007 Vijay Kiran Kamuju
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wincrypt.h"
+#include "handle.h"
+#include "cryptoprovutils.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(crypt);
+extern struct handle_table handle_table;
+
+/******************************************************************************
+ * create_container_key [Internal]
+ *
+ * Creates the registry key for a key container's persistent storage.
+ *
+ * PARAMS
+ * pKeyContainer [I] Pointer to the key container
+ * sam [I] Desired registry access
+ * phKey [O] Returned key
+ */
+BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam, HKEY *phKey)
+{
+ CHAR szBase[sizeof(CRYPTO_PROV_REGKEY) + MAX_PATH];
+ HKEY hRootKey;
+
+ sprintf(szBase, CRYPTO_PROV_REGKEY, pKeyContainer->szName);
+
+ if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
+ hRootKey = HKEY_LOCAL_MACHINE;
+ else
+ hRootKey = HKEY_CURRENT_USER;
+
+ /* @@ Wine registry key: HKLM\Software\Wine\Crypto\[CRYPTO_PROV] */
+ /* @@ Wine registry key: HKCU\Software\Wine\Crypto\[CRYPTO_PROV] */
+ return RegCreateKeyExA(hRootKey, szBase, 0, NULL,
+ REG_OPTION_NON_VOLATILE, sam, NULL, phKey, NULL)
+ == ERROR_SUCCESS;
+}
+
+/******************************************************************************
+ * open_container_key [Internal]
+ *
+ * Opens a key container's persistent storage for reading.
+ *
+ * PARAMS
+ * pszContainerName [I] Name of the container to be opened. May be the empty
+ * string if the parent key of all containers is to be
+ * opened.
+ * dwFlags [I] Flags indicating which keyset to be opened.
+ * phKey [O] Returned key
+ */
+BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags,
REGSAM access, HKEY *phKey)
+{
+ CHAR szRegBase[sizeof(CRYPTO_PROV_REGKEY) + MAX_PATH];
+ HKEY hRootKey;
+
+ sprintf(szRegBase, CRYPTO_PROV_REGKEY, pszContainerName);
+
+ if (dwFlags & CRYPT_MACHINE_KEYSET)
+ hRootKey = HKEY_LOCAL_MACHINE;
+ else
+ hRootKey = HKEY_CURRENT_USER;
+
+ /* @@ Wine registry key: HKLM\Software\Wine\Crypto\[CRYPTO_PROV] */
+ /* @@ Wine registry key: HKCU\Software\Wine\Crypto\[CRYPTO_PROV] */
+ return RegOpenKeyExA(hRootKey, szRegBase, 0, access, phKey) ==
+ ERROR_SUCCESS;
+}
+
+/******************************************************************************
+ * delete_container_key [Internal]
+ *
+ * Deletes a key container's persistent storage.
+ *
+ * PARAMS
+ * pszContainerName [I] Name of the container to be opened.
+ * dwFlags [I] Flags indicating which keyset to be opened.
+ */
+static BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags)
+{
+ CHAR szRegKey[sizeof(CRYPTO_PROV_REGKEY) + MAX_PATH];
+ HKEY hRootKey;
+
+ sprintf(szRegKey, CRYPTO_PROV_REGKEY, pszContainerName);
+
+ if (dwFlags & CRYPT_MACHINE_KEYSET)
+ hRootKey = HKEY_LOCAL_MACHINE;
+ else
+ hRootKey = HKEY_CURRENT_USER;
+ if (!RegDeleteKeyA(hRootKey, szRegKey)) {
+ SetLastError(ERROR_SUCCESS);
+ return TRUE;
+ } else {
+ SetLastError(NTE_BAD_KEYSET);
+ return FALSE;
+ }
+}
+
+/******************************************************************************
+ * new_key_container [Internal]
+ *
+ * Create a new key container. The personality of the CSP is determined via
+ * the pVTable->pszProvName string.
+ *
+ * PARAMS
+ * pszContainerName [I] Name of the key container.
+ * pVTable [I] Callback functions and context info provided by the OS
+ *
+ * RETURNS
+ * Success: Handle to the new key container.
+ * Failure: INVALID_HANDLE_VALUE
+ */
+HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags,
const VTableProvStruc *pVTable)
+{
+ KEYCONTAINER *pKeyContainer;
+ HCRYPTPROV hKeyContainer;
+ DWORD i;
+
+ hKeyContainer = new_object(&handle_table, sizeof(KEYCONTAINER),
+ CRYPTO_PROV_MAGIC_CONTAINER, destroy_key_container,
+ (OBJECTHDR**)&pKeyContainer);
+ if (hKeyContainer != (HCRYPTPROV)INVALID_HANDLE_VALUE)
+ {
+ lstrcpynA(pKeyContainer->szName, pszContainerName, MAX_PATH);
+ pKeyContainer->dwFlags = dwFlags;
+ pKeyContainer->dwEnumAlgsCtr = 0;
+ pKeyContainer->hKeyExchangeKeyPair = (HCRYPTKEY)INVALID_HANDLE_VALUE;
+ pKeyContainer->hSignatureKeyPair = (HCRYPTKEY)INVALID_HANDLE_VALUE;
+ if (pVTable && pVTable->pszProvName) {
+ lstrcpynA(pKeyContainer->szProvName,
pVTable->pszProvName, MAX_PATH);
+ pKeyContainer->dwPersonality
+ = aProvNamePersonalityPairs[0].dwPersonality;
+ for (i = 1; i < dwNProvNamePersonalityPairs; i++) {
+ if (!strcmp(pVTable->pszProvName,
+ aProvNamePersonalityPairs[i].pszProvName)) {
+ pKeyContainer->dwPersonality
+ = aProvNamePersonalityPairs[i].dwPersonality;
+ break;
+ }
+ }
+ }
+
+ /* The new key container has to be inserted into the CSP immediately
+ * after creation to be available for CPGetProvParam's
PP_ENUMCONTAINERS. */
+ if (!(dwFlags & CRYPT_VERIFYCONTEXT)) {
+ HKEY hKey;
+
+ if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
+ RegCloseKey(hKey);
+ }
+ }
+
+ return hKeyContainer;
+}
+
+/******************************************************************************
+ * destroy_key_container [Internal]
+ *
+ * Destructor for key containers.
+ *
+ * PARAMS
+ * pObjectHdr [I] Pointer to the key container to be destroyed.
+ */
+void destroy_key_container(OBJECTHDR *pObjectHdr)
+{
+ KEYCONTAINER *pKeyContainer = (KEYCONTAINER*)pObjectHdr;
+
+ if (!(pKeyContainer->dwFlags & CRYPT_VERIFYCONTEXT))
+ {
+ store_key_container_keys(pKeyContainer);
+ store_key_container_permissions(pKeyContainer);
+ release_key_container_keys(pKeyContainer);
+ }
+ else
+ release_key_container_keys(pKeyContainer);
+ HeapFree( GetProcessHeap(), 0, pKeyContainer );
+}
+
+/******************************************************************************
+ * store_key_container_keys [Internal]
+ *
+ * Stores key container's keys in a persistent location.
+ *
+ * PARAMS
+ * pKeyContainer [I] Pointer to the key container whose keys are to be saved
+ */
+void store_key_container_keys(KEYCONTAINER *pKeyContainer)
+{
+ HKEY hKey;
+ DWORD dwFlags;
+
+ /* On WinXP, persistent keys are stored in a file located at:
+ * $AppData$\\Microsoft\\Crypto\\[CRYPTO_PROV]\\$SID$\\some_hex_string
+ */
+
+ if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
+ dwFlags = CRYPTPROTECT_LOCAL_MACHINE;
+ else
+ dwFlags = 0;
+
+ if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
+ {
+ store_key_pair(pKeyContainer->hKeyExchangeKeyPair, hKey,
+ AT_KEYEXCHANGE, dwFlags);
+ store_key_pair(pKeyContainer->hSignatureKeyPair, hKey,
+ AT_SIGNATURE, dwFlags);
+ RegCloseKey(hKey);
+ }
+}
+
+/******************************************************************************
+ * store_key_pair [Internal]
+ *
+ * Stores a key pair to the registry
+ *
+ * PARAMS
+ * hCryptKey [I] Handle to the key to be stored
+ * hKey [I] Registry key where the key pair is to be stored
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ * dwFlags [I] Flags for protecting the key
+ */
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec,
DWORD dwFlags)
+{
+ LPCSTR szValueName;
+ DATA_BLOB blobIn, blobOut;
+ CRYPTKEY *pKey;
+ DWORD dwLen;
+ BYTE *pbKey;
+
+ if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
+ return;
+ if (lookup_handle(&handle_table, hCryptKey, CRYPTO_PROV_MAGIC_KEY,
+ (OBJECTHDR**)&pKey))
+ {
+ if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
+ {
+ pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
+ if (pbKey)
+ {
+ if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
+ &dwLen))
+ {
+ blobIn.pbData = pbKey;
+ blobIn.cbData = dwLen;
+
+ if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
+ dwFlags, &blobOut))
+ {
+ RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
+ blobOut.pbData, blobOut.cbData);
+ LocalFree(blobOut.pbData);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, pbKey);
+ }
+ }
+ }
+}
+
+/******************************************************************************
+ * store_key_container_permissions [Internal]
+ *
+ * Stores key container's key permissions in a persistent location.
+ *
+ * PARAMS
+ * pKeyContainer [I] Pointer to the key container whose key permissions are to
+ * be saved
+ */
+void store_key_container_permissions(KEYCONTAINER *pKeyContainer)
+{
+ HKEY hKey;
+
+ if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
+ {
+ store_key_permissions(pKeyContainer->hKeyExchangeKeyPair, hKey,
+ AT_KEYEXCHANGE);
+ store_key_permissions(pKeyContainer->hSignatureKeyPair, hKey,
+ AT_SIGNATURE);
+ RegCloseKey(hKey);
+ }
+}
+
+/******************************************************************************
+ * store_key_permissions [Internal]
+ *
+ * Stores a key's permissions to the registry
+ *
+ * PARAMS
+ * hCryptKey [I] Handle to the key whose permissions are to be stored
+ * hKey [I] Registry key where the key permissions are to be stored
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ */
+void store_key_permissions(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec)
+{
+ LPCSTR szValueName;
+ CRYPTKEY *pKey;
+
+ if (!(szValueName = map_key_spec_to_permissions_name(dwKeySpec)))
+ return;
+ if (lookup_handle(&handle_table, hCryptKey, CRYPTO_PROV_MAGIC_KEY,
+ (OBJECTHDR**)&pKey))
+ RegSetValueExA(hKey, szValueName, 0, REG_DWORD,
+ (BYTE *)&pKey->dwPermissions,
+ sizeof(pKey->dwPermissions));
+}
+
+/******************************************************************************
+ * release_key_container_keys [Internal]
+ *
+ * Releases key container's keys.
+ *
+ * PARAMS
+ * pKeyContainer [I] Pointer to the key container whose keys are to
be released.
+ */
+void release_key_container_keys(KEYCONTAINER *pKeyContainer)
+{
+ release_handle(&handle_table, pKeyContainer->hKeyExchangeKeyPair,
+ CRYPTO_PROV_MAGIC_KEY);
+ release_handle(&handle_table, pKeyContainer->hSignatureKeyPair,
+ CRYPTO_PROV_MAGIC_KEY);
+}
+
+/******************************************************************************
+ * map_key_spec_to_key_pair_name [Internal]
+ *
+ * Returns the name of the registry value associated with a key spec.
+ *
+ * PARAMS
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *
+ * RETURNS
+ * Success: Name of registry value.
+ * Failure: NULL
+ */
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
+{
+ LPCSTR szValueName;
+
+ switch (dwKeySpec)
+ {
+ case AT_KEYEXCHANGE:
+ szValueName = "KeyExchangeKeyPair";
+ break;
+ case AT_SIGNATURE:
+ szValueName = "SignatureKeyPair";
+ break;
+ default:
+ WARN("invalid key spec %d\n", dwKeySpec);
+ szValueName = NULL;
+ }
+ return szValueName;
+}
+
+/******************************************************************************
+ * map_key_spec_to_permissions_name [Internal]
+ *
+ * Returns the name of the registry value associated with the permissions for
+ * a key spec.
+ *
+ * PARAMS
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *
+ * RETURNS
+ * Success: Name of registry value.
+ * Failure: NULL
+ */
+LPCSTR map_key_spec_to_permissions_name(DWORD dwKeySpec)
+{
+ LPCSTR szValueName;
+
+ switch (dwKeySpec)
+ {
+ case AT_KEYEXCHANGE:
+ szValueName = "KeyExchangePermissions";
+ break;
+ case AT_SIGNATURE:
+ szValueName = "SignaturePermissions";
+ break;
+ default:
+ WARN("invalid key spec %d\n", dwKeySpec);
+ szValueName = NULL;
+ }
+ return szValueName;
+}
+
+/******************************************************************************
+ * read_key_value [Internal]
+ *
+ * Reads a key pair value from the registry
+ *
+ * PARAMS
+ * hKeyContainer [I] Crypt provider to use to import the key
+ * hKey [I] Registry key from which to read the key pair
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ * dwFlags [I] Flags for unprotecting the key
+ * phCryptKey [O] Returned key
+ */
+static BOOL read_key_value(HCRYPTPROV hKeyContainer, HKEY hKey, DWORD
dwKeySpec, DWORD dwFlags, HCRYPTKEY *phCryptKey)
+{
+ LPCSTR szValueName;
+ DWORD dwValueType, dwLen;
+ BYTE *pbKey;
+ DATA_BLOB blobIn, blobOut;
+ BOOL ret = FALSE;
+
+ if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
+ return FALSE;
+ if (RegQueryValueExA(hKey, szValueName, 0, &dwValueType, NULL, &dwLen) ==
+ ERROR_SUCCESS)
+ {
+ pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
+ if (pbKey)
+ {
+ if (RegQueryValueExA(hKey, szValueName, 0, &dwValueType,
pbKey, &dwLen) ==
+ ERROR_SUCCESS)
+ {
+ blobIn.pbData = pbKey;
+ blobIn.cbData = dwLen;
+
+ if (CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL,
+ dwFlags, &blobOut))
+ {
+ ret = import_key(hKeyContainer, blobOut.pbData,
blobOut.cbData, 0, 0,
+ FALSE, phCryptKey);
+ LocalFree(blobOut.pbData);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, pbKey);
+ }
+ }
+ if (ret)
+ {
+ CRYPTKEY *pKey;
+
+ if (lookup_handle(&handle_table, *phCryptKey, CRYPTO_PROV_MAGIC_KEY,
+ (OBJECTHDR**)&pKey))
+ {
+ if ((szValueName = map_key_spec_to_permissions_name(dwKeySpec)))
+ {
+ dwLen = sizeof(pKey->dwPermissions);
+ RegQueryValueExA(hKey, szValueName, 0, NULL,
+ (BYTE *)&pKey->dwPermissions, &dwLen);
+ }
+ }
+ }
+ return ret;
+}
+
+/******************************************************************************
+ * read_key_container [Internal]
+ *
+ * Tries to read the persistent state of the key container (mainly
the signature
+ * and key exchange private keys) given by pszContainerName.
+ *
+ * PARAMS
+ * pszContainerName [I] Name of the key container to read from the registry
+ * pVTable [I] Pointer to context data provided by the
operating system
+ *
+ * RETURNS
+ * Success: Handle to the key container read from the registry
+ * Failure: INVALID_HANDLE_VALUE
+ */
+static HCRYPTPROV read_key_container(PCHAR pszContainerName, DWORD
dwFlags, const VTableProvStruc *pVTable)
+{
+ HKEY hKey;
+ KEYCONTAINER *pKeyContainer;
+ HCRYPTPROV hKeyContainer;
+ HCRYPTKEY hCryptKey;
+
+ if (!open_container_key(pszContainerName, dwFlags, KEY_READ, &hKey))
+ {
+ SetLastError(NTE_BAD_KEYSET);
+ return (HCRYPTPROV)INVALID_HANDLE_VALUE;
+ }
+
+ hKeyContainer = new_key_container(pszContainerName, dwFlags, pVTable);
+ if (hKeyContainer != (HCRYPTPROV)INVALID_HANDLE_VALUE)
+ {
+ DWORD dwProtectFlags = (dwFlags & CRYPT_MACHINE_KEYSET) ?
+ CRYPTPROTECT_LOCAL_MACHINE : 0;
+
+ if (!lookup_handle(&handle_table, hKeyContainer,
CRYPTO_PROV_MAGIC_CONTAINER,
+ (OBJECTHDR**)&pKeyContainer))
+ return (HCRYPTPROV)INVALID_HANDLE_VALUE;
+
+ /* read_key_value calls import_key, which calls import_private_key,
+ * which implicitly installs the key value into the appropriate key
+ * container key. Thus the ref count is incremented twice, once for
+ * the output key value, and once for the implicit install, and needs
+ * to be decremented to balance the two.
+ */
+ if (read_key_value(hKeyContainer, hKey, AT_KEYEXCHANGE,
+ dwProtectFlags, &hCryptKey))
+ release_handle(&handle_table, hCryptKey, CRYPTO_PROV_MAGIC_KEY);
+ if (read_key_value(hKeyContainer, hKey, AT_SIGNATURE,
+ dwProtectFlags, &hCryptKey))
+ release_handle(&handle_table, hCryptKey, CRYPTO_PROV_MAGIC_KEY);
+ }
+
+ return hKeyContainer;
+}
+
+/******************************************************************************
+ * CPAcquireContext (CRYPTO_PROV_PFX.@)
+ *
+ * Acquire a handle to the key container specified by pszContainer
+ *
+ * PARAMS
+ * phProv [O] Pointer to the location the acquired handle will
be written to.
+ * pszContainer [I] Name of the desired key container. See Notes
+ * dwFlags [I] Flags. See Notes.
+ * pVTable [I] Pointer to a PVTableProvStruct containing callbacks.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ * NOTES
+ * If pszContainer is NULL or points to a zero length string the user's login
+ * name will be used as the key container name.
+ *
+ * If the CRYPT_NEW_KEYSET flag is set in dwFlags a new keyset will
be created.
+ * If a keyset with the given name already exists, the function fails and sets
+ * last error to NTE_EXISTS. If CRYPT_NEW_KEYSET is not set and the specified
+ * key container does not exist, function fails and sets last error to
+ * NTE_BAD_KEYSET.
+ */
+BOOL CRYPTO_PROV_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
+ DWORD dwFlags, PVTableProvStruc pVTable)
+{
+ CHAR szKeyContainerName[MAX_PATH];
+
+ TRACE("(phProv=%p, pszContainer=%s, dwFlags=%08x, pVTable=%p)\n", phProv,
+ debugstr_a(pszContainer), dwFlags, pVTable);
+
+ if (pszContainer && *pszContainer)
+ {
+ lstrcpynA(szKeyContainerName, pszContainer, MAX_PATH);
+ }
+ else
+ {
+ DWORD dwLen = sizeof(szKeyContainerName);
+ if (!GetUserNameA(szKeyContainerName, &dwLen)) return FALSE;
+ }
+
+ switch (dwFlags & (CRYPT_NEWKEYSET|CRYPT_VERIFYCONTEXT|CRYPT_DELETEKEYSET))
+ {
+ case 0:
+ *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable);
+ break;
+
+ case CRYPT_DELETEKEYSET:
+ return delete_container_key(szKeyContainerName, dwFlags);
+
+ case CRYPT_NEWKEYSET:
+ *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable);
+ if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE)
+ {
+ release_handle(&handle_table, *phProv,
CRYPTO_PROV_MAGIC_CONTAINER);
+ TRACE("Can't create new keyset, already exists\n");
+ SetLastError(NTE_EXISTS);
+ return FALSE;
+ }
+ *phProv = new_key_container(szKeyContainerName, dwFlags, pVTable);
+ break;
+
+ case CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET:
+ case CRYPT_VERIFYCONTEXT:
+ if (pszContainer && *pszContainer) {
+ TRACE("pszContainer should be empty\n");
+ SetLastError(NTE_BAD_FLAGS);
+ return FALSE;
+ }
+ *phProv = new_key_container("", dwFlags, pVTable);
+ break;
+
+ default:
+ *phProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
+ SetLastError(NTE_BAD_FLAGS);
+ return FALSE;
+ }
+
+ if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) {
+ SetLastError(ERROR_SUCCESS);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+/******************************************************************************
+ * CPReleaseContext (CRYPTO_PROV.@)
+ *
+ * Release a key container.
+ *
+ * PARAMS
+ * hProv [I] Key container to be released.
+ * dwFlags [I] Currently none defined.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL CRYPTO_PROV_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
+{
+ TRACE("(hProv=%08lx, dwFlags=%08x)\n", hProv, dwFlags);
+
+ if (!release_handle(&handle_table, hProv, CRYPTO_PROV_MAGIC_CONTAINER))
+ {
+ /* MSDN: hProv not containing valid context handle */
+ SetLastError(NTE_BAD_UID);
+ return FALSE;
+ }
+
+ if (dwFlags) {
+ SetLastError(NTE_BAD_FLAGS);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/dlls/rsaenh/cryptoprovutils.h b/dlls/rsaenh/cryptoprovutils.h
new file mode 100644
index 0000000000..c4997bb35e
--- /dev/null
+++ b/dlls/rsaenh/cryptoprovutils.h
@@ -0,0 +1,81 @@
+/*
+ * dlls/rsaenh/cryptoprovutils.h
+ * Header of utility functions to implement crypto privider.
+ *
+ * Copyright 2002 TransGaming Technologies (David Hammerton)
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004, 2005 Michael Jung
+ * Copyright 2007 Vijay Kiran Kamuju
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_CRYPTOPROVUTILS_H
+#define __WINE_CRYPTOPROVUTILS_H
+#include <cryptoprovconfig.h>
+#include "implglue.h"
+typedef struct tagKEYCONTAINER
+{
+ OBJECTHDR header;
+ DWORD dwFlags;
+ DWORD dwPersonality;
+ DWORD dwEnumAlgsCtr;
+ DWORD dwEnumContainersCtr;
+ char szName[MAX_PATH];
+ char szProvName[MAX_PATH];
+ HCRYPTKEY hKeyExchangeKeyPair;
+ HCRYPTKEY hSignatureKeyPair;
+} KEYCONTAINER;
+
+typedef struct tagCRYPTKEY
+{
+ OBJECTHDR header;
+ ALG_ID aiAlgid;
+ HCRYPTPROV hProv;
+ DWORD dwMode;
+ DWORD dwModeBits;
+ DWORD dwPermissions;
+ DWORD dwKeyLen;
+ DWORD dwEffectiveKeyLen;
+ DWORD dwSaltLen;
+ DWORD dwBlockLen;
+ DWORD dwState;
+ KEY_CONTEXT context;
+ BYTE abKeyValue[CRYPTO_PROV_MAX_KEY_SIZE];
+ BYTE abInitVector[CRYPTO_PROV_MAX_BLOCK_SIZE];
+ BYTE abChainVector[CRYPTO_PROV_MAX_BLOCK_SIZE];
+ CRYPTO_PROV_SCHANNEL_INFO siSChannelInfo;
+ CRYPT_DATA_BLOB blobHmacKey;
+} CRYPTKEY;
+
+HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags,
const VTableProvStruc *pVTable);
+BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam,
HKEY *phKey);
+void destroy_key_container(OBJECTHDR *pObjectHdr);
+void store_key_container_keys(KEYCONTAINER *pKeyContainer);
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec,
DWORD dwFlags);
+void store_key_container_permissions(KEYCONTAINER *pKeyContainer);
+void store_key_permissions(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec);
+void release_key_container_keys(KEYCONTAINER *pKeyContainer);
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec);
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+ DWORD dwBlobType, DWORD dwFlags, BOOL force,
+ BYTE *pbData, DWORD *pdwDataLen);
+LPCSTR map_key_spec_to_permissions_name(DWORD dwKeySpec);
+BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags,
REGSAM access, HKEY *phKey);
+BOOL CRYPTO_PROV_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
+ DWORD dwFlags, PVTableProvStruc pVTable);
+BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD
dwDataLen, HCRYPTKEY hPubKey,
+ DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey);
+#endif /* __WINE_CRYPTOPROVUTILS_H */
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 9119d4be2d..6a746d7b07 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -34,6 +34,7 @@
#include "objbase.h"
#include "rpcproxy.h"
#include "aclapi.h"
+#include "cryptoprovutils.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
@@ -66,67 +67,6 @@ typedef struct tagCRYPTHASH
RSAENH_TLS1PRF_PARAMS tpPRFParams;
} CRYPTHASH;
-/******************************************************************************
- * CRYPTKEY - key objects
- */
-#define RSAENH_MAGIC_KEY 0x73620457u
-#define RSAENH_MAX_KEY_SIZE 64
-#define RSAENH_MAX_BLOCK_SIZE 24
-#define RSAENH_KEYSTATE_IDLE 0
-#define RSAENH_KEYSTATE_ENCRYPTING 1
-#define RSAENH_KEYSTATE_MASTERKEY 2
-typedef struct _RSAENH_SCHANNEL_INFO
-{
- SCHANNEL_ALG saEncAlg;
- SCHANNEL_ALG saMACAlg;
- CRYPT_DATA_BLOB blobClientRandom;
- CRYPT_DATA_BLOB blobServerRandom;
-} RSAENH_SCHANNEL_INFO;
-
-typedef struct tagCRYPTKEY
-{
- OBJECTHDR header;
- ALG_ID aiAlgid;
- HCRYPTPROV hProv;
- DWORD dwMode;
- DWORD dwModeBits;
- DWORD dwPermissions;
- DWORD dwKeyLen;
- DWORD dwEffectiveKeyLen;
- DWORD dwSaltLen;
- DWORD dwBlockLen;
- DWORD dwState;
- KEY_CONTEXT context;
- BYTE abKeyValue[RSAENH_MAX_KEY_SIZE];
- BYTE abInitVector[RSAENH_MAX_BLOCK_SIZE];
- BYTE abChainVector[RSAENH_MAX_BLOCK_SIZE];
- RSAENH_SCHANNEL_INFO siSChannelInfo;
- CRYPT_DATA_BLOB blobHmacKey;
-} CRYPTKEY;
-
-/******************************************************************************
- * KEYCONTAINER - key containers
- */
-#define RSAENH_PERSONALITY_BASE 0u
-#define RSAENH_PERSONALITY_STRONG 1u
-#define RSAENH_PERSONALITY_ENHANCED 2u
-#define RSAENH_PERSONALITY_SCHANNEL 3u
-#define RSAENH_PERSONALITY_AES 4u
-
-#define RSAENH_MAGIC_CONTAINER 0x26384993u
-typedef struct tagKEYCONTAINER
-{
- OBJECTHDR header;
- DWORD dwFlags;
- DWORD dwPersonality;
- DWORD dwEnumAlgsCtr;
- DWORD dwEnumContainersCtr;
- CHAR szName[MAX_PATH];
- CHAR szProvName[MAX_PATH];
- HCRYPTKEY hKeyExchangeKeyPair;
- HCRYPTKEY hSignatureKeyPair;
-} KEYCONTAINER;
-
/******************************************************************************
* Some magic constants
*/
@@ -149,7 +89,6 @@ typedef struct tagKEYCONTAINER
#define RSAENH_SSL3_VERSION_MINOR 0
#define RSAENH_TLS1_VERSION_MAJOR 3
#define RSAENH_TLS1_VERSION_MINOR 1
-#define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
#define RSAENH_MIN(a,b) ((a)<(b)?(a):(b))
/******************************************************************************
@@ -316,26 +255,6 @@ RSAENH_CPDestroyHash(
HCRYPTHASH hHash
);
-static BOOL crypt_export_key(
- CRYPTKEY *pCryptKey,
- HCRYPTKEY hPubKey,
- DWORD dwBlobType,
- DWORD dwFlags,
- BOOL force,
- BYTE *pbData,
- DWORD *pdwDataLen
-);
-
-static BOOL import_key(
- HCRYPTPROV hProv,
- const BYTE *pbData,
- DWORD dwDataLen,
- HCRYPTKEY hPubKey,
- DWORD dwFlags,
- BOOL fStoreKey,
- HCRYPTKEY *phKey
-);
-
BOOL WINAPI
RSAENH_CPHashData(
HCRYPTPROV hProv,
@@ -348,7 +267,7 @@ RSAENH_CPHashData(
/******************************************************************************
* CSP's handle table (used by all acquired key containers)
*/
-static struct handle_table handle_table;
+struct handle_table handle_table;
/******************************************************************************
* DllMain (RSAENH.@)
@@ -933,498 +852,6 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv,
ALG_ID aiAlgid, DWORD dwFlags, CRYPTK
return hCryptKey;
}
-/******************************************************************************
- * map_key_spec_to_key_pair_name [Internal]
- *
- * Returns the name of the registry value associated with a key spec.
- *
- * PARAMS
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- *
- * RETURNS
- * Success: Name of registry value.
- * Failure: NULL
- */
-static LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
-{
- LPCSTR szValueName;
-
- switch (dwKeySpec)
- {
- case AT_KEYEXCHANGE:
- szValueName = "KeyExchangeKeyPair";
- break;
- case AT_SIGNATURE:
- szValueName = "SignatureKeyPair";
- break;
- default:
- WARN("invalid key spec %d\n", dwKeySpec);
- szValueName = NULL;
- }
- return szValueName;
-}
-
-/******************************************************************************
- * store_key_pair [Internal]
- *
- * Stores a key pair to the registry
- *
- * PARAMS
- * hCryptKey [I] Handle to the key to be stored
- * hKey [I] Registry key where the key pair is to be stored
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- * dwFlags [I] Flags for protecting the key
- */
-static void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD
dwKeySpec, DWORD dwFlags)
-{
- LPCSTR szValueName;
- DATA_BLOB blobIn, blobOut;
- CRYPTKEY *pKey;
- DWORD dwLen;
- BYTE *pbKey;
-
- if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
- return;
- if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
- {
- if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
- {
- pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
- if (pbKey)
- {
- if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
- &dwLen))
- {
- blobIn.pbData = pbKey;
- blobIn.cbData = dwLen;
-
- if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
- dwFlags, &blobOut))
- {
- RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
- blobOut.pbData, blobOut.cbData);
- LocalFree(blobOut.pbData);
- }
- }
- HeapFree(GetProcessHeap(), 0, pbKey);
- }
- }
- }
-}
-
-/******************************************************************************
- * map_key_spec_to_permissions_name [Internal]
- *
- * Returns the name of the registry value associated with the permissions for
- * a key spec.
- *
- * PARAMS
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- *
- * RETURNS
- * Success: Name of registry value.
- * Failure: NULL
- */
-static LPCSTR map_key_spec_to_permissions_name(DWORD dwKeySpec)
-{
- LPCSTR szValueName;
-
- switch (dwKeySpec)
- {
- case AT_KEYEXCHANGE:
- szValueName = "KeyExchangePermissions";
- break;
- case AT_SIGNATURE:
- szValueName = "SignaturePermissions";
- break;
- default:
- WARN("invalid key spec %d\n", dwKeySpec);
- szValueName = NULL;
- }
- return szValueName;
-}
-
-/******************************************************************************
- * store_key_permissions [Internal]
- *
- * Stores a key's permissions to the registry
- *
- * PARAMS
- * hCryptKey [I] Handle to the key whose permissions are to be stored
- * hKey [I] Registry key where the key permissions are to be stored
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- */
-static void store_key_permissions(HCRYPTKEY hCryptKey, HKEY hKey,
DWORD dwKeySpec)
-{
- LPCSTR szValueName;
- CRYPTKEY *pKey;
-
- if (!(szValueName = map_key_spec_to_permissions_name(dwKeySpec)))
- return;
- if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
- RegSetValueExA(hKey, szValueName, 0, REG_DWORD,
- (BYTE *)&pKey->dwPermissions,
- sizeof(pKey->dwPermissions));
-}
-
-/******************************************************************************
- * create_container_key [Internal]
- *
- * Creates the registry key for a key container's persistent storage.
- *
- * PARAMS
- * pKeyContainer [I] Pointer to the key container
- * sam [I] Desired registry access
- * phKey [O] Returned key
- */
-static BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM
sam, HKEY *phKey)
-{
- CHAR szRSABase[sizeof(RSAENH_REGKEY) + MAX_PATH];
- HKEY hRootKey;
-
- sprintf(szRSABase, RSAENH_REGKEY, pKeyContainer->szName);
-
- if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
- hRootKey = HKEY_LOCAL_MACHINE;
- else
- hRootKey = HKEY_CURRENT_USER;
-
- /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA */
- /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA */
- return RegCreateKeyExA(hRootKey, szRSABase, 0, NULL,
- REG_OPTION_NON_VOLATILE, sam, NULL, phKey, NULL)
- == ERROR_SUCCESS;
-}
-
-/******************************************************************************
- * open_container_key [Internal]
- *
- * Opens a key container's persistent storage for reading.
- *
- * PARAMS
- * pszContainerName [I] Name of the container to be opened. May be the empty
- * string if the parent key of all containers is to be
- * opened.
- * dwFlags [I] Flags indicating which keyset to be opened.
- * phKey [O] Returned key
- */
-static BOOL open_container_key(LPCSTR pszContainerName, DWORD
dwFlags, REGSAM access, HKEY *phKey)
-{
- CHAR szRSABase[sizeof(RSAENH_REGKEY) + MAX_PATH];
- HKEY hRootKey;
-
- sprintf(szRSABase, RSAENH_REGKEY, pszContainerName);
-
- if (dwFlags & CRYPT_MACHINE_KEYSET)
- hRootKey = HKEY_LOCAL_MACHINE;
- else
- hRootKey = HKEY_CURRENT_USER;
-
- /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA */
- /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA */
- return RegOpenKeyExA(hRootKey, szRSABase, 0, access, phKey) ==
- ERROR_SUCCESS;
-}
-
-/******************************************************************************
- * delete_container_key [Internal]
- *
- * Deletes a key container's persistent storage.
- *
- * PARAMS
- * pszContainerName [I] Name of the container to be opened.
- * dwFlags [I] Flags indicating which keyset to be opened.
- */
-static BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags)
-{
- CHAR szRegKey[sizeof(RSAENH_REGKEY) + MAX_PATH];
- HKEY hRootKey;
-
- sprintf(szRegKey, RSAENH_REGKEY, pszContainerName);
-
- if (dwFlags & CRYPT_MACHINE_KEYSET)
- hRootKey = HKEY_LOCAL_MACHINE;
- else
- hRootKey = HKEY_CURRENT_USER;
- if (!RegDeleteKeyA(hRootKey, szRegKey)) {
- SetLastError(ERROR_SUCCESS);
- return TRUE;
- } else {
- SetLastError(NTE_BAD_KEYSET);
- return FALSE;
- }
-}
-
-/******************************************************************************
- * store_key_container_keys [Internal]
- *
- * Stores key container's keys in a persistent location.
- *
- * PARAMS
- * pKeyContainer [I] Pointer to the key container whose keys are to be saved
- */
-static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
-{
- HKEY hKey;
- DWORD dwFlags;
-
- /* On WinXP, persistent keys are stored in a file located at:
- * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
- */
-
- if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
- dwFlags = CRYPTPROTECT_LOCAL_MACHINE;
- else
- dwFlags = 0;
-
- if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
- {
- store_key_pair(pKeyContainer->hKeyExchangeKeyPair, hKey,
- AT_KEYEXCHANGE, dwFlags);
- store_key_pair(pKeyContainer->hSignatureKeyPair, hKey,
- AT_SIGNATURE, dwFlags);
- RegCloseKey(hKey);
- }
-}
-
-/******************************************************************************
- * store_key_container_permissions [Internal]
- *
- * Stores key container's key permissions in a persistent location.
- *
- * PARAMS
- * pKeyContainer [I] Pointer to the key container whose key permissions are to
- * be saved
- */
-static void store_key_container_permissions(KEYCONTAINER *pKeyContainer)
-{
- HKEY hKey;
-
- if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
- {
- store_key_permissions(pKeyContainer->hKeyExchangeKeyPair, hKey,
- AT_KEYEXCHANGE);
- store_key_permissions(pKeyContainer->hSignatureKeyPair, hKey,
- AT_SIGNATURE);
- RegCloseKey(hKey);
- }
-}
-
-/******************************************************************************
- * release_key_container_keys [Internal]
- *
- * Releases key container's keys.
- *
- * PARAMS
- * pKeyContainer [I] Pointer to the key container whose keys are to
be released.
- */
-static void release_key_container_keys(KEYCONTAINER *pKeyContainer)
-{
- release_handle(&handle_table, pKeyContainer->hKeyExchangeKeyPair,
- RSAENH_MAGIC_KEY);
- release_handle(&handle_table, pKeyContainer->hSignatureKeyPair,
- RSAENH_MAGIC_KEY);
-}
-
-/******************************************************************************
- * destroy_key_container [Internal]
- *
- * Destructor for key containers.
- *
- * PARAMS
- * pObjectHdr [I] Pointer to the key container to be destroyed.
- */
-static void destroy_key_container(OBJECTHDR *pObjectHdr)
-{
- KEYCONTAINER *pKeyContainer = (KEYCONTAINER*)pObjectHdr;
-
- if (!(pKeyContainer->dwFlags & CRYPT_VERIFYCONTEXT))
- {
- store_key_container_keys(pKeyContainer);
- store_key_container_permissions(pKeyContainer);
- release_key_container_keys(pKeyContainer);
- }
- else
- release_key_container_keys(pKeyContainer);
- HeapFree( GetProcessHeap(), 0, pKeyContainer );
-}
-
-/******************************************************************************
- * new_key_container [Internal]
- *
- * Create a new key container. The personality (RSA Base, Strong or
Enhanced CP)
- * of the CSP is determined via the pVTable->pszProvName string.
- *
- * PARAMS
- * pszContainerName [I] Name of the key container.
- * pVTable [I] Callback functions and context info provided by the OS
- *
- * RETURNS
- * Success: Handle to the new key container.
- * Failure: INVALID_HANDLE_VALUE
- */
-static HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD
dwFlags, const VTableProvStruc *pVTable)
-{
- KEYCONTAINER *pKeyContainer;
- HCRYPTPROV hKeyContainer;
-
- hKeyContainer = new_object(&handle_table, sizeof(KEYCONTAINER),
RSAENH_MAGIC_CONTAINER,
- destroy_key_container,
(OBJECTHDR**)&pKeyContainer);
- if (hKeyContainer != (HCRYPTPROV)INVALID_HANDLE_VALUE)
- {
- lstrcpynA(pKeyContainer->szName, pszContainerName, MAX_PATH);
- pKeyContainer->dwFlags = dwFlags;
- pKeyContainer->dwEnumAlgsCtr = 0;
- pKeyContainer->hKeyExchangeKeyPair = (HCRYPTKEY)INVALID_HANDLE_VALUE;
- pKeyContainer->hSignatureKeyPair = (HCRYPTKEY)INVALID_HANDLE_VALUE;
- if (pVTable && pVTable->pszProvName) {
- lstrcpynA(pKeyContainer->szProvName,
pVTable->pszProvName, MAX_PATH);
- if (!strcmp(pVTable->pszProvName, MS_DEF_PROV_A)) {
- pKeyContainer->dwPersonality = RSAENH_PERSONALITY_BASE;
- } else if (!strcmp(pVTable->pszProvName, MS_ENHANCED_PROV_A)) {
- pKeyContainer->dwPersonality = RSAENH_PERSONALITY_ENHANCED;
- } else if (!strcmp(pVTable->pszProvName,
MS_DEF_RSA_SCHANNEL_PROV_A)) {
- pKeyContainer->dwPersonality = RSAENH_PERSONALITY_SCHANNEL;
- } else if (!strcmp(pVTable->pszProvName, MS_ENH_RSA_AES_PROV_A) ||
- !strcmp(pVTable->pszProvName,
MS_ENH_RSA_AES_PROV_XP_A)) {
- pKeyContainer->dwPersonality = RSAENH_PERSONALITY_AES;
- } else {
- pKeyContainer->dwPersonality = RSAENH_PERSONALITY_STRONG;
- }
- }
-
- /* The new key container has to be inserted into the CSP immediately
- * after creation to be available for CPGetProvParam's
PP_ENUMCONTAINERS. */
- if (!(dwFlags & CRYPT_VERIFYCONTEXT)) {
- HKEY hKey;
-
- if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
- RegCloseKey(hKey);
- }
- }
-
- return hKeyContainer;
-}
-
-/******************************************************************************
- * read_key_value [Internal]
- *
- * Reads a key pair value from the registry
- *
- * PARAMS
- * hKeyContainer [I] Crypt provider to use to import the key
- * hKey [I] Registry key from which to read the key pair
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- * dwFlags [I] Flags for unprotecting the key
- * phCryptKey [O] Returned key
- */
-static BOOL read_key_value(HCRYPTPROV hKeyContainer, HKEY hKey, DWORD
dwKeySpec, DWORD dwFlags, HCRYPTKEY *phCryptKey)
-{
- LPCSTR szValueName;
- DWORD dwValueType, dwLen;
- BYTE *pbKey;
- DATA_BLOB blobIn, blobOut;
- BOOL ret = FALSE;
-
- if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
- return FALSE;
- if (RegQueryValueExA(hKey, szValueName, 0, &dwValueType, NULL, &dwLen) ==
- ERROR_SUCCESS)
- {
- pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
- if (pbKey)
- {
- if (RegQueryValueExA(hKey, szValueName, 0, &dwValueType,
pbKey, &dwLen) ==
- ERROR_SUCCESS)
- {
- blobIn.pbData = pbKey;
- blobIn.cbData = dwLen;
-
- if (CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL,
- dwFlags, &blobOut))
- {
- ret = import_key(hKeyContainer, blobOut.pbData,
blobOut.cbData, 0, 0,
- FALSE, phCryptKey);
- LocalFree(blobOut.pbData);
- }
- }
- HeapFree(GetProcessHeap(), 0, pbKey);
- }
- }
- if (ret)
- {
- CRYPTKEY *pKey;
-
- if (lookup_handle(&handle_table, *phCryptKey, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
- {
- if ((szValueName = map_key_spec_to_permissions_name(dwKeySpec)))
- {
- dwLen = sizeof(pKey->dwPermissions);
- RegQueryValueExA(hKey, szValueName, 0, NULL,
- (BYTE *)&pKey->dwPermissions, &dwLen);
- }
- }
- }
- return ret;
-}
-
-/******************************************************************************
- * read_key_container [Internal]
- *
- * Tries to read the persistent state of the key container (mainly
the signature
- * and key exchange private keys) given by pszContainerName.
- *
- * PARAMS
- * pszContainerName [I] Name of the key container to read from the registry
- * pVTable [I] Pointer to context data provided by the
operating system
- *
- * RETURNS
- * Success: Handle to the key container read from the registry
- * Failure: INVALID_HANDLE_VALUE
- */
-static HCRYPTPROV read_key_container(PCHAR pszContainerName, DWORD
dwFlags, const VTableProvStruc *pVTable)
-{
- HKEY hKey;
- KEYCONTAINER *pKeyContainer;
- HCRYPTPROV hKeyContainer;
- HCRYPTKEY hCryptKey;
-
- if (!open_container_key(pszContainerName, dwFlags, KEY_READ, &hKey))
- {
- SetLastError(NTE_BAD_KEYSET);
- return (HCRYPTPROV)INVALID_HANDLE_VALUE;
- }
-
- hKeyContainer = new_key_container(pszContainerName, dwFlags, pVTable);
- if (hKeyContainer != (HCRYPTPROV)INVALID_HANDLE_VALUE)
- {
- DWORD dwProtectFlags = (dwFlags & CRYPT_MACHINE_KEYSET) ?
- CRYPTPROTECT_LOCAL_MACHINE : 0;
-
- if (!lookup_handle(&handle_table, hKeyContainer,
RSAENH_MAGIC_CONTAINER,
- (OBJECTHDR**)&pKeyContainer))
- return (HCRYPTPROV)INVALID_HANDLE_VALUE;
-
- /* read_key_value calls import_key, which calls import_private_key,
- * which implicitly installs the key value into the appropriate key
- * container key. Thus the ref count is incremented twice, once for
- * the output key value, and once for the implicit install, and needs
- * to be decremented to balance the two.
- */
- if (read_key_value(hKeyContainer, hKey, AT_KEYEXCHANGE,
- dwProtectFlags, &hCryptKey))
- release_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY);
- if (read_key_value(hKeyContainer, hKey, AT_SIGNATURE,
- dwProtectFlags, &hCryptKey))
- release_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY);
- }
-
- return hKeyContainer;
-}
-
/******************************************************************************
* build_hash_signature [Internal]
*
@@ -2073,64 +1500,7 @@ static BOOL unpad_data(HCRYPTPROV hProv, const
BYTE *abData, DWORD dwDataLen, BY
BOOL WINAPI RSAENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
DWORD dwFlags, PVTableProvStruc pVTable)
{
- CHAR szKeyContainerName[MAX_PATH];
-
- TRACE("(phProv=%p, pszContainer=%s, dwFlags=%08x, pVTable=%p)\n", phProv,
- debugstr_a(pszContainer), dwFlags, pVTable);
-
- if (pszContainer && *pszContainer)
- {
- lstrcpynA(szKeyContainerName, pszContainer, MAX_PATH);
- }
- else
- {
- DWORD dwLen = sizeof(szKeyContainerName);
- if (!GetUserNameA(szKeyContainerName, &dwLen)) return FALSE;
- }
-
- switch (dwFlags & (CRYPT_NEWKEYSET|CRYPT_VERIFYCONTEXT|CRYPT_DELETEKEYSET))
- {
- case 0:
- *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable);
- break;
-
- case CRYPT_DELETEKEYSET:
- return delete_container_key(szKeyContainerName, dwFlags);
-
- case CRYPT_NEWKEYSET:
- *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable);
- if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE)
- {
- release_handle(&handle_table, *phProv, RSAENH_MAGIC_CONTAINER);
- TRACE("Can't create new keyset, already exists\n");
- SetLastError(NTE_EXISTS);
- return FALSE;
- }
- *phProv = new_key_container(szKeyContainerName, dwFlags, pVTable);
- break;
-
- case CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET:
- case CRYPT_VERIFYCONTEXT:
- if (pszContainer && *pszContainer) {
- TRACE("pszContainer should be empty\n");
- SetLastError(NTE_BAD_FLAGS);
- return FALSE;
- }
- *phProv = new_key_container("", dwFlags, pVTable);
- break;
-
- default:
- *phProv = (HCRYPTPROV)INVALID_HANDLE_VALUE;
- SetLastError(NTE_BAD_FLAGS);
- return FALSE;
- }
-
- if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) {
- SetLastError(ERROR_SUCCESS);
- return TRUE;
- } else {
- return FALSE;
- }
+ return CRYPTO_PROV_CPAcquireContext(phProv, pszContainer,
dwFlags, pVTable);
}
/******************************************************************************
@@ -2906,7 +2276,7 @@ static BOOL crypt_export_plaintext_key(CRYPTKEY
*pCryptKey, BYTE *pbData,
* Success: TRUE.
* Failure: FALSE.
*/
-static BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
DWORD dwBlobType, DWORD dwFlags, BOOL force,
BYTE *pbData, DWORD *pdwDataLen)
{
@@ -3351,7 +2721,7 @@ static BOOL import_plaintext_key(HCRYPTPROV
hProv, const BYTE *pbData, DWORD dwD
* Success: TRUE.
* Failure: FALSE.
*/
-static BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD
dwDataLen, HCRYPTKEY hPubKey,
+BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD
dwDataLen, HCRYPTKEY hPubKey,
DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey)
{
KEYCONTAINER *pKeyContainer;
@@ -4549,21 +3919,7 @@ BOOL WINAPI RSAENH_CPHashSessionKey(HCRYPTPROV
hProv, HCRYPTHASH hHash, HCRYPTKE
*/
BOOL WINAPI RSAENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
{
- TRACE("(hProv=%08lx, dwFlags=%08x)\n", hProv, dwFlags);
-
- if (!release_handle(&handle_table, hProv, RSAENH_MAGIC_CONTAINER))
- {
- /* MSDN: hProv not containing valid context handle */
- SetLastError(NTE_BAD_UID);
- return FALSE;
- }
-
- if (dwFlags) {
- SetLastError(NTE_BAD_FLAGS);
- return FALSE;
- }
-
- return TRUE;
+ return CRYPTO_PROV_CPReleaseContext(hProv, dwFlags);
}
/******************************************************************************
--
2.21.0
2
1
With some tablet configurations, the InExt value passed to
ScaleForContext can be very large, leading to an integer overflow. Using
MulDiv prevents this problem by internally using 64-bit math.
---
dlls/wintab32/context.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c
index 0514dd78b4..ff9a4ca677 100644
--- a/dlls/wintab32/context.c
+++ b/dlls/wintab32/context.c
@@ -178,9 +178,9 @@ int TABLET_PostTabletMessage(LPOPENCONTEXT
newcontext, UINT msg, WPARAM wParam,
static inline DWORD ScaleForContext(DWORD In, LONG InOrg, LONG InExt,
LONG OutOrg, LONG OutExt)
{
if (((InExt > 0 )&&(OutExt > 0)) || ((InExt<0) && (OutExt < 0)))
- return ((In - InOrg) * abs(OutExt) / abs(InExt)) + OutOrg;
+ return MulDiv(In - InOrg, abs(OutExt), abs(InExt)) + OutOrg;
else
- return ((abs(InExt) - (In - InOrg))*abs(OutExt) / abs(InExt)) + OutOrg;
+ return MulDiv(abs(InExt) - (In - InOrg), abs(OutExt),
abs(InExt)) + OutOrg;
}
LPOPENCONTEXT AddPacketToContextQueue(LPWTPACKET packet, HWND hwnd)
--
2.23.0
2
1
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
dlls/sapi/Makefile.in | 3 +-
dlls/sapi/main.c | 3 +
dlls/sapi/sapi_classes.idl | 13 ++
dlls/sapi/sapi_private.h | 1 +
dlls/sapi/tests/Makefile.in | 3 +-
dlls/sapi/tests/tts.c | 71 +++++++
dlls/sapi/tts.c | 414 ++++++++++++++++++++++++++++++++++++
include/sapi.idl | 11 +-
8 files changed, 516 insertions(+), 3 deletions(-)
create mode 100644 dlls/sapi/tests/tts.c
create mode 100644 dlls/sapi/tts.c
diff --git a/dlls/sapi/Makefile.in b/dlls/sapi/Makefile.in
index 94e21bdd52..640c56223d 100644
--- a/dlls/sapi/Makefile.in
+++ b/dlls/sapi/Makefile.in
@@ -5,7 +5,8 @@ EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
main.c \
- token.c
+ token.c \
+ tts.c
IDL_SRCS = \
sapi_classes.idl \
diff --git a/dlls/sapi/main.c b/dlls/sapi/main.c
index f86fee25ca..ce51c37483 100644
--- a/dlls/sapi/main.c
+++ b/dlls/sapi/main.c
@@ -106,6 +106,7 @@ static const struct IClassFactoryVtbl class_factory_vtbl =
};
static struct class_factory data_key_cf = { { &class_factory_vtbl }, data_key_create };
+static struct class_factory speech_voice_cf = { { &class_factory_vtbl }, speech_voice_create };
static struct class_factory token_category_cf = { { &class_factory_vtbl }, token_category_create };
static struct class_factory token_enum_cf = { { &class_factory_vtbl }, token_enum_create };
@@ -124,6 +125,8 @@ HRESULT WINAPI DllGetClassObject( REFCLSID clsid, REFIID iid, void **obj )
cf = &token_category_cf.IClassFactory_iface;
else if (IsEqualCLSID( clsid, &CLSID_SpObjectTokenEnum ))
cf = &token_enum_cf.IClassFactory_iface;
+ else if (IsEqualCLSID( clsid, &CLSID_SpVoice ))
+ cf = &speech_voice_cf.IClassFactory_iface;
if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
diff --git a/dlls/sapi/sapi_classes.idl b/dlls/sapi/sapi_classes.idl
index 40886f5974..dbb08c9ae2 100644
--- a/dlls/sapi/sapi_classes.idl
+++ b/dlls/sapi/sapi_classes.idl
@@ -50,3 +50,16 @@ coclass SpObjectTokenEnum
interface ISpObjectTokenEnumBuilder;
[default] interface IEnumSpObjectTokens;
}
+
+[
+ uuid(96749377-3391-11d2-9ee3-00c04f797396),
+ helpstring("Speech Voice"),
+ progid("SAPI.SpVoice.1"),
+ vi_progid("SAPI.SpVoice"),
+ threading(both)
+]
+coclass SpVoice
+{
+ interface ISpVoice;
+ [default] interface ISpeechVoice;
+}
diff --git a/dlls/sapi/sapi_private.h b/dlls/sapi/sapi_private.h
index 1f89672242..8db4b47bbd 100644
--- a/dlls/sapi/sapi_private.h
+++ b/dlls/sapi/sapi_private.h
@@ -21,6 +21,7 @@
#include "wine/heap.h"
HRESULT data_key_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
+HRESULT speech_voice_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
HRESULT token_category_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
diff --git a/dlls/sapi/tests/Makefile.in b/dlls/sapi/tests/Makefile.in
index bf924d7ed9..bb89e0d8e0 100644
--- a/dlls/sapi/tests/Makefile.in
+++ b/dlls/sapi/tests/Makefile.in
@@ -2,4 +2,5 @@ TESTDLL = sapi.dll
IMPORTS = ole32 user32 advapi32
C_SRCS = \
- token.c
+ token.c \
+ tts.c
diff --git a/dlls/sapi/tests/tts.c b/dlls/sapi/tests/tts.c
new file mode 100644
index 0000000000..8d13ed0053
--- /dev/null
+++ b/dlls/sapi/tests/tts.c
@@ -0,0 +1,71 @@
+/*
+ * Speech API (SAPI) text-to-speech tests.
+ *
+ * Copyright 2019 Jactry Zeng for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "sapiddk.h"
+#include "sperror.h"
+
+#include "wine/test.h"
+
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown *obj, ULONG ref, int line)
+{
+ ULONG rc;
+ IUnknown_AddRef(obj);
+ rc = IUnknown_Release(obj);
+ ok_(__FILE__,line)(rc == ref, "Unexpected refcount %d, expected %d.\n", rc, ref);
+}
+
+static void test_interfaces(void)
+{
+ ISpeechVoice *speech_voice;
+ IDispatch *dispatch;
+ IUnknown *unk;
+ HRESULT hr;
+
+ hr = CoCreateInstance(&CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER,
+ &IID_ISpeechVoice, (void **)&speech_voice);
+ ok(hr == S_OK, "Failed to create ISpVoice interface: %#x.\n", hr);
+ EXPECT_REF(speech_voice, 1);
+
+ hr = CoCreateInstance(&CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IDispatch, (void **)&dispatch);
+ ok(hr == S_OK, "Failed to create IDispatch interface: %#x.\n", hr);
+ EXPECT_REF(dispatch, 1);
+ EXPECT_REF(speech_voice, 1);
+ IDispatch_Release(dispatch);
+
+ hr = CoCreateInstance(&CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void **)&unk);
+ ok(hr == S_OK, "Failed to create IUnknown interface: %#x.\n", hr);
+ EXPECT_REF(unk, 1);
+ EXPECT_REF(speech_voice, 1);
+ IUnknown_Release(unk);
+
+ ISpeechVoice_Release(speech_voice);
+}
+
+START_TEST(tts)
+{
+ CoInitialize(NULL);
+ test_interfaces();
+ CoUninitialize();
+}
diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c
new file mode 100644
index 0000000000..4000db11f5
--- /dev/null
+++ b/dlls/sapi/tts.c
@@ -0,0 +1,414 @@
+/*
+ * Speech API (SAPI) text-to-speech implementation.
+ *
+ * Copyright 2019 Jactry Zeng for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+
+#include "sapiddk.h"
+
+#include "wine/debug.h"
+
+#include "sapi_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(sapi);
+
+struct speech_voice
+{
+ ISpeechVoice ISpeechVoice_iface;
+ LONG ref;
+};
+
+static inline struct speech_voice *impl_from_ISpeechVoice(ISpeechVoice *iface)
+{
+ return CONTAINING_RECORD(iface, struct speech_voice, ISpeechVoice_iface);
+}
+
+/* ISpeechVoice interface */
+static HRESULT WINAPI speech_voice_QueryInterface(ISpeechVoice *iface, REFIID iid, void **obj)
+{
+ struct speech_voice *This = impl_from_ISpeechVoice(iface);
+
+ TRACE("(%p, %s %p).\n", iface, debugstr_guid(iid), obj);
+
+ if (IsEqualIID(iid, &IID_IUnknown) ||
+ IsEqualIID(iid, &IID_IDispatch) ||
+ IsEqualIID(iid, &IID_ISpeechVoice))
+ *obj = &This->ISpeechVoice_iface;
+ else
+ {
+ *obj = NULL;
+ FIXME("interface %s not implemented.\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown *)*obj);
+ return S_OK;
+}
+
+static ULONG WINAPI speech_voice_AddRef(ISpeechVoice *iface)
+{
+ struct speech_voice *This = impl_from_ISpeechVoice(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p): ref=%u.\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI speech_voice_Release(ISpeechVoice *iface)
+{
+ struct speech_voice *This = impl_from_ISpeechVoice(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p): ref=%u.\n", iface, ref);
+
+ if (!ref)
+ {
+ heap_free(This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI speech_voice_GetTypeInfoCount(ISpeechVoice *iface, UINT *info)
+{
+ FIXME("(%p, %p): stub.\n", iface, info);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_GetTypeInfo(ISpeechVoice *iface, UINT info, LCID lcid,
+ ITypeInfo **type_info)
+{
+ FIXME("(%p, %u, %u, %p): stub.\n", iface, info, lcid, type_info);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_GetIDsOfNames(ISpeechVoice *iface, REFIID riid, LPOLESTR *names,
+ UINT count, LCID lcid, DISPID *dispid)
+{
+ FIXME("(%p, %s, %p, %u, %u, %p): stub.\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_Invoke(ISpeechVoice *iface, DISPID dispid, REFIID riid, LCID lcid,
+ WORD flags, DISPPARAMS *params, VARIANT *result,
+ EXCEPINFO *excepinfo, UINT *argerr)
+{
+ FIXME("(%p, %d, %s, %#x, %#x, %p, %p, %p, %p): stub.\n", iface, dispid, debugstr_guid(riid),
+ lcid, flags, params, result, excepinfo, argerr);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_Status(ISpeechVoice *iface, ISpeechVoiceStatus **status)
+{
+ FIXME("(%p, %p): stub.\n", iface, status);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_Voice(ISpeechVoice *iface, ISpeechObjectToken **voice)
+{
+ FIXME("(%p, %p): stub.\n", iface, voice);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_putref_Voice(ISpeechVoice *iface, ISpeechObjectToken *voice)
+{
+ FIXME("(%p, %p): stub.\n", iface, voice);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_AudioOutput(ISpeechVoice *iface, ISpeechObjectToken **output)
+{
+ FIXME("(%p, %p): stub.\n", iface, output);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_putref_AudioOutput(ISpeechVoice *iface, ISpeechObjectToken *output)
+{
+ FIXME("(%p, %p): stub.\n", iface, output);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_AudioOutputStream(ISpeechVoice *iface, ISpeechBaseStream **output)
+{
+ FIXME("(%p, %p): stub.\n", iface, output);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_putref_AudioOutputStream(ISpeechVoice *iface, ISpeechBaseStream *output)
+{
+ FIXME("(%p, %p): stub.\n", iface, output);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_Rate(ISpeechVoice *iface, LONG *rate)
+{
+ FIXME("(%p, %p): stub.\n", iface, rate);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_Rate(ISpeechVoice *iface, LONG rate)
+{
+ FIXME("(%p, %d): stub.\n", iface, rate);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_Volume(ISpeechVoice *iface, LONG *volume)
+{
+ FIXME("(%p, %p): stub.\n", iface, volume);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_Volume(ISpeechVoice *iface, LONG volume)
+{
+ FIXME("(%p, %d): stub.\n", iface, volume);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_AllowAudioOutputFormatChangesOnNextSet(ISpeechVoice *iface,
+ VARIANT_BOOL allow)
+{
+ FIXME("(%p, %d): stub.\n", iface, allow);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_AllowAudioOutputFormatChangesOnNextSet(ISpeechVoice *iface, VARIANT_BOOL *allow)
+{
+ FIXME("(%p, %p): stub.\n", iface, allow);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_EventInterests(ISpeechVoice *iface, SpeechVoiceEvents *flags)
+{
+ FIXME("(%p, %p): stub.\n", iface, flags);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_EventInterests(ISpeechVoice *iface, SpeechVoiceEvents flags)
+{
+ FIXME("(%p, %#x): stub.\n", iface, flags);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_Priority(ISpeechVoice *iface, SpeechVoicePriority priority)
+{
+ FIXME("(%p, %d): stub.\n", iface, priority);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_Priority(ISpeechVoice *iface, SpeechVoicePriority *priority)
+{
+ FIXME("(%p, %p): stub.\n", iface, priority);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_AlertBoundary(ISpeechVoice *iface, SpeechVoiceEvents boundary)
+{
+ FIXME("(%p, %#x): stub.\n", iface, boundary);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_AlertBoundary(ISpeechVoice *iface, SpeechVoiceEvents *boundary)
+{
+ FIXME("(%p, %p): stub.\n", iface, boundary);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_put_SynchronousSpeakTimeout(ISpeechVoice *iface, LONG timeout)
+{
+ FIXME("(%p, %d): stub.\n", iface, timeout);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_get_SynchronousSpeakTimeout(ISpeechVoice *iface, LONG *timeout)
+{
+ FIXME("(%p, %p): stub.\n", iface, timeout);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_Speak(ISpeechVoice *iface, BSTR text, SpeechVoiceSpeakFlags flags, LONG *number)
+{
+ FIXME("(%p, %s, %#x, %p): stub.\n", iface, debugstr_w(text), flags, number);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_SpeakStream(ISpeechVoice *iface, ISpeechBaseStream *stream,
+ SpeechVoiceSpeakFlags flags, LONG *number)
+{
+ FIXME("(%p, %p, %#x, %p): stub.\n", iface, stream, flags, number);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_Pause(ISpeechVoice *iface)
+{
+ FIXME("(%p): stub.\n", iface);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_Resume(ISpeechVoice *iface)
+{
+ FIXME("(%p): stub.\n", iface);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_Skip(ISpeechVoice *iface, const BSTR type, LONG items, LONG *skipped)
+{
+ FIXME("(%p, %s, %d, %p): stub.\n", iface, debugstr_w(type), items, skipped);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_GetVoices(ISpeechVoice *iface, BSTR required, BSTR optional,
+ ISpeechObjectTokens **tokens)
+{
+ FIXME("(%p, %s, %s, %p): stub.\n", iface, debugstr_w(required), debugstr_w(optional), tokens);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_GetAudioOutputs(ISpeechVoice *iface, BSTR required, BSTR optional,
+ ISpeechObjectTokens **tokens)
+{
+ FIXME("(%p, %s, %s, %p): stub.\n", iface, debugstr_w(required), debugstr_w(optional), tokens);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_WaitUntilDone(ISpeechVoice *iface, LONG timeout, VARIANT_BOOL *done)
+{
+ FIXME("(%p, %d, %p): stub.\n", iface, timeout, done);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_SpeakCompleteEvent(ISpeechVoice *iface, LONG *handle)
+{
+ FIXME("(%p, %p): stub.\n", iface, handle);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_IsUISupported(ISpeechVoice *iface, const BSTR typeui, const VARIANT *data,
+ VARIANT_BOOL *supported)
+{
+ FIXME("(%p, %s, %p, %p): stub.\n", iface, debugstr_w(typeui), data, supported);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI speech_voice_DisplayUI(ISpeechVoice *iface, LONG hwnd, BSTR title,
+ const BSTR typeui, const VARIANT *data)
+{
+ FIXME("(%p, %d, %s, %s, %p): stub.\n", iface, hwnd, debugstr_w(title), debugstr_w(typeui), data);
+
+ return E_NOTIMPL;
+}
+
+static const ISpeechVoiceVtbl speech_voice_vtbl =
+{
+ speech_voice_QueryInterface,
+ speech_voice_AddRef,
+ speech_voice_Release,
+ speech_voice_GetTypeInfoCount,
+ speech_voice_GetTypeInfo,
+ speech_voice_GetIDsOfNames,
+ speech_voice_Invoke,
+ speech_voice_get_Status,
+ speech_voice_get_Voice,
+ speech_voice_putref_Voice,
+ speech_voice_get_AudioOutput,
+ speech_voice_putref_AudioOutput,
+ speech_voice_get_AudioOutputStream,
+ speech_voice_putref_AudioOutputStream,
+ speech_voice_get_Rate,
+ speech_voice_put_Rate,
+ speech_voice_get_Volume,
+ speech_voice_put_Volume,
+ speech_voice_put_AllowAudioOutputFormatChangesOnNextSet,
+ speech_voice_get_AllowAudioOutputFormatChangesOnNextSet,
+ speech_voice_get_EventInterests,
+ speech_voice_put_EventInterests,
+ speech_voice_put_Priority,
+ speech_voice_get_Priority,
+ speech_voice_put_AlertBoundary,
+ speech_voice_get_AlertBoundary,
+ speech_voice_put_SynchronousSpeakTimeout,
+ speech_voice_get_SynchronousSpeakTimeout,
+ speech_voice_Speak,
+ speech_voice_SpeakStream,
+ speech_voice_Pause,
+ speech_voice_Resume,
+ speech_voice_Skip,
+ speech_voice_GetVoices,
+ speech_voice_GetAudioOutputs,
+ speech_voice_WaitUntilDone,
+ speech_voice_SpeakCompleteEvent,
+ speech_voice_IsUISupported,
+ speech_voice_DisplayUI,
+};
+
+HRESULT speech_voice_create(IUnknown *outer, REFIID iid, void **obj)
+{
+ struct speech_voice *This = heap_alloc(sizeof(*This));
+ HRESULT hr;
+
+ if (!This) return E_OUTOFMEMORY;
+ This->ISpeechVoice_iface.lpVtbl = &speech_voice_vtbl;
+ This->ref = 1;
+
+ hr = ISpeechVoice_QueryInterface(&This->ISpeechVoice_iface, iid, obj);
+
+ ISpeechVoice_Release(&This->ISpeechVoice_iface);
+ return hr;
+}
diff --git a/include/sapi.idl b/include/sapi.idl
index 365d594a20..e87478cac6 100644
--- a/include/sapi.idl
+++ b/include/sapi.idl
@@ -839,7 +839,7 @@ interface ISpVoice : ISpEventSource
[out] SPVOICESTATUS *status,
[out, string] WCHAR **bookmark);
- HRESULT Skip([in,string] WCHAR* type, [in] long items, [out] ULONG *skipped);
+ HRESULT Skip([in,string] const WCHAR *type, [in] long items, [out] ULONG *skipped);
HRESULT SetPriority([in] SPVPRIORITY priority);
HRESULT GetPriority([out] SPVPRIORITY* priority);
@@ -1047,4 +1047,13 @@ library SpeechLib
/*[default] interface ISpeechRecognizer;*/
interface ISpRecognizer;
};
+
+ [
+ uuid(96749377-3391-11d2-9ee3-00c04f797396)
+ ]
+ coclass SpVoice
+ {
+ interface ISpVoice;
+ [default] interface ISpeechVoice;
+ };
}
--
2.24.0
3
4
With some tablet configurations, the InExt value passed to
ScaleForContext can be very large, leading to an integer overflow. Using
64-bit integers is a simple way to ensure that there is no overflow
without making the code more complicated.
---
dlls/wintab32/context.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c
index 0514dd78b4..9050a12df5 100644
--- a/dlls/wintab32/context.c
+++ b/dlls/wintab32/context.c
@@ -175,7 +175,7 @@ int TABLET_PostTabletMessage(LPOPENCONTEXT
newcontext, UINT msg, WPARAM wParam,
return 0;
}
-static inline DWORD ScaleForContext(DWORD In, LONG InOrg, LONG InExt,
LONG OutOrg, LONG OutExt)
+static inline DWORD ScaleForContext(ULONGLONG In, LONGLONG InOrg,
LONGLONG InExt, LONGLONG OutOrg, LONGLONG OutExt)
{
if (((InExt > 0 )&&(OutExt > 0)) || ((InExt<0) && (OutExt < 0)))
return ((In - InOrg) * abs(OutExt) / abs(InExt)) + OutOrg;
--
2.23.0
3
3
[PATCH v6 3/3] kernel32: Make GetUserGeoID() pretend we set a GeoID even if we didn't.
by João Diogo Ferreira 16 Nov '19
by João Diogo Ferreira 16 Nov '19
16 Nov '19
This undocumented behaviour was implemented in Windows 10 v1709 along
all the GeoName functions.
For Wine, this fixes an edge-case scenario where we would autodetect a
region-class ID from a locale, leaving the nation class empty.
As most apps only care about nations, this would make some apps crash
regardless of our autodetection mechanism.
For Windows developers, it means bugs in their programs can no longer
be tested and found, and now their apps are crashing on Wine.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46196
Signed-off-by: João Diogo Craveiro Ferreira <devilj(a)outlook.pt>
---
GetUserDefaultGeoName stub added to allow testing.
V6: Include testing.
Supersedes: 173069
---
dlls/kernel32/kernel32.spec | 1 +
dlls/kernel32/locale.c | 5 ++---
dlls/kernel32/tests/locale.c | 28 ++++++++++++++++++++++++++++
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index cf2f622a77..9cfaa51b85 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -869,6 +869,7 @@
# @ stub GetUILanguageInfo
@ stdcall -arch=x86_64 GetUmsCompletionListEvent(ptr ptr)
# @ stub -arch=x86_64 GetUmsSystemThreadInformation
+@ stub GetUserDefaultGeoName(wstr long)
@ stdcall -import GetUserDefaultLCID()
@ stdcall -import GetUserDefaultLangID()
@ stdcall -import GetUserDefaultLocaleName(ptr long)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index f1ff3fbaa7..40d5296be9 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -4016,7 +4016,7 @@ static const struct geoinfo_t *get_geoinfo_dataptr(GEOID geoid)
*/
GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
{
- GEOID ret = GEOID_NOT_AVAILABLE;
+ GEOID ret = 39070;
static const WCHAR geoW[] = {'G','e','o',0};
static const WCHAR nationW[] = {'N','a','t','i','o','n',0};
static const WCHAR regionW[] = {'R','e','g','i','o','n',0};
@@ -4025,7 +4025,6 @@ GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
UNICODE_STRING keyW;
const KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)bufferW;
DWORD count = sizeof(bufferW);
- RtlInitUnicodeString(&keyW, nationW);
switch (geoclass)
{
@@ -4037,7 +4036,7 @@ GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
break;
default:
WARN("Unknown geoclass %d\n", geoclass);
- return ret;
+ return GEOID_NOT_AVAILABLE;
}
if (!(hkey = create_registry_key())) return ret;
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 81e74531ea..8a49259836 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -98,6 +98,8 @@ static INT (WINAPI *pCompareStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPCWSTR, INT
static INT (WINAPI *pGetGeoInfoA)(GEOID, GEOTYPE, LPSTR, INT, LANGID);
static INT (WINAPI *pGetGeoInfoW)(GEOID, GEOTYPE, LPWSTR, INT, LANGID);
static BOOL (WINAPI *pEnumSystemGeoID)(GEOCLASS, GEOID, GEO_ENUMPROC);
+static GEOID (WINAPI *pGetUserGeoID)(GEOCLASS);
+static int (WINAPI *pGetUserDefaultGeoName)(WCHAR*, int);
static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
static BOOL (WINAPI *pGetThreadPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
static BOOL (WINAPI *pGetUserPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
@@ -136,6 +138,8 @@ static void InitFunctionPointers(void)
X(GetGeoInfoA);
X(GetGeoInfoW);
X(EnumSystemGeoID);
+ X(GetUserGeoID);
+ X(GetUserDefaultGeoName);
X(GetSystemPreferredUILanguages);
X(GetThreadPreferredUILanguages);
X(GetUserPreferredUILanguages);
@@ -4893,6 +4897,29 @@ static void test_EnumSystemGeoID(void)
}
}
+static void test_GetUserGeoID(void)
+{
+ GEOID id;
+
+ if (pGetUserDefaultGeoName)
+ {
+ ok(GEOID_NOT_AVAILABLE != GetUserGeoID(GEOCLASS_NATION),
+ "GEOCLASS_NATION: should never return GEOID_NOT_AVAILABLE in this platform.\n");
+ ok(GEOID_NOT_AVAILABLE != GetUserGeoID(GEOCLASS_REGION),
+ "GEOCLASS_REGION: should never return GEOID_NOT_AVAILABLE in this platform.\n");
+ }
+ else
+ win_skip("This platform allows returning GEOID_NOT_AVAILABLE on success.\n");
+
+ id = GetUserGeoID(GEOCLASS_ALL);
+ ok(id == GEOID_NOT_AVAILABLE,
+ "GEOCLASS_ALL: expected GEOID_NOT_AVAILABLE, got %d.\n", id);
+
+ id = GetUserGeoID(0xdeadbeef);
+ ok(id == GEOID_NOT_AVAILABLE,
+ "Gibberish argument: expected GEOID_NOT_AVAILABLE, got %d.\n", id);
+}
+
struct invariant_entry {
const char *name;
int id;
@@ -6048,6 +6075,7 @@ START_TEST(locale)
test_IsValidLocaleName();
test_CompareStringOrdinal();
test_GetGeoInfo();
+ test_GetUserGeoID();
test_EnumSystemGeoID();
test_invariant();
test_GetSystemPreferredUILanguages();
--
2.24.0
2
1
[PATCH v6 2/3] kernel32: Autoinitialize geographic values when launching any program.
by João Diogo Ferreira 16 Nov '19
by João Diogo Ferreira 16 Nov '19
16 Nov '19
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46196
Signed-off-by: João Diogo Craveiro Ferreira <devilj(a)outlook.pt>
---
V6: Use LOCALE_IGEOID instead of geonames.
Yeah, turns out this works after all.
Supersedes: 172991
---
dlls/kernel32/kernel_main.c | 3 +++
dlls/kernel32/kernel_private.h | 1 +
dlls/kernel32/locale.c | 9 +++++++++
3 files changed, 13 insertions(+)
diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c
index dfa66f0295..206972c210 100644
--- a/dlls/kernel32/kernel_main.c
+++ b/dlls/kernel32/kernel_main.c
@@ -88,6 +88,9 @@ static BOOL process_attach( HMODULE module )
/* Setup registry locale information */
LOCALE_InitRegistry();
+ /* Setup registry geographic information */
+ LOCALE_InitGeo();
+
/* Setup registry timezone information */
TIMEZONE_InitRegistry();
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index cd6c63efa3..e9f5f51029 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -75,6 +75,7 @@ extern void COMPUTERNAME_Init(void) DECLSPEC_HIDDEN;
/* locale.c */
extern void LOCALE_Init(void) DECLSPEC_HIDDEN;
extern void LOCALE_InitRegistry(void) DECLSPEC_HIDDEN;
+extern void LOCALE_InitGeo(void) DECLSPEC_HIDDEN;
/* time.c */
extern void TIMEZONE_InitRegistry(void) DECLSPEC_HIDDEN;
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 0f91728e84..f1ff3fbaa7 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -845,6 +845,15 @@ void LOCALE_InitRegistry(void)
NtClose( hkey );
}
+/* Initialize the geographic information in the registry. */
+void LOCALE_InitGeo(void)
+{
+ GEOID id;
+
+ if (GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_IGEOID|LOCALE_RETURN_NUMBER,
+ (WCHAR *)&id, sizeof(id) / sizeof(WCHAR)))
+ SetUserGeoID(id);
+}
#ifdef __APPLE__
/***********************************************************************
--
2.24.0
2
1
16 Nov '19
Signed-off-by: João Diogo Craveiro Ferreira <devilj(a)outlook.pt>
---
These GeoIDs were taken from Wine's own geoinfodata array via a script,
so they should match with Windows (and do for the handful I tested.)
---
dlls/kernel32/nls/afk.nls | 1 +
dlls/kernel32/nls/ara.nls | 1 +
dlls/kernel32/nls/arb.nls | 1 +
dlls/kernel32/nls/are.nls | 1 +
dlls/kernel32/nls/arg.nls | 1 +
dlls/kernel32/nls/arh.nls | 1 +
dlls/kernel32/nls/ari.nls | 1 +
dlls/kernel32/nls/arj.nls | 1 +
dlls/kernel32/nls/ark.nls | 1 +
dlls/kernel32/nls/arl.nls | 1 +
dlls/kernel32/nls/arm.nls | 1 +
dlls/kernel32/nls/aro.nls | 1 +
dlls/kernel32/nls/arq.nls | 1 +
dlls/kernel32/nls/ars.nls | 1 +
dlls/kernel32/nls/art.nls | 1 +
dlls/kernel32/nls/aru.nls | 1 +
dlls/kernel32/nls/ary.nls | 1 +
dlls/kernel32/nls/ast.nls | 1 +
dlls/kernel32/nls/aze.nls | 1 +
dlls/kernel32/nls/azl.nls | 1 +
dlls/kernel32/nls/bel.nls | 1 +
dlls/kernel32/nls/ben.nls | 1 +
dlls/kernel32/nls/bgr.nls | 1 +
dlls/kernel32/nls/brf.nls | 1 +
dlls/kernel32/nls/cat.nls | 1 +
dlls/kernel32/nls/chs.nls | 1 +
dlls/kernel32/nls/cht.nls | 1 +
dlls/kernel32/nls/cor.nls | 1 +
dlls/kernel32/nls/csy.nls | 1 +
dlls/kernel32/nls/cym.nls | 1 +
dlls/kernel32/nls/dan.nls | 1 +
dlls/kernel32/nls/dea.nls | 1 +
dlls/kernel32/nls/dec.nls | 1 +
dlls/kernel32/nls/del.nls | 1 +
dlls/kernel32/nls/des.nls | 1 +
dlls/kernel32/nls/deu.nls | 1 +
dlls/kernel32/nls/div.nls | 1 +
dlls/kernel32/nls/ell.nls | 1 +
dlls/kernel32/nls/ena.nls | 1 +
dlls/kernel32/nls/enb.nls | 1 +
dlls/kernel32/nls/enc.nls | 1 +
dlls/kernel32/nls/eng.nls | 1 +
dlls/kernel32/nls/eni.nls | 1 +
dlls/kernel32/nls/enj.nls | 1 +
dlls/kernel32/nls/enl.nls | 1 +
dlls/kernel32/nls/enp.nls | 1 +
dlls/kernel32/nls/ens.nls | 1 +
dlls/kernel32/nls/ent.nls | 1 +
dlls/kernel32/nls/enu.nls | 1 +
dlls/kernel32/nls/enw.nls | 1 +
dlls/kernel32/nls/enz.nls | 1 +
dlls/kernel32/nls/eox.nls | 1 +
dlls/kernel32/nls/esa.nls | 1 +
dlls/kernel32/nls/esb.nls | 1 +
dlls/kernel32/nls/esc.nls | 1 +
dlls/kernel32/nls/esd.nls | 1 +
dlls/kernel32/nls/ese.nls | 1 +
dlls/kernel32/nls/esf.nls | 1 +
dlls/kernel32/nls/esg.nls | 1 +
dlls/kernel32/nls/esh.nls | 1 +
dlls/kernel32/nls/esi.nls | 1 +
dlls/kernel32/nls/esl.nls | 1 +
dlls/kernel32/nls/esm.nls | 1 +
dlls/kernel32/nls/esn.nls | 1 +
dlls/kernel32/nls/eso.nls | 1 +
dlls/kernel32/nls/esp.nls | 1 +
dlls/kernel32/nls/esr.nls | 1 +
dlls/kernel32/nls/ess.nls | 1 +
dlls/kernel32/nls/esu.nls | 1 +
dlls/kernel32/nls/esv.nls | 1 +
dlls/kernel32/nls/esy.nls | 1 +
dlls/kernel32/nls/esz.nls | 1 +
dlls/kernel32/nls/eti.nls | 1 +
dlls/kernel32/nls/euq.nls | 1 +
dlls/kernel32/nls/far.nls | 1 +
dlls/kernel32/nls/fin.nls | 1 +
dlls/kernel32/nls/fos.nls | 1 +
dlls/kernel32/nls/fra.nls | 1 +
dlls/kernel32/nls/frb.nls | 1 +
dlls/kernel32/nls/frc.nls | 1 +
dlls/kernel32/nls/frl.nls | 1 +
dlls/kernel32/nls/frm.nls | 1 +
dlls/kernel32/nls/frs.nls | 1 +
dlls/kernel32/nls/gae.nls | 1 +
dlls/kernel32/nls/gdh.nls | 1 +
dlls/kernel32/nls/gdv.nls | 1 +
dlls/kernel32/nls/glc.nls | 1 +
dlls/kernel32/nls/guj.nls | 1 +
dlls/kernel32/nls/heb.nls | 1 +
dlls/kernel32/nls/hin.nls | 1 +
dlls/kernel32/nls/hrv.nls | 1 +
dlls/kernel32/nls/hun.nls | 1 +
dlls/kernel32/nls/hye.nls | 1 +
dlls/kernel32/nls/ind.nls | 1 +
dlls/kernel32/nls/isl.nls | 1 +
dlls/kernel32/nls/ita.nls | 1 +
dlls/kernel32/nls/its.nls | 1 +
dlls/kernel32/nls/ivl.nls | 1 +
dlls/kernel32/nls/jpn.nls | 1 +
dlls/kernel32/nls/kan.nls | 1 +
dlls/kernel32/nls/kat.nls | 1 +
dlls/kernel32/nls/kkz.nls | 1 +
dlls/kernel32/nls/knk.nls | 1 +
dlls/kernel32/nls/kor.nls | 1 +
dlls/kernel32/nls/kyr.nls | 1 +
dlls/kernel32/nls/lth.nls | 1 +
dlls/kernel32/nls/lvi.nls | 1 +
dlls/kernel32/nls/mar.nls | 1 +
dlls/kernel32/nls/mki.nls | 1 +
dlls/kernel32/nls/mon.nls | 1 +
dlls/kernel32/nls/msb.nls | 1 +
dlls/kernel32/nls/msl.nls | 1 +
dlls/kernel32/nls/nep.nls | 1 +
dlls/kernel32/nls/nlb.nls | 1 +
dlls/kernel32/nls/nld.nls | 1 +
dlls/kernel32/nls/nls.nls | 1 +
dlls/kernel32/nls/non.nls | 1 +
dlls/kernel32/nls/nor.nls | 1 +
dlls/kernel32/nls/pan.nls | 1 +
dlls/kernel32/nls/plk.nls | 1 +
dlls/kernel32/nls/ptb.nls | 1 +
dlls/kernel32/nls/ptg.nls | 1 +
dlls/kernel32/nls/rmc.nls | 1 +
dlls/kernel32/nls/rom.nls | 1 +
dlls/kernel32/nls/rus.nls | 1 +
dlls/kernel32/nls/san.nls | 1 +
dlls/kernel32/nls/sin.nls | 1 +
dlls/kernel32/nls/sky.nls | 1 +
dlls/kernel32/nls/slv.nls | 1 +
dlls/kernel32/nls/sqi.nls | 1 +
dlls/kernel32/nls/srb.nls | 1 +
dlls/kernel32/nls/srl.nls | 1 +
dlls/kernel32/nls/sve.nls | 1 +
dlls/kernel32/nls/svf.nls | 1 +
dlls/kernel32/nls/swk.nls | 1 +
dlls/kernel32/nls/syr.nls | 1 +
dlls/kernel32/nls/tam.nls | 1 +
dlls/kernel32/nls/tel.nls | 1 +
dlls/kernel32/nls/tha.nls | 1 +
dlls/kernel32/nls/trk.nls | 1 +
dlls/kernel32/nls/ttt.nls | 1 +
dlls/kernel32/nls/ukr.nls | 1 +
dlls/kernel32/nls/urd.nls | 1 +
dlls/kernel32/nls/uzb.nls | 1 +
dlls/kernel32/nls/uzl.nls | 1 +
dlls/kernel32/nls/vit.nls | 1 +
dlls/kernel32/nls/wal.nls | 1 +
dlls/kernel32/nls/zhh.nls | 1 +
dlls/kernel32/nls/zhi.nls | 1 +
dlls/kernel32/nls/zhm.nls | 1 +
150 files changed, 150 insertions(+)
diff --git a/dlls/kernel32/nls/afk.nls b/dlls/kernel32/nls/afk.nls
index 359368d1b8..aa33aa06d5 100644
--- a/dlls/kernel32/nls/afk.nls
+++ b/dlls/kernel32/nls/afk.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_AFRIKAANS, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "209"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0436"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ara.nls b/dlls/kernel32/nls/ara.nls
index db475ec95f..ff63164d47 100644
--- a/dlls/kernel32/nls/ara.nls
+++ b/dlls/kernel32/nls/ara.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "205"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0401"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arb.nls b/dlls/kernel32/nls/arb.nls
index e2ee977275..fb854ac44c 100644
--- a/dlls/kernel32/nls/arb.nls
+++ b/dlls/kernel32/nls/arb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_LEBANON
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "139"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "3001"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/are.nls b/dlls/kernel32/nls/are.nls
index 861ddc7f39..b044d3299b 100644
--- a/dlls/kernel32/nls/are.nls
+++ b/dlls/kernel32/nls/are.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_EGYPT
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "67"
LOCALE_IINTLCURRDIGITS "3"
LOCALE_ILANGUAGE "0c01"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arg.nls b/dlls/kernel32/nls/arg.nls
index 0d8f64cd12..6c10551f01 100644
--- a/dlls/kernel32/nls/arg.nls
+++ b/dlls/kernel32/nls/arg.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_ALGERIA
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "4"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1401"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arh.nls b/dlls/kernel32/nls/arh.nls
index 08a4c40fcf..ce2fe000d4 100644
--- a/dlls/kernel32/nls/arh.nls
+++ b/dlls/kernel32/nls/arh.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_BAHRAIN
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "17"
LOCALE_IINTLCURRDIGITS "3"
LOCALE_ILANGUAGE "3c01"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ari.nls b/dlls/kernel32/nls/ari.nls
index 56d6b0a66a..466fa2540b 100644
--- a/dlls/kernel32/nls/ari.nls
+++ b/dlls/kernel32/nls/ari.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_IRAQ
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "121"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0801"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arj.nls b/dlls/kernel32/nls/arj.nls
index 6de87ba1d7..fc4f15c509 100644
--- a/dlls/kernel32/nls/arj.nls
+++ b/dlls/kernel32/nls/arj.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_JORDAN
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "126"
LOCALE_IINTLCURRDIGITS "3"
LOCALE_ILANGUAGE "2c01"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ark.nls b/dlls/kernel32/nls/ark.nls
index 5714cb2016..9086b62226 100644
--- a/dlls/kernel32/nls/ark.nls
+++ b/dlls/kernel32/nls/ark.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_KUWAIT
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "136"
LOCALE_IINTLCURRDIGITS "3"
LOCALE_ILANGUAGE "3401"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arl.nls b/dlls/kernel32/nls/arl.nls
index b355537860..22bde6893f 100644
--- a/dlls/kernel32/nls/arl.nls
+++ b/dlls/kernel32/nls/arl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_LIBYA
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "148"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1001"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arm.nls b/dlls/kernel32/nls/arm.nls
index 4655544a94..8ac926550a 100644
--- a/dlls/kernel32/nls/arm.nls
+++ b/dlls/kernel32/nls/arm.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_MOROCCO
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "159"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1801"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/aro.nls b/dlls/kernel32/nls/aro.nls
index f05719620e..953b761de7 100644
--- a/dlls/kernel32/nls/aro.nls
+++ b/dlls/kernel32/nls/aro.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_OMAN
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "164"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2001"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/arq.nls b/dlls/kernel32/nls/arq.nls
index 328455231c..25ac8b9132 100644
--- a/dlls/kernel32/nls/arq.nls
+++ b/dlls/kernel32/nls/arq.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_QATAR
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "197"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "4001"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ars.nls b/dlls/kernel32/nls/ars.nls
index f0c22ed5dc..803ca07118 100644
--- a/dlls/kernel32/nls/ars.nls
+++ b/dlls/kernel32/nls/ars.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_SYRIA
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "222"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2801"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/art.nls b/dlls/kernel32/nls/art.nls
index 6c8335d265..55e34ac77f 100644
--- a/dlls/kernel32/nls/art.nls
+++ b/dlls/kernel32/nls/art.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_TUNISIA
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "234"
LOCALE_IINTLCURRDIGITS "3"
LOCALE_ILANGUAGE "1c01"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/aru.nls b/dlls/kernel32/nls/aru.nls
index 7e431370f5..d519b38bdd 100644
--- a/dlls/kernel32/nls/aru.nls
+++ b/dlls/kernel32/nls/aru.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_UAE
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "224"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "3801"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ary.nls b/dlls/kernel32/nls/ary.nls
index c51b59f5d5..0cb1bb88b6 100644
--- a/dlls/kernel32/nls/ary.nls
+++ b/dlls/kernel32/nls/ary.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_YEMEN
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "261"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2401"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ast.nls b/dlls/kernel32/nls/ast.nls
index f4a0489abe..4a6a77aa72 100644
--- a/dlls/kernel32/nls/ast.nls
+++ b/dlls/kernel32/nls/ast.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ASTURIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "04a5"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/aze.nls b/dlls/kernel32/nls/aze.nls
index a9b093e787..e2860d088f 100644
--- a/dlls/kernel32/nls/aze.nls
+++ b/dlls/kernel32/nls/aze.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_CYRILLIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "5"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "082c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/azl.nls b/dlls/kernel32/nls/azl.nls
index f6a237b6ee..86d49a6b5f 100644
--- a/dlls/kernel32/nls/azl.nls
+++ b/dlls/kernel32/nls/azl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_AZERI, SUBLANG_AZERI_LATIN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "5"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "042c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/bel.nls b/dlls/kernel32/nls/bel.nls
index d390871163..e6cc7a58df 100644
--- a/dlls/kernel32/nls/bel.nls
+++ b/dlls/kernel32/nls/bel.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_BELARUSIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "29"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0423"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ben.nls b/dlls/kernel32/nls/ben.nls
index f1031b09a7..bead15abaf 100644
--- a/dlls/kernel32/nls/ben.nls
+++ b/dlls/kernel32/nls/ben.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_BANGLA, SUBLANG_BANGLA_INDIA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0445"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/bgr.nls b/dlls/kernel32/nls/bgr.nls
index 4951098a1d..5f1f0e6697 100644
--- a/dlls/kernel32/nls/bgr.nls
+++ b/dlls/kernel32/nls/bgr.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "35"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0402"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/brf.nls b/dlls/kernel32/nls/brf.nls
index e0dcf12e89..06862e665c 100644
--- a/dlls/kernel32/nls/brf.nls
+++ b/dlls/kernel32/nls/brf.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_BRETON, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "84"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0493"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/cat.nls b/dlls/kernel32/nls/cat.nls
index b58cd75c27..5f1fa43e02 100644
--- a/dlls/kernel32/nls/cat.nls
+++ b/dlls/kernel32/nls/cat.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0403"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/chs.nls b/dlls/kernel32/nls/chs.nls
index 2829e52d66..c7f6114768 100644
--- a/dlls/kernel32/nls/chs.nls
+++ b/dlls/kernel32/nls/chs.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "45"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0804"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/cht.nls b/dlls/kernel32/nls/cht.nls
index b8bac7be3e..1cfeb840f0 100644
--- a/dlls/kernel32/nls/cht.nls
+++ b/dlls/kernel32/nls/cht.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "237"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0404"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/cor.nls b/dlls/kernel32/nls/cor.nls
index 535239aaf6..36c7e7f234 100644
--- a/dlls/kernel32/nls/cor.nls
+++ b/dlls/kernel32/nls/cor.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_CORNISH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "242"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0492"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/csy.nls b/dlls/kernel32/nls/csy.nls
index 4cfb2afd4d..d03494e4cd 100644
--- a/dlls/kernel32/nls/csy.nls
+++ b/dlls/kernel32/nls/csy.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "75"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0405"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/cym.nls b/dlls/kernel32/nls/cym.nls
index 9d0f272ef2..41a25c415b 100644
--- a/dlls/kernel32/nls/cym.nls
+++ b/dlls/kernel32/nls/cym.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_WELSH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "242"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0492"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/dan.nls b/dlls/kernel32/nls/dan.nls
index 444e5a78d2..3e567cd333 100644
--- a/dlls/kernel32/nls/dan.nls
+++ b/dlls/kernel32/nls/dan.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "61"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0406"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/dea.nls b/dlls/kernel32/nls/dea.nls
index 0caf414af0..f97ae8ebe3 100644
--- a/dlls/kernel32/nls/dea.nls
+++ b/dlls/kernel32/nls/dea.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "14"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c07"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/dec.nls b/dlls/kernel32/nls/dec.nls
index ee3a95cdf2..b6b492b84d 100644
--- a/dlls/kernel32/nls/dec.nls
+++ b/dlls/kernel32/nls/dec.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_LIECHTENSTEIN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "145"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1407"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/del.nls b/dlls/kernel32/nls/del.nls
index b92df675fa..6a7258d9fe 100644
--- a/dlls/kernel32/nls/del.nls
+++ b/dlls/kernel32/nls/del.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_LUXEMBOURG
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "147"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1007"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/des.nls b/dlls/kernel32/nls/des.nls
index f67f1d7bd8..bb6fed059c 100644
--- a/dlls/kernel32/nls/des.nls
+++ b/dlls/kernel32/nls/des.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "223"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0807"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/deu.nls b/dlls/kernel32/nls/deu.nls
index 66c0554032..b02639801b 100644
--- a/dlls/kernel32/nls/deu.nls
+++ b/dlls/kernel32/nls/deu.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "94"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0407"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/div.nls b/dlls/kernel32/nls/div.nls
index e8b1c72830..1c7989e006 100644
--- a/dlls/kernel32/nls/div.nls
+++ b/dlls/kernel32/nls/div.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_DIVEHI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "165"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0465"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ell.nls b/dlls/kernel32/nls/ell.nls
index cb129e75ad..d86fe9e473 100644
--- a/dlls/kernel32/nls/ell.nls
+++ b/dlls/kernel32/nls/ell.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "98"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0408"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ena.nls b/dlls/kernel32/nls/ena.nls
index e57be4732d..f34a20b96d 100644
--- a/dlls/kernel32/nls/ena.nls
+++ b/dlls/kernel32/nls/ena.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "12"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c09"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/enb.nls b/dlls/kernel32/nls/enb.nls
index 164c94ebf2..ca6af6766e 100644
--- a/dlls/kernel32/nls/enb.nls
+++ b/dlls/kernel32/nls/enb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CARIBBEAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "161832257"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2409"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/enc.nls b/dlls/kernel32/nls/enc.nls
index 01b4b8af7a..0f3a394263 100644
--- a/dlls/kernel32/nls/enc.nls
+++ b/dlls/kernel32/nls/enc.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "39"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1009"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/eng.nls b/dlls/kernel32/nls/eng.nls
index 72cac4180c..779bd0ae6d 100644
--- a/dlls/kernel32/nls/eng.nls
+++ b/dlls/kernel32/nls/eng.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "242"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0809"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/eni.nls b/dlls/kernel32/nls/eni.nls
index 31c137512c..9796b0f6cd 100644
--- a/dlls/kernel32/nls/eni.nls
+++ b/dlls/kernel32/nls/eni.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_EIRE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "68"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1809"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/enj.nls b/dlls/kernel32/nls/enj.nls
index 9b1afeec61..36134691ef 100644
--- a/dlls/kernel32/nls/enj.nls
+++ b/dlls/kernel32/nls/enj.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_JAMAICA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "124"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2009"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/enl.nls b/dlls/kernel32/nls/enl.nls
index 6bbe6d9952..ee78870cc8 100644
--- a/dlls/kernel32/nls/enl.nls
+++ b/dlls/kernel32/nls/enl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_BELIZE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "24"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2809"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/enp.nls b/dlls/kernel32/nls/enp.nls
index 8f4cd835ea..5af8b97efc 100644
--- a/dlls/kernel32/nls/enp.nls
+++ b/dlls/kernel32/nls/enp.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_PHILIPPINES
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "201"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "3409"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/ens.nls b/dlls/kernel32/nls/ens.nls
index e94af6370e..ee2403196f 100644
--- a/dlls/kernel32/nls/ens.nls
+++ b/dlls/kernel32/nls/ens.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_SOUTH_AFRICA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "209"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1c09"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ent.nls b/dlls/kernel32/nls/ent.nls
index b0e849101c..48bfb26b15 100644
--- a/dlls/kernel32/nls/ent.nls
+++ b/dlls/kernel32/nls/ent.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_TRINIDAD
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "225"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2c09"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/enu.nls b/dlls/kernel32/nls/enu.nls
index 6a5a63b155..527d6430f0 100644
--- a/dlls/kernel32/nls/enu.nls
+++ b/dlls/kernel32/nls/enu.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "244"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0409"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/enw.nls b/dlls/kernel32/nls/enw.nls
index de51ae2f8b..1ba782fc32 100644
--- a/dlls/kernel32/nls/enw.nls
+++ b/dlls/kernel32/nls/enw.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_ZIMBABWE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "264"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "3009"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/enz.nls b/dlls/kernel32/nls/enz.nls
index cc2532454a..e4571a765b 100644
--- a/dlls/kernel32/nls/enz.nls
+++ b/dlls/kernel32/nls/enz.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_NZ
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "183"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1409"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/eox.nls b/dlls/kernel32/nls/eox.nls
index f67c955fde..bbd617eac4 100644
--- a/dlls/kernel32/nls/eox.nls
+++ b/dlls/kernel32/nls/eox.nls
@@ -56,6 +56,7 @@ STRINGTABLE LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "39070" /* World */
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "048f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esa.nls b/dlls/kernel32/nls/esa.nls
index f89e234f83..a311d796eb 100644
--- a/dlls/kernel32/nls/esa.nls
+++ b/dlls/kernel32/nls/esa.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PANAMA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "192"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "180a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esb.nls b/dlls/kernel32/nls/esb.nls
index ef5c4300b2..ce95402300 100644
--- a/dlls/kernel32/nls/esb.nls
+++ b/dlls/kernel32/nls/esb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_BOLIVIA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "26"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "400a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esc.nls b/dlls/kernel32/nls/esc.nls
index 8eccd4c137..60ed24e706 100644
--- a/dlls/kernel32/nls/esc.nls
+++ b/dlls/kernel32/nls/esc.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "54"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "140a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esd.nls b/dlls/kernel32/nls/esd.nls
index d956d0cd65..93b6bb0005 100644
--- a/dlls/kernel32/nls/esd.nls
+++ b/dlls/kernel32/nls/esd.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_DOMINICAN_REPUBLIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "65"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1c0a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ese.nls b/dlls/kernel32/nls/ese.nls
index e2f9f5ab91..a68c027440 100644
--- a/dlls/kernel32/nls/ese.nls
+++ b/dlls/kernel32/nls/ese.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_EL_SALVADOR
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "72"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "440a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esf.nls b/dlls/kernel32/nls/esf.nls
index a70f5e249d..65f47d73a2 100644
--- a/dlls/kernel32/nls/esf.nls
+++ b/dlls/kernel32/nls/esf.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ECUADOR
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "66"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "300a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esg.nls b/dlls/kernel32/nls/esg.nls
index 2b6138960c..a9c9a8a860 100644
--- a/dlls/kernel32/nls/esg.nls
+++ b/dlls/kernel32/nls/esg.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_GUATEMALA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "99"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "100a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esh.nls b/dlls/kernel32/nls/esh.nls
index 8d329cebc8..5593836b44 100644
--- a/dlls/kernel32/nls/esh.nls
+++ b/dlls/kernel32/nls/esh.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_HONDURAS
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "106"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "480a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esi.nls b/dlls/kernel32/nls/esi.nls
index 6ba9a78786..ac4bdb79d0 100644
--- a/dlls/kernel32/nls/esi.nls
+++ b/dlls/kernel32/nls/esi.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_NICARAGUA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "182"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "4c0a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esl.nls b/dlls/kernel32/nls/esl.nls
index 9b5c16d72b..57f35643b6 100644
--- a/dlls/kernel32/nls/esl.nls
+++ b/dlls/kernel32/nls/esl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_CHILE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "46"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "340a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esm.nls b/dlls/kernel32/nls/esm.nls
index 09f246504b..8c404f1733 100644
--- a/dlls/kernel32/nls/esm.nls
+++ b/dlls/kernel32/nls/esm.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MEXICAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "166"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "080a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esn.nls b/dlls/kernel32/nls/esn.nls
index 373445cabf..0cb88fa366 100644
--- a/dlls/kernel32/nls/esn.nls
+++ b/dlls/kernel32/nls/esn.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c0a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/eso.nls b/dlls/kernel32/nls/eso.nls
index d1831c4bc9..9f7131066a 100644
--- a/dlls/kernel32/nls/eso.nls
+++ b/dlls/kernel32/nls/eso.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_COLOMBIA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "51"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "240a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esp.nls b/dlls/kernel32/nls/esp.nls
index c80b650ea3..a557a52b7d 100644
--- a/dlls/kernel32/nls/esp.nls
+++ b/dlls/kernel32/nls/esp.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esr.nls b/dlls/kernel32/nls/esr.nls
index 050e5e9f7b..752120dadf 100644
--- a/dlls/kernel32/nls/esr.nls
+++ b/dlls/kernel32/nls/esr.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PERU
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "187"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "280a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ess.nls b/dlls/kernel32/nls/ess.nls
index c10084416b..30c96a0bf7 100644
--- a/dlls/kernel32/nls/ess.nls
+++ b/dlls/kernel32/nls/ess.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "11"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "2c0a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esu.nls b/dlls/kernel32/nls/esu.nls
index 25e5792edc..eb2ec3b04a 100644
--- a/dlls/kernel32/nls/esu.nls
+++ b/dlls/kernel32/nls/esu.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PUERTO_RICO
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "202"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "500a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esv.nls b/dlls/kernel32/nls/esv.nls
index baa4396841..155ebef33c 100644
--- a/dlls/kernel32/nls/esv.nls
+++ b/dlls/kernel32/nls/esv.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_VENEZUELA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "249"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "200a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esy.nls b/dlls/kernel32/nls/esy.nls
index 41d5f48480..9444f436a1 100644
--- a/dlls/kernel32/nls/esy.nls
+++ b/dlls/kernel32/nls/esy.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_URUGUAY
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "246"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "380a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/esz.nls b/dlls/kernel32/nls/esz.nls
index 34c321bc66..82eb4241b2 100644
--- a/dlls/kernel32/nls/esz.nls
+++ b/dlls/kernel32/nls/esz.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_PARAGUAY
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "185"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "3c0a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/eti.nls b/dlls/kernel32/nls/eti.nls
index 31b8aa0349..8d7f0fe39c 100644
--- a/dlls/kernel32/nls/eti.nls
+++ b/dlls/kernel32/nls/eti.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ESTONIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "70"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0425"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/euq.nls b/dlls/kernel32/nls/euq.nls
index f5570f02cc..38d34312ea 100644
--- a/dlls/kernel32/nls/euq.nls
+++ b/dlls/kernel32/nls/euq.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_BASQUE, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "042d"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/far.nls b/dlls/kernel32/nls/far.nls
index c67b78ae3c..ddc4495f77 100644
--- a/dlls/kernel32/nls/far.nls
+++ b/dlls/kernel32/nls/far.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_PERSIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "116"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0429"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/fin.nls b/dlls/kernel32/nls/fin.nls
index bc1221dcb3..29b7d2e897 100644
--- a/dlls/kernel32/nls/fin.nls
+++ b/dlls/kernel32/nls/fin.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "77"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040b"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/fos.nls b/dlls/kernel32/nls/fos.nls
index ad74d06ae6..5d53bcc81f 100644
--- a/dlls/kernel32/nls/fos.nls
+++ b/dlls/kernel32/nls/fos.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FAEROESE, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "81"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0438"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/fra.nls b/dlls/kernel32/nls/fra.nls
index 7a2da391dd..9a588a932e 100644
--- a/dlls/kernel32/nls/fra.nls
+++ b/dlls/kernel32/nls/fra.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "84"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/frb.nls b/dlls/kernel32/nls/frb.nls
index 904e8e7f2e..7ee0b29751 100644
--- a/dlls/kernel32/nls/frb.nls
+++ b/dlls/kernel32/nls/frb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_BELGIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "21"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "080c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/frc.nls b/dlls/kernel32/nls/frc.nls
index 8626473fc6..79eac11d96 100644
--- a/dlls/kernel32/nls/frc.nls
+++ b/dlls/kernel32/nls/frc.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_CANADIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "39"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c0c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/frl.nls b/dlls/kernel32/nls/frl.nls
index cb7d36d2c9..29d2ad0c9c 100644
--- a/dlls/kernel32/nls/frl.nls
+++ b/dlls/kernel32/nls/frl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_LUXEMBOURG
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "147"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "140c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/frm.nls b/dlls/kernel32/nls/frm.nls
index 5c3e6b192e..fa38552812 100644
--- a/dlls/kernel32/nls/frm.nls
+++ b/dlls/kernel32/nls/frm.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_MONACO
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "158"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "180c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/frs.nls b/dlls/kernel32/nls/frs.nls
index 303be0a31b..cefb9d36db 100644
--- a/dlls/kernel32/nls/frs.nls
+++ b/dlls/kernel32/nls/frs.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_SWISS
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "223"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "100c"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/gae.nls b/dlls/kernel32/nls/gae.nls
index 8167cbcd60..e817403c43 100644
--- a/dlls/kernel32/nls/gae.nls
+++ b/dlls/kernel32/nls/gae.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_IRISH, SUBLANG_IRISH_IRELAND
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "68"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "083c"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/gdh.nls b/dlls/kernel32/nls/gdh.nls
index f8bdaa0b64..0cd5699120 100644
--- a/dlls/kernel32/nls/gdh.nls
+++ b/dlls/kernel32/nls/gdh.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_SCOTTISH_GAELIC, SUBLANG_SCOTTISH_GAELIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "242"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0491"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/gdv.nls b/dlls/kernel32/nls/gdv.nls
index c836eee807..0723813c14 100644
--- a/dlls/kernel32/nls/gdv.nls
+++ b/dlls/kernel32/nls/gdv.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_MANX_GAELIC, SUBLANG_MANX_GAELIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "15126"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0494"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/glc.nls b/dlls/kernel32/nls/glc.nls
index 71b49390d8..f60a0aac69 100644
--- a/dlls/kernel32/nls/glc.nls
+++ b/dlls/kernel32/nls/glc.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GALICIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "217"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0456"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/guj.nls b/dlls/kernel32/nls/guj.nls
index 4731cc5004..e24ba5e43f 100644
--- a/dlls/kernel32/nls/guj.nls
+++ b/dlls/kernel32/nls/guj.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GUJARATI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0447"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/heb.nls b/dlls/kernel32/nls/heb.nls
index 2ba57a50ab..2d69ffd467 100644
--- a/dlls/kernel32/nls/heb.nls
+++ b/dlls/kernel32/nls/heb.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "117"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040d"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/hin.nls b/dlls/kernel32/nls/hin.nls
index 3a70dc0db6..b32a057265 100644
--- a/dlls/kernel32/nls/hin.nls
+++ b/dlls/kernel32/nls/hin.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_HINDI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0439"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/hrv.nls b/dlls/kernel32/nls/hrv.nls
index faa39455d0..958e15e59e 100644
--- a/dlls/kernel32/nls/hrv.nls
+++ b/dlls/kernel32/nls/hrv.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "108"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/hun.nls b/dlls/kernel32/nls/hun.nls
index 3c95372f4f..c3dbb9773f 100644
--- a/dlls/kernel32/nls/hun.nls
+++ b/dlls/kernel32/nls/hun.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "109"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040e"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/hye.nls b/dlls/kernel32/nls/hye.nls
index fbd4b2b63a..2000280fe1 100644
--- a/dlls/kernel32/nls/hye.nls
+++ b/dlls/kernel32/nls/hye.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ARMENIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "7"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "042b"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ind.nls b/dlls/kernel32/nls/ind.nls
index f160c6829e..c33acb8a3e 100644
--- a/dlls/kernel32/nls/ind.nls
+++ b/dlls/kernel32/nls/ind.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "111"
LOCALE_IINTLCURRDIGITS "0"
LOCALE_ILANGUAGE "0421"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/isl.nls b/dlls/kernel32/nls/isl.nls
index 0f13d17562..5a6c3d67e3 100644
--- a/dlls/kernel32/nls/isl.nls
+++ b/dlls/kernel32/nls/isl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ICELANDIC, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "110"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "040f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ita.nls b/dlls/kernel32/nls/ita.nls
index 205384f42e..256d546819 100644
--- a/dlls/kernel32/nls/ita.nls
+++ b/dlls/kernel32/nls/ita.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "118"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0410"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/its.nls b/dlls/kernel32/nls/its.nls
index f8a67e7b19..c9a6c1744c 100644
--- a/dlls/kernel32/nls/its.nls
+++ b/dlls/kernel32/nls/its.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN_SWISS
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "223"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0810"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ivl.nls b/dlls/kernel32/nls/ivl.nls
index c55bea948f..6bfaf0f950 100644
--- a/dlls/kernel32/nls/ivl.nls
+++ b/dlls/kernel32/nls/ivl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_INVARIANT, SUBLANG_NEUTRAL
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "39070" /* World*/
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "007f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/jpn.nls b/dlls/kernel32/nls/jpn.nls
index 06ddccf859..39507dee84 100644
--- a/dlls/kernel32/nls/jpn.nls
+++ b/dlls/kernel32/nls/jpn.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "122"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0411"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/kan.nls b/dlls/kernel32/nls/kan.nls
index 9c82d16dc9..e6934d1a42 100644
--- a/dlls/kernel32/nls/kan.nls
+++ b/dlls/kernel32/nls/kan.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_KANNADA, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "044b"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/kat.nls b/dlls/kernel32/nls/kat.nls
index e2596483c3..26e165001e 100644
--- a/dlls/kernel32/nls/kat.nls
+++ b/dlls/kernel32/nls/kat.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_GEORGIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "88"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0437"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/kkz.nls b/dlls/kernel32/nls/kkz.nls
index c23ded5a00..5a8451563b 100644
--- a/dlls/kernel32/nls/kkz.nls
+++ b/dlls/kernel32/nls/kkz.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_KAZAK, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "137"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "043f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/knk.nls b/dlls/kernel32/nls/knk.nls
index 44e19e8a7b..c2526d2c81 100644
--- a/dlls/kernel32/nls/knk.nls
+++ b/dlls/kernel32/nls/knk.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_KONKANI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0457"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/kor.nls b/dlls/kernel32/nls/kor.nls
index 26ebe7f520..9d44870b39 100644
--- a/dlls/kernel32/nls/kor.nls
+++ b/dlls/kernel32/nls/kor.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_KOREAN, SUBLANG_KOREAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "134"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0412"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/kyr.nls b/dlls/kernel32/nls/kyr.nls
index e0ade28a16..7ab2a4d0b6 100644
--- a/dlls/kernel32/nls/kyr.nls
+++ b/dlls/kernel32/nls/kyr.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_KYRGYZ, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "130"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0440"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/lth.nls b/dlls/kernel32/nls/lth.nls
index 9f3fc4f195..fa1417357a 100644
--- a/dlls/kernel32/nls/lth.nls
+++ b/dlls/kernel32/nls/lth.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_LITHUANIAN, SUBLANG_LITHUANIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "141"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0427"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/lvi.nls b/dlls/kernel32/nls/lvi.nls
index bdff4bf2b8..3faa56bf54 100644
--- a/dlls/kernel32/nls/lvi.nls
+++ b/dlls/kernel32/nls/lvi.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_LATVIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "140"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0426"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/mar.nls b/dlls/kernel32/nls/mar.nls
index d7b31a757b..3069a59070 100644
--- a/dlls/kernel32/nls/mar.nls
+++ b/dlls/kernel32/nls/mar.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_MARATHI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "044e"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/mki.nls b/dlls/kernel32/nls/mki.nls
index 6103b42265..30efc19b37 100644
--- a/dlls/kernel32/nls/mki.nls
+++ b/dlls/kernel32/nls/mki.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_MACEDONIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "19618"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "042f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/mon.nls b/dlls/kernel32/nls/mon.nls
index 41516fb4bc..c60ec86c91 100644
--- a/dlls/kernel32/nls/mon.nls
+++ b/dlls/kernel32/nls/mon.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_MONGOLIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "0"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "154"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0450"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/msb.nls b/dlls/kernel32/nls/msb.nls
index bbba93f642..0e232cfcb0 100644
--- a/dlls/kernel32/nls/msb.nls
+++ b/dlls/kernel32/nls/msb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_MALAY, SUBLANG_MALAY_BRUNEI_DARUSSALAM
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "37"
LOCALE_IINTLCURRDIGITS "0"
LOCALE_ILANGUAGE "083e"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/msl.nls b/dlls/kernel32/nls/msl.nls
index 3bffbb6d1d..1df52003c2 100644
--- a/dlls/kernel32/nls/msl.nls
+++ b/dlls/kernel32/nls/msl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_MALAY, SUBLANG_MALAY_MALAYSIA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "167"
LOCALE_IINTLCURRDIGITS "0"
LOCALE_ILANGUAGE "043e"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/nep.nls b/dlls/kernel32/nls/nep.nls
index c8b5d74def..63946744cb 100644
--- a/dlls/kernel32/nls/nep.nls
+++ b/dlls/kernel32/nls/nep.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_NEPALI, SUBLANG_NEPALI_NEPAL
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "178"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0461"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/nlb.nls b/dlls/kernel32/nls/nlb.nls
index 8af8f48ee1..17fd3790de 100644
--- a/dlls/kernel32/nls/nlb.nls
+++ b/dlls/kernel32/nls/nlb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_DUTCH, SUBLANG_DUTCH_BELGIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "21"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0813"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/nld.nls b/dlls/kernel32/nls/nld.nls
index 6abf0dd3fd..47de663dec 100644
--- a/dlls/kernel32/nls/nld.nls
+++ b/dlls/kernel32/nls/nld.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_DUTCH, SUBLANG_DUTCH
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "176"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0413"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/nls.nls b/dlls/kernel32/nls/nls.nls
index 8ebbfdf071..b29f0bc3a1 100644
--- a/dlls/kernel32/nls/nls.nls
+++ b/dlls/kernel32/nls/nls.nls
@@ -46,6 +46,7 @@ STRINGTABLE LANGUAGE LANG_DUTCH, SUBLANG_DUTCH_SURINAM
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "181"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c13"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/non.nls b/dlls/kernel32/nls/non.nls
index 9a2eefa42f..ac6827536f 100644
--- a/dlls/kernel32/nls/non.nls
+++ b/dlls/kernel32/nls/non.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "177"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0814"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/nor.nls b/dlls/kernel32/nls/nor.nls
index eb65152380..bd78390541 100644
--- a/dlls/kernel32/nls/nor.nls
+++ b/dlls/kernel32/nls/nor.nls
@@ -41,6 +41,7 @@ STRINGTABLE LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "177"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0414"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/pan.nls b/dlls/kernel32/nls/pan.nls
index 358a9eb97a..bd8aeb883f 100644
--- a/dlls/kernel32/nls/pan.nls
+++ b/dlls/kernel32/nls/pan.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_PUNJABI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0446"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/plk.nls b/dlls/kernel32/nls/plk.nls
index 6e1447dc15..b79020ecb0 100644
--- a/dlls/kernel32/nls/plk.nls
+++ b/dlls/kernel32/nls/plk.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "191"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0415"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ptb.nls b/dlls/kernel32/nls/ptb.nls
index e66c09a3cc..66cc65be83 100644
--- a/dlls/kernel32/nls/ptb.nls
+++ b/dlls/kernel32/nls/ptb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "32"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0416"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ptg.nls b/dlls/kernel32/nls/ptg.nls
index a7c6496b25..c75d5a1caf 100644
--- a/dlls/kernel32/nls/ptg.nls
+++ b/dlls/kernel32/nls/ptg.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "193"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0816"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/rmc.nls b/dlls/kernel32/nls/rmc.nls
index c41a31dedd..f54db3585a 100644
--- a/dlls/kernel32/nls/rmc.nls
+++ b/dlls/kernel32/nls/rmc.nls
@@ -51,6 +51,7 @@ STRINGTABLE LANGUAGE LANG_ROMANSH, SUBLANG_ROMANSH_SWITZERLAND
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "223"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0417"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/rom.nls b/dlls/kernel32/nls/rom.nls
index 420154c5d1..fd519238dd 100644
--- a/dlls/kernel32/nls/rom.nls
+++ b/dlls/kernel32/nls/rom.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "200"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0418"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/rus.nls b/dlls/kernel32/nls/rus.nls
index a066c81c4a..5c78460f66 100644
--- a/dlls/kernel32/nls/rus.nls
+++ b/dlls/kernel32/nls/rus.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "203"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0419"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/san.nls b/dlls/kernel32/nls/san.nls
index 57ee6a54b2..4f44f3e3d9 100644
--- a/dlls/kernel32/nls/san.nls
+++ b/dlls/kernel32/nls/san.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SANSKRIT, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "044f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/sin.nls b/dlls/kernel32/nls/sin.nls
index cc5465f4dc..31d258b673 100644
--- a/dlls/kernel32/nls/sin.nls
+++ b/dlls/kernel32/nls/sin.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SINHALESE, SUBLANG_SINHALESE_SRI_LANKA
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "42"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "045B"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/sky.nls b/dlls/kernel32/nls/sky.nls
index 0e140e02de..29647b2b1b 100644
--- a/dlls/kernel32/nls/sky.nls
+++ b/dlls/kernel32/nls/sky.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "143"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041b"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/slv.nls b/dlls/kernel32/nls/slv.nls
index f5c0ffc94f..8f7fc66ac7 100644
--- a/dlls/kernel32/nls/slv.nls
+++ b/dlls/kernel32/nls/slv.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "212"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0424"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/sqi.nls b/dlls/kernel32/nls/sqi.nls
index 41b4085e10..6f4048230e 100644
--- a/dlls/kernel32/nls/sqi.nls
+++ b/dlls/kernel32/nls/sqi.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_ALBANIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "6"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041c"
LOCALE_ILDATE "2"
diff --git a/dlls/kernel32/nls/srb.nls b/dlls/kernel32/nls/srb.nls
index 500e36bb63..eb500cf0fd 100644
--- a/dlls/kernel32/nls/srb.nls
+++ b/dlls/kernel32/nls/srb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "271"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c1a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/srl.nls b/dlls/kernel32/nls/srl.nls
index 85f156d656..948b5e11a2 100644
--- a/dlls/kernel32/nls/srl.nls
+++ b/dlls/kernel32/nls/srl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "271"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "081a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/sve.nls b/dlls/kernel32/nls/sve.nls
index cff29a267a..6c8db124a6 100644
--- a/dlls/kernel32/nls/sve.nls
+++ b/dlls/kernel32/nls/sve.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "221"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041d"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/svf.nls b/dlls/kernel32/nls/svf.nls
index 2b97b4fe03..59982e8a39 100644
--- a/dlls/kernel32/nls/svf.nls
+++ b/dlls/kernel32/nls/svf.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH_FINLAND
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "2"
+ LOCALE_IGEOID "77"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "081d"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/swk.nls b/dlls/kernel32/nls/swk.nls
index 28e9dfc1aa..6308562991 100644
--- a/dlls/kernel32/nls/swk.nls
+++ b/dlls/kernel32/nls/swk.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SWAHILI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "129"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0441"
LOCALE_ILDATE "0"
diff --git a/dlls/kernel32/nls/syr.nls b/dlls/kernel32/nls/syr.nls
index 9e6453d77f..6f8aa76602 100644
--- a/dlls/kernel32/nls/syr.nls
+++ b/dlls/kernel32/nls/syr.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_SYRIAC, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "5"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "222"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "045a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/tam.nls b/dlls/kernel32/nls/tam.nls
index ba32416f42..8db932bf65 100644
--- a/dlls/kernel32/nls/tam.nls
+++ b/dlls/kernel32/nls/tam.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_TAMIL, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0449"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/tel.nls b/dlls/kernel32/nls/tel.nls
index 59078d15ee..37586776ea 100644
--- a/dlls/kernel32/nls/tel.nls
+++ b/dlls/kernel32/nls/tel.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_TELUGU, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "113"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "044a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/tha.nls b/dlls/kernel32/nls/tha.nls
index 3995c74368..2097b3728d 100644
--- a/dlls/kernel32/nls/tha.nls
+++ b/dlls/kernel32/nls/tha.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_THAI, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "227"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041e"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/trk.nls b/dlls/kernel32/nls/trk.nls
index 0b68b5bbce..3954b4b63e 100644
--- a/dlls/kernel32/nls/trk.nls
+++ b/dlls/kernel32/nls/trk.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "235"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "041f"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ttt.nls b/dlls/kernel32/nls/ttt.nls
index cae2f9418c..64cdb3d102 100644
--- a/dlls/kernel32/nls/ttt.nls
+++ b/dlls/kernel32/nls/ttt.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_TATAR, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "203"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0444"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/ukr.nls b/dlls/kernel32/nls/ukr.nls
index 142133ea9c..e13ac684fc 100644
--- a/dlls/kernel32/nls/ukr.nls
+++ b/dlls/kernel32/nls/ukr.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "241"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0422"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/urd.nls b/dlls/kernel32/nls/urd.nls
index d8b6c30135..1bebe46e74 100644
--- a/dlls/kernel32/nls/urd.nls
+++ b/dlls/kernel32/nls/urd.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_URDU, SUBLANG_URDU_PAKISTAN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "1"
+ LOCALE_IGEOID "190"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0420"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/uzb.nls b/dlls/kernel32/nls/uzb.nls
index 022f7f59af..1257f39f2f 100644
--- a/dlls/kernel32/nls/uzb.nls
+++ b/dlls/kernel32/nls/uzb.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_UZBEK, SUBLANG_UZBEK_CYRILLIC
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "247"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0843"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/uzl.nls b/dlls/kernel32/nls/uzl.nls
index 88206a9038..b03cfb6fb1 100644
--- a/dlls/kernel32/nls/uzl.nls
+++ b/dlls/kernel32/nls/uzl.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_UZBEK, SUBLANG_UZBEK_LATIN
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "247"
LOCALE_IINTLCURRDIGITS "0"
LOCALE_ILANGUAGE "0443"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/vit.nls b/dlls/kernel32/nls/vit.nls
index 3813cafb6b..17389243dc 100644
--- a/dlls/kernel32/nls/vit.nls
+++ b/dlls/kernel32/nls/vit.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_VIETNAMESE, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "0"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "251"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "042a"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/wal.nls b/dlls/kernel32/nls/wal.nls
index d86f9d6803..3e5f9585d7 100644
--- a/dlls/kernel32/nls/wal.nls
+++ b/dlls/kernel32/nls/wal.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_WALON, SUBLANG_DEFAULT
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "21"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0490"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/zhh.nls b/dlls/kernel32/nls/zhh.nls
index 19e1961393..f6aca66bd1 100644
--- a/dlls/kernel32/nls/zhh.nls
+++ b/dlls/kernel32/nls/zhh.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_HONGKONG
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "104"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "0c04"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/zhi.nls b/dlls/kernel32/nls/zhi.nls
index 941ec6e664..8b304d7514 100644
--- a/dlls/kernel32/nls/zhi.nls
+++ b/dlls/kernel32/nls/zhi.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "215"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1004"
LOCALE_ILDATE "1"
diff --git a/dlls/kernel32/nls/zhm.nls b/dlls/kernel32/nls/zhm.nls
index 8cef84265b..1a915bda16 100644
--- a/dlls/kernel32/nls/zhm.nls
+++ b/dlls/kernel32/nls/zhm.nls
@@ -40,6 +40,7 @@ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_MACAU
LOCALE_IDIGITSUBSTITUTION "1"
LOCALE_IFIRSTDAYOFWEEK "6"
LOCALE_IFIRSTWEEKOFYEAR "0"
+ LOCALE_IGEOID "151"
LOCALE_IINTLCURRDIGITS "2"
LOCALE_ILANGUAGE "1404"
LOCALE_ILDATE "1"
--
2.24.0
1
0
See attachment.
2
1
See attachment.
2
1