Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- 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
December 2020
- 68 participants
- 931 messages
[PATCH 2/3] wintrust: Allocate CryptCATOpen objects before reading the file.
by Rémi Bernon
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/wintrust/crypt.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/wintrust/crypt.c b/dlls/wintrust/crypt.c
index 4fbf75f7e0c..e9a58a84ac4 100644
--- a/dlls/wintrust/crypt.c
+++ b/dlls/wintrust/crypt.c
@@ -928,16 +928,16 @@ HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv,
file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, open_mode, 0, NULL);
if (file == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;
+ if (!(hmsg = CryptMsgOpenToDecode(dwEncodingType, 0, 0, hProv, NULL, NULL))) goto failed;
+ if (!(cc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cc)))) goto failed_alloc;
+ cc->msg = hmsg;
+ cc->encoding = dwEncodingType;
+
size = GetFileSize(file, NULL);
if (!(buffer = HeapAlloc(GetProcessHeap(), 0, size))) goto failed_alloc;
- if (!(hmsg = CryptMsgOpenToDecode(dwEncodingType, 0, 0, hProv, NULL, NULL))) goto failed;
if (!ReadFile(file, buffer, size, &size, NULL) || !CryptMsgUpdate(hmsg, buffer, size, TRUE)) goto failed;
size = sizeof(DWORD);
- if (!(cc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cc)))) goto failed_alloc;
-
- cc->msg = hmsg;
- cc->encoding = dwEncodingType;
if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_COUNT_PARAM, 0, &cc->attr_count, &size)) goto failed;
for (i = 0; i < cc->attr_count; i++)
--
2.29.2
Dec. 16, 2020
[PATCH 1/3] wintrust: Refactor CryptCATOpen error handling.
by Rémi Bernon
Make it simpler, handle all errors in the same place.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/wintrust/crypt.c | 118 +++++++++++++-----------------------------
1 file changed, 36 insertions(+), 82 deletions(-)
diff --git a/dlls/wintrust/crypt.c b/dlls/wintrust/crypt.c
index be869ad8277..4fbf75f7e0c 100644
--- a/dlls/wintrust/crypt.c
+++ b/dlls/wintrust/crypt.c
@@ -904,10 +904,10 @@ BOOL WINAPI CryptCATPersistStore(HANDLE catalog)
HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv,
DWORD dwPublicVersion, DWORD dwEncodingType)
{
- HANDLE file, hmsg;
- BYTE *buffer = NULL;
- DWORD size, open_mode = OPEN_ALWAYS;
- struct cryptcat *cc;
+ HANDLE file, hmsg = NULL;
+ BYTE *buffer = NULL, *p;
+ DWORD i, sum = 0, size, open_mode = OPEN_ALWAYS;
+ struct cryptcat *cc = NULL;
TRACE("filename %s, flags %#x, provider %#lx, version %#x, type %#x\n",
debugstr_w(filename), flags, hProv, dwPublicVersion, dwEncodingType);
@@ -929,92 +929,46 @@ HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv,
if (file == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;
size = GetFileSize(file, NULL);
- if (!(buffer = HeapAlloc(GetProcessHeap(), 0, size)))
- {
- CloseHandle(file);
- SetLastError(ERROR_OUTOFMEMORY);
- return INVALID_HANDLE_VALUE;
- }
- if (!(hmsg = CryptMsgOpenToDecode(dwEncodingType, 0, 0, hProv, NULL, NULL)))
- {
- CloseHandle(file);
- HeapFree(GetProcessHeap(), 0, buffer);
- return INVALID_HANDLE_VALUE;
- }
- if (!ReadFile(file, buffer, size, &size, NULL) || !CryptMsgUpdate(hmsg, buffer, size, TRUE))
- {
- CloseHandle(file);
- HeapFree(GetProcessHeap(), 0, buffer);
- CryptMsgClose(hmsg);
- return INVALID_HANDLE_VALUE;
- }
- HeapFree(GetProcessHeap(), 0, buffer);
- CloseHandle(file);
+ if (!(buffer = HeapAlloc(GetProcessHeap(), 0, size))) goto failed_alloc;
+ if (!(hmsg = CryptMsgOpenToDecode(dwEncodingType, 0, 0, hProv, NULL, NULL))) goto failed;
+ if (!ReadFile(file, buffer, size, &size, NULL) || !CryptMsgUpdate(hmsg, buffer, size, TRUE)) goto failed;
size = sizeof(DWORD);
- if (!(cc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cc))))
- {
- CryptMsgClose(hmsg);
- SetLastError(ERROR_OUTOFMEMORY);
- return INVALID_HANDLE_VALUE;
- }
+ if (!(cc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cc)))) goto failed_alloc;
cc->msg = hmsg;
cc->encoding = dwEncodingType;
- if (CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_COUNT_PARAM, 0, &cc->attr_count, &size))
- {
- DWORD i, sum = 0;
- BYTE *p;
+ if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_COUNT_PARAM, 0, &cc->attr_count, &size)) goto failed;
- for (i = 0; i < cc->attr_count; i++)
- {
- if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, NULL, &size))
- {
- CryptMsgClose(hmsg);
- HeapFree(GetProcessHeap(), 0, cc);
- return INVALID_HANDLE_VALUE;
- }
- sum += size;
- }
- if (!(cc->attr = HeapAlloc(GetProcessHeap(), 0, sizeof(*cc->attr) * cc->attr_count + sum)))
- {
- CryptMsgClose(hmsg);
- HeapFree(GetProcessHeap(), 0, cc);
- SetLastError(ERROR_OUTOFMEMORY);
- return INVALID_HANDLE_VALUE;
- }
- p = (BYTE *)(cc->attr + cc->attr_count);
- for (i = 0; i < cc->attr_count; i++)
- {
- if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, NULL, &size))
- {
- CryptMsgClose(hmsg);
- HeapFree(GetProcessHeap(), 0, cc->attr);
- HeapFree(GetProcessHeap(), 0, cc);
- return INVALID_HANDLE_VALUE;
- }
- if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, p, &size))
- {
- CryptMsgClose(hmsg);
- HeapFree(GetProcessHeap(), 0, cc->attr);
- HeapFree(GetProcessHeap(), 0, cc);
- return INVALID_HANDLE_VALUE;
- }
- p += size;
- }
- cc->inner = decode_inner_content(hmsg, dwEncodingType, &cc->inner_len);
- if (!cc->inner || !CryptSIPRetrieveSubjectGuid(filename, NULL, &cc->subject))
- {
- CryptMsgClose(hmsg);
- HeapFree(GetProcessHeap(), 0, cc->attr);
- HeapFree(GetProcessHeap(), 0, cc->inner);
- HeapFree(GetProcessHeap(), 0, cc);
- return INVALID_HANDLE_VALUE;
- }
- cc->magic = CRYPTCAT_MAGIC;
- return cc;
+ for (i = 0; i < cc->attr_count; i++)
+ {
+ if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, NULL, &size)) goto failed;
+ sum += size;
+ }
+ if (!(cc->attr = HeapAlloc(GetProcessHeap(), 0, sizeof(*cc->attr) * cc->attr_count + sum))) goto failed_alloc;
+ p = (BYTE *)(cc->attr + cc->attr_count);
+ for (i = 0; i < cc->attr_count; i++)
+ {
+ if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, NULL, &size)) goto failed;
+ if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_PARAM, i, p, &size)) goto failed;
+ p += size;
}
+ cc->inner = decode_inner_content(hmsg, dwEncodingType, &cc->inner_len);
+ if (!cc->inner || !CryptSIPRetrieveSubjectGuid(filename, NULL, &cc->subject)) goto failed;
+ cc->magic = CRYPTCAT_MAGIC;
+ HeapFree(GetProcessHeap(), 0, buffer);
+ CloseHandle(file);
+ return cc;
+
+failed_alloc:
+ SetLastError(ERROR_OUTOFMEMORY);
+failed:
+ if (cc) HeapFree(GetProcessHeap(), 0, cc->inner);
+ if (cc) HeapFree(GetProcessHeap(), 0, cc->attr);
HeapFree(GetProcessHeap(), 0, cc);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ CryptMsgClose(hmsg);
+ CloseHandle(file);
return INVALID_HANDLE_VALUE;
}
--
2.29.2
Dec. 16, 2020
[PATCH] wined3d: Do not create Vulkan 2D (array) views for UAVs on 3D resources.
by Henri Verbeet
We should simply create 3D views.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50123
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/view.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index f2c8ceab461..c3128c9ed4c 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -688,7 +688,7 @@ static VkBufferView wined3d_view_vk_create_buffer_view(struct wined3d_context_vk
static VkImageView wined3d_view_vk_create_texture_view(struct wined3d_context_vk *context_vk,
const struct wined3d_view_desc *desc, struct wined3d_texture_vk *texture_vk,
- const struct wined3d_format_vk *view_format_vk, struct color_fixup_desc fixup, bool srv)
+ const struct wined3d_format_vk *view_format_vk, struct color_fixup_desc fixup, bool rtv)
{
const struct wined3d_resource *resource = &texture_vk->t.resource;
const struct wined3d_vk_info *vk_info = context_vk->vk_info;
@@ -730,7 +730,7 @@ static VkImageView wined3d_view_vk_create_texture_view(struct wined3d_context_vk
create_info.flags = 0;
create_info.image = texture_vk->vk_image;
create_info.viewType = vk_image_view_type_from_wined3d(resource->type, desc->flags);
- if (!srv && create_info.viewType == VK_IMAGE_VIEW_TYPE_3D)
+ if (rtv && create_info.viewType == VK_IMAGE_VIEW_TYPE_3D)
{
if (desc->u.texture.layer_count > 1)
create_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
@@ -823,7 +823,7 @@ static void wined3d_render_target_view_vk_cs_init(void *object)
context = context_acquire(resource->device, NULL, 0);
view_vk->vk_image_view = wined3d_view_vk_create_texture_view(wined3d_context_vk(context),
- desc, texture_vk, format_vk, COLOR_FIXUP_IDENTITY, false);
+ desc, texture_vk, format_vk, COLOR_FIXUP_IDENTITY, true);
context_release(context);
if (!view_vk->vk_image_view)
@@ -1098,7 +1098,7 @@ static void wined3d_shader_resource_view_vk_cs_init(void *object)
context = context_acquire(resource->device, NULL, 0);
vk_image_view = wined3d_view_vk_create_texture_view(wined3d_context_vk(context),
- desc, texture_vk, wined3d_format_vk(format), format->color_fixup, true);
+ desc, texture_vk, wined3d_format_vk(format), format->color_fixup, false);
context_release(context);
if (!vk_image_view)
--
2.20.1
Dec. 16, 2020
Re: [PATCH 2/2] widl: open files to write in binary mode
by Steve Lhomme
On 2020-12-16 14:13, Henri Verbeet wrote:
> On Wed, 16 Dec 2020 at 12:44, Steve Lhomme <robux4(a)ycbcr.xyz> wrote:
>> When compiled with mingw64 the output files have Windows line endings instead
>> of UNIX ones.
>> ---
> Isn't that what you'd want when building for Windows?
On Windows that would be the mingw-w64 generator and it's expecting
files with only \n (otherwise it makes huge diffs).
I'm not sure if there are other cases where widl would be used to
produce Windows based headers.
Dec. 16, 2020
Re: [PATCH 2/2] widl: open files to write in binary mode
by Henri Verbeet
On Wed, 16 Dec 2020 at 12:44, Steve Lhomme <robux4(a)ycbcr.xyz> wrote:
> When compiled with mingw64 the output files have Windows line endings instead
> of UNIX ones.
> ---
Isn't that what you'd want when building for Windows?
Dec. 16, 2020
Re: [PATCH 4/5] msvcrt: Use __ASM_USE_THISCALL_WRAPPER in cxx.h.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
Dec. 16, 2020
Re: [PATCH 3/5] msvcrt: Use GCC-style assembly on Clang MSVC target.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
Dec. 16, 2020
[PATCH 2/5 v2] msvcrt: Prefix *rot* functions.
by Piotr Caban
From: Jacek Caban <jacek(a)codeweavers.com>
MSVC does not allow overriding those intrinsic functions.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/crtdll/crtdll.spec | 8 ++++----
dlls/msvcr100/msvcr100.spec | 12 ++++++------
dlls/msvcr110/msvcr110.spec | 12 ++++++------
dlls/msvcr120/msvcr120.spec | 12 ++++++------
dlls/msvcr70/msvcr70.spec | 8 ++++----
dlls/msvcr71/msvcr71.spec | 8 ++++----
dlls/msvcr80/msvcr80.spec | 12 ++++++------
dlls/msvcr90/msvcr90.spec | 12 ++++++------
dlls/msvcrt/math.c | 12 ++++++------
dlls/msvcrt/msvcrt.spec | 12 ++++++------
dlls/msvcrtd/msvcrtd.spec | 8 ++++----
dlls/ucrtbase/ucrtbase.spec | 12 ++++++------
12 files changed, 64 insertions(+), 64 deletions(-)
Dec. 16, 2020
[PATCH 1/5 v2] ucrtbase: Improve __intrinsic_abnormal_termination stub.
by Piotr Caban
From: Jacek Caban <jacek(a)codeweavers.com>
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
v2:
- fix spec files
dlls/crtdll/crtdll.spec | 2 +-
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr110/msvcr110.spec | 2 +-
dlls/msvcr120/msvcr120.spec | 2 +-
dlls/msvcr70/msvcr70.spec | 2 +-
dlls/msvcr71/msvcr71.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/except.c | 2 +-
dlls/msvcrt/msvcrt.spec | 2 +-
dlls/msvcrtd/msvcrtd.spec | 2 +-
dlls/ucrtbase/ucrtbase.spec | 2 +-
12 files changed, 12 insertions(+), 12 deletions(-)
Dec. 16, 2020
Re: [RFC] Announcing Wayland driver development
by Julian Rüger
> FWIW, I recommend looking at the commit history, how past big changes
> were introduced i.e. the Mac driver, maybe the DIB-Engine (although that
> was quite long ago and a lot has changed since)
The most recent example of a new driver:
https://source.winehq.org/git/wine.git/?a=search&h=HEAD&st=commit&s=wineusb
Dec. 16, 2020
Re: TestBot job 83503 results: [PATCH] ws2_32: Fix buffer size check in WSAIoctl() for SIO_GET_INTERFACE_LIST.
by Paul Gofman
On 12/16/20 12:10, Marvin wrote:
> ws2_32:
> sock.c:10534: Test failed: Got unexpected ret 0.
> sock.c:10535: Test failed: Got unexpected error 6.
> sock.c:10536: Test failed: Got unexpected size 76.
Can it be that Wine is not getting updated on Testbot? The tests results
are like the changes to test are applied but ws2_32.dll is unchanged.
Dec. 16, 2020
[PATCH 2/2] widl: open files to write in binary mode
by Steve Lhomme
When compiled with mingw64 the output files have Windows line endings instead
of UNIX ones.
---
tools/widl/header.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 43be8d74cbe..5457185538e 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -1893,7 +1893,7 @@ void write_header(const statement_list_t *stmts)
if (!do_header) return;
- if(!(header = fopen(header_name, "w"))) {
+ if(!(header = fopen(header_name, "wb"))) {
error("Could not open %s for output\n", header_name);
return;
}
--
2.29.2
Dec. 16, 2020
[PATCH 1/2] widl: don't use local methods when writing async interfaces
by Steve Lhomme
The same entries can have a different call_as between the synchronous and
asynchronous interfaces and shouldn't be mixed up.
---
tools/widl/header.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 223ab5c5ca9..43be8d74cbe 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -1535,7 +1535,7 @@ static void write_com_interface_start(FILE *header, const type_t *iface)
fprintf(header,"#define __%s_%sINTERFACE_DEFINED__\n\n", iface->c_name, dispinterface ? "DISP" : "");
}
-static void write_com_interface_end(FILE *header, type_t *iface)
+static void write_com_interface_end(FILE *header, type_t *iface, int as_async)
{
int dispinterface = is_attr(iface->attrs, ATTR_DISPINTERFACE);
const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
@@ -1614,7 +1614,8 @@ static void write_com_interface_end(FILE *header, type_t *iface)
if (!dispinterface && !winrt_mode)
{
write_method_proto(header, iface);
- write_locals(header, iface, FALSE);
+ if (!as_async)
+ write_locals(header, iface, FALSE);
fprintf(header, "\n");
}
fprintf(header, "#endif /* __%s_%sINTERFACE_DEFINED__ */\n", iface->c_name, dispinterface ? "DISP" : "");
@@ -1808,11 +1809,11 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
{
write_com_interface_start(header, iface);
write_header_stmts(header, type_iface_get_stmts(iface), stmt->u.type, TRUE);
- write_com_interface_end(header, iface);
+ write_com_interface_end(header, iface, FALSE);
if (async_iface)
{
write_com_interface_start(header, async_iface);
- write_com_interface_end(header, async_iface);
+ write_com_interface_end(header, async_iface, TRUE);
}
}
else
--
2.29.2
Dec. 16, 2020
[PATCH] ws2_32: Fix buffer size check in WSAIoctl() for SIO_GET_INTERFACE_LIST.
by Paul Gofman
Fixes out of bound memory access in Anno 1404 Addon.
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
This is not a (recent) regression, but this is out of bound memory acccess andd
the fix is trivial, so suggesting during the code freeze.
dlls/ws2_32/socket.c | 3 ++-
dlls/ws2_32/tests/sock.c | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 6cb35bcd135..05097ce53b8 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4618,10 +4618,11 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
if (ptr->IpAddressList.IpAddress.String[0] == '\0')
continue;
- if ((numInt + 1)*sizeof(INTERFACE_INFO)/sizeof(IP_ADAPTER_INFO) > out_size)
+ if ((numInt + 1) * sizeof(INTERFACE_INFO) > out_size)
{
WARN("Buffer too small = %u, out_size = %u\n", numInt + 1, out_size);
status = WSAEFAULT;
+ if (ret_size) *ret_size = 0;
break;
}
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 8711b65fcea..98cc3881853 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -10514,6 +10514,30 @@ static void test_WSCGetProviderPath(void)
ok(len == 256, "Got unexpected len %d.\n", len);
}
+static void test_wsaioctl(void)
+{
+ char buffer[4096];
+ DWORD size;
+ SOCKET s;
+ int ret;
+
+ s = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+ ok(s != INVALID_SOCKET, "failed to create socket, error %u\n", WSAGetLastError());
+
+ size = 0xdeadbeef;
+ ret = WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, buffer, sizeof(buffer), &size, NULL, NULL);
+ ok(!ret, "Got unexpected ret %d.\n", ret);
+ ok(size && size != 0xdeadbeef && !(size % sizeof(INTERFACE_INFO)), "Got unexpected size %u.\n", size);
+
+ size = 0xdeadbeef;
+ ret = WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, buffer, sizeof(INTERFACE_INFO), &size, NULL, NULL);
+ ok(ret == -1, "Got unexpected ret %d.\n", ret);
+ ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
+ ok(!size, "Got unexpected size %u.\n", size);
+
+ closesocket(s);
+}
+
START_TEST( sock )
{
int i;
@@ -10595,6 +10619,7 @@ START_TEST( sock )
/* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
test_send();
test_synchronous_WSAIoctl();
+ test_wsaioctl();
Exit();
}
--
2.29.2
Dec. 16, 2020
Re: [RFC] Announcing Wayland driver development
by Julian Rüger
Hi Alexandros,
first of all, congratulations and thanks for your work, this sounds very
cool!
Disclaimer:
I'm little more than a curious observer of the larger developments in
Wine, but I've been around for a while and have picked up a few things.
Still, you should probably take anything someone who actually
understands the code says over my ramblings ;)
> My first question to the Wine community is how complete the driver
> should be before being considered for inclusion. Is the current Wayland
> driver state enough?
The most important and probably trickiest order of business is to
convince Alexandre you're going the "Right Way" (tm), from an
architectural standpoint.
I can't really say if your current progress is enough to gauge that, but
I think it is.
> If there is interest, I was hoping to get the
> driver in earlier rather than later, in an experimental capacity, in
> order to provide a single, official point of development for people
> wanting to contribute.
You should talk to our tireless and competent staging developers,
Zebediah Figura and Alistair Leslie-Hughes about that.
> My second question is about the best way to move forward with
> upstreaming. The code is currently split between just a few commits,
> mostly as a result of the experimental nature of this effort, and also
> because I used existing code from winex11 and wineandroid as my starting
> point. I would like to split this into smaller commits to make it more
> review-friendly for the mailing list. I was thinking of splitting by
> user32 function (and internal dependencies), but since this is going to
> be an artificial split, I am open to other ideas to make reviewers'
> lives easier.
Again, I'm no expert, but from what I've seen, a good approach would be
to start with a stubbed skeleton driver and build it up from that, piece
by piece, in small logical steps.
The rules for commits are basically:
* leave wine in a consistent and working state after every commit!
* don't introduce dead code
* have meaningful commit messages
(* normally tests are very important, though I'm not sure how much that
applies in this case or how to go about failing tests under your driver)
Read the wiki for more info, notably
https://wiki.winehq.org/Submitting_Patches
and most of https://wiki.winehq.org/Wine_Developer%27s_Guide
though some stuff may be out of date.
FWIW, I recommend looking at the commit history, how past big changes
were introduced i.e. the Mac driver, maybe the DIB-Engine (although that
was quite long ago and a lot has changed since)
Better wait for advice from actual developers here ;)
> Looking forward to your feedback and questions!
I hope that helps a bit, and that when the experts ship in they don't
have to repeat the basics.
This is about all I know, sorry I can't really be more specific. Please
correct anything I got wrong!
Best,
Julian
Dec. 16, 2020
Re: [PATCH] -Add SORT_DIGITSASNUMBERS flag to CompareStringsEx (Fixes FL Studio 20.8 crash on startup)
by john zourlios
Signed-off-by: John Zourlios <john.kinigos(a)gmail.com>
Dec. 16, 2020
Re: [RFC] Announcing Wayland driver development
by Damjan Jovanovic
On Tue, Dec 15, 2020 at 7:16 PM Alexandros Frantzis <
alexandros.frantzis(a)collabora.com> wrote:
>
> What needs more work (or is completely missing):
>
> * Minimize
> * Better z-order and activation handling
> * Keyboard layout support
> * Grabs
> * GTK menu mouse handling bug (cannot click to select items)
> * Multiple displays
> * Vulkan. Note that that there is another effort at
> https://github.com/varmd/wine-wayland/ focusing solely on vulkan.
> My hope is that we will be able to share efforts going forward.
>
That's impressive.
What about:
Clipboard
Drag and drop
Cross-process window embedding / system tray
X11-based XDG standards, eg. startup notifications
Games that change screen resolution / color depth
Damjan
Dec. 16, 2020
[PATCH] po: Update Korean translation.
by Byeongsik Jeon
Signed-off-by: Byeongsik Jeon <bsjeon(a)hanmail.net>
---
po/ko.po | 536 ++++++++++++++++++++-----------------------------------
1 file changed, 189 insertions(+), 347 deletions(-)
diff --git a/po/ko.po b/po/ko.po
index 6beee8a7c15..a8b4f84d583 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: Wine\n"
"Report-Msgid-Bugs-To: https://bugs.winehq.org\n"
"POT-Creation-Date: N/A\n"
-"PO-Revision-Date: 2019-11-01 16:21+0900\n"
+"PO-Revision-Date: 2020-12-16 13:14+0900\n"
"Last-Translator: Byeongsik Jeon <bsjeon(a)hanmail.net>\n"
"Language-Team: Korean\n"
"Language: ko\n"
@@ -702,7 +702,7 @@ msgstr "사용자 정의 색상(&C):"
#: dlls/comdlg32/comdlg32.rc:289
msgid "|S&olid"
-msgstr ""
+msgstr "|단색(&O)"
#: dlls/comdlg32/comdlg32.rc:290
msgid "&Red:"
@@ -739,11 +739,9 @@ msgid "&Define Custom Colors >>"
msgstr "사용자 정의 색상 결정(&D) >>"
#: dlls/comdlg32/comdlg32.rc:312
-#, fuzzy
-#| msgid "&No"
msgctxt "Solid"
msgid "&o"
-msgstr "아니요(&N)"
+msgstr "&O"
#: dlls/comdlg32/comdlg32.rc:318 programs/regedit/regedit.rc:275
#: programs/regedit/regedit.rc:285
@@ -978,7 +976,7 @@ msgstr "파일이 없습니다"
#: dlls/comdlg32/comdlg32.rc:41
msgid "The selection contains a non-folder object"
-msgstr "선택 영역에 폴더가 아닌 객체가 들어 있습니다"
+msgstr "선택 영역에 폴더가 아닌 개체가 들어 있습니다"
#: dlls/comdlg32/comdlg32.rc:46
msgid "Up One Level"
@@ -2292,7 +2290,7 @@ msgstr "용도 추가"
#: dlls/cryptui/cryptui.rc:265
msgid ""
"Add the object identifier (OID) for the certificate purpose you wish to add:"
-msgstr "추가하고자 하는 인증서 용도의 객체 식별자(OID) 추가:"
+msgstr "추가하고자 하는 인증서 용도의 개체 식별자(OID) 추가:"
#: dlls/cryptui/cryptui.rc:273 dlls/cryptui/cryptui.rc:69
msgid "Select Certificate Store"
@@ -2726,7 +2724,7 @@ msgid ""
"The file contains objects that do not match the given criteria. Please "
"select another file."
msgstr ""
-"이 파일에 주어진 기준에 맞지 않는 객체가 있습니다. 다른 파일을 선택하십시오."
+"이 파일에 주어진 기준에 맞지 않는 개체가 있습니다. 다른 파일을 선택하십시오."
#: dlls/cryptui/cryptui.rc:73
msgid "File to Import"
@@ -3126,7 +3124,7 @@ msgstr "행동"
#: dlls/dinput/dinput.rc:29
msgid "Object"
-msgstr "객체"
+msgstr "개체"
#: dlls/dxdiagn/dxdiagn.rc:28
msgid "Regional Setting"
@@ -3723,11 +3721,11 @@ msgstr "게임 컨트롤러"
#: dlls/joy.cpl/joy.rc:32
msgid "Test and configure game controllers."
-msgstr ""
+msgstr "게임 컨트롤러를 테스트하고 구성합니다."
#: dlls/jscript/jscript.rc:28
msgid "Error converting object to primitive type"
-msgstr "객체를 기본 형식으로 변환하는 중에 오류 발생"
+msgstr "개체를 기본 형식으로 변환하는 중에 오류 발생"
#: dlls/jscript/jscript.rc:29 dlls/vbscript/vbscript.rc:29
msgid "Invalid procedure call or argument"
@@ -3738,26 +3736,24 @@ msgid "Subscript out of range"
msgstr "첨자가 범위를 벗어남"
#: dlls/jscript/jscript.rc:31
-#, fuzzy
-#| msgid "Out of paper; "
msgid "Out of stack space"
-msgstr "종이 초과; "
+msgstr "스택 공간이 부족함"
#: dlls/jscript/jscript.rc:32
msgid "Object required"
-msgstr "객체가 필요함"
+msgstr "개체가 필요함"
#: dlls/jscript/jscript.rc:33
msgid "Automation server can't create object"
-msgstr "자동화 서버가 객체를 만들 수 없음"
+msgstr "자동화 서버가 개체를 만들 수 없음"
#: dlls/jscript/jscript.rc:34 dlls/vbscript/vbscript.rc:49
msgid "Object doesn't support this property or method"
-msgstr "객체는 이 속성이나 메소드를 지원하지 않음"
+msgstr "개체는 이 속성이나 메소드를 지원하지 않음"
#: dlls/jscript/jscript.rc:35 dlls/vbscript/vbscript.rc:50
msgid "Object doesn't support this action"
-msgstr "객체는 이 행동을 지원하지 않음"
+msgstr "개체는 이 행동을 지원하지 않음"
#: dlls/jscript/jscript.rc:36
msgid "Argument not optional"
@@ -3809,11 +3805,11 @@ msgstr "루프 바깥에는 'continue'를 사용할 수 없음"
#: dlls/jscript/jscript.rc:48
msgid "Label redefined"
-msgstr "레이블이 중복정의됨"
+msgstr "레이블이 재정의되었습니다"
#: dlls/jscript/jscript.rc:49
msgid "Label not found"
-msgstr "레이블을 찾을 수 없음"
+msgstr "레이블을 찾을 수 없습니다"
#: dlls/jscript/jscript.rc:50
msgid "Expected '@end'"
@@ -3821,7 +3817,7 @@ msgstr "'@end'가 필요합니다"
#: dlls/jscript/jscript.rc:51
msgid "Conditional compilation is turned off"
-msgstr "조건부 컴파일이 해제되어 있음"
+msgstr "조건부 컴파일이 해제되었습니다"
#: dlls/jscript/jscript.rc:52
msgid "Expected '@'"
@@ -3829,17 +3825,15 @@ msgstr "'@'가 필요합니다"
#: dlls/jscript/jscript.rc:78
msgid "Microsoft JScript compilation error"
-msgstr ""
+msgstr "Microsoft JScript 컴파일 오류"
#: dlls/jscript/jscript.rc:79
msgid "Microsoft JScript runtime error"
-msgstr ""
+msgstr "Microsoft JScript 런타임 오류"
#: dlls/jscript/jscript.rc:80 dlls/vbscript/vbscript.rc:64
-#, fuzzy
-#| msgid "Unknown error"
msgid "Unknown runtime error"
-msgstr "알 수 없는 오류"
+msgstr "알 수 없는 런타임 오류"
#: dlls/jscript/jscript.rc:55
msgid "Number expected"
@@ -3851,11 +3845,11 @@ msgstr "함수가 필요합니다"
#: dlls/jscript/jscript.rc:54
msgid "'[object]' is not a date object"
-msgstr "'[object]'가 날짜 객체가 아닙니다"
+msgstr "'[object]'은(는) 날짜 개체가 아닙니다"
#: dlls/jscript/jscript.rc:56
msgid "Object expected"
-msgstr "객체가 필요합니다"
+msgstr "개체가 필요합니다"
#: dlls/jscript/jscript.rc:57
msgid "Illegal assignment"
@@ -3863,43 +3857,39 @@ msgstr "잘못된 할당"
#: dlls/jscript/jscript.rc:58
msgid "'|' is undefined"
-msgstr "'|'가 정의도지 않았습니다"
+msgstr "'|'이(가) 정의되지 않았습니다"
#: dlls/jscript/jscript.rc:59
msgid "Boolean object expected"
-msgstr "볼린 객제가 필요함"
+msgstr "Boolean 개체가 필요합니다"
#: dlls/jscript/jscript.rc:60
msgid "Cannot delete '|'"
-msgstr "'|'를 지울 수 없음"
+msgstr "'|'을(를) 삭제할 수 없습니다"
#: dlls/jscript/jscript.rc:61
msgid "VBArray object expected"
-msgstr "VBArray 갹체가 필요함"
+msgstr "VBArray 개체가 필요합니다"
#: dlls/jscript/jscript.rc:62
msgid "JScript object expected"
-msgstr "JScript 객체가 필요함"
+msgstr "JScript 개체가 필요합니다"
#: dlls/jscript/jscript.rc:63
-#, fuzzy
-#| msgid "Array object expected"
msgid "Enumerator object expected"
-msgstr "배열 객체가 필요합니다"
+msgstr "열거형 개체가 필요합니다"
#: dlls/jscript/jscript.rc:64
-#, fuzzy
-#| msgid "Boolean object expected"
msgid "Regular Expression object expected"
-msgstr "볼린 객제가 필요함"
+msgstr "정규식 개체가 필요합니다"
#: dlls/jscript/jscript.rc:65
msgid "Syntax error in regular expression"
-msgstr "정규 표현식에 문법오류가 있음"
+msgstr "정규식에 구문 오류가 있습니다"
#: dlls/jscript/jscript.rc:66
msgid "Exception thrown and not caught"
-msgstr ""
+msgstr "예외가 발생했지만 catch할 수 없습니다"
#: dlls/jscript/jscript.rc:68
msgid "URI to be encoded contains invalid characters"
@@ -3907,7 +3897,7 @@ msgstr "인코딩할 URI에 올바르지 않은 문자가 들어 있습니다"
#: dlls/jscript/jscript.rc:67
msgid "URI to be decoded is incorrect"
-msgstr "디코딩할 URI가 올바르지 않습니다"
+msgstr "디코딩할 URI가 잘못되었습니다"
#: dlls/jscript/jscript.rc:69
msgid "Number of fraction digits is out of range"
@@ -3919,11 +3909,11 @@ msgstr "정밀도가 범위를 벗어났습니다"
#: dlls/jscript/jscript.rc:71
msgid "Array length must be a finite positive integer"
-msgstr "배열 길이는 유한한 양의 정수이어야 합니다"
+msgstr "배열의 길이는 유한한 양의 정수이어야 합니다"
#: dlls/jscript/jscript.rc:72
msgid "Array object expected"
-msgstr "배열 객체가 필요합니다"
+msgstr "배열 개체가 필요합니다"
#: dlls/jscript/jscript.rc:73
msgid ""
@@ -3934,15 +3924,15 @@ msgstr ""
#: dlls/jscript/jscript.rc:74
msgid "Cannot redefine non-configurable property '|'"
-msgstr "구성되지 않은 요소 '|'를 재처리할 수 없습니다"
+msgstr "구성 가능하지 않은 속성 '|'을(를) 재정의할 수 없습니다"
#: dlls/jscript/jscript.rc:75
msgid "Cannot modify non-writable property '|'"
-msgstr "쓰기 가능하지 않은 요소 '|'를 편집할 수 없습니다"
+msgstr "쓰기 가능하지 않은 속성 '|'을(를) 수정할 수 없습니다"
#: dlls/jscript/jscript.rc:76
msgid "Property cannot have both accessors and a value"
-msgstr "속성은 접근자와 값을 모두 가질 수 없습니다"
+msgstr "속성에 접근자와 값을 둘 다 지정할 수는 없습니다"
#: include/wine/wine_common_ver.rc:129
msgid "Wine kernel DLL"
@@ -5975,7 +5965,7 @@ msgstr "목록상자에는 탭정지가 없음.\n"
#: dlls/kernel32/winerror.mc:2573
msgid "Can't destroy object owned by another thread.\n"
-msgstr "다른 스레드가 소유한 객체를 파괴할 수 없다.\n"
+msgstr "다른 스레드가 소유한 개체를 파괴할 수 없다.\n"
#: dlls/kernel32/winerror.mc:2578
msgid "Child window menus not allowed.\n"
@@ -6303,7 +6293,7 @@ msgstr "올바르지 않은 시간 초과 값.\n"
#: dlls/kernel32/winerror.mc:2983
msgid "Object UUID not found.\n"
-msgstr "UUID 객체를 찾을 수 없습니다.\n"
+msgstr "UUID 개체를 찾을 수 없습니다.\n"
#: dlls/kernel32/winerror.mc:2988
msgid "UUID already registered.\n"
@@ -6479,7 +6469,7 @@ msgstr "더 이상 회원은 없습니다.\n"
#: dlls/kernel32/winerror.mc:3208
msgid "Not all objects unexported.\n"
-msgstr "모든 객체가 내보내지지 못했습니다.\n"
+msgstr "모든 개체가 내보내지지 못했습니다.\n"
#: dlls/kernel32/winerror.mc:3213
msgid "Interface not found.\n"
@@ -6763,7 +6753,7 @@ msgstr "잘못된 스텁 버전.\n"
#: dlls/kernel32/winerror.mc:3563
msgid "Invalid pipe object.\n"
-msgstr "올바르지 않은 파이프 객체.\n"
+msgstr "올바르지 않은 파이프 개체.\n"
#: dlls/kernel32/winerror.mc:3568
msgid "Wrong pipe order.\n"
@@ -6783,7 +6773,7 @@ msgstr "엔드포인트 매퍼 DB를 만들 수 없습니다.\n"
#: dlls/kernel32/winerror.mc:3588
msgid "Invalid object.\n"
-msgstr "올바르지 않은 객체.\n"
+msgstr "올바르지 않은 개체.\n"
#: dlls/kernel32/winerror.mc:3593
msgid "Invalid time.\n"
@@ -6831,7 +6821,7 @@ msgstr "올바르지 않은 드라이버.\n"
#: dlls/kernel32/winerror.mc:3648
msgid "Invalid object resolver set.\n"
-msgstr "잘못된 객체 확인자 세트.\n"
+msgstr "잘못된 개체 확인자 세트.\n"
#: dlls/kernel32/winerror.mc:3653
msgid "Incomplete RPC send.\n"
@@ -6914,49 +6904,41 @@ msgid "Connection reset by peer.\n"
msgstr "피어가 연결을 초기화 했습니다.\n"
#: dlls/kernel32/winerror.mc:3767
-#, fuzzy
-#| msgid "Not implemented"
msgid "Not implemented.\n"
-msgstr "구현되지 않음"
+msgstr "구현되지 않았습니다.\n"
#: dlls/kernel32/winerror.mc:3788
-#, fuzzy
-#| msgid "RPC call failed.\n"
msgid "Call failed.\n"
-msgstr "RPC 호출 실패.\n"
+msgstr "호출이 실패했습니다.\n"
#: dlls/kernel32/winerror.mc:3760
msgid "No Signature found in file.\n"
-msgstr "서명 또는 인증서를 찾을 수 없습니다.\n"
+msgstr "파일에서 서명을 찾을 수 없습니다.\n"
#: dlls/kernel32/winerror.mc:3774
-#, fuzzy
-#| msgid "Invalid level.\n"
msgid "Invalid call.\n"
-msgstr "올바르지 않은 레벨.\n"
+msgstr "올바르지 않은 호출입니다.\n"
#: dlls/kernel32/winerror.mc:3781
-#, fuzzy
-#| msgid "Value is not available.\n"
msgid "Resource is not currently available.\n"
-msgstr "값을 사용할 수 없습니다.\n"
+msgstr "지금은 리소스를 사용할 수 없습니다.\n"
#: dlls/localspl/localspl.rc:31 dlls/localui/localui.rc:31
#: dlls/winspool.drv/winspool.rc:30
msgid "Local Port"
-msgstr "지역 포트"
+msgstr "로컬 포트"
#: dlls/localspl/localspl.rc:32
msgid "Local Monitor"
-msgstr "지역 모니터"
+msgstr "로컬 모니터"
#: dlls/localui/localui.rc:39
msgid "Add a Local Port"
-msgstr "지역 포트 더하기"
+msgstr "로컬 포트 추가"
#: dlls/localui/localui.rc:42
msgid "&Enter the port name to add:"
-msgstr "더할 포트 이름 입력(&E):"
+msgstr "추가할 포트 이름 입력(&E):"
#: dlls/localui/localui.rc:51
msgid "Configure LPT Port"
@@ -6964,11 +6946,11 @@ msgstr "LPT 포트 설정"
#: dlls/localui/localui.rc:54
msgid "Timeout (seconds)"
-msgstr "시간초과(초)"
+msgstr "시간 제한(초)"
#: dlls/localui/localui.rc:55
msgid "&Transmission Retry:"
-msgstr "재 전송 횟수(&T):"
+msgstr "전송 재시도(&T):"
#: dlls/localui/localui.rc:32
msgid "'%s' is not a valid port name"
@@ -6999,10 +6981,8 @@ msgid "Sink has not been finalized.\n"
msgstr "싱크가 완료되지 않았습니다.\n"
#: dlls/mferror/mferror.mc:732
-#, fuzzy
-#| msgid "Sink was already stopped.\n"
msgid "Clock was stopped\n"
-msgstr "싱크가 이미 중지되었습니다.\n"
+msgstr "시계가 중지되었습니다.\n"
#: dlls/mferror/mferror.mc:32
msgid "Media Foundation platform is not initialized.\n"
@@ -7030,7 +7010,7 @@ msgstr "더 이상 입력이 허용되지 않습니다.\n"
#: dlls/mferror/mferror.mc:74
msgid "Object is not initialized.\n"
-msgstr "객체가 초기화되지 않았습니다.\n"
+msgstr "개체가 초기화되지 않았습니다.\n"
#: dlls/mferror/mferror.mc:81
msgid "Representation is not supported.\n"
@@ -7110,7 +7090,7 @@ msgstr "비율(rate) 변경이 선점되었습니다.\n"
#: dlls/mferror/mferror.mc:228
msgid "Object or value wasn't found.\n"
-msgstr "객체 또는 값을 찾을 수 없습니다.\n"
+msgstr "개체 또는 값을 찾을 수 없습니다.\n"
#: dlls/mferror/mferror.mc:235
msgid "Value is not available.\n"
@@ -7381,10 +7361,8 @@ msgid "Clock state was already set.\n"
msgstr "시계 상태가 이미 설정되었습니다.\n"
#: dlls/mferror/mferror.mc:725
-#, fuzzy
-#| msgid "Clock is not available.\n"
msgid "Clock is not simple\n"
-msgstr "시계를 사용할 수 없습니다.\n"
+msgstr "시계가 단순하지 않습니다.\n"
#: dlls/mpr/mpr.rc:35 dlls/wininet/wininet.rc:48
msgid "Enter Network Password"
@@ -8043,7 +8021,7 @@ msgstr "Wine 비디오 1 비디오 코덱"
#: dlls/oleacc/oleacc.rc:31
msgid "unknown object"
-msgstr "알 수 없는 객체"
+msgstr "알 수 없는 개체"
#: dlls/oleacc/oleacc.rc:32
msgid "title bar"
@@ -8478,214 +8456,168 @@ msgid "Off"
msgstr "비작동"
#: dlls/oledb32/version.rc:56
-#, fuzzy
-#| msgid "video"
msgid "Provider"
-msgstr "비디오"
+msgstr "공급자"
#: dlls/oledb32/version.rc:59
-#, fuzzy
-#| msgid "Select the format you want to use:"
msgid "Select the data you want to connect to:"
-msgstr "사용할 파일 형식 선택:"
+msgstr "연결할 데이터 선택:"
#: dlls/oledb32/version.rc:66
-#, fuzzy
-#| msgid "Connections"
msgid "Connection"
msgstr "연결"
#: dlls/oledb32/version.rc:69
-#, fuzzy
-#| msgid "Select the format you want to use:"
msgid "Specify the following to connect to ODBC data:"
-msgstr "사용할 파일 형식 선택:"
+msgstr "ODBC 데이터에 연결하려면 다음을 지정합니다:"
#: dlls/oledb32/version.rc:70
msgid "1. Specify the source of data:"
-msgstr ""
+msgstr "1. 데이터 원본을 지정합니다:"
#: dlls/oledb32/version.rc:71
-#, fuzzy
-#| msgid "Please enter your name"
msgid "Use &data source name"
-msgstr "이름을 입력해 주세요"
+msgstr "데이터 원본 이름 사용(&D)"
#: dlls/oledb32/version.rc:74
-#, fuzzy
-#| msgid "Reset Connections"
msgid "Use c&onnection string"
-msgstr "연결 재설정"
+msgstr "연결 문자열 사용(&O)"
#: dlls/oledb32/version.rc:75
-#, fuzzy
-#| msgid "Connections"
msgid "&Connection string:"
-msgstr "연결"
+msgstr "연결 문자열(&C):"
#: dlls/oledb32/version.rc:77
-#, fuzzy
-#| msgid "A&dd..."
msgid "B&uild..."
-msgstr "추가(&D)..."
+msgstr "빌드(&U)..."
#: dlls/oledb32/version.rc:78
msgid "2. Enter information to log on to the server"
-msgstr ""
+msgstr "2. 서버에 로그온할 정보를 입력합니다"
#: dlls/oledb32/version.rc:79
-#, fuzzy
-#| msgid "&User name:"
msgid "User &name:"
-msgstr "사용자 이름(&U):"
+msgstr "사용자 이름(&N):"
#: dlls/oledb32/version.rc:83
-#, fuzzy
-#| msgid "&Blank page"
msgid "&Blank password"
-msgstr "빈 페이지(&B)"
+msgstr "빈 암호(&B)"
#: dlls/oledb32/version.rc:84
-#, fuzzy
-#| msgid "Wrong password.\n"
msgid "Allow &saving password"
-msgstr "잘못된 암호.\n"
+msgstr "암호 저장 허용(&S)"
#: dlls/oledb32/version.rc:85
msgid "3. Enter the &initial catalog to use:"
-msgstr ""
+msgstr "3. 사용할 초기 카탈로그를 입력합니다(&I):"
#: dlls/oledb32/version.rc:87
-#, fuzzy
-#| msgid "Reset Connections"
msgid "&Test Connection"
-msgstr "연결 재설정"
+msgstr "테스트 연결(&T)"
#: dlls/oledb32/version.rc:92
msgid "Advanced"
-msgstr "중급자"
+msgstr "고급"
#: dlls/oledb32/version.rc:95
-#, fuzzy
-#| msgid "Network share"
msgid "Network settings"
-msgstr "네트워크 공유"
+msgstr "네트워크 설정"
#: dlls/oledb32/version.rc:96
-#, fuzzy
-#| msgid "Bad impersonation level.\n"
msgid "&Impersonation level:"
-msgstr "나쁜 가장 수준.\n"
+msgstr "개인화 수준(&I):"
#: dlls/oledb32/version.rc:98
msgid "P&rotection level:"
-msgstr ""
+msgstr "보호 수준(&R):"
#: dlls/oledb32/version.rc:101
-#, fuzzy
-#| msgid "Connected"
msgid "Connect:"
-msgstr "연결됨"
+msgstr "연결:"
#: dlls/oledb32/version.rc:103
-#, fuzzy
-#| msgid "seconds"
msgid "seconds."
-msgstr "초"
+msgstr "초."
#: dlls/oledb32/version.rc:104
-#, fuzzy
-#| msgid "Success"
msgid "A&ccess:"
-msgstr "성공"
+msgstr "접근(&C):"
#: dlls/oledb32/version.rc:110
-#, fuzzy
-#| msgid "&All"
msgid "All"
-msgstr "모두(&A)"
+msgstr "모두"
#: dlls/oledb32/version.rc:114
msgid ""
"These are the initialization properties for this type of data. To edit a "
"value, select a property, then choose Edit Value below."
msgstr ""
+"이러한 유형의 데이터에 대한 초기화 속성입니다. 값을 편집하려면 속성을 선택한 "
+"다음 아래의 값 편집을 선택합니다."
#: dlls/oledb32/version.rc:115
-#, fuzzy
-#| msgid "&Edit..."
msgid "&Edit Value..."
-msgstr "편집(&E)..."
+msgstr "값 편집(&E)..."
#: dlls/oledb32/version.rc:49
-#, fuzzy
-#| msgid "Properties"
msgid "Data Link Error"
-msgstr "속성"
+msgstr "데이터 링크 오류"
#: dlls/oledb32/version.rc:50
-#, fuzzy
-#| msgid "Please select a file."
msgid "Please select a provider."
-msgstr "파일을 선택하십시오."
+msgstr "공급자를 선택하십시오."
#: dlls/oledb32/version.rc:51
msgid ""
"Provider is no longer available. Ensure that the provider is installed "
"properly."
msgstr ""
+"공급자를 더 이상 사용할 수 없습니다. 공급자가 올바르게 설치되었는지 확인하십"
+"시오."
#: dlls/oledb32/version.rc:36
-#, fuzzy
-#| msgid "Properties"
msgid "Data Link Properties"
-msgstr "속성"
+msgstr "데이터 링크 속성"
#: dlls/oledb32/version.rc:37
msgid "OLE DB Provider(s)"
-msgstr ""
+msgstr "OLE DB 제공자"
#: dlls/oledb32/version.rc:41
-#, fuzzy
-#| msgid "Ready"
msgid "Read"
-msgstr "준비"
+msgstr "읽기"
#: dlls/oledb32/version.rc:42
-#, fuzzy
-#| msgid "Readme:"
msgid "ReadWrite"
-msgstr "주의사항:"
+msgstr "읽기 쓰기"
#: dlls/oledb32/version.rc:43
msgid "Share Deny None"
-msgstr ""
+msgstr "거부 없음을 공유"
#: dlls/oledb32/version.rc:44
msgid "Share Deny Read"
-msgstr ""
+msgstr "읽기 거부를 공유"
#: dlls/oledb32/version.rc:45
msgid "Share Deny Write"
-msgstr ""
+msgstr "쓰기 거부를 공유"
#: dlls/oledb32/version.rc:46
msgid "Share Exclusive"
-msgstr ""
+msgstr "독점적 공유"
#: dlls/oledb32/version.rc:47
-#, fuzzy
-#| msgid "I/O Writes"
msgid "Write"
-msgstr "I/O 쓰기"
+msgstr "쓰기"
#: dlls/oledlg/oledlg.rc:55
msgid "Insert Object"
-msgstr "객체 삽입"
+msgstr "개체 삽입"
#: dlls/oledlg/oledlg.rc:61
msgid "Object Type:"
-msgstr "객체 타입:"
+msgstr "개체 타입:"
#: dlls/oledlg/oledlg.rc:64 dlls/oledlg/oledlg.rc:102
msgid "Result"
@@ -8753,14 +8685,14 @@ msgstr "아이콘 바꾸기(&I)..."
#: dlls/oledlg/oledlg.rc:28
msgid "Insert a new %s object into your document"
-msgstr "새 %s 객체를 문서에 삽입"
+msgstr "새 %s 개체를 문서에 삽입"
#: dlls/oledlg/oledlg.rc:29
msgid ""
"Insert the contents of the file as an object into your document so that you "
"may activate it using the program which created it."
msgstr ""
-"파일 내용을 문서에 객체로 삽입합니다. 파일을 만든 프로그램을 사용하여 활성화"
+"파일 내용을 문서에 개체로 삽입합니다. 파일을 만든 프로그램을 사용하여 활성화"
"합니다."
#: dlls/oledlg/oledlg.rc:30 dlls/shell32/shell32.rc:197
@@ -8784,15 +8716,15 @@ msgstr "변환(&C)..."
#: dlls/oledlg/oledlg.rc:36
msgid "%1 %2 &Object"
-msgstr "%1 %2 객체(&O)"
+msgstr "%1 %2 개체(&O)"
#: dlls/oledlg/oledlg.rc:34
msgid "%1 &Object"
-msgstr "%1 객체(&O)"
+msgstr "%1 개체(&O)"
#: dlls/oledlg/oledlg.rc:33 programs/oleview/oleview.rc:40
msgid "&Object"
-msgstr "객체(&O)"
+msgstr "개체(&O)"
#: dlls/oledlg/oledlg.rc:41
msgid "Inserts the contents of the clipboard into your document as %s."
@@ -8854,7 +8786,7 @@ msgstr "알 수 없는 원본"
#: dlls/oledlg/oledlg.rc:50
msgid "the program which created it"
-msgstr "객체를 만든 프로그램"
+msgstr "개체를 만든 프로그램"
#: dlls/sane.ds/sane.rc:41
msgid "Scanning"
@@ -9228,7 +9160,7 @@ msgstr "Wine 인터넷 익스폴로어"
#: dlls/shdoclc/shdoclc.rc:33
msgid "&w&bPage &p"
-msgstr "&w&b페이지 &p"
+msgstr "&w&b&p쪽"
#: dlls/shell32/shell32.rc:30 dlls/shell32/shell32.rc:45
#: dlls/shell32/shell32.rc:122 dlls/shell32/shell32.rc:162
@@ -9906,16 +9838,12 @@ msgid "Cape Verde Daylight Time"
msgstr "카보베르데 일광 절약 시간"
#: dlls/tzres/tzres.rc:126
-#, fuzzy
-#| msgid "Hawaiian Standard Time"
msgid "Haiti Standard Time"
-msgstr "하와이 표준 시간"
+msgstr "아이티 표준 시간"
#: dlls/tzres/tzres.rc:127
-#, fuzzy
-#| msgid "Hawaiian Daylight Time"
msgid "Haiti Daylight Time"
-msgstr "하와이 일광 절약 시간"
+msgstr "아이티 일광 절약 시간"
#: dlls/tzres/tzres.rc:80
msgid "Central European Standard Time"
@@ -9950,16 +9878,12 @@ msgid "Iran Daylight Time"
msgstr "이란 일광 절약 시간"
#: dlls/tzres/tzres.rc:204
-#, fuzzy
-#| msgid "Hawaiian Standard Time"
msgid "Saint Pierre Standard Time"
-msgstr "하와이 표준 시간"
+msgstr "생피에르 표준 시간"
#: dlls/tzres/tzres.rc:205
-#, fuzzy
-#| msgid "Hawaiian Daylight Time"
msgid "Saint Pierre Daylight Time"
-msgstr "하와이 일광 절약 시간"
+msgstr "생피에르 일광 절약 시간"
#: dlls/tzres/tzres.rc:170
msgid "Namibia Standard Time"
@@ -10002,16 +9926,12 @@ msgid "Central Asia Daylight Time"
msgstr "중앙 아시아 일광 절약 시간"
#: dlls/tzres/tzres.rc:146
-#, fuzzy
-#| msgid "Korea Standard Time"
msgid "Lord Howe Standard Time"
-msgstr "대한민국 표준 시간"
+msgstr "로드하우 표준 시간"
#: dlls/tzres/tzres.rc:147
-#, fuzzy
-#| msgid "Korea Daylight Time"
msgid "Lord Howe Daylight Time"
-msgstr "대한민국 일광 절약 시간"
+msgstr "로드하우 일광 절약 시간"
#: dlls/tzres/tzres.rc:40
msgid "Arabic Standard Time"
@@ -10062,16 +9982,12 @@ msgid "Azerbaijan Daylight Time"
msgstr "아제르바이잔 일광 절약 시간"
#: dlls/tzres/tzres.rc:150
-#, fuzzy
-#| msgid "Magadan Standard Time"
msgid "Magallanes Standard Time"
-msgstr "마가단 표준 시간"
+msgstr "마갈란스 표준 시간"
#: dlls/tzres/tzres.rc:151
-#, fuzzy
-#| msgid "Magadan Daylight Time"
msgid "Magallanes Daylight Time"
-msgstr "마가단 일광 절약 시간"
+msgstr "마갈란스 일광 절약 시간"
#: dlls/tzres/tzres.rc:206
msgid "Samoa Standard Time"
@@ -10122,16 +10038,12 @@ msgid "Line Islands Daylight Time"
msgstr "라인 제도 일광 절약 시간"
#: dlls/tzres/tzres.rc:92
-#, fuzzy
-#| msgid "China Standard Time"
msgid "Cuba Standard Time"
-msgstr "중국 표준 시간"
+msgstr "쿠바 표준 시간"
#: dlls/tzres/tzres.rc:93
-#, fuzzy
-#| msgid "China Daylight Time"
msgid "Cuba Daylight Time"
-msgstr "중국 일광 절약 시간"
+msgstr "쿠바 일광 절약 시간"
#: dlls/tzres/tzres.rc:136
msgid "Jordan Standard Time"
@@ -10174,16 +10086,12 @@ msgid "Argentina Daylight Time"
msgstr "아르헨티나 일광 절약 시간"
#: dlls/tzres/tzres.rc:152
-#, fuzzy
-#| msgid "Mauritius Standard Time"
msgid "Marquesas Standard Time"
-msgstr "모리셔스 표준 시간"
+msgstr "마키저스 표준 시간"
#: dlls/tzres/tzres.rc:153
-#, fuzzy
-#| msgid "Mauritius Daylight Time"
msgid "Marquesas Daylight Time"
-msgstr "모리셔스 일광 절약 시간"
+msgstr "마키저스 일광 절약 시간"
#: dlls/tzres/tzres.rc:166
msgid "Myanmar Standard Time"
@@ -10334,16 +10242,12 @@ msgid "US Eastern Daylight Time"
msgstr "미국 동부 일광 절약 시간"
#: dlls/tzres/tzres.rc:182
-#, fuzzy
-#| msgid "Korea Standard Time"
msgid "North Korea Standard Time"
-msgstr "대한민국 표준 시간"
+msgstr "북한 표준 시간"
#: dlls/tzres/tzres.rc:183
-#, fuzzy
-#| msgid "Korea Daylight Time"
msgid "North Korea Daylight Time"
-msgstr "대한민국 일광 절약 시간"
+msgstr "북한 일광 절약 시간"
#: dlls/tzres/tzres.rc:220
msgid "Tasmania Standard Time"
@@ -10434,16 +10338,12 @@ msgid "Arabian Daylight Time"
msgstr "아라비아 일광 절약 시간"
#: dlls/tzres/tzres.rc:222
-#, fuzzy
-#| msgid "Mountain Standard Time"
msgid "Tocantins Standard Time"
-msgstr "산지 표준 시간"
+msgstr "토칸칭스 표준 시간"
#: dlls/tzres/tzres.rc:223
-#, fuzzy
-#| msgid "Mountain Daylight Time"
msgid "Tocantins Daylight Time"
-msgstr "산지 일광 절약 시간"
+msgstr "토칸칭스 일광 절약 시간"
#: dlls/tzres/tzres.rc:196
msgid "Russian Standard Time"
@@ -10454,14 +10354,10 @@ msgid "Russian Daylight Time"
msgstr "러시아 일광 절약 시간"
#: dlls/tzres/tzres.rc:48
-#, fuzzy
-#| msgid "AUS Central Standard Time"
msgid "Aus Central W. Standard Time"
msgstr "오스트레일리아 중부 표준 시간"
#: dlls/tzres/tzres.rc:49
-#, fuzzy
-#| msgid "AUS Central Daylight Time"
msgid "Aus Central W. Daylight Time"
msgstr "오스트레일리아 중부 일광 절약 시간"
@@ -10594,16 +10490,12 @@ msgid "Venezuela Daylight Time"
msgstr "베네수엘라 일광 절약 시간"
#: dlls/tzres/tzres.rc:62
-#, fuzzy
-#| msgid "Mountain Standard Time"
msgid "Bougainville Standard Time"
-msgstr "산지 표준 시간"
+msgstr "부건빌 표준 시간"
#: dlls/tzres/tzres.rc:63
-#, fuzzy
-#| msgid "Mountain Daylight Time"
msgid "Bougainville Daylight Time"
-msgstr "산지 일광 절약 시간"
+msgstr "부건빌 일광 절약 시간"
#: dlls/tzres/tzres.rc:128
msgid "Hawaiian Standard Time"
@@ -10630,16 +10522,12 @@ msgid "New Zealand Daylight Time"
msgstr "뉴질랜드 일광 절약 시간"
#: dlls/tzres/tzres.rc:34
-#, fuzzy
-#| msgid "Argentina Standard Time"
msgid "Aleutian Standard Time"
-msgstr "아르헨티나 표준 시간"
+msgstr "알류샨 표준 시간"
#: dlls/tzres/tzres.rc:35
-#, fuzzy
-#| msgid "Argentina Daylight Time"
msgid "Aleutian Daylight Time"
-msgstr "아르헨티나 일광 절약 시간"
+msgstr "알류샨 일광 절약 시간"
#: dlls/tzres/tzres.rc:76
msgid "Central Brazilian Standard Time"
@@ -10690,16 +10578,12 @@ msgid "Egypt Daylight Time"
msgstr "이집트 일광 절약 시간"
#: dlls/tzres/tzres.rc:106
-#, fuzzy
-#| msgid "Central Standard Time (Mexico)"
msgid "Eastern Standard Time (Mexico)"
-msgstr "중부 표준 시간 (멕시코)"
+msgstr "동부 표준 시간 (멕시코)"
#: dlls/tzres/tzres.rc:107
-#, fuzzy
-#| msgid "Central Daylight Time (Mexico)"
msgid "Eastern Daylight Time (Mexico)"
-msgstr "중부 일광 절약 시간 (멕시코)"
+msgstr "동부 일광 절약 시간 (멕시코)"
#: dlls/tzres/tzres.rc:154
msgid "Mauritius Standard Time"
@@ -10734,16 +10618,12 @@ msgid "Korea Daylight Time"
msgstr "대한민국 일광 절약 시간"
#: dlls/tzres/tzres.rc:88
-#, fuzzy
-#| msgid "Easter Island Standard Time"
msgid "Chatham Islands Standard Time"
-msgstr "이스터 섬 표준 시간"
+msgstr "채텀 섬 표준 시간"
#: dlls/tzres/tzres.rc:89
-#, fuzzy
-#| msgid "Easter Island Daylight Time"
msgid "Chatham Islands Daylight Time"
-msgstr "이스터 섬 일광 절약 시간"
+msgstr "채텀 섬 일광 절약 시간"
#: dlls/tzres/tzres.rc:96
msgid "E. Africa Standard Time"
@@ -10908,149 +10788,115 @@ msgstr "더 많은 창(&M)..."
#: dlls/vbscript/vbscript.rc:30
msgid "Overflow"
-msgstr ""
+msgstr "오버플로"
#: dlls/vbscript/vbscript.rc:31
-#, fuzzy
-#| msgid "Out of memory."
msgid "Out of memory"
-msgstr "메모리 부족."
+msgstr "메모리 부족"
#: dlls/vbscript/vbscript.rc:33
msgid "This array is fixed or temporarily locked"
-msgstr ""
+msgstr "이 배열은 고정되었거나 일시적으로 잠금 상태입니다"
#: dlls/vbscript/vbscript.rc:34
-#, fuzzy
-#| msgid "Data type mismatch.\n"
msgid "Type mismatch"
-msgstr "데이터 형식이 맞지 않습니다.\n"
+msgstr "형식 불일치"
#: dlls/vbscript/vbscript.rc:36
-#, fuzzy
-#| msgid "I/O device error.\n"
msgid "Device I/O error"
-msgstr "I/O 장치 오류.\n"
+msgstr "장치 I/O 오류"
#: dlls/vbscript/vbscript.rc:37
-#, fuzzy
-#| msgid "File already exists.\n"
msgid "File already exists"
-msgstr "파일이 이미 존재합니다.\n"
+msgstr "파일이 이미 있습니다"
#: dlls/vbscript/vbscript.rc:38
-#, fuzzy
-#| msgid "Disk full.\n"
msgid "Disk full"
-msgstr "디스크가 차 있습니다.\n"
+msgstr "디스크가 가득 찼습니다"
#: dlls/vbscript/vbscript.rc:39
-#, fuzzy
-#| msgid "Too many open files.\n"
msgid "Too many files"
-msgstr "너무 많은 파일 오픈.\n"
+msgstr "파일이 너무 많습니다"
#: dlls/vbscript/vbscript.rc:40
-#, fuzzy
-#| msgid "Access denied.\n"
msgid "Permission denied"
-msgstr "접근 거부.\n"
+msgstr "허가가 거부되었습니다"
#: dlls/vbscript/vbscript.rc:41
msgid "Path/File access error"
-msgstr ""
+msgstr "경로/파일 접근 오류"
#: dlls/vbscript/vbscript.rc:42
-#, fuzzy
-#| msgid "Path not found.\n"
msgid "Path not found"
-msgstr "경로를 찾을 수 없습니다.\n"
+msgstr "경로를 찾을 수 없습니다"
#: dlls/vbscript/vbscript.rc:43
-#, fuzzy
-#| msgid "(value not set)"
msgid "Object variable not set"
-msgstr "(값이 설정되지 않음)"
+msgstr "개체 변수가 설정되어 있지 않습니다"
#: dlls/vbscript/vbscript.rc:44
-#, fuzzy
-#| msgid "Invalid user buffer.\n"
msgid "Invalid use of Null"
-msgstr "올바르지 않은 사용자 버퍼.\n"
+msgstr "올바르지 않은 널 사용"
#: dlls/vbscript/vbscript.rc:45
msgid "Can't create necessary temporary file"
-msgstr ""
+msgstr "필요한 임시 파일을 만들 수 없습니다"
#: dlls/vbscript/vbscript.rc:46
-#, fuzzy
-#| msgid "Automation server can't create object"
msgid "ActiveX component can't create object"
-msgstr "자동화 서버가 객체를 만들 수 없음"
+msgstr "ActiveX 구성 요소는 개체를 만들 수 없습니다"
#: dlls/vbscript/vbscript.rc:47
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Class doesn't support Automation"
-msgstr "객체는 이 행동을 지원하지 않음"
+msgstr "클래스는 자동화를 지원하지 않습니다"
#: dlls/vbscript/vbscript.rc:48
msgid "File name or class name not found during Automation operation"
-msgstr ""
+msgstr "자동화 작업 중에 파일 이름 또는 클래스 이름을 찾을 수 없습니다"
#: dlls/vbscript/vbscript.rc:51
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Object doesn't support named arguments"
-msgstr "객체는 이 행동을 지원하지 않음"
+msgstr "개체는 명명된 인수를 지원하지 않습니다"
#: dlls/vbscript/vbscript.rc:52
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Object doesn't support current locale setting"
-msgstr "객체는 이 행동을 지원하지 않음"
+msgstr "개체는 현재 로캘 설정을 지원하지 않습니다"
#: dlls/vbscript/vbscript.rc:53 dlls/vbscript/vbscript.rc:54
-#, fuzzy
-#| msgid "Element not found.\n"
msgid "Named argument not found"
-msgstr "요소를 찾을 수 없습니다.\n"
+msgstr "명명된 인수를 찾을 수 없습니다"
#: dlls/vbscript/vbscript.rc:55
msgid "Wrong number of arguments or invalid property assignment"
-msgstr ""
+msgstr "인수의 개수나 속성 할당이 잘못되었습니다"
#: dlls/vbscript/vbscript.rc:56
-#, fuzzy
-#| msgid "Object Class Violation"
msgid "Object not a collection"
-msgstr "객체 클래스 위반"
+msgstr "컬렉션이 아닌 개체입니다"
#: dlls/vbscript/vbscript.rc:57
-#, fuzzy
-#| msgid "Specified control was not found in message"
msgid "Specified DLL function not found"
-msgstr "지정한 제어는 메시지에서 발견할 수 없습니다"
+msgstr "지정한 DLL 함수를 찾을 수 없습니다"
#: dlls/vbscript/vbscript.rc:58
msgid "Variable uses an Automation type not supported in VBScript"
-msgstr ""
+msgstr "변수에 VBScript에서 지원하지 않는 자동화 형식이 사용되었습니다"
#: dlls/vbscript/vbscript.rc:59
msgid "The remote server machine does not exist or is unavailable"
-msgstr ""
+msgstr "원격 서버가 없거나 사용할 수 없습니다"
#: dlls/vbscript/vbscript.rc:60
msgid "Invalid or unqualified reference"
-msgstr ""
+msgstr "올바르지 않거나 비정규화된 참조"
#: dlls/vbscript/vbscript.rc:62
msgid "Microsoft VBScript compilation error"
-msgstr ""
+msgstr "Microsoft VBScript 컴파일 오류"
#: dlls/vbscript/vbscript.rc:63
msgid "Microsoft VBScript runtime error"
-msgstr ""
+msgstr "Microsoft VBScript 런타임 오류"
#: dlls/winemac.drv/winemac.rc:33
msgid "Hide %@"
@@ -11147,33 +10993,27 @@ msgstr "인증서에 최소한 하나의 알 수 없는 보안 문제가 있습
#: dlls/wininet/wininet.rc:35
msgid "Effective Date"
-msgstr ""
+msgstr "개시 날짜"
#: dlls/wininet/wininet.rc:37
-#, fuzzy
-#| msgid "Security"
msgid "Security Protocol"
-msgstr "보안"
+msgstr "보안 프로토콜"
#: dlls/wininet/wininet.rc:38
-#, fuzzy
-#| msgid "Signature"
msgid "Signature Type"
-msgstr "서명"
+msgstr "서명 유형"
#: dlls/wininet/wininet.rc:39
-#, fuzzy
-#| msgid "Encrypting File System"
msgid "Encryption Type"
-msgstr "파일 시스템 암호화"
+msgstr "암호화 유형"
#: dlls/wininet/wininet.rc:40
msgid "Privacy Strength"
-msgstr ""
+msgstr "보안 수준"
#: dlls/wininet/wininet.rc:43
msgid "bits"
-msgstr ""
+msgstr "bits"
#: dlls/wininet/winineterror.mc:26
msgid "The request has timed out.\n"
@@ -11918,7 +11758,7 @@ msgstr "잘못된 문법"
#: dlls/wldap32/wldap32.rc:64
msgid "No Such Object"
-msgstr "어떤 객체도 없음"
+msgstr "어떤 개체도 없음"
#: dlls/wldap32/wldap32.rc:65
msgid "Alias Problem"
@@ -11978,7 +11818,7 @@ msgstr "명명 위반"
#: dlls/wldap32/wldap32.rc:97
msgid "Object Class Violation"
-msgstr "객체 클래스 위반"
+msgstr "개체 클래스 위반"
#: dlls/wldap32/wldap32.rc:98
msgid "Not allowed on Non-leaf"
@@ -11994,7 +11834,7 @@ msgstr "이미 존재합니다"
#: dlls/wldap32/wldap32.rc:101
msgid "No Object Class Mods"
-msgstr "어떤 객체 클래스 모드도 없숩니다"
+msgstr "어떤 개체 클래스 모드도 없숩니다"
#: dlls/wldap32/wldap32.rc:102
msgid "Results Too Large"
@@ -13176,6 +13016,9 @@ msgid ""
"\n"
"hardlink hardlink management\n"
msgstr ""
+"- 지원되는 명령 -\n"
+"\n"
+"hardlink 하드링크 관리\n"
#: programs/fsutil/fsutil.mc:35
msgid ""
@@ -13183,10 +13026,13 @@ msgid ""
"\n"
"create create a hardlink\n"
msgstr ""
+"- Hardlink - 지원되는 명령 -\n"
+"\n"
+"create 하드링크 만들기\n"
#: programs/fsutil/fsutil.mc:40
msgid "Syntax: fsutil hardlink create <new> <existing>\n"
-msgstr ""
+msgstr "구문: fsutil hardlink create <new> <existing>\n"
#: programs/hostname/hostname.rc:30
msgid "Usage: hostname\n"
@@ -13817,7 +13663,7 @@ msgstr "C&LSID를 클립보드로 복사"
#: programs/oleview/oleview.rc:57
msgid "Copy &HTML object Tag to clipboard"
-msgstr "&HTML 객체 태그를 클립보드로 복사"
+msgstr "&HTML 개체 태그를 클립보드로 복사"
#: programs/oleview/oleview.rc:63
msgid "&Expert mode"
@@ -13930,7 +13776,7 @@ msgstr "ITypeLib 뷰어"
#: programs/oleview/oleview.rc:99
msgid "OleView - OLE/COM Object Viewer"
-msgstr "OleView - OLE/COM 객체 뷰어"
+msgstr "OleView - OLE/COM 개체 뷰어"
#: programs/oleview/oleview.rc:102
msgid "TypeLib files (*.tlb; *.olb; *.dll; *.ocx; *.exe)"
@@ -13958,15 +13804,15 @@ msgstr "바뀐 것을 저장할지 물어보고 프로그램 끝내기"
#: programs/oleview/oleview.rc:110
msgid "Create an instance of the selected object"
-msgstr "선택된 객체의 인스턴트 만들기"
+msgstr "선택된 개체의 인스턴트 만들기"
#: programs/oleview/oleview.rc:111
msgid "Create an instance of the selected object on a specific machine"
-msgstr "지정한 머신의 선택된 객체의 인스턴트 만들기"
+msgstr "지정한 머신의 선택된 개체의 인스턴트 만들기"
#: programs/oleview/oleview.rc:112
msgid "Release the currently selected object instance"
-msgstr "현재 선택된 객체 인스턴트 해제하기"
+msgstr "현재 선택된 개체 인스턴트 해제하기"
#: programs/oleview/oleview.rc:113
msgid "Copy the GUID of the currently selected item to the clipboard"
@@ -14027,15 +13873,15 @@ msgstr "컴포턴트 분류"
#: programs/oleview/oleview.rc:132
msgid "OLE 1.0 Objects"
-msgstr "OLE 1.0 객체"
+msgstr "OLE 1.0 개체"
#: programs/oleview/oleview.rc:133
msgid "COM Library Objects"
-msgstr "COM 라이브러리 객체"
+msgstr "COM 라이브러리 개체"
#: programs/oleview/oleview.rc:134
msgid "All Objects"
-msgstr "모든 객체"
+msgstr "모든 개체"
#: programs/oleview/oleview.rc:135
msgid "Application IDs"
@@ -15625,7 +15471,7 @@ msgstr "페이지 실패(&F)"
#: programs/taskmgr/taskmgr.rc:537
msgid "&USER Objects"
-msgstr "사용자 객체(&U)"
+msgstr "사용자 개체(&U)"
#: programs/taskmgr/taskmgr.rc:539 programs/taskmgr/taskmgr.rc:281
msgid "I/O Reads"
@@ -15673,7 +15519,7 @@ msgstr "스레드 카운트(&T)"
#: programs/taskmgr/taskmgr.rc:561 programs/taskmgr/taskmgr.rc:292
msgid "GDI Objects"
-msgstr "GDI 객체"
+msgstr "GDI 개체"
#: programs/taskmgr/taskmgr.rc:563 programs/taskmgr/taskmgr.rc:293
msgid "I/O Writes"
@@ -15909,7 +15755,7 @@ msgstr "페이지 실패"
#: programs/taskmgr/taskmgr.rc:280
msgid "USER Objects"
-msgstr "사용자 객체"
+msgstr "사용자 개체"
#: programs/taskmgr/taskmgr.rc:283
msgid "Session ID"
@@ -15937,7 +15783,7 @@ msgstr "NP 풀"
#: programs/taskmgr/taskmgr.rc:289
msgid "Base Pri"
-msgstr "기본 Pri"
+msgstr "기본 우선 순위"
#: programs/taskmgr/taskmgr.rc:301
msgid "Task Manager Warning"
@@ -16983,14 +16829,12 @@ msgid "&Beginner"
msgstr "초보자(&B)"
#: programs/winemine/winemine.rc:45
-#, fuzzy
-#| msgid "Interface"
msgid "&Intermediate"
-msgstr "인터페이스"
+msgstr "중급자(&I)"
#: programs/winemine/winemine.rc:46
msgid "&Expert"
-msgstr "상급자(&E)"
+msgstr "전문가(&E)"
#: programs/winemine/winemine.rc:47
msgid "&Custom..."
@@ -17017,10 +16861,8 @@ msgid "Beginner"
msgstr "초보자"
#: programs/winemine/winemine.rc:65
-#, fuzzy
-#| msgid "Interface"
msgid "Intermediate"
-msgstr "인터페이스"
+msgstr "중급자"
#: programs/winemine/winemine.rc:66
msgid "Expert"
--
2.29.2
Dec. 16, 2020
Re: [RFC] Announcing Wayland driver development
by Aaryaman Vasishta
This is super amazing. Thank you very much for this contribution to WINE! I
can't wait to try this.
Cheers,
Aaryaman
On Wed, Dec 16, 2020 at 2:16 AM Alexandros Frantzis <
alexandros.frantzis(a)collabora.com> wrote:
> Hi all,
>
> For some time now I have been working on a Wayland driver for Wine, and
> it has now reached a good enough state to present it to the wider
> community. This driver allows users to run Windows GDI and OpenGL
> applications directly on Wayland compositors without an intermediate
> layer to translate from X11 to Wayland. This leads to a leaner and more
> efficient stack.
>
> The code currently resides at:
>
> https://gitlab.collabora.com/alf/wine/-/commits/wayland
>
> Get it with:
>
> $ git clone -b wayland https://gitlab.collabora.com/alf/wine/
>
> Configure with (you need the wayland-client and wayland-egl packages):
>
> $ ./configure --with-wayland
>
> To run, ensure there is a Wayland compositor running, unset DISPLAY (so
> that Wayland is picked instead of X11) and set WAYLAND_DISPLAY (if
> needed):
>
> $ DISPLAY= WAYLAND_DISPLAY=wayland-0 ./wine ...
>
> Here is video showcasing a few Windows applications running with the
> Wayland driver on the Weston reference compositor:
>
> https://youtu.be/br2b8gUy5n8
>
> The Wayland protocol is by design more constrained compared to more
> traditional display systems like X11. These constraints add some
> special challenges in the integration of Wayland with Win32.
>
> Since Wayland's window model is not based on a single flat 2D
> co-ordinate space, as X11's was, the Wayland protocol doesn't allow
> applications to control their absolute position on the screen. For Win32
> transient windows (menus, tooltips, etc) the driver tries to work around
> the lack of absolute positioning by "anchoring" them to an owning
> Wayland surface and treating them as subsurfaces of that owner. Screen
> coordinates for such windows are transformed to local coordinates
> relative to the owning surface, allowing correct placement through
> relative subsurface movement, which is supported by Wayland. By using
> heuristics to select the proper owning surface, this approach has led to
> very good results.
>
> Absolute positioning of non-transient top level windows is not supported
> at this time, and will likely require a (possibly controversial) Wayland
> extension if it is to ever be pursued. The lack of absolute positioning
> also has an adverse effect on input handling, when parts of windows
> reside outside the visible windows display space, but are still full
> accessible in the Wayland compositor display space (and thus the user).
> Input events to such areas don't reach their intended coordinates (are
> clamped to Windows display bounds) leaving the user mystified about why
> they are unable to interact with a perfectly visible area in their
> Wayland compositor. The current partial workaround is to force all
> windows at (0,0) windows display coordinates, to maximize the area which
> can be interacted with. With this workaround, and as long as windows
> remain smaller than the display size, input works without issues.
>
> Here what's supported at the moment (modulo bugs):
>
> * GDI apps, including layered/translucent windows
> * OpenGL apps
> * Window resizing
> * Maximized and fullscreen window states
> * Mouse and keyboard (only QWERTY) input
> * Mouse cursors
> * Menus, tooltips, etc
> * Single display
>
> What needs more work (or is completely missing):
>
> * Minimize
> * Better z-order and activation handling
> * Keyboard layout support
> * Grabs
> * GTK menu mouse handling bug (cannot click to select items)
> * Multiple displays
> * Vulkan. Note that that there is another effort at
> https://github.com/varmd/wine-wayland/ focusing solely on vulkan.
> My hope is that we will be able to share efforts going forward.
>
> Programs I have tried and which are working well (again modulo bugs):
>
> * Native Wine/Win32 apps (notepad, regedit etc)
> * Supertuxkart
> * 010Editor
> * Firefox
> * Stellarium
> * Battle For Wesnoth
> * GIMP (except clicking items in GTK menus as noted above)
> * Unigine Valley
>
> My first question to the Wine community is how complete the driver
> should be before being considered for inclusion. Is the current Wayland
> driver state enough? If there is interest, I was hoping to get the
> driver in earlier rather than later, in an experimental capacity, in
> order to provide a single, official point of development for people
> wanting to contribute.
>
> My second question is about the best way to move forward with
> upstreaming. The code is currently split between just a few commits,
> mostly as a result of the experimental nature of this effort, and also
> because I used existing code from winex11 and wineandroid as my starting
> point. I would like to split this into smaller commits to make it more
> review-friendly for the mailing list. I was thinking of splitting by
> user32 function (and internal dependencies), but since this is going to
> be an artificial split, I am open to other ideas to make reviewers'
> lives easier.
>
> Looking forward to your feedback and questions!
>
> Thanks,
> Alexandros
>
>
Dec. 16, 2020
[PATCH vkd3d v3 4/4] vkd3d-shader: Implement #elif.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
Makefile.am | 1 -
libs/vkd3d-shader/preproc.l | 3 +++
libs/vkd3d-shader/preproc.y | 23 +++++++++++++++++++++++
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index bf1d7bfa..514f0506 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -243,7 +243,6 @@ XFAIL_TESTS = \
tests/hlsl-vector-indexing.shader_test \
tests/hlsl-vector-indexing-uniform.shader_test \
tests/math.shader_test \
- tests/preproc-if.shader_test \
tests/preproc-ifdef.shader_test \
tests/preproc-if-expr.shader_test \
tests/preproc-invalid.shader_test \
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index 33860d39..47ad1f13 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -100,6 +100,8 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
for (p = yytext + 1; strchr(" \t", *p); ++p)
;
+ if (!strcmp(p, "elif"))
+ return T_ELIF;
if (!strcmp(p, "else"))
return T_ELSE;
if (!strcmp(p, "endif"))
@@ -189,6 +191,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
{
switch (token)
{
+ case T_ELIF:
case T_ELSE:
case T_ENDIF:
case T_IF:
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
index 465a33d2..331dcb18 100644
--- a/libs/vkd3d-shader/preproc.y
+++ b/libs/vkd3d-shader/preproc.y
@@ -139,6 +139,7 @@ static uint32_t preproc_parse_integer(const char *s)
%token T_NEWLINE
+%token T_ELIF "#elif"
%token T_ELSE "#else"
%token T_ENDIF "#endif"
%token T_IF "#if"
@@ -160,6 +161,28 @@ directive
if (!preproc_push_if(ctx, !!$2))
YYABORT;
}
+ | T_ELIF expr T_NEWLINE
+ {
+ if (ctx->if_count)
+ {
+ struct preproc_if_state *state = &ctx->if_stack[ctx->if_count - 1];
+
+ if (state->seen_else)
+ {
+ preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE, "Ignoring #elif after #else.");
+ }
+ else
+ {
+ state->current_true = $2 && !state->seen_true && preproc_was_writing(ctx);
+ state->seen_true = $2 || state->seen_true;
+ }
+ }
+ else
+ {
+ preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE,
+ "Ignoring #elif without prior #if.");
+ }
+ }
| T_ELSE T_NEWLINE
{
if (ctx->if_count)
--
2.29.2
Dec. 15, 2020
[PATCH vkd3d v3 3/4] vkd3d-shader: Implement #else.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/preproc.h | 4 ++++
libs/vkd3d-shader/preproc.l | 3 +++
libs/vkd3d-shader/preproc.y | 25 +++++++++++++++++++++++++
3 files changed, 32 insertions(+)
diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h
index 0f494fcd..effcd995 100644
--- a/libs/vkd3d-shader/preproc.h
+++ b/libs/vkd3d-shader/preproc.h
@@ -27,6 +27,10 @@ struct preproc_if_state
{
/* Are we currently in a "true" block? */
bool current_true;
+ /* Have we seen a "true" block in this #if..#endif yet? */
+ bool seen_true;
+ /* Have we seen an #else yet? */
+ bool seen_else;
};
struct preproc_ctx
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index c60970cd..33860d39 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -100,6 +100,8 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
for (p = yytext + 1; strchr(" \t", *p); ++p)
;
+ if (!strcmp(p, "else"))
+ return T_ELSE;
if (!strcmp(p, "endif"))
return T_ENDIF;
if (!strcmp(p, "if"))
@@ -187,6 +189,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
{
switch (token)
{
+ case T_ELSE:
case T_ENDIF:
case T_IF:
ctx->current_directive = token;
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
index 024ff4c2..465a33d2 100644
--- a/libs/vkd3d-shader/preproc.y
+++ b/libs/vkd3d-shader/preproc.y
@@ -81,6 +81,8 @@ static bool preproc_push_if(struct preproc_ctx *ctx, bool condition)
return false;
state = &ctx->if_stack[ctx->if_count++];
state->current_true = condition && preproc_was_writing(ctx);
+ state->seen_true = condition;
+ state->seen_else = false;
return true;
}
@@ -137,6 +139,7 @@ static uint32_t preproc_parse_integer(const char *s)
%token T_NEWLINE
+%token T_ELSE "#else"
%token T_ENDIF "#endif"
%token T_IF "#if"
@@ -157,6 +160,28 @@ directive
if (!preproc_push_if(ctx, !!$2))
YYABORT;
}
+ | T_ELSE T_NEWLINE
+ {
+ if (ctx->if_count)
+ {
+ struct preproc_if_state *state = &ctx->if_stack[ctx->if_count - 1];
+
+ if (state->seen_else)
+ {
+ preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE, "Ignoring #else after #else.");
+ }
+ else
+ {
+ state->current_true = !state->seen_true && preproc_was_writing(ctx);
+ state->seen_else = true;
+ }
+ }
+ else
+ {
+ preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE,
+ "Ignoring #else without prior #if.");
+ }
+ }
| T_ENDIF T_NEWLINE
{
if (ctx->if_count)
--
2.29.2
Dec. 15, 2020
[PATCH vkd3d v3 2/4] vkd3d-shader: Implement basic support for #if and #endif.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
include/private/vkd3d_memory.h | 11 +++
libs/vkd3d-shader/preproc.h | 17 ++++
libs/vkd3d-shader/preproc.l | 106 +++++++++++++++++++++--
libs/vkd3d-shader/preproc.y | 101 ++++++++++++++++++++-
libs/vkd3d-shader/vkd3d_shader_main.c | 24 +++++
libs/vkd3d-shader/vkd3d_shader_private.h | 6 ++
tests/hlsl_d3d12.c | 2 +-
7 files changed, 257 insertions(+), 10 deletions(-)
diff --git a/include/private/vkd3d_memory.h b/include/private/vkd3d_memory.h
index df93abf5..bd56d30a 100644
--- a/include/private/vkd3d_memory.h
+++ b/include/private/vkd3d_memory.h
@@ -22,6 +22,7 @@
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <string.h>
#include "vkd3d_debug.h"
@@ -54,6 +55,16 @@ static inline void vkd3d_free(void *ptr)
free(ptr);
}
+static inline char *vkd3d_strdup(const char *string)
+{
+ size_t len = strlen(string) + 1;
+ char *ptr;
+
+ if ((ptr = vkd3d_malloc(len)))
+ memcpy(ptr, string, len);
+ return ptr;
+}
+
bool vkd3d_array_reserve(void **elements, size_t *capacity,
size_t element_count, size_t element_size) DECLSPEC_HIDDEN;
diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h
index bd9dfdd3..0f494fcd 100644
--- a/libs/vkd3d-shader/preproc.h
+++ b/libs/vkd3d-shader/preproc.h
@@ -23,6 +23,12 @@
#include "vkd3d_shader_private.h"
+struct preproc_if_state
+{
+ /* Are we currently in a "true" block? */
+ bool current_true;
+};
+
struct preproc_ctx
{
void *scanner;
@@ -31,7 +37,18 @@ struct preproc_ctx
struct vkd3d_string_buffer buffer;
struct vkd3d_shader_location location;
+ struct preproc_if_state *if_stack;
+ size_t if_count, if_stack_size;
+
+ int current_directive;
+
+ bool last_was_newline;
+ bool last_was_eof;
+
bool error;
};
+void preproc_warning(struct preproc_ctx *ctx, const struct vkd3d_shader_location *loc,
+ enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(4, 5) DECLSPEC_HIDDEN;
+
#endif
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index b406af09..c60970cd 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -50,6 +50,7 @@ static void update_location(struct preproc_ctx *ctx);
%s C_COMMENT
%s CXX_COMMENT
+NEWLINE \r?\n
WS [ \t]
IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
@@ -57,10 +58,10 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
<INITIAL>"//" {yy_push_state(CXX_COMMENT, yyscanner);}
<INITIAL>"/*" {yy_push_state(C_COMMENT, yyscanner);}
-<CXX_COMMENT>\\\r?\n {}
+<CXX_COMMENT>\\{NEWLINE} {}
<CXX_COMMENT>\n {
yy_pop_state(yyscanner);
- return T_TEXT;
+ return T_NEWLINE;
}
<C_COMMENT>"*/" {yy_pop_state(yyscanner);}
<C_COMMENT,CXX_COMMENT><<EOF>> {yy_pop_state(yyscanner);}
@@ -68,13 +69,15 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
<INITIAL>{IDENTIFIER} {return T_TEXT;}
+ /* We have no use for floats, but shouldn't parse them as integers. */
+
<INITIAL>[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;}
<INITIAL>[0-9]+\.([eE][+-]?[0-9]+)?[hHfF]? {return T_TEXT;}
<INITIAL>[0-9]+([eE][+-]?[0-9]+)?[hHfF] {return T_TEXT;}
<INITIAL>[0-9]+[eE][+-]?[0-9]+ {return T_TEXT;}
-<INITIAL>0[xX][0-9a-fA-f]+[ul]{0,2} {return T_TEXT;}
-<INITIAL>0[0-7]*[ul]{0,2} {return T_TEXT;}
-<INITIAL>[1-9][0-9]*[ul]{0,2} {return T_TEXT;}
+<INITIAL>0[xX][0-9a-fA-f]+[ul]{0,2} {return T_INTEGER;}
+<INITIAL>0[0-7]*[ul]{0,2} {return T_INTEGER;}
+<INITIAL>[1-9][0-9]*[ul]{0,2} {return T_INTEGER;}
<INITIAL>"&&" {return T_TEXT;}
<INITIAL>"||" {return T_TEXT;}
@@ -87,6 +90,29 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
/* C strings (including escaped quotes). */
<INITIAL>\"([^"\\]|\\.)*\" {return T_TEXT;}
+<INITIAL>#{WS}*{IDENTIFIER} {
+ struct preproc_ctx *ctx = yyget_extra(yyscanner);
+ const char *p;
+
+ if (!ctx->last_was_newline)
+ return T_TEXT;
+
+ for (p = yytext + 1; strchr(" \t", *p); ++p)
+ ;
+
+ if (!strcmp(p, "endif"))
+ return T_ENDIF;
+ if (!strcmp(p, "if"))
+ return T_IF;
+
+ preproc_warning(ctx, yyget_lloc(yyscanner), VKD3D_SHADER_WARNING_PP_UNKNOWN_DIRECTIVE,
+ "Ignoring unknown directive \"%s\".", yytext);
+ return T_TEXT;
+ }
+
+<INITIAL>\\{NEWLINE} {}
+<INITIAL>{NEWLINE} {return T_NEWLINE;}
+
<INITIAL>{WS}+ {}
<INITIAL>. {return T_TEXT;}
@@ -113,6 +139,27 @@ static void update_location(struct preproc_ctx *ctx)
}
}
+static bool preproc_is_writing(struct preproc_ctx *ctx)
+{
+ if (!ctx->if_count)
+ return true;
+ return ctx->if_stack[ctx->if_count - 1].current_true;
+}
+
+static int return_token(int token, YYSTYPE *lval, const char *text)
+{
+ switch (token)
+ {
+ case T_INTEGER:
+ case T_TEXT:
+ if (!(lval->string = vkd3d_strdup(text)))
+ return 0;
+ break;
+ }
+
+ return token;
+}
+
int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
{
struct preproc_ctx *ctx = yyget_extra(scanner);
@@ -122,11 +169,44 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
const char *text;
int token;
- if (!(token = preproc_lexer_lex(lval, lloc, scanner)))
+ if (ctx->last_was_eof)
return 0;
- text = yyget_text(scanner);
- TRACE("Parsing token %d, line %d, string %s.\n", token, lloc->line, debugstr_a(text));
+ if (!(token = preproc_lexer_lex(lval, lloc, scanner)))
+ {
+ ctx->last_was_eof = true;
+ token = T_NEWLINE;
+ text = "\n";
+ }
+ else
+ {
+ text = yyget_text(scanner);
+ }
+
+ if (ctx->last_was_newline)
+ {
+ switch (token)
+ {
+ case T_ENDIF:
+ case T_IF:
+ ctx->current_directive = token;
+ break;
+
+ default:
+ ctx->current_directive = 0;
+ }
+ }
+
+ ctx->last_was_newline = (token == T_NEWLINE);
+
+ TRACE("Parsing token %d, line %d, in directive %d, string %s.\n",
+ token, lloc->line, ctx->current_directive, debugstr_a(text));
+
+ if (!ctx->current_directive && !preproc_is_writing(ctx))
+ continue;
+
+ if (ctx->current_directive)
+ return return_token(token, lval, text);
vkd3d_string_buffer_printf(&ctx->buffer, "%s ", text);
}
@@ -147,12 +227,22 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info,
yylex_init_extra(&ctx, &ctx.scanner);
top_buffer = yy_scan_bytes(compile_info->source.code, compile_info->source.size, ctx.scanner);
+ ctx.last_was_newline = true;
preproc_yyparse(ctx.scanner, &ctx);
yy_delete_buffer(top_buffer, ctx.scanner);
yylex_destroy(ctx.scanner);
+ if (ctx.if_count)
+ {
+ const struct vkd3d_shader_location loc = {.source_name = ctx.location.source_name};
+
+ preproc_warning(&ctx, &loc, VKD3D_SHADER_WARNING_PP_UNTERMINATED_IF, "Unterminated #if block.");
+ }
+
+ vkd3d_free(ctx.if_stack);
+
if (ctx.error)
{
WARN("Failed to preprocess.\n");
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
index 16b84ea9..024ff4c2 100644
--- a/libs/vkd3d-shader/preproc.y
+++ b/libs/vkd3d-shader/preproc.y
@@ -51,11 +51,70 @@ static void preproc_error(struct preproc_ctx *ctx, const struct vkd3d_shader_loc
ctx->error = true;
}
+void preproc_warning(struct preproc_ctx *ctx, const struct vkd3d_shader_location *loc,
+ enum vkd3d_shader_error error, const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vkd3d_shader_vwarning(ctx->message_context, loc, error, format, args);
+ va_end(args);
+}
+
static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, const char *string)
{
preproc_error(ctx, loc, VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX, "%s", string);
}
+static bool preproc_was_writing(struct preproc_ctx *ctx)
+{
+ if (ctx->if_count < 2)
+ return true;
+ return ctx->if_stack[ctx->if_count - 2].current_true;
+}
+
+static bool preproc_push_if(struct preproc_ctx *ctx, bool condition)
+{
+ struct preproc_if_state *state;
+
+ if (!vkd3d_array_reserve((void **)&ctx->if_stack, &ctx->if_stack_size, ctx->if_count + 1, sizeof(*ctx->if_stack)))
+ return false;
+ state = &ctx->if_stack[ctx->if_count++];
+ state->current_true = condition && preproc_was_writing(ctx);
+ return true;
+}
+
+static int char_to_int(char c)
+{
+ if ('0' <= c && c <= '9')
+ return c - '0';
+ if ('A' <= c && c <= 'F')
+ return c - 'A' + 10;
+ if ('a' <= c && c <= 'f')
+ return c - 'a' + 10;
+ return -1;
+}
+
+static uint32_t preproc_parse_integer(const char *s)
+{
+ uint32_t base = 10, ret = 0;
+ int digit;
+
+ if (s[0] == '0')
+ {
+ base = 8;
+ if (s[1] == 'x' || s[1] == 'X')
+ {
+ base = 16;
+ s += 2;
+ }
+ }
+
+ while ((digit = char_to_int(*s++)) >= 0)
+ ret = ret * base + (uint32_t)digit;
+ return ret;
+}
+
}
%define api.prefix {preproc_yy}
@@ -67,9 +126,49 @@ static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx,
%parse-param {void *scanner}
%parse-param {struct preproc_ctx *ctx}
-%token T_TEXT
+%union
+{
+ char *string;
+ uint32_t integer;
+}
+
+%token <string> T_INTEGER
+%token <string> T_TEXT
+
+%token T_NEWLINE
+
+%token T_ENDIF "#endif"
+%token T_IF "#if"
+
+%type <integer> expr
%%
shader_text
: %empty
+ | shader_text directive
+ {
+ vkd3d_string_buffer_printf(&ctx->buffer, "\n");
+ }
+
+directive
+ : T_IF expr T_NEWLINE
+ {
+ if (!preproc_push_if(ctx, !!$2))
+ YYABORT;
+ }
+ | T_ENDIF T_NEWLINE
+ {
+ if (ctx->if_count)
+ --ctx->if_count;
+ else
+ preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE,
+ "Ignoring #endif without prior #if.");
+ }
+
+expr
+ : T_INTEGER
+ {
+ $$ = preproc_parse_integer($1);
+ vkd3d_free($1);
+ }
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 173ff170..df3b1a57 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -144,6 +144,30 @@ bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_cont
return true;
}
+void vkd3d_shader_vwarning(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
+ enum vkd3d_shader_error error, const char *format, va_list args)
+{
+ if (context->log_level < VKD3D_SHADER_LOG_WARNING)
+ return;
+
+ if (location)
+ {
+ const char *source_name = location->source_name ? location->source_name : "<anonymous>";
+
+ if (location->line)
+ vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: W%04u: ",
+ source_name, location->line, location->column, error);
+ else
+ vkd3d_string_buffer_printf(&context->messages, "%s: W%04u: ", source_name, error);
+ }
+ else
+ {
+ vkd3d_string_buffer_printf(&context->messages, "W%04u: ", error);
+ }
+ vkd3d_string_buffer_vprintf(&context->messages, format, args);
+ vkd3d_string_buffer_printf(&context->messages, "\n");
+}
+
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
enum vkd3d_shader_error error, const char *format, va_list args)
{
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 882a8060..b89d20e2 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -81,6 +81,10 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES = 3004,
VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX = 4000,
+
+ VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE = 4301,
+ VKD3D_SHADER_WARNING_PP_UNKNOWN_DIRECTIVE = 4303,
+ VKD3D_SHADER_WARNING_PP_UNTERMINATED_IF = 4305,
};
enum VKD3D_SHADER_INSTRUCTION_HANDLER
@@ -871,6 +875,8 @@ void vkd3d_shader_error(struct vkd3d_shader_message_context *context, const stru
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(4, 5) DECLSPEC_HIDDEN;
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN;
+void vkd3d_shader_vwarning(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
+ enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN;
int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length,
struct vkd3d_shader_message_context *message_context, const char *source_name,
diff --git a/tests/hlsl_d3d12.c b/tests/hlsl_d3d12.c
index 61324fa9..77a7ea1a 100644
--- a/tests/hlsl_d3d12.c
+++ b/tests/hlsl_d3d12.c
@@ -414,7 +414,7 @@ static void test_preprocess(void)
hr = D3DPreprocess(test_include_top, strlen(test_include_top), NULL, NULL, &test_include_fail, &blob, &errors);
todo ok(hr == E_FAIL, "Got hr %#x.\n", hr);
todo ok(blob == (ID3D10Blob *)0xdeadbeef, "Expected no compiled shader blob.\n");
- todo ok(!!errors, "Expected non-NULL error blob.\n");
+ ok(!!errors, "Expected non-NULL error blob.\n");
if (errors)
{
if (vkd3d_test_state.debug_level)
--
2.29.2
Dec. 15, 2020
[PATCH vkd3d v3 1/4] vkd3d-shader: Handle preprocessor parsing errors.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
v3: Use vkd3d_shader_location. In fact, use it also in struct preproc_ctx.
Although there are conceptual reasons not to, for now it's more confusing when
left distinct.
libs/vkd3d-shader/preproc.h | 4 +++
libs/vkd3d-shader/preproc.l | 38 +++++++++++++++++++++++-
libs/vkd3d-shader/preproc.y | 17 ++++++++++-
libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++
4 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/preproc.h b/libs/vkd3d-shader/preproc.h
index cbd93229..bd9dfdd3 100644
--- a/libs/vkd3d-shader/preproc.h
+++ b/libs/vkd3d-shader/preproc.h
@@ -27,7 +27,11 @@ struct preproc_ctx
{
void *scanner;
+ struct vkd3d_shader_message_context *message_context;
struct vkd3d_string_buffer buffer;
+ struct vkd3d_shader_location location;
+
+ bool error;
};
#endif
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index 4d809b8f..b406af09 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -27,6 +27,10 @@
#define YY_DECL static int preproc_lexer_lex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner)
+static void update_location(struct preproc_ctx *ctx);
+
+#define YY_USER_ACTION update_location(yyget_extra(yyscanner));
+
%}
%option 8bit
@@ -88,6 +92,27 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
%%
+static void update_location(struct preproc_ctx *ctx)
+{
+ unsigned int i, leng = yyget_leng(ctx->scanner);
+ const char *text = yyget_text(ctx->scanner);
+
+ /* We want to do this here, rather than before calling yylex(), because
+ * some tokens are skipped by the lexer. */
+
+ *yyget_lloc(ctx->scanner) = ctx->location;
+
+ for (i = 0; i < leng; ++i)
+ {
+ ++ctx->location.column;
+ if (text[i] == '\n')
+ {
+ ctx->location.column = 1;
+ ++ctx->location.line;
+ }
+ }
+}
+
int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
{
struct preproc_ctx *ctx = yyget_extra(scanner);
@@ -101,7 +126,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
return 0;
text = yyget_text(scanner);
- TRACE("Parsing token %d, string %s.\n", token, debugstr_a(text));
+ TRACE("Parsing token %d, line %d, string %s.\n", token, lloc->line, debugstr_a(text));
vkd3d_string_buffer_printf(&ctx->buffer, "%s ", text);
}
@@ -115,6 +140,10 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info,
void *output_code;
vkd3d_string_buffer_init(&ctx.buffer);
+ ctx.message_context = message_context;
+ ctx.location.source_name = compile_info->source_name;
+ ctx.location.line = 1;
+ ctx.location.column = 1;
yylex_init_extra(&ctx, &ctx.scanner);
top_buffer = yy_scan_bytes(compile_info->source.code, compile_info->source.size, ctx.scanner);
@@ -124,6 +153,13 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info,
yy_delete_buffer(top_buffer, ctx.scanner);
yylex_destroy(ctx.scanner);
+ if (ctx.error)
+ {
+ WARN("Failed to preprocess.\n");
+ vkd3d_string_buffer_cleanup(&ctx.buffer);
+ return VKD3D_ERROR_INVALID_SHADER;
+ }
+
if (!(output_code = vkd3d_malloc(ctx.buffer.content_size)))
{
vkd3d_string_buffer_cleanup(&ctx.buffer);
diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
index 92448f24..16b84ea9 100644
--- a/libs/vkd3d-shader/preproc.y
+++ b/libs/vkd3d-shader/preproc.y
@@ -24,6 +24,8 @@
#include "vkd3d_shader_private.h"
#include "preproc.h"
+#define PREPROC_YYLTYPE struct vkd3d_shader_location
+
}
%code provides
@@ -36,9 +38,22 @@ int preproc_yylex(PREPROC_YYSTYPE *yylval_param, PREPROC_YYLTYPE *yylloc_param,
%code
{
+#define YYLLOC_DEFAULT(cur, rhs, n) (cur) = YYRHSLOC(rhs, !!n)
+
+static void preproc_error(struct preproc_ctx *ctx, const struct vkd3d_shader_location *loc,
+ enum vkd3d_shader_error error, const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vkd3d_shader_verror(ctx->message_context, loc, error, format, args);
+ va_end(args);
+ ctx->error = true;
+}
+
static void yyerror(const YYLTYPE *loc, void *scanner, struct preproc_ctx *ctx, const char *string)
{
- FIXME("Error reporting is not implemented.\n");
+ preproc_error(ctx, loc, VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX, "%s", string);
}
}
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index e974b928..882a8060 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -79,6 +79,8 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE = 3002,
VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE = 3003,
VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES = 3004,
+
+ VKD3D_SHADER_ERROR_PP_INVALID_SYNTAX = 4000,
};
enum VKD3D_SHADER_INSTRUCTION_HANDLER
--
2.29.2
Dec. 15, 2020
Re: [PATCH vkd3d v2 2/2] vkd3d-shader: Move location tracking out of the vkd3d_shader_message_context structure.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Dec. 15, 2020
[PATCH] wine.inf: Store Dynamic DST data for Asia/Tehran as "relative" dates.
by Henri Verbeet
I.e., the "Nth <weekday> of <month>" form. This form is much less convenient
for timezones where the DST change happens on specific dates, but some
applications distribute old versions of Mono that don't bother checking the
"wYear" fields of the SYSTEMTIME fields in the TIME_ZONE_INFORMATION structure
returned by GetTimeZoneInformation(), and instead always convert the presumed
"relative" dates to "absolute" dates. Unsurprisingly, the resulting dates are
invalid, and these applications then end up throwing
"System.NotSupportedException: Can't get timezone name." when run in such a
timezone, typically early during startup.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This happens with at least "INSIDE" and "Life is Strange: Before the Storm",
but the issue is much more widespread than that, typically affecting any
application that does anything with times or dates and uses an affected
version of Mono.
loader/wine.inf.in | 90 +++++++++++++++++++++++-----------------------
1 file changed, 45 insertions(+), 45 deletions(-)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 0cbbcb710f6..d5dd2d5b66b 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -3240,53 +3240,53 @@ HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time,"MUI_Dlt",,"@tzres.dll,-55
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time,"MUI_Std",,"@tzres.dll,-5568"
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time,"Std",,"Iran Standard Time"
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time,"TZI",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,04,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1991",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,c7,07,09,00,00,00,16,00,00,00,00,00,00,00,00,00,c7,07,05,00,05,00,03,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1992",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,c8,07,09,00,02,00,16,00,00,00,00,00,00,00,00,00,c8,07,03,00,00,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1993",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,c9,07,09,00,03,00,16,00,00,00,00,00,00,00,00,00,c9,07,03,00,01,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1994",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ca,07,09,00,04,00,16,00,00,00,00,00,00,00,00,00,ca,07,03,00,02,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1995",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,cb,07,09,00,05,00,16,00,00,00,00,00,00,00,00,00,cb,07,03,00,03,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1996",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,cc,07,09,00,06,00,15,00,00,00,00,00,00,00,00,00,cc,07,03,00,04,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1997",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,cd,07,09,00,01,00,16,00,00,00,00,00,00,00,00,00,cd,07,03,00,06,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1998",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ce,07,09,00,02,00,16,00,00,00,00,00,00,00,00,00,ce,07,03,00,00,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1999",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,cf,07,09,00,03,00,16,00,00,00,00,00,00,00,00,00,cf,07,03,00,01,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2000",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d0,07,09,00,04,00,15,00,00,00,00,00,00,00,00,00,d0,07,03,00,02,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2001",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d1,07,09,00,06,00,16,00,00,00,00,00,00,00,00,00,d1,07,03,00,04,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2002",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d2,07,09,00,00,00,16,00,00,00,00,00,00,00,00,00,d2,07,03,00,05,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2003",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d3,07,09,00,01,00,16,00,00,00,00,00,00,00,00,00,d3,07,03,00,06,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2004",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d4,07,09,00,02,00,15,00,00,00,00,00,00,00,00,00,d4,07,03,00,00,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2005",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d5,07,09,00,04,00,16,00,00,00,00,00,00,00,00,00,d5,07,03,00,02,00,16,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1991",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,05,00,05,00,01,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1992",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1993",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1994",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1995",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1996",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,06,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,04,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1997",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1998",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"1999",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2000",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2001",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,06,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,04,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2002",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2003",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2004",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2005",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,04,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2006",1,2e,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2007",1,2e,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2008",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d8,07,09,00,00,00,15,00,00,00,00,00,00,00,00,00,d8,07,03,00,05,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2009",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,d9,07,09,00,02,00,16,00,00,00,00,00,00,00,00,00,d9,07,03,00,00,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2010",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,da,07,09,00,03,00,16,00,00,00,00,00,00,00,00,00,da,07,03,00,01,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2011",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,db,07,09,00,04,00,16,00,00,00,00,00,00,00,00,00,db,07,03,00,02,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2012",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,dc,07,09,00,05,00,15,00,00,00,00,00,00,00,00,00,dc,07,03,00,03,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2013",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,dd,07,09,00,00,00,16,00,00,00,00,00,00,00,00,00,dd,07,03,00,05,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2014",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,de,07,09,00,01,00,16,00,00,00,00,00,00,00,00,00,de,07,03,00,06,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2015",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,df,07,09,00,02,00,16,00,00,00,00,00,00,00,00,00,df,07,03,00,00,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2016",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e0,07,09,00,03,00,15,00,00,00,00,00,00,00,00,00,e0,07,03,00,01,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2017",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e1,07,09,00,05,00,16,00,00,00,00,00,00,00,00,00,e1,07,03,00,03,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2018",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e2,07,09,00,06,00,16,00,00,00,00,00,00,00,00,00,e2,07,03,00,04,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2019",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e3,07,09,00,00,00,16,00,00,00,00,00,00,00,00,00,e3,07,03,00,05,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2020",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e4,07,09,00,01,00,15,00,00,00,00,00,00,00,00,00,e4,07,03,00,06,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2021",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e5,07,09,00,03,00,16,00,00,00,00,00,00,00,00,00,e5,07,03,00,01,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2022",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e6,07,09,00,04,00,16,00,00,00,00,00,00,00,00,00,e6,07,03,00,02,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2023",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e7,07,09,00,05,00,16,00,00,00,00,00,00,00,00,00,e7,07,03,00,03,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2024",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e8,07,09,00,06,00,15,00,00,00,00,00,00,00,00,00,e8,07,03,00,04,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2025",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,e9,07,09,00,01,00,16,00,00,00,00,00,00,00,00,00,e9,07,03,00,06,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2026",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ea,07,09,00,02,00,16,00,00,00,00,00,00,00,00,00,ea,07,03,00,00,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2027",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,eb,07,09,00,03,00,16,00,00,00,00,00,00,00,00,00,eb,07,03,00,01,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2028",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ec,07,09,00,04,00,15,00,00,00,00,00,00,00,00,00,ec,07,03,00,02,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2029",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ed,07,09,00,05,00,15,00,00,00,00,00,00,00,00,00,ed,07,03,00,03,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2030",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ee,07,09,00,00,00,16,00,00,00,00,00,00,00,00,00,ee,07,03,00,05,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2031",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,ef,07,09,00,01,00,16,00,00,00,00,00,00,00,00,00,ef,07,03,00,06,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2032",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f0,07,09,00,02,00,15,00,00,00,00,00,00,00,00,00,f0,07,03,00,00,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2033",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f1,07,09,00,03,00,15,00,00,00,00,00,00,00,00,00,f1,07,03,00,01,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2034",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f2,07,09,00,05,00,16,00,00,00,00,00,00,00,00,00,f2,07,03,00,03,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2035",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f3,07,09,00,06,00,16,00,00,00,00,00,00,00,00,00,f3,07,03,00,04,00,16,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2036",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f4,07,09,00,00,00,15,00,00,00,00,00,00,00,00,00,f4,07,03,00,05,00,15,00,00,00,00,00,00,00,00,00
-HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2037",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,f5,07,09,00,01,00,15,00,00,00,00,00,00,00,00,00,f5,07,03,00,06,00,15,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2008",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2009",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2010",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2011",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2012",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2013",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2014",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2015",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2016",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2017",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2018",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,06,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,04,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2019",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2020",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2021",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2022",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2023",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2024",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,06,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,04,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2025",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2026",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2027",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2028",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,04,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,02,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2029",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2030",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2031",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2032",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,02,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2033",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,03,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,01,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2034",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,05,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,03,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2035",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,06,00,04,00,00,00,00,00,00,00,00,00,00,00,03,00,04,00,04,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2036",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,05,00,03,00,00,00,00,00,00,00,00,00
+HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"2037",1,2e,ff,ff,ff,00,00,00,00,c4,ff,ff,ff,00,00,09,00,01,00,03,00,00,00,00,00,00,00,00,00,00,00,03,00,06,00,03,00,00,00,00,00,00,00,00,00
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"FirstEntry",0x10001,1991
HKLM,%CurrentVersionNT%\Time Zones\Iran Standard Time\Dynamic DST,"LastEntry",0x10001,2037
HKLM,%CurrentVersionNT%\Time Zones\Israel Standard Time,"Display",,"Asia/Jerusalem"
--
2.20.1
Dec. 15, 2020