You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0a299f39c8 | ||
|
f22ff249a9 | ||
|
f90534f9da | ||
|
de03562a2d | ||
|
831d2d8b52 | ||
|
5087d8a8d9 | ||
|
22ed5ee061 | ||
|
003d5833c2 | ||
|
151728b04d | ||
|
83c7e2a993 | ||
|
91a9c0e3db | ||
|
c35a3386eb | ||
|
2996658d6a | ||
|
c7aa87d8a2 | ||
|
4125a9880c |
@@ -1,25 +1,35 @@
|
||||
From b1bbc311c1e2dec72e04be9c668b6072d11b04fb Mon Sep 17 00:00:00 2001
|
||||
From ce5e1fc75139e4de9d92dfe27b4a513a96da013c Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Thu, 2 Oct 2014 19:53:46 +0200
|
||||
Subject: [PATCH] winelib: Append '(Staging)' at the end of the version string.
|
||||
|
||||
---
|
||||
dlls/ntdll/Makefile.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
Makefile.in | 2 +-
|
||||
dlls/ntdll/Makefile.in | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile.in b/Makefile.in
|
||||
index 307a95b3b1a..61019fed949 100644
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -116,7 +116,7 @@ install-manpages:: manpages
|
||||
# Rules for generated source files
|
||||
|
||||
dlls/ntdll/unix/version.c: dummy
|
||||
- @version=`(GIT_DIR=$(srcdir)/.git git describe HEAD 2>/dev/null || echo "wine-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char wine_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || ($(RM) $@ && exit 1)
|
||||
+ @version=`(GIT_DIR=$(srcdir)/.git git describe HEAD 2>/dev/null || echo "wine-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char wine_build[] = "\1 (Staging)";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || (rm -f $@ && exit 1)
|
||||
|
||||
programs/winetest/build.rc: dummy
|
||||
@build="STRINGTABLE { 1 \"`GIT_DIR=$(srcdir)/.git git rev-parse HEAD 2>/dev/null`\" }" && (echo $$build | cmp -s - $@) || echo $$build >$@ || (rm -f $@ && exit 1)
|
||||
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
|
||||
index a553536d4c7..71e3df13b66 100644
|
||||
index f39ffb42c6f..67847bb9392 100644
|
||||
--- a/dlls/ntdll/Makefile.in
|
||||
+++ b/dlls/ntdll/Makefile.in
|
||||
@@ -81,7 +81,7 @@ unix_loader_EXTRADEFS = \
|
||||
@@ -79,3 +79,4 @@ unix_loader_EXTRADEFS = \
|
||||
-DBINDIR=\"${bindir}\" \
|
||||
-DDLL_TO_BINDIR=\"`${MAKEDEP} -R ${dlldir} ${bindir}`\" \
|
||||
-DBIN_TO_DATADIR=\"`${MAKEDEP} -R ${bindir} ${datadir}/wine`\"
|
||||
|
||||
unix/version.c: dummy
|
||||
- version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "wine-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char wine_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || (rm -f $@ && exit 1)
|
||||
+ version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "wine-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char wine_build[] = "\1 (Staging)";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || (rm -f $@ && exit 1)
|
||||
|
||||
dummy:
|
||||
.PHONY: dummy
|
||||
+
|
||||
--
|
||||
2.28.0
|
||||
|
||||
|
@@ -1,334 +0,0 @@
|
||||
From 1b222275e7faf71ae1e5c94e297004055ec6f82f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Fri, 4 Aug 2017 02:33:14 +0200
|
||||
Subject: [PATCH] ntdll: Implement NtFilterToken.
|
||||
|
||||
---
|
||||
dlls/ntdll/ntdll.spec | 2 +-
|
||||
dlls/ntdll/unix/security.c | 64 +++++++++++++++++++++++++++++
|
||||
include/winnt.h | 5 +++
|
||||
include/winternl.h | 1 +
|
||||
server/named_pipe.c | 2 +-
|
||||
server/process.c | 2 +-
|
||||
server/protocol.def | 10 +++++
|
||||
server/security.h | 4 +-
|
||||
server/token.c | 84 +++++++++++++++++++++++++++++++++++++-
|
||||
9 files changed, 168 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index a3bc57716da..f604c8a3c35 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -208,7 +208,7 @@
|
||||
# @ stub NtEnumerateSystemEnvironmentValuesEx
|
||||
@ stdcall -syscall NtEnumerateValueKey(long long long ptr long ptr)
|
||||
@ stub NtExtendSection
|
||||
-# @ stub NtFilterToken
|
||||
+@ stdcall -syscall NtFilterToken(long long ptr ptr ptr ptr)
|
||||
@ stdcall -syscall NtFindAtom(ptr long ptr)
|
||||
@ stdcall -syscall NtFlushBuffersFile(long ptr)
|
||||
@ stdcall -syscall NtFlushInstructionCache(long ptr long)
|
||||
diff --git a/dlls/ntdll/unix/security.c b/dlls/ntdll/unix/security.c
|
||||
index daecc5e0591..d063d43d6d4 100644
|
||||
--- a/dlls/ntdll/unix/security.c
|
||||
+++ b/dlls/ntdll/unix/security.c
|
||||
@@ -604,6 +604,70 @@ NTSTATUS WINAPI NtAdjustPrivilegesToken( HANDLE token, BOOLEAN disable, TOKEN_PR
|
||||
}
|
||||
|
||||
|
||||
+/***********************************************************************
|
||||
+ * NtFilterToken (NTDLL.@)
|
||||
+ */
|
||||
+NTSTATUS WINAPI NtFilterToken( HANDLE token, ULONG flags, TOKEN_GROUPS *disable_sids,
|
||||
+ TOKEN_PRIVILEGES *privileges, TOKEN_GROUPS *restrict_sids,
|
||||
+ HANDLE *new_token )
|
||||
+{
|
||||
+ data_size_t privileges_len = 0;
|
||||
+ data_size_t sids_len = 0;
|
||||
+ SID *sids = NULL;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ TRACE( "(%p, 0x%08x, %p, %p, %p, %p)\n", token, flags, disable_sids, privileges,
|
||||
+ restrict_sids, new_token );
|
||||
+
|
||||
+ if (flags)
|
||||
+ FIXME( "flags %x unsupported\n", flags );
|
||||
+
|
||||
+ if (restrict_sids)
|
||||
+ FIXME( "support for restricting sids not yet implemented\n" );
|
||||
+
|
||||
+ if (privileges)
|
||||
+ privileges_len = privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
|
||||
+
|
||||
+ if (disable_sids)
|
||||
+ {
|
||||
+ DWORD len, i;
|
||||
+ BYTE *tmp;
|
||||
+
|
||||
+ for (i = 0; i < disable_sids->GroupCount; i++)
|
||||
+ {
|
||||
+ SID *sid = disable_sids->Groups[i].Sid;
|
||||
+ sids_len += offsetof( SID, SubAuthority[sid->SubAuthorityCount] );
|
||||
+ }
|
||||
+
|
||||
+ sids = malloc( sids_len );
|
||||
+ if (!sids) return STATUS_NO_MEMORY;
|
||||
+
|
||||
+ for (i = 0, tmp = (BYTE *)sids; i < disable_sids->GroupCount; i++, tmp += len)
|
||||
+ {
|
||||
+ SID *sid = disable_sids->Groups[i].Sid;
|
||||
+ len = offsetof( SID, SubAuthority[sid->SubAuthorityCount] );
|
||||
+ memcpy( tmp, disable_sids->Groups[i].Sid, len );
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ SERVER_START_REQ( filter_token )
|
||||
+ {
|
||||
+ req->handle = wine_server_obj_handle( token );
|
||||
+ req->flags = flags;
|
||||
+ req->privileges_size = privileges_len;
|
||||
+ wine_server_add_data( req, privileges->Privileges, privileges_len );
|
||||
+ wine_server_add_data( req, sids, sids_len );
|
||||
+ status = wine_server_call( req );
|
||||
+ if (!status) *new_token = wine_server_ptr_handle( reply->new_handle );
|
||||
+ }
|
||||
+ SERVER_END_REQ;
|
||||
+
|
||||
+ free( sids );
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
/***********************************************************************
|
||||
* NtPrivilegeCheck (NTDLL.@)
|
||||
*/
|
||||
diff --git a/include/winnt.h b/include/winnt.h
|
||||
index e1cf78420a6..da17fe3e330 100644
|
||||
--- a/include/winnt.h
|
||||
+++ b/include/winnt.h
|
||||
@@ -4221,6 +4221,11 @@ typedef enum _TOKEN_INFORMATION_CLASS {
|
||||
TOKEN_ADJUST_SESSIONID | \
|
||||
TOKEN_ADJUST_DEFAULT )
|
||||
|
||||
+#define DISABLE_MAX_PRIVILEGE 0x1
|
||||
+#define SANDBOX_INERT 0x2
|
||||
+#define LUA_TOKEN 0x4
|
||||
+#define WRITE_RESTRICTED 0x8
|
||||
+
|
||||
#ifndef _SECURITY_DEFINED
|
||||
#define _SECURITY_DEFINED
|
||||
|
||||
diff --git a/include/winternl.h b/include/winternl.h
|
||||
index b3fbb90feff..4687a410ca4 100644
|
||||
--- a/include/winternl.h
|
||||
+++ b/include/winternl.h
|
||||
@@ -2749,6 +2749,7 @@ NTSYSAPI NTSTATUS WINAPI NtDuplicateToken(HANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES
|
||||
NTSYSAPI NTSTATUS WINAPI NtEnumerateKey(HANDLE,ULONG,KEY_INFORMATION_CLASS,void *,DWORD,DWORD *);
|
||||
NTSYSAPI NTSTATUS WINAPI NtEnumerateValueKey(HANDLE,ULONG,KEY_VALUE_INFORMATION_CLASS,PVOID,ULONG,PULONG);
|
||||
NTSYSAPI NTSTATUS WINAPI NtExtendSection(HANDLE,PLARGE_INTEGER);
|
||||
+NTSYSAPI NTSTATUS WINAPI NtFilterToken(HANDLE,ULONG,TOKEN_GROUPS*,TOKEN_PRIVILEGES*,TOKEN_GROUPS*,HANDLE*);
|
||||
NTSYSAPI NTSTATUS WINAPI NtFindAtom(const WCHAR*,ULONG,RTL_ATOM*);
|
||||
NTSYSAPI NTSTATUS WINAPI NtFlushBuffersFile(HANDLE,IO_STATUS_BLOCK*);
|
||||
NTSYSAPI NTSTATUS WINAPI NtFlushInstructionCache(HANDLE,LPCVOID,SIZE_T);
|
||||
diff --git a/server/named_pipe.c b/server/named_pipe.c
|
||||
index b259abb8de4..4cd4d7dc4a8 100644
|
||||
--- a/server/named_pipe.c
|
||||
+++ b/server/named_pipe.c
|
||||
@@ -1142,7 +1142,7 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
|
||||
if (current->process->token) /* FIXME: use the client token */
|
||||
{
|
||||
struct token *token;
|
||||
- if (!(token = token_duplicate( current->process->token, 0, SecurityImpersonation, NULL )))
|
||||
+ if (!(token = token_duplicate( current->process->token, 0, SecurityImpersonation, NULL, NULL, 0, NULL, 0 )))
|
||||
return 0;
|
||||
if (current->token) release_object( current->token );
|
||||
current->token = token;
|
||||
diff --git a/server/process.c b/server/process.c
|
||||
index 5e587b28cbe..406167e825b 100644
|
||||
--- a/server/process.c
|
||||
+++ b/server/process.c
|
||||
@@ -577,7 +577,7 @@ struct process *create_process( int fd, struct process *parent, int inherit_all,
|
||||
: alloc_handle_table( process, 0 );
|
||||
/* Note: for security reasons, starting a new process does not attempt
|
||||
* to use the current impersonation token for the new process */
|
||||
- process->token = token_duplicate( parent->token, TRUE, 0, NULL );
|
||||
+ process->token = token_duplicate( parent->token, TRUE, 0, NULL, NULL, 0, NULL, 0 );
|
||||
process->affinity = parent->affinity;
|
||||
}
|
||||
if (!process->handles || !process->token) goto error;
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index a121c371c19..ee07b1eca14 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -3263,6 +3263,16 @@ enum caret_state
|
||||
obj_handle_t new_handle; /* duplicated handle */
|
||||
@END
|
||||
|
||||
+@REQ(filter_token)
|
||||
+ obj_handle_t handle; /* handle to the token to duplicate */
|
||||
+ unsigned int flags; /* flags */
|
||||
+ data_size_t privileges_size; /* size of privileges */
|
||||
+ VARARG(privileges,LUID_AND_ATTRIBUTES,privileges_size); /* privileges to remove from new token */
|
||||
+ VARARG(disable_sids,SID); /* array of groups to remove from new token */
|
||||
+@REPLY
|
||||
+ obj_handle_t new_handle; /* filtered handle */
|
||||
+@END
|
||||
+
|
||||
@REQ(access_check)
|
||||
obj_handle_t handle; /* handle to the token */
|
||||
unsigned int desired_access; /* desired access to the object */
|
||||
diff --git a/server/security.h b/server/security.h
|
||||
index 606dbb2ab2c..6c337143c3d 100644
|
||||
--- a/server/security.h
|
||||
+++ b/server/security.h
|
||||
@@ -56,7 +56,9 @@ extern const PSID security_high_label_sid;
|
||||
extern struct token *token_create_admin(void);
|
||||
extern int token_assign_label( struct token *token, PSID label );
|
||||
extern struct token *token_duplicate( struct token *src_token, unsigned primary,
|
||||
- int impersonation_level, const struct security_descriptor *sd );
|
||||
+ int impersonation_level, const struct security_descriptor *sd,
|
||||
+ const LUID_AND_ATTRIBUTES *filter_privileges, unsigned int priv_count,
|
||||
+ const SID *filter_groups, unsigned int group_count );
|
||||
extern int token_check_privileges( struct token *token, int all_required,
|
||||
const LUID_AND_ATTRIBUTES *reqprivs,
|
||||
unsigned int count, LUID_AND_ATTRIBUTES *usedprivs);
|
||||
diff --git a/server/token.c b/server/token.c
|
||||
index 2fa95e17aaf..38a4c203d54 100644
|
||||
--- a/server/token.c
|
||||
+++ b/server/token.c
|
||||
@@ -285,6 +285,19 @@ static int acl_is_valid( const ACL *acl, data_size_t size )
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+static unsigned int get_sid_count( const SID *sid, data_size_t size )
|
||||
+{
|
||||
+ unsigned int count;
|
||||
+
|
||||
+ for (count = 0; size >= sizeof(SID) && security_sid_len( sid ) <= size; count++)
|
||||
+ {
|
||||
+ size -= security_sid_len( sid );
|
||||
+ sid = (const SID *)((char *)sid + security_sid_len( sid ));
|
||||
+ }
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
/* checks whether all members of a security descriptor fit inside the size
|
||||
* of memory specified */
|
||||
int sd_is_valid( const struct security_descriptor *sd, data_size_t size )
|
||||
@@ -626,8 +639,36 @@ static struct token *create_token( unsigned primary, const SID *user,
|
||||
return token;
|
||||
}
|
||||
|
||||
+static int filter_group( struct group *group, const SID *filter, unsigned int count )
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < count; i++)
|
||||
+ {
|
||||
+ if (security_equal_sid( &group->sid, filter )) return 1;
|
||||
+ filter = (const SID *)((char *)filter + security_sid_len( filter ));
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int filter_privilege( struct privilege *privilege, const LUID_AND_ATTRIBUTES *filter, unsigned int count )
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < count; i++)
|
||||
+ {
|
||||
+ if (!memcmp( &privilege->luid, &filter[i].Luid, sizeof(LUID) ))
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
struct token *token_duplicate( struct token *src_token, unsigned primary,
|
||||
- int impersonation_level, const struct security_descriptor *sd )
|
||||
+ int impersonation_level, const struct security_descriptor *sd,
|
||||
+ const LUID_AND_ATTRIBUTES *filter_privileges, unsigned int priv_count,
|
||||
+ const SID *filter_groups, unsigned int group_count)
|
||||
{
|
||||
const luid_t *modified_id =
|
||||
primary || (impersonation_level == src_token->impersonation_level) ?
|
||||
@@ -663,6 +704,12 @@ struct token *token_duplicate( struct token *src_token, unsigned primary,
|
||||
return NULL;
|
||||
}
|
||||
memcpy( newgroup, group, size );
|
||||
+ if (filter_group( group, filter_groups, group_count ))
|
||||
+ {
|
||||
+ newgroup->enabled = 0;
|
||||
+ newgroup->def = 0;
|
||||
+ newgroup->deny_only = 1;
|
||||
+ }
|
||||
list_add_tail( &token->groups, &newgroup->entry );
|
||||
if (src_token->primary_group == &group->sid)
|
||||
{
|
||||
@@ -674,11 +721,14 @@ struct token *token_duplicate( struct token *src_token, unsigned primary,
|
||||
|
||||
/* copy privileges */
|
||||
LIST_FOR_EACH_ENTRY( privilege, &src_token->privileges, struct privilege, entry )
|
||||
+ {
|
||||
+ if (filter_privilege( privilege, filter_privileges, priv_count )) continue;
|
||||
if (!privilege_add( token, &privilege->luid, privilege->enabled ))
|
||||
{
|
||||
release_object( token );
|
||||
return NULL;
|
||||
}
|
||||
+ }
|
||||
|
||||
if (sd) default_set_sd( &token->obj, sd, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
|
||||
DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION );
|
||||
@@ -1311,7 +1361,7 @@ DECL_HANDLER(duplicate_token)
|
||||
TOKEN_DUPLICATE,
|
||||
&token_ops )))
|
||||
{
|
||||
- struct token *token = token_duplicate( src_token, req->primary, req->impersonation_level, sd );
|
||||
+ struct token *token = token_duplicate( src_token, req->primary, req->impersonation_level, sd, NULL, 0, NULL, 0 );
|
||||
if (token)
|
||||
{
|
||||
reply->new_handle = alloc_handle_no_access_check( current->process, token, req->access, objattr->attributes );
|
||||
@@ -1321,6 +1371,36 @@ DECL_HANDLER(duplicate_token)
|
||||
}
|
||||
}
|
||||
|
||||
+/* creates a restricted version of a token */
|
||||
+DECL_HANDLER(filter_token)
|
||||
+{
|
||||
+ struct token *src_token;
|
||||
+
|
||||
+ if ((src_token = (struct token *)get_handle_obj( current->process, req->handle,
|
||||
+ TOKEN_DUPLICATE,
|
||||
+ &token_ops )))
|
||||
+ {
|
||||
+ const LUID_AND_ATTRIBUTES *filter_privileges = get_req_data();
|
||||
+ unsigned int priv_count, group_count;
|
||||
+ const SID *filter_groups;
|
||||
+ struct token *token;
|
||||
+
|
||||
+ priv_count = min( req->privileges_size, get_req_data_size() ) / sizeof(LUID_AND_ATTRIBUTES);
|
||||
+ filter_groups = (const SID *)((char *)filter_privileges + priv_count * sizeof(LUID_AND_ATTRIBUTES));
|
||||
+ group_count = get_sid_count( filter_groups, get_req_data_size() - priv_count * sizeof(LUID_AND_ATTRIBUTES) );
|
||||
+
|
||||
+ token = token_duplicate( src_token, src_token->primary, src_token->impersonation_level, NULL,
|
||||
+ filter_privileges, priv_count, filter_groups, group_count );
|
||||
+ if (token)
|
||||
+ {
|
||||
+ unsigned int access = get_handle_access( current->process, req->handle );
|
||||
+ reply->new_handle = alloc_handle_no_access_check( current->process, token, access, 0 );
|
||||
+ release_object( token );
|
||||
+ }
|
||||
+ release_object( src_token );
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* checks the specified privileges are held by the token */
|
||||
DECL_HANDLER(check_token_privileges)
|
||||
{
|
||||
--
|
||||
2.27.0
|
||||
|
@@ -1,132 +0,0 @@
|
||||
From 3c1f5962482e7acf531f57f49d923d9c4e5278b1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Fri, 4 Aug 2017 02:51:57 +0200
|
||||
Subject: [PATCH] advapi32: Implement CreateRestrictedToken.
|
||||
|
||||
---
|
||||
dlls/kernelbase/security.c | 103 ++++++++++++++++++++++++++++++-------
|
||||
1 file changed, 84 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernelbase/security.c b/dlls/kernelbase/security.c
|
||||
index 2e75e81ed77..97f6ee6a2fd 100644
|
||||
--- a/dlls/kernelbase/security.c
|
||||
+++ b/dlls/kernelbase/security.c
|
||||
@@ -592,31 +592,96 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static BOOL allocate_groups(TOKEN_GROUPS **groups_ret, SID_AND_ATTRIBUTES *sids, DWORD count)
|
||||
+{
|
||||
+ TOKEN_GROUPS *groups;
|
||||
+ DWORD i;
|
||||
+
|
||||
+ if (!count)
|
||||
+ {
|
||||
+ *groups_ret = NULL;
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+
|
||||
+ groups = (TOKEN_GROUPS *)heap_alloc(FIELD_OFFSET(TOKEN_GROUPS, Groups) +
|
||||
+ count * sizeof(SID_AND_ATTRIBUTES));
|
||||
+ if (!groups)
|
||||
+ {
|
||||
+ SetLastError(ERROR_OUTOFMEMORY);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ groups->GroupCount = count;
|
||||
+ for (i = 0; i < count; i++)
|
||||
+ groups->Groups[i] = sids[i];
|
||||
+
|
||||
+ *groups_ret = groups;
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static BOOL allocate_privileges(TOKEN_PRIVILEGES **privileges_ret, LUID_AND_ATTRIBUTES *privs, DWORD count)
|
||||
+{
|
||||
+ TOKEN_PRIVILEGES *privileges;
|
||||
+ DWORD i;
|
||||
+
|
||||
+ if (!count)
|
||||
+ {
|
||||
+ *privileges_ret = NULL;
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+
|
||||
+ privileges = (TOKEN_PRIVILEGES *)heap_alloc(FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges) +
|
||||
+ count * sizeof(LUID_AND_ATTRIBUTES));
|
||||
+ if (!privileges)
|
||||
+ {
|
||||
+ SetLastError(ERROR_OUTOFMEMORY);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ privileges->PrivilegeCount = count;
|
||||
+ for (i = 0; i < count; i++)
|
||||
+ privileges->Privileges[i] = privs[i];
|
||||
+
|
||||
+ *privileges_ret = privileges;
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
/*************************************************************************
|
||||
* CreateRestrictedToken (kernelbase.@)
|
||||
*/
|
||||
-BOOL WINAPI CreateRestrictedToken( HANDLE token, DWORD flags,
|
||||
- DWORD disable_count, PSID_AND_ATTRIBUTES disable_sids,
|
||||
- DWORD delete_count, PLUID_AND_ATTRIBUTES delete_privs,
|
||||
- DWORD restrict_count, PSID_AND_ATTRIBUTES restrict_sids, PHANDLE ret )
|
||||
+BOOL WINAPI CreateRestrictedToken( HANDLE baseToken, DWORD flags,
|
||||
+ DWORD nDisableSids, PSID_AND_ATTRIBUTES disableSids,
|
||||
+ DWORD nDeletePrivs, PLUID_AND_ATTRIBUTES deletePrivs,
|
||||
+ DWORD nRestrictSids, PSID_AND_ATTRIBUTES restrictSids, PHANDLE newToken )
|
||||
{
|
||||
- TOKEN_TYPE type;
|
||||
- SECURITY_IMPERSONATION_LEVEL level = SecurityAnonymous;
|
||||
- DWORD size;
|
||||
+ TOKEN_PRIVILEGES *delete_privs = NULL;
|
||||
+ TOKEN_GROUPS *disable_groups = NULL;
|
||||
+ TOKEN_GROUPS *restrict_sids = NULL;
|
||||
+ BOOL ret = FALSE;
|
||||
|
||||
- FIXME("(%p, 0x%x, %u, %p, %u, %p, %u, %p, %p): stub\n",
|
||||
- token, flags, disable_count, disable_sids, delete_count, delete_privs,
|
||||
- restrict_count, restrict_sids, ret );
|
||||
+ TRACE("(%p, 0x%x, %u, %p, %u, %p, %u, %p, %p)\n",
|
||||
+ baseToken, flags, nDisableSids, disableSids,
|
||||
+ nDeletePrivs, deletePrivs,
|
||||
+ nRestrictSids, restrictSids,
|
||||
+ newToken);
|
||||
+
|
||||
+ if (!allocate_groups(&disable_groups, disableSids, nDisableSids))
|
||||
+ goto done;
|
||||
+
|
||||
+ if (!allocate_privileges(&delete_privs, deletePrivs, nDeletePrivs))
|
||||
+ goto done;
|
||||
+
|
||||
+ if (!allocate_groups(&restrict_sids, restrictSids, nRestrictSids))
|
||||
+ goto done;
|
||||
+
|
||||
+ ret = set_ntstatus(NtFilterToken(baseToken, flags, disable_groups, delete_privs, restrict_sids, newToken));
|
||||
+
|
||||
+done:
|
||||
+ heap_free(disable_groups);
|
||||
+ heap_free(delete_privs);
|
||||
+ heap_free(restrict_sids);
|
||||
+ return ret;
|
||||
|
||||
- size = sizeof(type);
|
||||
- if (!GetTokenInformation( token, TokenType, &type, size, &size )) return FALSE;
|
||||
- if (type == TokenImpersonation)
|
||||
- {
|
||||
- size = sizeof(level);
|
||||
- if (!GetTokenInformation( token, TokenImpersonationLevel, &level, size, &size ))
|
||||
- return FALSE;
|
||||
- }
|
||||
- return DuplicateTokenEx( token, MAXIMUM_ALLOWED, NULL, level, type, ret );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
--
|
||||
2.20.1
|
||||
|
@@ -1 +0,0 @@
|
||||
Fixes: [25834] Implement advapi32.CreateRestrictedToken
|
@@ -1,310 +0,0 @@
|
||||
From 9c61f6acfa2c43e43f07fae1a5cd447573b9529b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sun, 6 Aug 2017 02:08:05 +0200
|
||||
Subject: [PATCH] server: Implement support for creating processes using a
|
||||
token.
|
||||
|
||||
---
|
||||
dlls/kernelbase/process.c | 24 +++++++++++++-----------
|
||||
dlls/ntdll/unix/process.c | 1 +
|
||||
server/process.c | 39 +++++++++++++++++++++++++++++++++++----
|
||||
server/process.h | 2 +-
|
||||
server/protocol.def | 1 +
|
||||
server/request.c | 2 +-
|
||||
server/security.h | 2 ++
|
||||
server/token.c | 11 +++++++++++
|
||||
8 files changed, 65 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
|
||||
index a3b168543fc..b5c8b47239d 100644
|
||||
--- a/dlls/kernelbase/process.c
|
||||
+++ b/dlls/kernelbase/process.c
|
||||
@@ -244,7 +244,7 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename
|
||||
/***********************************************************************
|
||||
* create_nt_process
|
||||
*/
|
||||
-static NTSTATUS create_nt_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
+static NTSTATUS create_nt_process( HANDLE token, SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
BOOL inherit, DWORD flags, RTL_USER_PROCESS_PARAMETERS *params,
|
||||
RTL_USER_PROCESS_INFORMATION *info, HANDLE parent )
|
||||
{
|
||||
@@ -259,7 +259,7 @@ static NTSTATUS create_nt_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES
|
||||
status = RtlCreateUserProcess( &nameW, OBJ_CASE_INSENSITIVE, params,
|
||||
psa ? psa->lpSecurityDescriptor : NULL,
|
||||
tsa ? tsa->lpSecurityDescriptor : NULL,
|
||||
- parent, inherit, 0, 0, info );
|
||||
+ parent, inherit, 0, token, info );
|
||||
RtlFreeUnicodeString( &nameW );
|
||||
}
|
||||
return status;
|
||||
@@ -269,7 +269,7 @@ static NTSTATUS create_nt_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES
|
||||
/***********************************************************************
|
||||
* create_vdm_process
|
||||
*/
|
||||
-static NTSTATUS create_vdm_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
+static NTSTATUS create_vdm_process( HANDLE token, SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
BOOL inherit, DWORD flags, RTL_USER_PROCESS_PARAMETERS *params,
|
||||
RTL_USER_PROCESS_INFORMATION *info )
|
||||
{
|
||||
@@ -290,7 +290,7 @@ static NTSTATUS create_vdm_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTE
|
||||
winevdm, params->ImagePathName.Buffer, params->CommandLine.Buffer );
|
||||
RtlInitUnicodeString( ¶ms->ImagePathName, winevdm );
|
||||
RtlInitUnicodeString( ¶ms->CommandLine, newcmdline );
|
||||
- status = create_nt_process( psa, tsa, inherit, flags, params, info, NULL );
|
||||
+ status = create_nt_process( token, psa, tsa, inherit, flags, params, info, NULL );
|
||||
HeapFree( GetProcessHeap(), 0, newcmdline );
|
||||
return status;
|
||||
}
|
||||
@@ -299,7 +299,7 @@ static NTSTATUS create_vdm_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTE
|
||||
/***********************************************************************
|
||||
* create_cmd_process
|
||||
*/
|
||||
-static NTSTATUS create_cmd_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
+static NTSTATUS create_cmd_process( HANDLE token, SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTES *tsa,
|
||||
BOOL inherit, DWORD flags, RTL_USER_PROCESS_PARAMETERS *params,
|
||||
RTL_USER_PROCESS_INFORMATION *info )
|
||||
{
|
||||
@@ -318,7 +318,7 @@ static NTSTATUS create_cmd_process( SECURITY_ATTRIBUTES *psa, SECURITY_ATTRIBUTE
|
||||
swprintf( newcmdline, len, L"%s /s/c \"%s\"", comspec, params->CommandLine.Buffer );
|
||||
RtlInitUnicodeString( ¶ms->ImagePathName, comspec );
|
||||
RtlInitUnicodeString( ¶ms->CommandLine, newcmdline );
|
||||
- status = create_nt_process( psa, tsa, inherit, flags, params, info, NULL );
|
||||
+ status = create_nt_process( token, psa, tsa, inherit, flags, params, info, NULL );
|
||||
RtlFreeHeap( GetProcessHeap(), 0, newcmdline );
|
||||
return status;
|
||||
}
|
||||
@@ -450,7 +450,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
|
||||
|
||||
TRACE( "app %s cmdline %s\n", debugstr_w(app_name), debugstr_w(cmd_line) );
|
||||
|
||||
- if (token) FIXME( "Creating a process with a token is not yet implemented\n" );
|
||||
+ /* FIXME: Starting a process which requires admin rights should fail
|
||||
+ * with ERROR_ELEVATION_REQUIRED when no token is passed. */
|
||||
+
|
||||
if (new_token) FIXME( "No support for returning created process token\n" );
|
||||
|
||||
if (app_name)
|
||||
@@ -523,7 +525,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
|
||||
}
|
||||
}
|
||||
|
||||
- status = create_nt_process( process_attr, thread_attr, inherit, flags, params, &rtl_info, parent );
|
||||
+ status = create_nt_process( token, process_attr, thread_attr, inherit, flags, params, &rtl_info, parent );
|
||||
switch (status)
|
||||
{
|
||||
case STATUS_SUCCESS:
|
||||
@@ -532,7 +534,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
|
||||
case STATUS_INVALID_IMAGE_NE_FORMAT:
|
||||
case STATUS_INVALID_IMAGE_PROTECT:
|
||||
TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(app_name) );
|
||||
- status = create_vdm_process( process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
+ status = create_vdm_process( token, process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
break;
|
||||
case STATUS_INVALID_IMAGE_NOT_MZ:
|
||||
/* check for .com or .bat extension */
|
||||
@@ -540,12 +542,12 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
|
||||
if (!wcsicmp( p, L".com" ) || !wcsicmp( p, L".pif" ))
|
||||
{
|
||||
TRACE( "starting %s as DOS binary\n", debugstr_w(app_name) );
|
||||
- status = create_vdm_process( process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
+ status = create_vdm_process( token, process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
}
|
||||
else if (!wcsicmp( p, L".bat" ) || !wcsicmp( p, L".cmd" ))
|
||||
{
|
||||
TRACE( "starting %s as batch binary\n", debugstr_w(app_name) );
|
||||
- status = create_cmd_process( process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
+ status = create_cmd_process( token, process_attr, thread_attr, inherit, flags, params, &rtl_info );
|
||||
}
|
||||
break;
|
||||
}
|
||||
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
|
||||
index cca6c2747bf..379a0036b63 100644
|
||||
--- a/dlls/ntdll/unix/process.c
|
||||
+++ b/dlls/ntdll/unix/process.c
|
||||
@@ -827,6 +827,7 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
|
||||
req->access = process_access;
|
||||
req->cpu = pe_info.cpu;
|
||||
req->info_size = startup_info_size;
|
||||
+ req->token = wine_server_obj_handle( token );
|
||||
wine_server_add_data( req, objattr, attr_len );
|
||||
wine_server_add_data( req, startup_info, startup_info_size );
|
||||
wine_server_add_data( req, params->Environment, env_size );
|
||||
diff --git a/server/process.c b/server/process.c
|
||||
index 52604ec4d61..047916ffd09 100644
|
||||
--- a/server/process.c
|
||||
+++ b/server/process.c
|
||||
@@ -499,7 +499,7 @@ static void start_sigkill_timer( struct process *process )
|
||||
/* create a new process */
|
||||
/* if the function fails the fd is closed */
|
||||
struct process *create_process( int fd, struct process *parent, int inherit_all,
|
||||
- const struct security_descriptor *sd )
|
||||
+ const struct security_descriptor *sd, struct token *token )
|
||||
{
|
||||
struct process *process;
|
||||
|
||||
@@ -576,7 +576,7 @@ struct process *create_process( int fd, struct process *parent, int inherit_all,
|
||||
: alloc_handle_table( process, 0 );
|
||||
/* Note: for security reasons, starting a new process does not attempt
|
||||
* to use the current impersonation token for the new process */
|
||||
- process->token = token_duplicate( parent->token, TRUE, 0, NULL, NULL, 0, NULL, 0 );
|
||||
+ process->token = token_duplicate( token ? token : parent->token, TRUE, 0, NULL, NULL, 0, NULL, 0 );
|
||||
process->affinity = parent->affinity;
|
||||
}
|
||||
if (!process->handles || !process->token) goto error;
|
||||
@@ -1132,6 +1132,7 @@ DECL_HANDLER(new_process)
|
||||
const struct security_descriptor *sd;
|
||||
const struct object_attributes *objattr = get_req_object_attributes( &sd, &name, NULL );
|
||||
struct process *process = NULL;
|
||||
+ struct token *token = NULL;
|
||||
struct process *parent;
|
||||
struct thread *parent_thread = current;
|
||||
int socket_fd = thread_get_inflight_fd( current, req->socket_fd );
|
||||
@@ -1185,10 +1186,39 @@ DECL_HANDLER(new_process)
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (req->token)
|
||||
+ {
|
||||
+ token = get_token_from_handle( req->token, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY );
|
||||
+ if (!token)
|
||||
+ {
|
||||
+ close( socket_fd );
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!token_is_primary( token ))
|
||||
+ {
|
||||
+ set_error( STATUS_BAD_TOKEN_TYPE );
|
||||
+ release_object( token );
|
||||
+ close( socket_fd );
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!req->info_size) /* create an orphaned process */
|
||||
+ {
|
||||
+ if ((process = create_process( socket_fd, NULL, 0, sd, token )))
|
||||
+ {
|
||||
+ create_thread( -1, process, NULL );
|
||||
+ release_object( process );
|
||||
+ }
|
||||
+ if (token) release_object( token );
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
/* build the startup info for a new process */
|
||||
if (!(info = alloc_object( &startup_info_ops )))
|
||||
{
|
||||
close( socket_fd );
|
||||
+ if (token) release_object( token );
|
||||
release_object( parent );
|
||||
return;
|
||||
}
|
||||
@@ -1236,7 +1266,7 @@ DECL_HANDLER(new_process)
|
||||
#undef FIXUP_LEN
|
||||
}
|
||||
|
||||
- if (!(process = create_process( socket_fd, parent, req->inherit_all, sd ))) goto done;
|
||||
+ if (!(process = create_process( socket_fd, parent, req->inherit_all, sd, token ))) goto done;
|
||||
|
||||
process->startup_info = (struct startup_info *)grab_object( info );
|
||||
|
||||
@@ -1297,6 +1327,7 @@ DECL_HANDLER(new_process)
|
||||
reply->handle = alloc_handle_no_access_check( current->process, process, req->access, objattr->attributes );
|
||||
|
||||
done:
|
||||
+ if (token) release_object( token );
|
||||
if (process) release_object( process );
|
||||
release_object( parent );
|
||||
release_object( info );
|
||||
@@ -1330,7 +1361,7 @@ DECL_HANDLER(exec_process)
|
||||
close( socket_fd );
|
||||
return;
|
||||
}
|
||||
- if (!(process = create_process( socket_fd, NULL, 0, NULL ))) return;
|
||||
+ if (!(process = create_process( socket_fd, NULL, 0, NULL, NULL ))) return;
|
||||
create_thread( -1, process, NULL );
|
||||
release_object( process );
|
||||
}
|
||||
diff --git a/server/process.h b/server/process.h
|
||||
index dfe5c4e52d8..61b83abf693 100644
|
||||
--- a/server/process.h
|
||||
+++ b/server/process.h
|
||||
@@ -118,7 +118,7 @@ extern unsigned int alloc_ptid( void *ptr );
|
||||
extern void free_ptid( unsigned int id );
|
||||
extern void *get_ptid_entry( unsigned int id );
|
||||
extern struct process *create_process( int fd, struct process *parent, int inherit_all,
|
||||
- const struct security_descriptor *sd );
|
||||
+ const struct security_descriptor *sd, struct token *token );
|
||||
extern data_size_t init_process( struct thread *thread );
|
||||
extern struct thread *get_process_first_thread( struct process *process );
|
||||
extern struct process *get_process_from_id( process_id_t id );
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 901c380b721..8c86967609f 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -801,6 +801,7 @@ struct rawinput_device
|
||||
unsigned int access; /* access rights for process object */
|
||||
client_cpu_t cpu; /* CPU that the new process will use */
|
||||
data_size_t info_size; /* size of startup info */
|
||||
+ obj_handle_t token; /* token for the new process */
|
||||
VARARG(objattr,object_attributes); /* object attributes */
|
||||
VARARG(info,startup_info,info_size); /* startup information */
|
||||
VARARG(env,unicode_str); /* environment for new process */
|
||||
diff --git a/server/request.c b/server/request.c
|
||||
index 4c1f30a5fe7..321bb6cfa81 100644
|
||||
--- a/server/request.c
|
||||
+++ b/server/request.c
|
||||
@@ -582,7 +582,7 @@ static void master_socket_poll_event( struct fd *fd, int event )
|
||||
int client = accept( get_unix_fd( master_socket->fd ), (struct sockaddr *) &dummy, &len );
|
||||
if (client == -1) return;
|
||||
fcntl( client, F_SETFL, O_NONBLOCK );
|
||||
- if ((process = create_process( client, NULL, 0, NULL )))
|
||||
+ if ((process = create_process( client, NULL, 0, NULL, NULL )))
|
||||
{
|
||||
create_thread( -1, process, NULL );
|
||||
release_object( process );
|
||||
diff --git a/server/security.h b/server/security.h
|
||||
index 21e90ccf23f..32dfe5f8db9 100644
|
||||
--- a/server/security.h
|
||||
+++ b/server/security.h
|
||||
@@ -67,6 +67,8 @@ extern const ACL *token_get_default_dacl( struct token *token );
|
||||
extern const SID *token_get_user( struct token *token );
|
||||
extern const SID *token_get_primary_group( struct token *token );
|
||||
extern int token_sid_present( struct token *token, const SID *sid, int deny);
|
||||
+extern struct token *get_token_from_handle( obj_handle_t handle, unsigned int access );
|
||||
+extern int token_is_primary( struct token *token );
|
||||
|
||||
static inline const ACE_HEADER *ace_next( const ACE_HEADER *ace )
|
||||
{
|
||||
diff --git a/server/token.c b/server/token.c
|
||||
index 1c1d49989b3..2f466aa1b25 100644
|
||||
--- a/server/token.c
|
||||
+++ b/server/token.c
|
||||
@@ -843,6 +843,12 @@ int token_assign_label( struct token *token, PSID label )
|
||||
return ret;
|
||||
}
|
||||
|
||||
+struct token *get_token_from_handle( obj_handle_t handle, unsigned int access )
|
||||
+{
|
||||
+ return (struct token *)get_handle_obj( current->process, handle,
|
||||
+ access, &token_ops );
|
||||
+}
|
||||
+
|
||||
struct token *token_create_admin( void )
|
||||
{
|
||||
struct token *token = NULL;
|
||||
@@ -1269,6 +1275,11 @@ const SID *token_get_primary_group( struct token *token )
|
||||
return token->primary_group;
|
||||
}
|
||||
|
||||
+int token_is_primary( struct token *token )
|
||||
+{
|
||||
+ return token->primary;
|
||||
+}
|
||||
+
|
||||
int check_object_access(struct object *obj, unsigned int *access)
|
||||
{
|
||||
GENERIC_MAPPING mapping;
|
||||
--
|
||||
2.27.0
|
||||
|
@@ -1,6 +1,5 @@
|
||||
Fixes: [40613] Basic implementation for token integrity levels and UAC handling
|
||||
Fixes: [39262] Run explorer.exe as unevaluated process
|
||||
Depends: advapi32-CreateRestrictedToken
|
||||
Depends: Staging
|
||||
# Broken due to ntdll.so <- ntdll.dll imports. This isn't particularly difficult
|
||||
# to fix, but it was already broken for some more obscure reason, and the whole
|
||||
|
@@ -1,6 +1,6 @@
|
||||
From e9505756537aca02b463864d632249d8d3056a3c Mon Sep 17 00:00:00 2001
|
||||
From 01cf21eb49307de6b0eb5445b9befdf8f585e3f7 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Henrie <alexhenrie24@gmail.com>
|
||||
Date: Mon, 31 Aug 2020 01:42:43 -0600
|
||||
Date: Sat, 12 Sep 2020 01:45:02 -0600
|
||||
Subject: [PATCH] wine.inf: Add sRGB color profile
|
||||
|
||||
"This profile is made available by the International Color Consortium,
|
||||
@@ -17,15 +17,15 @@ Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
|
||||
Makefile.in | 1 +
|
||||
color/Makefile.in | 2 ++
|
||||
color/sRGB_Color_Space_Profile.icm | Bin 0 -> 3024 bytes
|
||||
configure.ac | 1 +
|
||||
configure.ac | 2 ++
|
||||
loader/wine.inf.in | 14 +++++++++-----
|
||||
tools/makedep.c | 12 ++++++++++++
|
||||
6 files changed, 25 insertions(+), 5 deletions(-)
|
||||
6 files changed, 26 insertions(+), 5 deletions(-)
|
||||
create mode 100644 color/Makefile.in
|
||||
create mode 100644 color/sRGB_Color_Space_Profile.icm
|
||||
|
||||
diff --git a/Makefile.in b/Makefile.in
|
||||
index 5c6a3e30c59..36b89e45768 100644
|
||||
index 307a95b3b1..367bc3fe77 100644
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -27,6 +27,7 @@ datarootdir = @datarootdir@
|
||||
@@ -38,7 +38,7 @@ index 5c6a3e30c59..36b89e45768 100644
|
||||
dlldir = ${libdir}/wine
|
||||
diff --git a/color/Makefile.in b/color/Makefile.in
|
||||
new file mode 100644
|
||||
index 00000000000..f9f6f62a3b1
|
||||
index 0000000000..f9f6f62a3b
|
||||
--- /dev/null
|
||||
+++ b/color/Makefile.in
|
||||
@@ -0,0 +1,2 @@
|
||||
@@ -104,10 +104,10 @@ literal 0
|
||||
HcmV?d00001
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 21b9bd113ed..ffe287aeb80 100644
|
||||
index 20ae7577fa..c615f1bfe0 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2870,6 +2870,7 @@ depend: \$(MAKEDEP) dummy
|
||||
@@ -2810,6 +2810,7 @@ dummy:
|
||||
WINE_CONFIG_SYMLINK(wine,tools/winewrapper)
|
||||
WINE_CONFIG_SYMLINK(wine64,tools/winewrapper,["x$enable_win64" != xno -o -n "$with_wine64"])
|
||||
|
||||
@@ -115,8 +115,16 @@ index 21b9bd113ed..ffe287aeb80 100644
|
||||
WINE_CONFIG_MAKEFILE(dlls/acledit)
|
||||
WINE_CONFIG_MAKEFILE(dlls/aclui)
|
||||
WINE_CONFIG_MAKEFILE(dlls/activeds.tlb)
|
||||
@@ -4146,6 +4147,7 @@ clean::
|
||||
else
|
||||
TOP_INSTALL_DEV="$TOP_INSTALL_DEV include"
|
||||
TOP_INSTALL_LIB="$TOP_INSTALL_LIB \
|
||||
+color \
|
||||
fonts \
|
||||
loader/wine.inf \
|
||||
loader/winebus.inf \
|
||||
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
|
||||
index 41471d3168e..879c1038a95 100644
|
||||
index cd0e7bd16f..f84567c13e 100644
|
||||
--- a/loader/wine.inf.in
|
||||
+++ b/loader/wine.inf.in
|
||||
@@ -30,7 +30,7 @@ signature="$CHICAGO$"
|
||||
@@ -128,7 +136,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
AddReg=\
|
||||
Classes,\
|
||||
ContentIndex,\
|
||||
@@ -55,7 +55,7 @@ AddReg=\
|
||||
@@ -54,7 +54,7 @@ AddReg=\
|
||||
RegisterDlls=RegisterDllsSection
|
||||
WineFakeDlls=FakeDllsWin32,FakeDlls
|
||||
UpdateInis=SystemIni
|
||||
@@ -137,7 +145,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
AddReg=\
|
||||
Classes,\
|
||||
ContentIndex,\
|
||||
@@ -82,7 +82,7 @@ RegisterDlls=RegisterDllsSection
|
||||
@@ -80,7 +80,7 @@ RegisterDlls=RegisterDllsSection
|
||||
WineFakeDlls=FakeDllsWin64,FakeDlls
|
||||
WinePreInstall=Wow64
|
||||
UpdateInis=SystemIni
|
||||
@@ -146,7 +154,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
AddReg=\
|
||||
Classes,\
|
||||
ContentIndex,\
|
||||
@@ -110,7 +110,7 @@ RegisterDlls=RegisterDllsSection
|
||||
@@ -107,7 +107,7 @@ RegisterDlls=RegisterDllsSection
|
||||
WineFakeDlls=FakeDllsWin64,FakeDlls
|
||||
WinePreInstall=Wow64
|
||||
UpdateInis=SystemIni
|
||||
@@ -155,7 +163,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
AddReg=\
|
||||
Classes,\
|
||||
ContentIndex,\
|
||||
@@ -2949,7 +2949,6 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
|
||||
@@ -2670,7 +2670,6 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
|
||||
11,catroot,
|
||||
11,mui,
|
||||
11,tasks,
|
||||
@@ -163,7 +171,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
11,spool\printers,
|
||||
10,,explorer.exe
|
||||
10,,hh.exe
|
||||
@@ -4167,6 +4166,9 @@ HKLM,Software\Wine\LicenseInformation,"Shell-InBoxGames-Solitaire-EnableGame",0x
|
||||
@@ -3886,6 +3885,9 @@ HKLM,Software\Wine\LicenseInformation,"Shell-InBoxGames-Solitaire-EnableGame",0x
|
||||
HKLM,Software\Wine\LicenseInformation,"Shell-InBoxGames-SpiderSolitaire-EnableGame",0x10001,0x00000001
|
||||
HKLM,Software\Wine\LicenseInformation,"Shell-PremiumInBoxGames-Chess-EnableGame",0x10001,0x00000001
|
||||
|
||||
@@ -173,7 +181,7 @@ index 41471d3168e..879c1038a95 100644
|
||||
[InfFiles]
|
||||
winebus.inf
|
||||
winehid.inf
|
||||
@@ -4249,10 +4251,12 @@ normnfkd.nls
|
||||
@@ -3968,10 +3970,12 @@ normnfkd.nls
|
||||
sortdefault.nls
|
||||
|
||||
[WineSourceDirs]
|
||||
@@ -187,10 +195,10 @@ index 41471d3168e..879c1038a95 100644
|
||||
NlsFiles = 11
|
||||
SortFiles = 10,globalization\sorting
|
||||
diff --git a/tools/makedep.c b/tools/makedep.c
|
||||
index 023ac6b8573..d35d08c0dca 100644
|
||||
index 7fe2c4daf5..aa188d6fe5 100644
|
||||
--- a/tools/makedep.c
|
||||
+++ b/tools/makedep.c
|
||||
@@ -2992,6 +2992,17 @@ static void output_source_svg( struct makefile *make, struct incl_file *source,
|
||||
@@ -2955,6 +2955,17 @@ static void output_source_svg( struct makefile *make, struct incl_file *source,
|
||||
}
|
||||
|
||||
|
||||
@@ -208,7 +216,7 @@ index 023ac6b8573..d35d08c0dca 100644
|
||||
/*******************************************************************
|
||||
* output_source_nls
|
||||
*/
|
||||
@@ -3209,6 +3220,7 @@ static const struct
|
||||
@@ -3171,6 +3182,7 @@ static const struct
|
||||
{ "tlb", output_source_tlb },
|
||||
{ "sfd", output_source_sfd },
|
||||
{ "svg", output_source_svg },
|
||||
|
@@ -1,2 +1 @@
|
||||
Fixes: [37396] Add sRGB color profile.
|
||||
Disabled: True
|
||||
|
@@ -16,7 +16,7 @@ index 076c50323dda..ddb69c96dd42 100644
|
||||
MODULE = dbghelp.dll
|
||||
IMPORTLIB = dbghelp
|
||||
-EXTRADEFS = -D_IMAGEHLP_SOURCE_
|
||||
+EXTRADEFS = -D_IMAGEHLP_SOURCE_ -DBINDIR="\"${bindir}\""
|
||||
+EXTRADEFS = -D_IMAGEHLP_SOURCE_ -DBINDIR="L\"${bindir}\""
|
||||
DELAYIMPORTS = version
|
||||
|
||||
EXTRADLLFLAGS = -mno-cygwin
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 95aeebee8fa45177e8b721aca8528d7b89c19054 Mon Sep 17 00:00:00 2001
|
||||
From c37ee83fb56f540a9fcb04c800ca3a6e94295e29 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 4 Feb 2017 16:20:37 +0100
|
||||
Subject: [PATCH] kernel32: Implement some processor group functions.
|
||||
@@ -38,7 +38,7 @@ index 4998af04d9b..5ce8e24713b 100644
|
||||
@ stdcall GetNamedPipeServerProcessId(long ptr) kernel32.GetNamedPipeServerProcessId
|
||||
@ stdcall GetNumaAvailableMemoryNodeEx(long ptr) kernel32.GetNumaAvailableMemoryNodeEx
|
||||
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
|
||||
index 5671ae7e93d..188c62636e6 100644
|
||||
index 4b09f359b97..c1bb03080c7 100644
|
||||
--- a/dlls/kernel32/kernel32.spec
|
||||
+++ b/dlls/kernel32/kernel32.spec
|
||||
@@ -719,7 +719,7 @@
|
||||
@@ -51,10 +51,10 @@ index 5671ae7e93d..188c62636e6 100644
|
||||
@ stdcall -import GetModuleFileNameW(long ptr long)
|
||||
@ stdcall -import GetModuleHandleA(str)
|
||||
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
|
||||
index 0cf45faf0f3..afed492873c 100644
|
||||
index ff4e79ff2b7..c0d1d8b9294 100644
|
||||
--- a/dlls/kernel32/process.c
|
||||
+++ b/dlls/kernel32/process.c
|
||||
@@ -726,7 +726,9 @@ HRESULT WINAPI RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK
|
||||
@@ -624,7 +624,9 @@ HRESULT WINAPI RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK
|
||||
*/
|
||||
WORD WINAPI GetActiveProcessorGroupCount(void)
|
||||
{
|
||||
@@ -65,7 +65,7 @@ index 0cf45faf0f3..afed492873c 100644
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -735,10 +737,14 @@ WORD WINAPI GetActiveProcessorGroupCount(void)
|
||||
@@ -633,10 +635,14 @@ WORD WINAPI GetActiveProcessorGroupCount(void)
|
||||
*/
|
||||
DWORD WINAPI GetActiveProcessorCount(WORD group)
|
||||
{
|
||||
@@ -83,7 +83,7 @@ index 0cf45faf0f3..afed492873c 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -752,6 +758,18 @@ DWORD WINAPI GetMaximumProcessorCount(WORD group)
|
||||
@@ -650,6 +656,18 @@ DWORD WINAPI GetMaximumProcessorCount(WORD group)
|
||||
return cpus;
|
||||
}
|
||||
|
||||
@@ -103,10 +103,10 @@ index 0cf45faf0f3..afed492873c 100644
|
||||
* GetFirmwareEnvironmentVariableA (KERNEL32.@)
|
||||
*/
|
||||
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
|
||||
index 5bd7b71d63e..58ccbfbdacc 100644
|
||||
index 109322d6844..bdcbd4329b8 100644
|
||||
--- a/dlls/kernel32/tests/process.c
|
||||
+++ b/dlls/kernel32/tests/process.c
|
||||
@@ -93,6 +93,7 @@ static SIZE_T (WINAPI *pGetLargePageMinimum)(void);
|
||||
@@ -90,6 +90,7 @@ static SIZE_T (WINAPI *pGetLargePageMinimum)(void);
|
||||
static BOOL (WINAPI *pInitializeProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD, SIZE_T*);
|
||||
static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD_PTR, void *,SIZE_T,void*,SIZE_T*);
|
||||
static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*);
|
||||
@@ -114,7 +114,7 @@ index 5bd7b71d63e..58ccbfbdacc 100644
|
||||
|
||||
/* ############################### */
|
||||
static char base[MAX_PATH];
|
||||
@@ -276,6 +277,7 @@ static BOOL init(void)
|
||||
@@ -270,6 +271,7 @@ static BOOL init(void)
|
||||
pInitializeProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "InitializeProcThreadAttributeList");
|
||||
pUpdateProcThreadAttribute = (void *)GetProcAddress(hkernel32, "UpdateProcThreadAttribute");
|
||||
pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList");
|
||||
@@ -122,8 +122,8 @@ index 5bd7b71d63e..58ccbfbdacc 100644
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -4185,6 +4187,26 @@ void test_parent_process_attribute(unsigned int level, HANDLE read_pipe)
|
||||
}
|
||||
@@ -4139,6 +4141,26 @@ static void test_handle_list_attribute(BOOL child, HANDLE handle1, HANDLE handle
|
||||
CloseHandle(pipe[1]);
|
||||
}
|
||||
|
||||
+static void test_GetActiveProcessorCount(void)
|
||||
@@ -148,8 +148,8 @@ index 5bd7b71d63e..58ccbfbdacc 100644
|
||||
+
|
||||
START_TEST(process)
|
||||
{
|
||||
HANDLE job;
|
||||
@@ -4296,6 +4318,7 @@ START_TEST(process)
|
||||
HANDLE job, hproc, h, h2;
|
||||
@@ -4254,6 +4276,7 @@ START_TEST(process)
|
||||
test_GetNumaProcessorNode();
|
||||
test_session_info();
|
||||
test_GetLogicalProcessorInformationEx();
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 7595b344c4fc7d03f07a163b3f2f0b38123f7264 Mon Sep 17 00:00:00 2001
|
||||
From 5a1737e74415871fd5b0646ece31f191fa74bb69 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Tue, 9 Jul 2019 14:13:28 +1000
|
||||
Subject: [PATCH] user32: Improve GetKeyboardLayoutList
|
||||
@@ -6,15 +6,15 @@ Subject: [PATCH] user32: Improve GetKeyboardLayoutList
|
||||
This function returns the current list of *installed* Keyboard layouts
|
||||
not the complete list from the registry.
|
||||
---
|
||||
dlls/user32/driver.c | 27 ---------------------------
|
||||
dlls/user32/driver.c | 26 --------------------------
|
||||
dlls/user32/tests/input.c | 35 +++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 35 insertions(+), 27 deletions(-)
|
||||
2 files changed, 35 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
|
||||
index 6d916c7d65d..b9e0dc60e7c 100644
|
||||
index 8ff6b0a817e..ddf00cfd7b5 100644
|
||||
--- a/dlls/user32/driver.c
|
||||
+++ b/dlls/user32/driver.c
|
||||
@@ -210,12 +210,9 @@ static void CDECL nulldrv_Beep(void)
|
||||
@@ -198,8 +198,6 @@ static void CDECL nulldrv_Beep(void)
|
||||
|
||||
static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
|
||||
{
|
||||
@@ -23,16 +23,12 @@ index 6d916c7d65d..b9e0dc60e7c 100644
|
||||
INT count = 0;
|
||||
ULONG_PTR baselayout;
|
||||
LANGID langid;
|
||||
- static const WCHAR szKeyboardReg[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','K','e','y','b','o','a','r','d',' ','L','a','y','o','u','t','s',0};
|
||||
|
||||
baselayout = GetUserDefaultLCID();
|
||||
langid = PRIMARYLANGID(LANGIDFROMLCID(baselayout));
|
||||
@@ -224,30 +221,6 @@ static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
|
||||
@@ -211,30 +209,6 @@ static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
|
||||
else
|
||||
baselayout |= baselayout << 16;
|
||||
|
||||
- /* Enumerate the Registry */
|
||||
- rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,szKeyboardReg,&hKeyKeyboard);
|
||||
- rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,L"System\\CurrentControlSet\\Control\\Keyboard Layouts",&hKeyKeyboard);
|
||||
- if (rc == ERROR_SUCCESS)
|
||||
- {
|
||||
- do {
|
||||
@@ -41,7 +37,7 @@ index 6d916c7d65d..b9e0dc60e7c 100644
|
||||
- rc = RegEnumKeyW(hKeyKeyboard, count, szKeyName, 9);
|
||||
- if (rc == ERROR_SUCCESS)
|
||||
- {
|
||||
- layout = (HKL)(ULONG_PTR)strtoulW(szKeyName,NULL,16);
|
||||
- layout = (HKL)(ULONG_PTR)wcstoul(szKeyName,NULL,16);
|
||||
- if (baselayout != 0 && layout == (HKL)baselayout)
|
||||
- baselayout = 0; /* found in the registry do not add again */
|
||||
- if (size && layouts)
|
||||
@@ -59,10 +55,10 @@ index 6d916c7d65d..b9e0dc60e7c 100644
|
||||
if (baselayout != 0)
|
||||
{
|
||||
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
|
||||
index bab0fd97536..ea0cac6d18a 100644
|
||||
index 1809c147cbd..fd8f26e9ee4 100644
|
||||
--- a/dlls/user32/tests/input.c
|
||||
+++ b/dlls/user32/tests/input.c
|
||||
@@ -3706,6 +3706,40 @@ static void test_UnregisterDeviceNotification(void)
|
||||
@@ -3791,6 +3791,40 @@ static void test_UnregisterDeviceNotification(void)
|
||||
ok(ret == FALSE, "Unregistering NULL Device Notification returned: %d\n", ret);
|
||||
}
|
||||
|
||||
@@ -103,7 +99,7 @@ index bab0fd97536..ea0cac6d18a 100644
|
||||
START_TEST(input)
|
||||
{
|
||||
char **argv;
|
||||
@@ -3741,6 +3775,7 @@ START_TEST(input)
|
||||
@@ -3826,6 +3860,7 @@ START_TEST(input)
|
||||
test_GetRawInputBuffer();
|
||||
test_RegisterRawInputDevices();
|
||||
test_rawinput(argv[0]);
|
||||
@@ -112,5 +108,5 @@ index bab0fd97536..ea0cac6d18a 100644
|
||||
if(pGetMouseMovePointsEx)
|
||||
test_GetMouseMovePointsEx();
|
||||
--
|
||||
2.27.0
|
||||
2.28.0
|
||||
|
||||
|
@@ -1,19 +1,19 @@
|
||||
From 7824e15960e00ffb11adae1a1e683aa1487f6317 Mon Sep 17 00:00:00 2001
|
||||
From 197e9857c0d65098111273e1d3219ac90f4896d2 Mon Sep 17 00:00:00 2001
|
||||
From: Derek Lesho <dlesho@codeweavers.com>
|
||||
Date: Wed, 29 Jan 2020 15:37:39 -0600
|
||||
Subject: [PATCH 23/52] tools: Add support for multiple parent directories.
|
||||
Subject: [PATCH] tools: Add support for multiple parent directories.
|
||||
|
||||
Signed-off-by: Derek Lesho <dlesho@codeweavers.com>
|
||||
---
|
||||
tools/make_makefiles | 45 +++++++++++++++++++++++++++-----------------
|
||||
tools/makedep.c | 30 ++++++++++++++++++++---------
|
||||
2 files changed, 49 insertions(+), 26 deletions(-)
|
||||
tools/makedep.c | 26 +++++++++++++++++--------
|
||||
2 files changed, 46 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/tools/make_makefiles b/tools/make_makefiles
|
||||
index c18fa90e2d3..1e34a280a40 100755
|
||||
index a92987c2ab5..6bc1b47ca5d 100755
|
||||
--- a/tools/make_makefiles
|
||||
+++ b/tools/make_makefiles
|
||||
@@ -231,14 +231,14 @@ sub parse_makefile($)
|
||||
@@ -230,14 +230,14 @@ sub parse_makefile($)
|
||||
{
|
||||
die "Configure substitution is not allowed in $file" unless $file eq "Makefile";
|
||||
}
|
||||
@@ -30,7 +30,7 @@ index c18fa90e2d3..1e34a280a40 100755
|
||||
{
|
||||
my $var = $1;
|
||||
my @list = split(/\s+/, $2);
|
||||
@@ -293,19 +293,27 @@ sub get_makedep_flags($)
|
||||
@@ -292,19 +292,27 @@ sub get_makedep_flags($)
|
||||
return %flags;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ index c18fa90e2d3..1e34a280a40 100755
|
||||
}
|
||||
|
||||
# preserve shared source files that are listed in the existing makefile
|
||||
@@ -410,13 +418,16 @@ sub assign_sources_to_makefiles(@)
|
||||
@@ -409,13 +417,16 @@ sub assign_sources_to_makefiles(@)
|
||||
foreach my $file (@makefiles)
|
||||
{
|
||||
my $make = $makefiles{$file};
|
||||
@@ -91,28 +91,25 @@ index c18fa90e2d3..1e34a280a40 100755
|
||||
}
|
||||
|
||||
diff --git a/tools/makedep.c b/tools/makedep.c
|
||||
index 4bd20d469d6..a67add38afa 100644
|
||||
index 7fe2c4daf54..55a52603820 100644
|
||||
--- a/tools/makedep.c
|
||||
+++ b/tools/makedep.c
|
||||
@@ -184,6 +184,7 @@ struct makefile
|
||||
@@ -184,11 +184,11 @@ struct makefile
|
||||
struct strarray install_dev;
|
||||
struct strarray extra_targets;
|
||||
struct strarray extra_imports;
|
||||
+ struct strarray parent_dirs;
|
||||
struct list sources;
|
||||
struct list includes;
|
||||
const char *base_dir;
|
||||
@@ -191,7 +192,6 @@ struct makefile
|
||||
const char *src_dir;
|
||||
const char *obj_dir;
|
||||
const char *top_src_dir;
|
||||
const char *top_obj_dir;
|
||||
- const char *parent_dir;
|
||||
const char *module;
|
||||
const char *testdll;
|
||||
const char *sharedlib;
|
||||
@@ -1376,15 +1376,24 @@ static struct file *open_local_file( const struct makefile *make, const char *pa
|
||||
@@ -1382,14 +1382,21 @@ static struct file *open_local_file( const struct makefile *make, const char *pa
|
||||
{
|
||||
char *src_path = root_dir_path( base_dir_path( make, path ));
|
||||
char *src_path = src_dir_path( make, path );
|
||||
struct file *ret = load_file( src_path );
|
||||
+ unsigned int i;
|
||||
|
||||
@@ -125,23 +122,19 @@ index 4bd20d469d6..a67add38afa 100644
|
||||
+
|
||||
free( src_path );
|
||||
- path = strmake( "%s/%s", make->parent_dir, path );
|
||||
- src_path = root_dir_path( base_dir_path( make, path ));
|
||||
- src_path = src_dir_path( make, path );
|
||||
+ new_path = strmake( "%s/%s", make->parent_dirs.str[i], path );
|
||||
+ src_path = root_dir_path( base_dir_path( make, new_path ));
|
||||
+ src_path = src_dir_path( make, new_path );
|
||||
ret = load_file( src_path );
|
||||
- if (ret) ret->flags |= FLAG_PARENTDIR;
|
||||
+ if (ret)
|
||||
+ {
|
||||
+ ret->flags |= FLAG_PARENTDIR;
|
||||
+ path = new_path;
|
||||
+ }
|
||||
+ else
|
||||
+ free(new_path);
|
||||
}
|
||||
|
||||
if (ret) *filename = src_dir_path( make, path );
|
||||
@@ -4275,13 +4284,13 @@ static void load_sources( struct makefile *make )
|
||||
strarray_set_value( &make->vars, "top_srcdir", top_src_dir_path( make, "" ));
|
||||
if (ret) *filename = src_path;
|
||||
@@ -4129,13 +4136,13 @@ static void load_sources( struct makefile *make )
|
||||
strarray_set_value( &make->vars, "top_srcdir", root_src_dir_path( "" ));
|
||||
strarray_set_value( &make->vars, "srcdir", src_dir_path( make, "" ));
|
||||
|
||||
- make->parent_dir = get_expanded_make_variable( make, "PARENTSRC" );
|
||||
@@ -155,7 +148,7 @@ index 4bd20d469d6..a67add38afa 100644
|
||||
make->programs = get_expanded_make_var_array( make, "PROGRAMS" );
|
||||
make->scripts = get_expanded_make_var_array( make, "SCRIPTS" );
|
||||
make->imports = get_expanded_make_var_array( make, "IMPORTS" );
|
||||
@@ -4326,8 +4335,11 @@ static void load_sources( struct makefile *make )
|
||||
@@ -4180,8 +4187,11 @@ static void load_sources( struct makefile *make )
|
||||
strarray_add( &make->include_args, strmake( "-I%s", obj_dir_path( make, "" )));
|
||||
if (make->src_dir)
|
||||
strarray_add( &make->include_args, strmake( "-I%s", make->src_dir ));
|
||||
@@ -166,9 +159,9 @@ index 4bd20d469d6..a67add38afa 100644
|
||||
+ for (i = 0; i < make->parent_dirs.count; i++)
|
||||
+ strarray_add( &make->include_args, strmake( "-I%s", src_dir_path( make, make->parent_dirs.str[i] )));
|
||||
+ }
|
||||
strarray_add( &make->include_args, strmake( "-I%s", top_obj_dir_path( make, "include" )));
|
||||
if (make->top_src_dir)
|
||||
strarray_add( &make->include_args, strmake( "-I%s", top_src_dir_path( make, "include" )));
|
||||
strarray_add( &make->include_args, "-Iinclude" );
|
||||
if (root_src_dir) strarray_add( &make->include_args, strmake( "-I%s", root_src_dir_path( "include" )));
|
||||
|
||||
--
|
||||
2.28.0
|
||||
|
||||
|
@@ -0,0 +1,48 @@
|
||||
From 4275e2569a44939e04098fca9cf8beab4cb3941e Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sun, 13 Sep 2020 13:39:07 +1000
|
||||
Subject: [PATCH] winegstreamer: Support older versions
|
||||
|
||||
---
|
||||
configure.ac | 4 +++-
|
||||
dlls/winegstreamer/media_source.c | 2 ++
|
||||
3 files changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 5d882b94d99..8abd50e6690 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -1665,7 +1665,9 @@ then
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gst/gst.h>]],
|
||||
[[static int a[sizeof(gint64) > 4 ? 1 : -1]; if (a[0]) return 0;]])],
|
||||
[AC_MSG_RESULT([yes])
|
||||
- AC_CHECK_LIB(gstreamer-1.0,gst_pad_new,[:],,[$GSTREAMER_LIBS])],
|
||||
+ AC_CHECK_LIB(gstreamer-1.0,gst_pad_new,[:],,[$GSTREAMER_LIBS])
|
||||
+ WINE_CHECK_LIB_FUNCS([gst_structure_get_list], [$GSTREAMER_LIBS])
|
||||
+ ],
|
||||
[AC_MSG_RESULT([no])
|
||||
ac_glib2_broken=yes
|
||||
WINE_NOTICE([glib-2.0 pkgconfig configuration is for the wrong architecture, winegstreamer won't be built.])])])])
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 07c16ac8a07..3ef258937dc 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1087,6 +1087,7 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
|
||||
if (!strcmp(gst_structure_get_name(gst_caps_get_structure(stream->their_caps, 0)), "video/x-raw"))
|
||||
{
|
||||
+#ifdef HAVE_GST_STRUCTURE_GET_LIST
|
||||
GstElementFactory *videoconvert_factory = gst_element_factory_find("videoconvert");
|
||||
/* output every format supported by videoconvert */
|
||||
const GList *template_list = gst_element_factory_get_static_pad_templates(videoconvert_factory);
|
||||
@@ -1118,6 +1119,7 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
gst_caps_unref(src_caps);
|
||||
break;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
else if (!strcmp(gst_structure_get_name(gst_caps_get_structure(stream->their_caps, 0)), "audio/x-raw"))
|
||||
{
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1 +1,2 @@
|
||||
Fixes: [49692] mfplat: Improved support for multiple video formats.
|
||||
Disabled: true
|
||||
|
@@ -0,0 +1,262 @@
|
||||
From 5c873ba9b51531c7e41b77424b46264ed712b972 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Fri, 11 Sep 2020 17:55:59 +1000
|
||||
Subject: [PATCH 1/3] include: Remove interfaces already define in msxml6.idl
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
dlls/msxml3/factory.c | 1 +
|
||||
dlls/msxml3/tests/saxreader.c | 1 +
|
||||
dlls/msxml3/tests/schema.c | 5 ++
|
||||
dlls/msxml3/uuid.c | 11 ++++
|
||||
include/msxml2.idl | 109 ----------------------------------
|
||||
5 files changed, 18 insertions(+), 109 deletions(-)
|
||||
|
||||
diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c
|
||||
index 445cfbf730..b8452ff4b4 100644
|
||||
--- a/dlls/msxml3/factory.c
|
||||
+++ b/dlls/msxml3/factory.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "ole2.h"
|
||||
#include "msxml.h"
|
||||
#include "msxml2.h"
|
||||
+#include "msxml6.h"
|
||||
#include "xmlparser.h"
|
||||
|
||||
/* undef the #define in msxml2 so that we can access the v.2 version
|
||||
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
|
||||
index 986f429cc1..db39919a41 100644
|
||||
--- a/dlls/msxml3/tests/saxreader.c
|
||||
+++ b/dlls/msxml3/tests/saxreader.c
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "windows.h"
|
||||
#include "ole2.h"
|
||||
#include "msxml2.h"
|
||||
+#include "msxml6.h"
|
||||
#include "msxml2did.h"
|
||||
#include "ocidl.h"
|
||||
#include "dispex.h"
|
||||
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
|
||||
index 4637d62f8b..805f05cb71 100644
|
||||
--- a/dlls/msxml3/tests/schema.c
|
||||
+++ b/dlls/msxml3/tests/schema.c
|
||||
@@ -32,6 +32,11 @@
|
||||
#include "dispex.h"
|
||||
#include "cguid.h"
|
||||
|
||||
+DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+
|
||||
#include "wine/test.h"
|
||||
|
||||
#define EXPECT_HR(hr,hr_exp) \
|
||||
diff --git a/dlls/msxml3/uuid.c b/dlls/msxml3/uuid.c
|
||||
index 4abbe5e476..333d4f3d3c 100644
|
||||
--- a/dlls/msxml3/uuid.c
|
||||
+++ b/dlls/msxml3/uuid.c
|
||||
@@ -41,6 +41,17 @@
|
||||
#include "initguid.h"
|
||||
#include "msxml2.h"
|
||||
|
||||
+/* Cannot include msxml6 here since we will get a duplicate LIBID_MSXML2 error. */
|
||||
+DEFINE_GUID(CLSID_FreeThreadedDOMDocument60, 0x88d96a06, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_MXNamespaceManager60, 0x88d96a11, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_ServerXMLHTTP60, 0x88d96a0b, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_XMLHTTP60, 0x88d96a0a, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_XSLTemplate60, 0x88d96a08, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+
|
||||
/*
|
||||
* Note that because of a #define in msxml2.h, we end up initializing
|
||||
* CLSID_DOMDocument2 to be the v.3 version independent DOMDocument
|
||||
diff --git a/include/msxml2.idl b/include/msxml2.idl
|
||||
index 916e0e8ab3..1d1ba7a524 100644
|
||||
--- a/include/msxml2.idl
|
||||
+++ b/include/msxml2.idl
|
||||
@@ -1612,15 +1612,6 @@ coclass FreeThreadedDOMDocument40
|
||||
[default, source] dispinterface XMLDOMDocumentEvents;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a06-f192-11d4-a65f-0040963251e5),
|
||||
-]
|
||||
-coclass FreeThreadedDOMDocument60
|
||||
-{
|
||||
- [default] interface IXMLDOMDocument3;
|
||||
- [default, source] dispinterface XMLDOMDocumentEvents;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("Free threaded XML DOM Document"),
|
||||
progid("Msxml2.FreeThreadedDOMDocument"),
|
||||
@@ -1662,14 +1653,6 @@ coclass XMLHTTP40
|
||||
[default] interface IXMLHTTPRequest;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0a-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XMLHTTP60
|
||||
-{
|
||||
- [default] interface IXMLHTTPRequest;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XML HTTP"),
|
||||
progid("Msxml2.XMLHTTP"),
|
||||
@@ -1702,14 +1685,6 @@ coclass ServerXMLHTTP40
|
||||
[default] interface IServerXMLHTTPRequest2;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0b-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass ServerXMLHTTP60
|
||||
-{
|
||||
- [default] interface IServerXMLHTTPRequest2;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("Server XML HTTP"),
|
||||
progid("Msxml2.ServerXMLHTTP"),
|
||||
@@ -1750,14 +1725,6 @@ coclass XMLSchemaCache40
|
||||
[default] interface IXMLDOMSchemaCollection2;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a07-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XMLSchemaCache60
|
||||
-{
|
||||
- [default] interface IXMLDOMSchemaCollection2;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XML Schema Cache"),
|
||||
progid("Msxml2.XMLSchemaCache"),
|
||||
@@ -1798,14 +1765,6 @@ coclass XSLTemplate40
|
||||
[default] interface IXSLTemplate;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a08-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XSLTemplate60
|
||||
-{
|
||||
- [default] interface IXSLTemplate;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XSL Template"),
|
||||
progid("Msxml2.XSLTemplate"),
|
||||
@@ -3297,15 +3256,6 @@ coclass SAXXMLReader40
|
||||
interface ISAXXMLReader;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0c-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass SAXXMLReader60
|
||||
-{
|
||||
- [default] interface IVBSAXXMLReader;
|
||||
- interface ISAXXMLReader;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAX XML Reader"),
|
||||
progid("Msxml2.SAXXMLReader"),
|
||||
@@ -3380,26 +3330,6 @@ coclass MXHTMLWriter40
|
||||
interface IVBSAXLexicalHandler;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a10-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXHTMLWriter60
|
||||
-{
|
||||
- [default] interface IMXWriter;
|
||||
-
|
||||
- interface ISAXContentHandler;
|
||||
- interface ISAXDeclHandler;
|
||||
- interface ISAXDTDHandler;
|
||||
- interface ISAXErrorHandler;
|
||||
- interface ISAXLexicalHandler;
|
||||
-
|
||||
- interface IVBSAXContentHandler;
|
||||
- interface IVBSAXDeclHandler;
|
||||
- interface IVBSAXDTDHandler;
|
||||
- interface IVBSAXErrorHandler;
|
||||
- interface IVBSAXLexicalHandler;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("MXXMLWriter 3.0"),
|
||||
progid("Msxml2.MXXMLWriter.3.0"),
|
||||
@@ -3444,26 +3374,6 @@ coclass MXXMLWriter40
|
||||
interface IVBSAXLexicalHandler;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0f-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXXMLWriter60
|
||||
-{
|
||||
- [default] interface IMXWriter;
|
||||
-
|
||||
- interface ISAXContentHandler;
|
||||
- interface ISAXDeclHandler;
|
||||
- interface ISAXDTDHandler;
|
||||
- interface ISAXErrorHandler;
|
||||
- interface ISAXLexicalHandler;
|
||||
-
|
||||
- interface IVBSAXContentHandler;
|
||||
- interface IVBSAXDeclHandler;
|
||||
- interface IVBSAXDTDHandler;
|
||||
- interface IVBSAXErrorHandler;
|
||||
- interface IVBSAXLexicalHandler;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("MXXMLWriter"),
|
||||
progid("Msxml2.MXXMLWriter"),
|
||||
@@ -3506,15 +3416,6 @@ coclass MXNamespaceManager40
|
||||
interface IMXNamespaceManager;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a11-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXNamespaceManager60
|
||||
-{
|
||||
- [default] interface IVBMXNamespaceManager;
|
||||
- interface IMXNamespaceManager;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAXAttributes 3.0"),
|
||||
progid("Msxml2.SAXAttributes.3.0"),
|
||||
@@ -3539,16 +3440,6 @@ coclass SAXAttributes40
|
||||
interface ISAXAttributes;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0e-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass SAXAttributes60
|
||||
-{
|
||||
- [default] interface IMXAttributes;
|
||||
- interface IVBSAXAttributes;
|
||||
- interface ISAXAttributes;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAXAttributes"),
|
||||
progid("Msxml2.SAXAttributes"),
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1,40 +0,0 @@
|
||||
From 1b9bde927b65e034acde1a3cdca1aac6afcab854 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 3 Sep 2020 17:58:53 +1000
|
||||
Subject: [PATCH 1/5] msxml3: Use msxml6 header for defining GUIDs.
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
dlls/msxml3/factory.c | 2 +-
|
||||
dlls/msxml3/uuid.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c
|
||||
index 445cfbf730..3be974c58a 100644
|
||||
--- a/dlls/msxml3/factory.c
|
||||
+++ b/dlls/msxml3/factory.c
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "winuser.h"
|
||||
#include "ole2.h"
|
||||
#include "msxml.h"
|
||||
-#include "msxml2.h"
|
||||
+#include "msxml6.h"
|
||||
#include "xmlparser.h"
|
||||
|
||||
/* undef the #define in msxml2 so that we can access the v.2 version
|
||||
diff --git a/dlls/msxml3/uuid.c b/dlls/msxml3/uuid.c
|
||||
index 4abbe5e476..7403b27c72 100644
|
||||
--- a/dlls/msxml3/uuid.c
|
||||
+++ b/dlls/msxml3/uuid.c
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
/* Now we can initialize the rest of the uuids */
|
||||
#include "initguid.h"
|
||||
-#include "msxml2.h"
|
||||
+#include "msxml6.h"
|
||||
|
||||
/*
|
||||
* Note that because of a #define in msxml2.h, we end up initializing
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From e46f6e920f9f41f7f5ab5b0bb5254dec7d0c0dc2 Mon Sep 17 00:00:00 2001
|
||||
From cf32f7460fe0df6bb9dfb80c5a55473246ff4018 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 3 Sep 2020 17:59:10 +1000
|
||||
Subject: [PATCH 4/5] include: Add IXMLHTTPRequest2/3 interfaces
|
||||
Subject: [PATCH 2/3] include: Add IXMLHTTPRequest2/3 interfaces
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
@@ -9,21 +9,21 @@ Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
1 file changed, 106 insertions(+)
|
||||
|
||||
diff --git a/include/msxml6.idl b/include/msxml6.idl
|
||||
index 1f657a8cde..b837e42477 100644
|
||||
index 5bfb21d04a..5473fa0bd9 100644
|
||||
--- a/include/msxml6.idl
|
||||
+++ b/include/msxml6.idl
|
||||
@@ -109,6 +109,8 @@ interface ISchemaAny;
|
||||
interface ISchemaIdentityConstraint;
|
||||
interface ISchemaNotation;
|
||||
@@ -244,6 +244,8 @@ typedef enum _SCHEMAWHITESPACE
|
||||
SCHEMAWHITESPACE_COLLAPSE = 2,
|
||||
} SCHEMAWHITESPACE;
|
||||
|
||||
+interface IXMLHTTPRequest2Callback;
|
||||
+interface IXMLHTTPRequest3Callback;
|
||||
|
||||
cpp_quote("#define DOMDocument DOMDocument2")
|
||||
cpp_quote("#define CLSID_DOMDocument CLSID_DOMDocument2")
|
||||
@@ -261,6 +263,35 @@ typedef enum _SCHEMATYPEVARIETY
|
||||
SCHEMATYPEVARIETY_UNION = 2,
|
||||
} SCHEMATYPEVARIETY;
|
||||
typedef enum _SCHEMATYPEVARIETY
|
||||
{
|
||||
@@ -393,6 +395,35 @@ interface IXMLDOMNode : IDispatch
|
||||
[in] VARIANT var1);
|
||||
}
|
||||
|
||||
+typedef struct tagXHR_COOKIE
|
||||
+{
|
||||
@@ -57,8 +57,8 @@ index 1f657a8cde..b837e42477 100644
|
||||
[
|
||||
local,
|
||||
object,
|
||||
@@ -1265,6 +1296,70 @@ interface IXMLHTTPRequest : IDispatch
|
||||
HRESULT onreadystatechange([in] IDispatch *pReadyStateSink);
|
||||
@@ -1309,6 +1340,70 @@ interface IServerXMLHTTPRequest : IXMLHTTPRequest
|
||||
[in] VARIANT value);
|
||||
}
|
||||
|
||||
+[
|
||||
@@ -128,8 +128,8 @@ index 1f657a8cde..b837e42477 100644
|
||||
[
|
||||
object,
|
||||
dual,
|
||||
@@ -1554,6 +1649,17 @@ coclass XMLHTTP60
|
||||
[default] interface IXMLHTTPRequest;
|
||||
@@ -1607,6 +1702,17 @@ interface ISAXDeclHandler : IUnknown
|
||||
[in] int nSystemId);
|
||||
}
|
||||
|
||||
+[
|
||||
@@ -144,8 +144,8 @@ index 1f657a8cde..b837e42477 100644
|
||||
+}
|
||||
+
|
||||
[
|
||||
uuid(afba6b42-5692-48ea-8141-dc517dcf0ef1)
|
||||
]
|
||||
object,
|
||||
local,
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1,45 +0,0 @@
|
||||
From 904a06e52cb70dd9821b6aea99bc646f9c573d12 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 3 Sep 2020 17:59:01 +1000
|
||||
Subject: [PATCH 2/5] msxml3/tests: Use msxml6.h where required
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
dlls/msxml3/tests/saxreader.c | 4 ++--
|
||||
dlls/msxml3/tests/schema.c | 4 ++--
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
|
||||
index 986f429cc1..5c5fa8075d 100644
|
||||
--- a/dlls/msxml3/tests/saxreader.c
|
||||
+++ b/dlls/msxml3/tests/saxreader.c
|
||||
@@ -28,8 +28,8 @@
|
||||
|
||||
#include "windows.h"
|
||||
#include "ole2.h"
|
||||
-#include "msxml2.h"
|
||||
-#include "msxml2did.h"
|
||||
+#include "msxml6.h"
|
||||
+#include "msxml6did.h"
|
||||
#include "ocidl.h"
|
||||
#include "dispex.h"
|
||||
|
||||
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
|
||||
index 4637d62f8b..fc0329bd10 100644
|
||||
--- a/dlls/msxml3/tests/schema.c
|
||||
+++ b/dlls/msxml3/tests/schema.c
|
||||
@@ -26,9 +26,9 @@
|
||||
#include "initguid.h"
|
||||
#include "windows.h"
|
||||
#include "ole2.h"
|
||||
-#include "msxml2.h"
|
||||
+#include "msxml6.h"
|
||||
#undef CLSID_DOMDocument
|
||||
-#include "msxml2did.h"
|
||||
+#include "msxml6did.h"
|
||||
#include "dispex.h"
|
||||
#include "cguid.h"
|
||||
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1,196 +0,0 @@
|
||||
From 87f6f9640a5590ae216c4f863d34826122e4914a Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 3 Sep 2020 17:59:06 +1000
|
||||
Subject: [PATCH 3/5] include: Remove interfaces already define in msxml6.idl
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
include/msxml2.idl | 109 ---------------------------------------------
|
||||
1 file changed, 109 deletions(-)
|
||||
|
||||
diff --git a/include/msxml2.idl b/include/msxml2.idl
|
||||
index cfafc42133..a2d72d2063 100644
|
||||
--- a/include/msxml2.idl
|
||||
+++ b/include/msxml2.idl
|
||||
@@ -1605,15 +1605,6 @@ coclass FreeThreadedDOMDocument40
|
||||
[default, source] dispinterface XMLDOMDocumentEvents;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a06-f192-11d4-a65f-0040963251e5),
|
||||
-]
|
||||
-coclass FreeThreadedDOMDocument60
|
||||
-{
|
||||
- [default] interface IXMLDOMDocument3;
|
||||
- [default, source] dispinterface XMLDOMDocumentEvents;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("Free threaded XML DOM Document"),
|
||||
progid("Msxml2.FreeThreadedDOMDocument"),
|
||||
@@ -1655,14 +1646,6 @@ coclass XMLHTTP40
|
||||
[default] interface IXMLHTTPRequest;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0a-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XMLHTTP60
|
||||
-{
|
||||
- [default] interface IXMLHTTPRequest;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XML HTTP"),
|
||||
progid("Msxml2.XMLHTTP"),
|
||||
@@ -1695,14 +1678,6 @@ coclass ServerXMLHTTP40
|
||||
[default] interface IServerXMLHTTPRequest2;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0b-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass ServerXMLHTTP60
|
||||
-{
|
||||
- [default] interface IServerXMLHTTPRequest2;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("Server XML HTTP"),
|
||||
progid("Msxml2.ServerXMLHTTP"),
|
||||
@@ -1743,14 +1718,6 @@ coclass XMLSchemaCache40
|
||||
[default] interface IXMLDOMSchemaCollection2;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a07-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XMLSchemaCache60
|
||||
-{
|
||||
- [default] interface IXMLDOMSchemaCollection2;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XML Schema Cache"),
|
||||
progid("Msxml2.XMLSchemaCache"),
|
||||
@@ -1791,14 +1758,6 @@ coclass XSLTemplate40
|
||||
[default] interface IXSLTemplate;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a08-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass XSLTemplate60
|
||||
-{
|
||||
- [default] interface IXSLTemplate;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("XSL Template"),
|
||||
progid("Msxml2.XSLTemplate"),
|
||||
@@ -3290,15 +3249,6 @@ coclass SAXXMLReader40
|
||||
interface ISAXXMLReader;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0c-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass SAXXMLReader60
|
||||
-{
|
||||
- [default] interface IVBSAXXMLReader;
|
||||
- interface ISAXXMLReader;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAX XML Reader"),
|
||||
progid("Msxml2.SAXXMLReader"),
|
||||
@@ -3373,26 +3323,6 @@ coclass MXHTMLWriter40
|
||||
interface IVBSAXLexicalHandler;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a10-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXHTMLWriter60
|
||||
-{
|
||||
- [default] interface IMXWriter;
|
||||
-
|
||||
- interface ISAXContentHandler;
|
||||
- interface ISAXDeclHandler;
|
||||
- interface ISAXDTDHandler;
|
||||
- interface ISAXErrorHandler;
|
||||
- interface ISAXLexicalHandler;
|
||||
-
|
||||
- interface IVBSAXContentHandler;
|
||||
- interface IVBSAXDeclHandler;
|
||||
- interface IVBSAXDTDHandler;
|
||||
- interface IVBSAXErrorHandler;
|
||||
- interface IVBSAXLexicalHandler;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("MXXMLWriter 3.0"),
|
||||
progid("Msxml2.MXXMLWriter.3.0"),
|
||||
@@ -3437,26 +3367,6 @@ coclass MXXMLWriter40
|
||||
interface IVBSAXLexicalHandler;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0f-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXXMLWriter60
|
||||
-{
|
||||
- [default] interface IMXWriter;
|
||||
-
|
||||
- interface ISAXContentHandler;
|
||||
- interface ISAXDeclHandler;
|
||||
- interface ISAXDTDHandler;
|
||||
- interface ISAXErrorHandler;
|
||||
- interface ISAXLexicalHandler;
|
||||
-
|
||||
- interface IVBSAXContentHandler;
|
||||
- interface IVBSAXDeclHandler;
|
||||
- interface IVBSAXDTDHandler;
|
||||
- interface IVBSAXErrorHandler;
|
||||
- interface IVBSAXLexicalHandler;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("MXXMLWriter"),
|
||||
progid("Msxml2.MXXMLWriter"),
|
||||
@@ -3499,15 +3409,6 @@ coclass MXNamespaceManager40
|
||||
interface IMXNamespaceManager;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a11-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass MXNamespaceManager60
|
||||
-{
|
||||
- [default] interface IVBMXNamespaceManager;
|
||||
- interface IMXNamespaceManager;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAXAttributes 3.0"),
|
||||
progid("Msxml2.SAXAttributes.3.0"),
|
||||
@@ -3532,16 +3433,6 @@ coclass SAXAttributes40
|
||||
interface ISAXAttributes;
|
||||
}
|
||||
|
||||
-[
|
||||
- uuid(88d96a0e-f192-11d4-a65f-0040963251e5)
|
||||
-]
|
||||
-coclass SAXAttributes60
|
||||
-{
|
||||
- [default] interface IMXAttributes;
|
||||
- interface IVBSAXAttributes;
|
||||
- interface ISAXAttributes;
|
||||
-}
|
||||
-
|
||||
[
|
||||
helpstring("SAXAttributes"),
|
||||
progid("Msxml2.SAXAttributes"),
|
||||
--
|
||||
2.28.0
|
||||
|
@@ -1,15 +1,16 @@
|
||||
From 02147fc13eefc56391549102082759b85c282510 Mon Sep 17 00:00:00 2001
|
||||
From 849e198c39ce81b2e99505486859ee305d9f6fed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Tue, 8 Sep 2020 18:43:52 +0200
|
||||
Subject: [PATCH 5/5] msxml3: Implement FreeThreadedXMLHTTP60.
|
||||
Subject: [PATCH 3/3] msxml3: Implement FreeThreadedXMLHTTP60.
|
||||
|
||||
---
|
||||
dlls/msxml3/Makefile.in | 2 +-
|
||||
dlls/msxml3/factory.c | 5 +
|
||||
dlls/msxml3/httprequest.c | 493 +++++++++++++++++++++++++++++++++++-
|
||||
dlls/msxml3/msxml_private.h | 1 +
|
||||
dlls/msxml3/tests/httpreq.c | 395 ++++++++++++++++++++++++++++-
|
||||
5 files changed, 891 insertions(+), 5 deletions(-)
|
||||
dlls/msxml3/tests/schema.c | 5 +
|
||||
dlls/msxml3/uuid.c | 3 +
|
||||
6 files changed, 894 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in
|
||||
index 936c745895..f9e629f89b 100644
|
||||
@@ -22,29 +23,6 @@ index 936c745895..f9e629f89b 100644
|
||||
EXTRALIBS = $(XML2_LIBS)
|
||||
EXTRAINCL = $(XML2_CFLAGS) $(XSLT_CFLAGS)
|
||||
|
||||
diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c
|
||||
index 3be974c58a..8608e238ee 100644
|
||||
--- a/dlls/msxml3/factory.c
|
||||
+++ b/dlls/msxml3/factory.c
|
||||
@@ -280,6 +280,7 @@ static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv
|
||||
|
||||
static ClassFactory xmldoccf = { { &ClassFactoryVtbl }, XMLDocument_create };
|
||||
static ClassFactory httpreqcf = { { &ClassFactoryVtbl }, XMLHTTPRequest_create };
|
||||
+static ClassFactory httpreqcf2 = { { &ClassFactoryVtbl }, XMLHTTPRequest2_create };
|
||||
static ClassFactory serverhttp = { { &ClassFactoryVtbl }, ServerXMLHTTP_create };
|
||||
static ClassFactory xsltemplatecf = { { &ClassFactoryVtbl }, XSLTemplate_create };
|
||||
static ClassFactory mxnsmanagercf = { {&ClassFactoryVtbl }, MXNamespaceManager_create };
|
||||
@@ -341,6 +342,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
|
||||
{
|
||||
cf = &httpreqcf.IClassFactory_iface;
|
||||
}
|
||||
+ else if( IsEqualCLSID( rclsid, &CLSID_FreeThreadedXMLHTTP60 ))
|
||||
+ {
|
||||
+ cf = &httpreqcf2.IClassFactory_iface;
|
||||
+ }
|
||||
else if( IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP ) ||
|
||||
IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP30 ) ||
|
||||
IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP40 ) ||
|
||||
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
|
||||
index 7286eb97bb..ad74260193 100644
|
||||
--- a/dlls/msxml3/httprequest.c
|
||||
@@ -577,10 +555,10 @@ index 7286eb97bb..ad74260193 100644
|
||||
{
|
||||
MESSAGE("This program tried to use a ServerXMLHTTP object, but\n"
|
||||
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
|
||||
index 5fce060985..f25a4a8268 100644
|
||||
index a59e00bf2b..9797f96f3c 100644
|
||||
--- a/dlls/msxml3/msxml_private.h
|
||||
+++ b/dlls/msxml3/msxml_private.h
|
||||
@@ -498,6 +498,7 @@ extern HRESULT XMLDocument_create(void**) DECLSPEC_HIDDEN;
|
||||
@@ -501,6 +501,7 @@ extern HRESULT XMLDocument_create(void**) DECLSPEC_HIDDEN;
|
||||
extern HRESULT SAXXMLReader_create(MSXML_VERSION, void**) DECLSPEC_HIDDEN;
|
||||
extern HRESULT SAXAttributes_create(MSXML_VERSION, void**) DECLSPEC_HIDDEN;
|
||||
extern HRESULT XMLHTTPRequest_create(void **) DECLSPEC_HIDDEN;
|
||||
@@ -589,14 +567,15 @@ index 5fce060985..f25a4a8268 100644
|
||||
extern HRESULT XSLTemplate_create(void**) DECLSPEC_HIDDEN;
|
||||
extern HRESULT MXWriter_create(MSXML_VERSION, void**) DECLSPEC_HIDDEN;
|
||||
diff --git a/dlls/msxml3/tests/httpreq.c b/dlls/msxml3/tests/httpreq.c
|
||||
index 74c302d5eb..f22c9831a1 100644
|
||||
index 74c302d5eb..25e6922c31 100644
|
||||
--- a/dlls/msxml3/tests/httpreq.c
|
||||
+++ b/dlls/msxml3/tests/httpreq.c
|
||||
@@ -27,8 +27,8 @@
|
||||
@@ -26,9 +26,9 @@
|
||||
#include <assert.h>
|
||||
|
||||
#include "windows.h"
|
||||
|
||||
-#include "msxml2.h"
|
||||
-
|
||||
#include "msxml2.h"
|
||||
-#include "msxml2did.h"
|
||||
+#include "msxml6.h"
|
||||
+#include "msxml6did.h"
|
||||
@@ -1019,6 +998,40 @@ index 74c302d5eb..f22c9831a1 100644
|
||||
|
||||
CoUninitialize();
|
||||
}
|
||||
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
|
||||
index 805f05cb71..f9c64c50ec 100644
|
||||
--- a/dlls/msxml3/tests/schema.c
|
||||
+++ b/dlls/msxml3/tests/schema.c
|
||||
@@ -32,10 +32,15 @@
|
||||
#include "dispex.h"
|
||||
#include "cguid.h"
|
||||
|
||||
+DEFINE_GUID(CLSID_FreeThreadedDOMDocument60, 0x88d96a06, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(CLSID_FreeThreadedXMLHTTP60, 0x88d96a09, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest2, 0xe5d37dc0, 0x552a, 0x4d52, 0x9c,0xc0, 0xa1,0x4d,0x54,0x6f,0xbd,0x04);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest2Callback, 0xa44a9299, 0xe321, 0x40de, 0x88,0x66, 0x34,0x1b,0x41,0x66,0x91,0x62);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest3Callback, 0xb9e57830, 0x8c6c, 0x4a6f, 0x9c,0x13, 0x47,0x77,0x2b,0xb0,0x47,0xbb);
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
diff --git a/dlls/msxml3/uuid.c b/dlls/msxml3/uuid.c
|
||||
index 333d4f3d3c..2b995d5acc 100644
|
||||
--- a/dlls/msxml3/uuid.c
|
||||
+++ b/dlls/msxml3/uuid.c
|
||||
@@ -51,6 +51,9 @@ DEFINE_GUID(CLSID_ServerXMLHTTP60, 0x88d96a0b, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0
|
||||
DEFINE_GUID(CLSID_XMLHTTP60, 0x88d96a0a, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
DEFINE_GUID(CLSID_XSLTemplate60, 0x88d96a08, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest2, 0xe5d37dc0, 0x552a, 0x4d52, 0x9c,0xc0, 0xa1,0x4d,0x54,0x6f,0xbd,0x04);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest2Callback, 0xa44a9299, 0xe321, 0x40de, 0x88,0x66, 0x34,0x1b,0x41,0x66,0x91,0x62);
|
||||
+DEFINE_GUID(IID_IXMLHTTPRequest3Callback, 0xb9e57830, 0x8c6c, 0x4a6f, 0x9c,0x13, 0x47,0x77,0x2b,0xb0,0x47,0xbb);
|
||||
|
||||
/*
|
||||
* Note that because of a #define in msxml2.h, we end up initializing
|
||||
--
|
||||
2.28.0
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user