mirror of
https://github.com/reactos/reactos.git
synced 2024-12-31 19:42:51 +00:00
[RTL] Partly sync actctx.c with Wine Staging 1.7.37. CORE-9246
svn path=/trunk/; revision=66623
This commit is contained in:
parent
66123cf941
commit
9a8d806a2e
2 changed files with 167 additions and 77 deletions
|
@ -12,7 +12,7 @@
|
||||||
* Samuel Serapión
|
* Samuel Serapión
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Based on Wine 1.7.17 */
|
/* Based on Wine Staging 1.7.37 */
|
||||||
|
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ struct assembly_identity
|
||||||
WCHAR *type;
|
WCHAR *type;
|
||||||
struct assembly_version version;
|
struct assembly_version version;
|
||||||
BOOL optional;
|
BOOL optional;
|
||||||
|
BOOL delayed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct strsection_header
|
struct strsection_header
|
||||||
|
@ -582,13 +583,13 @@ static const WCHAR dependencyW[] = {'d','e','p','e','n','d','e','n','c','y',0};
|
||||||
static const WCHAR dependentAssemblyW[] = {'d','e','p','e','n','d','e','n','t','A','s','s','e','m','b','l','y',0};
|
static const WCHAR dependentAssemblyW[] = {'d','e','p','e','n','d','e','n','t','A','s','s','e','m','b','l','y',0};
|
||||||
static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0};
|
static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0};
|
||||||
static const WCHAR fileW[] = {'f','i','l','e',0};
|
static const WCHAR fileW[] = {'f','i','l','e',0};
|
||||||
|
static const WCHAR hashW[] = {'h','a','s','h',0};
|
||||||
static const WCHAR noInheritW[] = {'n','o','I','n','h','e','r','i','t',0};
|
static const WCHAR noInheritW[] = {'n','o','I','n','h','e','r','i','t',0};
|
||||||
static const WCHAR noInheritableW[] = {'n','o','I','n','h','e','r','i','t','a','b','l','e',0};
|
static const WCHAR noInheritableW[] = {'n','o','I','n','h','e','r','i','t','a','b','l','e',0};
|
||||||
static const WCHAR typelibW[] = {'t','y','p','e','l','i','b',0};
|
static const WCHAR typelibW[] = {'t','y','p','e','l','i','b',0};
|
||||||
static const WCHAR windowClassW[] = {'w','i','n','d','o','w','C','l','a','s','s',0};
|
static const WCHAR windowClassW[] = {'w','i','n','d','o','w','C','l','a','s','s',0};
|
||||||
|
|
||||||
static const WCHAR clsidW[] = {'c','l','s','i','d',0};
|
static const WCHAR clsidW[] = {'c','l','s','i','d',0};
|
||||||
static const WCHAR hashW[] = {'h','a','s','h',0};
|
|
||||||
static const WCHAR hashalgW[] = {'h','a','s','h','a','l','g',0};
|
static const WCHAR hashalgW[] = {'h','a','s','h','a','l','g',0};
|
||||||
static const WCHAR helpdirW[] = {'h','e','l','p','d','i','r',0};
|
static const WCHAR helpdirW[] = {'h','e','l','p','d','i','r',0};
|
||||||
static const WCHAR iidW[] = {'i','i','d',0};
|
static const WCHAR iidW[] = {'i','i','d',0};
|
||||||
|
@ -684,6 +685,7 @@ static const struct olemisc_entry olemisc_values[] =
|
||||||
|
|
||||||
static const WCHAR g_xmlW[] = {'?','x','m','l',0};
|
static const WCHAR g_xmlW[] = {'?','x','m','l',0};
|
||||||
static const WCHAR manifestv1W[] = {'u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','a','s','m','.','v','1',0};
|
static const WCHAR manifestv1W[] = {'u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','a','s','m','.','v','1',0};
|
||||||
|
static const WCHAR manifestv2W[] = {'u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','a','s','m','.','v','2',0};
|
||||||
static const WCHAR manifestv3W[] = {'u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','a','s','m','.','v','3',0};
|
static const WCHAR manifestv3W[] = {'u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','a','s','m','.','v','3',0};
|
||||||
|
|
||||||
static const WCHAR dotManifestW[] = {'.','m','a','n','i','f','e','s','t',0};
|
static const WCHAR dotManifestW[] = {'.','m','a','n','i','f','e','s','t',0};
|
||||||
|
@ -879,6 +881,7 @@ static void free_entity_array(struct entity_array *array)
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.base);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.base);
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.ps32);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.ps32);
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.name);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.name);
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.ifaceps.tlib);
|
||||||
break;
|
break;
|
||||||
case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
|
case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.typelib.tlbid);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, entity->u.typelib.tlbid);
|
||||||
|
@ -1060,6 +1063,7 @@ static WCHAR *build_assembly_id( const struct assembly_identity *ai )
|
||||||
append_string( ret, versionW2, version );
|
append_string( ret, versionW2, version );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
|
static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
|
||||||
{
|
{
|
||||||
ACTIVATION_CONTEXT *ret = NULL, *actctx = h;
|
ACTIVATION_CONTEXT *ret = NULL, *actctx = h;
|
||||||
|
@ -1114,6 +1118,14 @@ static void actctx_release( ACTIVATION_CONTEXT *actctx )
|
||||||
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->config.info );
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->config.info );
|
||||||
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->appdir.info );
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->appdir.info );
|
||||||
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->assemblies );
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->assemblies );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->dllredirect_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->wndclass_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->tlib_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->comserver_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->ifaceps_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->clrsurrogate_section );
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, actctx->progid_section );
|
||||||
|
|
||||||
pActual = CONTAINING_RECORD(actctx, ACTIVATION_CONTEXT_WRAPPED, ActivationContext);
|
pActual = CONTAINING_RECORD(actctx, ACTIVATION_CONTEXT_WRAPPED, ActivationContext);
|
||||||
pActual->MagicMarker = 0;
|
pActual->MagicMarker = 0;
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pActual);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, pActual);
|
||||||
|
@ -1891,16 +1903,26 @@ static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf)
|
||||||
|
|
||||||
static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
|
static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
|
||||||
{
|
{
|
||||||
xmlstr_t elem, content;
|
xmlstr_t elem, content, attr_name, attr_value;
|
||||||
UNICODE_STRING elemU;
|
BOOL end = FALSE, ret = TRUE, error = FALSE;
|
||||||
BOOL end = FALSE, ret = TRUE;
|
|
||||||
|
|
||||||
if (!parse_expect_no_attr(xmlbuf, &end) || end ||
|
UNICODE_STRING elem1U, elem2U;
|
||||||
!parse_text_content(xmlbuf, &content))
|
|
||||||
|
while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
|
||||||
|
{
|
||||||
|
elem1U = xmlstr2unicode(&attr_name);
|
||||||
|
elem2U = xmlstr2unicode(&attr_value);
|
||||||
|
DPRINT1("unknown attr %s=%s\n", &elem1U, &elem2U);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) return FALSE;
|
||||||
|
if (end) return TRUE;
|
||||||
|
|
||||||
|
if (!parse_text_content(xmlbuf, &content))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
elemU = xmlstr2unicode(&content);
|
elem1U = xmlstr2unicode(&content);
|
||||||
DPRINT("Got description %wZ\n", &elemU);
|
DPRINT("Got description %wZ\n", &elem1U);
|
||||||
|
|
||||||
while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
|
while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
|
||||||
{
|
{
|
||||||
|
@ -1911,8 +1933,8 @@ static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elemU = xmlstr2unicode(&elem);
|
elem1U = xmlstr2unicode(&elem);
|
||||||
DPRINT1("unknown elem %wZ\n", &elemU);
|
DPRINT1("unknown elem %wZ\n", &elem1U);
|
||||||
ret = parse_unknown_elem(xmlbuf, &elem);
|
ret = parse_unknown_elem(xmlbuf, &elem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2092,13 +2114,31 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly
|
||||||
static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, BOOL optional)
|
static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, BOOL optional)
|
||||||
{
|
{
|
||||||
struct assembly_identity ai;
|
struct assembly_identity ai;
|
||||||
xmlstr_t elem;
|
xmlstr_t elem, attr_name, attr_value;
|
||||||
BOOL end = FALSE, ret = TRUE;
|
BOOL end = FALSE, error = FALSE, ret = TRUE, delayed = FALSE;
|
||||||
|
|
||||||
if (!parse_expect_no_attr(xmlbuf, &end) || end) return end;
|
UNICODE_STRING elem1U, elem2U;
|
||||||
|
|
||||||
|
while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
|
||||||
|
{
|
||||||
|
static const WCHAR allowDelayedBindingW[] = {'a','l','l','o','w','D','e','l','a','y','e','d','B','i','n','d','i','n','g',0};
|
||||||
|
static const WCHAR trueW[] = {'t','r','u','e',0};
|
||||||
|
|
||||||
|
if (xmlstr_cmp(&attr_name, allowDelayedBindingW))
|
||||||
|
delayed = xmlstr_cmp(&attr_value, trueW);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elem1U = xmlstr2unicode(&attr_name);
|
||||||
|
elem2U = xmlstr2unicode(&attr_value);
|
||||||
|
DPRINT1("unknown attr %s=%s\n", &elem1U, &elem2U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error || end) return end;
|
||||||
|
|
||||||
memset(&ai, 0, sizeof(ai));
|
memset(&ai, 0, sizeof(ai));
|
||||||
ai.optional = optional;
|
ai.optional = optional;
|
||||||
|
ai.delayed = delayed;
|
||||||
|
|
||||||
if (!parse_expect_elem(xmlbuf, assemblyIdentityW, asmv1W) ||
|
if (!parse_expect_elem(xmlbuf, assemblyIdentityW, asmv1W) ||
|
||||||
!parse_assembly_identity_elem(xmlbuf, acl->actctx, &ai))
|
!parse_assembly_identity_elem(xmlbuf, acl->actctx, &ai))
|
||||||
|
@ -2297,7 +2337,9 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
|
||||||
}
|
}
|
||||||
else if (xmlstr_cmp(&attr_name, xmlnsW))
|
else if (xmlstr_cmp(&attr_name, xmlnsW))
|
||||||
{
|
{
|
||||||
if (!xmlstr_cmp(&attr_value, manifestv1W) && !xmlstr_cmp(&attr_value, manifestv3W))
|
if (!xmlstr_cmp(&attr_value, manifestv1W) &&
|
||||||
|
!xmlstr_cmp(&attr_value, manifestv2W) &&
|
||||||
|
!xmlstr_cmp(&attr_value, manifestv3W))
|
||||||
{
|
{
|
||||||
DPRINT1("wrong namespace %wZ\n", &attr_valueU);
|
DPRINT1("wrong namespace %wZ\n", &attr_valueU);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -2537,7 +2579,7 @@ static NTSTATUS open_nt_file( HANDLE *handle, UNICODE_STRING *name )
|
||||||
static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, USHORT extra_len )
|
static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, USHORT extra_len )
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
ULONG magic;
|
ULONG_PTR magic;
|
||||||
LDR_DATA_TABLE_ENTRY *pldr;
|
LDR_DATA_TABLE_ENTRY *pldr;
|
||||||
|
|
||||||
LdrLockLoaderLock(0, NULL, &magic);
|
LdrLockLoaderLock(0, NULL, &magic);
|
||||||
|
@ -2763,8 +2805,8 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai )
|
||||||
{
|
{
|
||||||
static const WCHAR lookup_fmtW[] =
|
static const WCHAR lookup_fmtW[] =
|
||||||
{'%','s','_','%','s','_','%','s','_','%','u','.','%','u','.','*','.','*','_',
|
{'%','s','_','%','s','_','%','s','_','%','u','.','%','u','.','*','.','*','_',
|
||||||
'*', /* FIXME */
|
'%','s','_','*','.','m','a','n','i','f','e','s','t',0};
|
||||||
'.','m','a','n','i','f','e','s','t',0};
|
static const WCHAR wine_trailerW[] = {'d','e','a','d','b','e','e','f','.','m','a','n','i','f','e','s','t'};
|
||||||
|
|
||||||
WCHAR *lookup, *ret = NULL;
|
WCHAR *lookup, *ret = NULL;
|
||||||
UNICODE_STRING lookup_us;
|
UNICODE_STRING lookup_us;
|
||||||
|
@ -2788,6 +2830,7 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai )
|
||||||
FileBothDirectoryInformation, FALSE, &lookup_us, TRUE );
|
FileBothDirectoryInformation, FALSE, &lookup_us, TRUE );
|
||||||
if (io.Status == STATUS_SUCCESS)
|
if (io.Status == STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
|
ULONG min_build = ai->version.build, min_revision = ai->version.revision;
|
||||||
FILE_BOTH_DIR_INFORMATION *dir_info;
|
FILE_BOTH_DIR_INFORMATION *dir_info;
|
||||||
WCHAR *tmp;
|
WCHAR *tmp;
|
||||||
ULONG build, revision;
|
ULONG build, revision;
|
||||||
|
@ -2811,20 +2854,32 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai )
|
||||||
|
|
||||||
tmp = (WCHAR *)dir_info->FileName + (strchrW(lookup, '*') - lookup);
|
tmp = (WCHAR *)dir_info->FileName + (strchrW(lookup, '*') - lookup);
|
||||||
build = atoiW(tmp);
|
build = atoiW(tmp);
|
||||||
if (build < ai->version.build) continue;
|
if (build < min_build) continue;
|
||||||
tmp = strchrW(tmp, '.') + 1;
|
tmp = strchrW(tmp, '.') + 1;
|
||||||
revision = atoiW(tmp);
|
revision = atoiW(tmp);
|
||||||
if (build == ai->version.build && revision < ai->version.revision)
|
if (build == min_build && revision < min_revision) continue;
|
||||||
continue;
|
tmp = strchrW(tmp, '_') + 1;
|
||||||
ai->version.build = (USHORT)build;
|
tmp = strchrW(tmp, '_') + 1;
|
||||||
ai->version.revision = (USHORT)revision;
|
if (dir_info->FileNameLength - (tmp - dir_info->FileName) * sizeof(WCHAR) == sizeof(wine_trailerW) &&
|
||||||
|
!memicmpW( tmp, wine_trailerW, sizeof(wine_trailerW) / sizeof(WCHAR) ))
|
||||||
if ((ret = RtlAllocateHeap( RtlGetProcessHeap(), 0, dir_info->FileNameLength * sizeof(WCHAR) )))
|
{
|
||||||
|
/* prefer a non-Wine manifest if we already have one */
|
||||||
|
/* we'll still load the builtin dll if specified through DllOverrides */
|
||||||
|
if (ret) continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
min_build = build;
|
||||||
|
min_revision = revision;
|
||||||
|
}
|
||||||
|
ai->version.build = build;
|
||||||
|
ai->version.revision = revision;
|
||||||
|
RtlFreeHeap( RtlGetProcessHeap(), 0, ret );
|
||||||
|
if ((ret = RtlAllocateHeap( RtlGetProcessHeap(), 0, dir_info->FileNameLength + sizeof(WCHAR) )))
|
||||||
{
|
{
|
||||||
memcpy( ret, dir_info->FileName, dir_info->FileNameLength );
|
memcpy( ret, dir_info->FileName, dir_info->FileNameLength );
|
||||||
ret[dir_info->FileNameLength/sizeof(WCHAR)] = 0;
|
ret[dir_info->FileNameLength/sizeof(WCHAR)] = 0;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else DPRINT1("no matching file for %S\n", lookup);
|
else DPRINT1("no matching file for %S\n", lookup);
|
||||||
|
@ -2920,7 +2975,7 @@ static NTSTATUS lookup_assembly(struct actctx_loader* acl,
|
||||||
HANDLE file;
|
HANDLE file;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
DPRINT( "looking for name=%S version=%u.%u.%u.%u arch=%S\n",
|
DPRINT1( "looking for name=%S version=%u.%u.%u.%u arch=%S\n",
|
||||||
ai->name, ai->version.major, ai->version.minor, ai->version.build, ai->version.revision, ai->arch );
|
ai->name, ai->version.major, ai->version.minor, ai->version.build, ai->version.revision, ai->arch );
|
||||||
|
|
||||||
if ((status = lookup_winsxs(acl, ai)) != STATUS_NO_SUCH_FILE) return status;
|
if ((status = lookup_winsxs(acl, ai)) != STATUS_NO_SUCH_FILE) return status;
|
||||||
|
@ -3006,7 +3061,7 @@ static NTSTATUS parse_depend_manifests(struct actctx_loader* acl)
|
||||||
{
|
{
|
||||||
if (lookup_assembly(acl, &acl->dependencies[i]) != STATUS_SUCCESS)
|
if (lookup_assembly(acl, &acl->dependencies[i]) != STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
if (!acl->dependencies[i].optional)
|
if (!acl->dependencies[i].optional && !acl->dependencies[i].delayed)
|
||||||
{
|
{
|
||||||
const struct assembly_version *ver = &acl->dependencies[i].version;
|
const struct assembly_version *ver = &acl->dependencies[i].version;
|
||||||
DPRINT1( "Could not find dependent assembly %S (%u.%u.%u.%u)\n",
|
DPRINT1( "Could not find dependent assembly %S (%u.%u.%u.%u)\n",
|
||||||
|
@ -3035,7 +3090,7 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
|
||||||
}
|
}
|
||||||
else if (flags & (RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_ADDRESS | RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_HMODULE))
|
else if (flags & (RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_ADDRESS | RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_HMODULE))
|
||||||
{
|
{
|
||||||
ULONG magic;
|
ULONG_PTR magic;
|
||||||
LDR_DATA_TABLE_ENTRY *pldr;
|
LDR_DATA_TABLE_ENTRY *pldr;
|
||||||
|
|
||||||
if (!*handle) return STATUS_INVALID_PARAMETER;
|
if (!*handle) return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -4584,6 +4639,11 @@ void actctx_init(void)
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RtlCreateActivationContext (NTDLL.@)
|
||||||
|
*
|
||||||
|
* Create an activation context.
|
||||||
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
RtlCreateActivationContext(IN ULONG Flags,
|
RtlCreateActivationContext(IN ULONG Flags,
|
||||||
|
@ -4633,7 +4693,7 @@ RtlCreateActivationContext(IN ULONG Flags,
|
||||||
if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID) module = pActCtx->hModule;
|
if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID) module = pActCtx->hModule;
|
||||||
else module = NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress;
|
else module = NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress;
|
||||||
|
|
||||||
status = get_module_filename(module, &dir, 0);
|
status = get_module_filename( module, &dir, 0 );
|
||||||
if (!NT_SUCCESS(status)) goto error;
|
if (!NT_SUCCESS(status)) goto error;
|
||||||
if ((p = strrchrW( dir.Buffer, '\\' ))) p[1] = 0;
|
if ((p = strrchrW( dir.Buffer, '\\' ))) p[1] = 0;
|
||||||
actctx->appdir.info = dir.Buffer;
|
actctx->appdir.info = dir.Buffer;
|
||||||
|
@ -4782,25 +4842,44 @@ RtlReleaseActivationContext( HANDLE handle )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
VOID
|
|
||||||
NTAPI
|
/***********************************************************************
|
||||||
RtlAddRefActivationContext( HANDLE handle )
|
* RtlAddRefActivationContext (NTDLL.@)
|
||||||
|
*/
|
||||||
|
VOID NTAPI RtlAddRefActivationContext( HANDLE handle )
|
||||||
{
|
{
|
||||||
ACTIVATION_CONTEXT *actctx;
|
ACTIVATION_CONTEXT *actctx;
|
||||||
|
|
||||||
if ((actctx = check_actctx(handle))) actctx_addref(actctx);
|
if ((actctx = check_actctx( handle ))) actctx_addref( actctx );
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
/******************************************************************
|
||||||
RtlReleaseActivationContext( HANDLE handle )
|
* RtlReleaseActivationContext (NTDLL.@)
|
||||||
|
*/
|
||||||
|
VOID NTAPI RtlReleaseActivationContext( HANDLE handle )
|
||||||
{
|
{
|
||||||
ACTIVATION_CONTEXT *actctx;
|
ACTIVATION_CONTEXT *actctx;
|
||||||
|
|
||||||
if ((actctx = check_actctx(handle))) actctx_release(actctx);
|
if ((actctx = check_actctx( handle ))) actctx_release( actctx );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* RtlZombifyActivationContext (NTDLL.@)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NTSTATUS NTAPI RtlZombifyActivationContext(PVOID Context)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
if (Context == ACTCTX_FAKE_HANDLE)
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI RtlActivateActivationContextEx( ULONG flags, PTEB tebAddress, HANDLE handle, PULONG_PTR cookie )
|
NTAPI RtlActivateActivationContextEx( ULONG flags, PTEB tebAddress, HANDLE handle, PULONG_PTR cookie )
|
||||||
{
|
{
|
||||||
|
@ -4821,16 +4900,18 @@ NTAPI RtlActivateActivationContextEx( ULONG flags, PTEB tebAddress, HANDLE handl
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
NTSTATUS
|
* RtlActivateActivationContext (NTDLL.@)
|
||||||
NTAPI RtlActivateActivationContext( ULONG flags, HANDLE handle, PULONG_PTR cookie )
|
*/
|
||||||
|
NTSTATUS NTAPI RtlActivateActivationContext( ULONG flags, HANDLE handle, PULONG_PTR cookie )
|
||||||
{
|
{
|
||||||
return RtlActivateActivationContextEx(flags, NtCurrentTeb(), handle, cookie);
|
return RtlActivateActivationContextEx(flags, NtCurrentTeb(), handle, cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
/***********************************************************************
|
||||||
NTAPI
|
* RtlDeactivateActivationContext (NTDLL.@)
|
||||||
RtlDeactivateActivationContext( ULONG flags, ULONG_PTR cookie )
|
*/
|
||||||
|
NTSTATUS NTAPI RtlDeactivateActivationContext( ULONG flags, ULONG_PTR cookie )
|
||||||
{
|
{
|
||||||
RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame, *top;
|
RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame, *top;
|
||||||
|
|
||||||
|
@ -4892,16 +4973,20 @@ RtlFreeActivationContextStack(IN PACTIVATION_CONTEXT_STACK Stack)
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, Stack);
|
RtlFreeHeap(RtlGetProcessHeap(), 0, Stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
/******************************************************************
|
||||||
NTAPI RtlFreeThreadActivationContextStack(VOID)
|
* RtlFreeThreadActivationContextStack (NTDLL.@)
|
||||||
|
*/
|
||||||
|
VOID NTAPI RtlFreeThreadActivationContextStack(VOID)
|
||||||
{
|
{
|
||||||
RtlFreeActivationContextStack(NtCurrentTeb()->ActivationContextStackPointer);
|
RtlFreeActivationContextStack(NtCurrentTeb()->ActivationContextStackPointer);
|
||||||
NtCurrentTeb()->ActivationContextStackPointer = NULL;
|
NtCurrentTeb()->ActivationContextStackPointer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
/******************************************************************
|
||||||
NTAPI RtlGetActiveActivationContext( HANDLE *handle )
|
* RtlGetActiveActivationContext (NTDLL.@)
|
||||||
|
*/
|
||||||
|
NTSTATUS NTAPI RtlGetActiveActivationContext( HANDLE *handle )
|
||||||
{
|
{
|
||||||
if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
|
if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
|
||||||
{
|
{
|
||||||
|
@ -4915,8 +5000,10 @@ NTAPI RtlGetActiveActivationContext( HANDLE *handle )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN
|
/******************************************************************
|
||||||
NTAPI RtlIsActivationContextActive( HANDLE handle )
|
* RtlIsActivationContextActive (NTDLL.@)
|
||||||
|
*/
|
||||||
|
BOOLEAN NTAPI RtlIsActivationContextActive( HANDLE handle )
|
||||||
{
|
{
|
||||||
RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame;
|
RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame;
|
||||||
|
|
||||||
|
@ -4925,11 +5012,16 @@ NTAPI RtlIsActivationContextActive( HANDLE handle )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
/***********************************************************************
|
||||||
RtlQueryInformationActivationContext( ULONG flags, HANDLE handle, PVOID subinst,
|
* RtlQueryInformationActivationContext (NTDLL.@)
|
||||||
ULONG class, PVOID buffer,
|
*
|
||||||
SIZE_T bufsize, SIZE_T *retlen )
|
* Get information about an activation context.
|
||||||
|
* FIXME: function signature/prototype may be wrong
|
||||||
|
*/
|
||||||
|
NTSTATUS NTAPI RtlQueryInformationActivationContext( ULONG flags, HANDLE handle, PVOID subinst,
|
||||||
|
ULONG class, PVOID buffer,
|
||||||
|
SIZE_T bufsize, SIZE_T *retlen )
|
||||||
{
|
{
|
||||||
ACTIVATION_CONTEXT *actctx;
|
ACTIVATION_CONTEXT *actctx;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
@ -5172,10 +5264,14 @@ RtlpFindActivationContextSection_CheckParameters( ULONG flags, const GUID *guid,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
/***********************************************************************
|
||||||
NTAPI
|
* RtlFindActivationContextSectionString (NTDLL.@)
|
||||||
RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG section_kind,
|
*
|
||||||
const UNICODE_STRING *section_name, PVOID ptr )
|
* Find information about a string in an activation context.
|
||||||
|
* FIXME: function signature/prototype may be wrong
|
||||||
|
*/
|
||||||
|
NTSTATUS NTAPI RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG section_kind,
|
||||||
|
const UNICODE_STRING *section_name, PVOID ptr )
|
||||||
{
|
{
|
||||||
PACTCTX_SECTION_KEYED_DATA data = ptr;
|
PACTCTX_SECTION_KEYED_DATA data = ptr;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
@ -5204,13 +5300,19 @@ RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG sect
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RtlFindActivationContextSectionGuid (NTDLL.@)
|
||||||
|
*
|
||||||
|
* Find information about a GUID in an activation context.
|
||||||
|
* FIXME: function signature/prototype may be wrong
|
||||||
|
*/
|
||||||
NTSTATUS WINAPI RtlFindActivationContextSectionGuid( ULONG flags, const GUID *extguid, ULONG section_kind,
|
NTSTATUS WINAPI RtlFindActivationContextSectionGuid( ULONG flags, const GUID *extguid, ULONG section_kind,
|
||||||
const GUID *guid, void *ptr )
|
const GUID *guid, void *ptr )
|
||||||
{
|
{
|
||||||
ACTCTX_SECTION_KEYED_DATA *data = ptr;
|
ACTCTX_SECTION_KEYED_DATA *data = ptr;
|
||||||
NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND;
|
NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND;
|
||||||
|
|
||||||
if (extguid)
|
if (extguid)
|
||||||
{
|
{
|
||||||
DPRINT1("expected extguid == NULL\n");
|
DPRINT1("expected extguid == NULL\n");
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -5224,7 +5326,7 @@ NTSTATUS WINAPI RtlFindActivationContextSectionGuid( ULONG flags, const GUID *ex
|
||||||
|
|
||||||
if (!data || data->cbSize < FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) || !guid)
|
if (!data || data->cbSize < FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) || !guid)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
|
if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
|
||||||
{
|
{
|
||||||
ACTIVATION_CONTEXT *actctx = check_actctx(NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext);
|
ACTIVATION_CONTEXT *actctx = check_actctx(NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext);
|
||||||
|
@ -5346,17 +5448,3 @@ RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CON
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
RtlZombifyActivationContext(PVOID Context)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
|
|
||||||
if (Context == ACTCTX_FAKE_HANDLE)
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -260,6 +260,8 @@ check Wine current souces first as it may already be fixed.
|
||||||
|
|
||||||
reactos/lib/3rdparty/strmbase # Synced to Wine-1.7.27
|
reactos/lib/3rdparty/strmbase # Synced to Wine-1.7.27
|
||||||
|
|
||||||
|
reactos/lib/rtl/actctx.c # Partly synced with WineStaging-1.7.37
|
||||||
|
|
||||||
advapi32 -
|
advapi32 -
|
||||||
reactos/dll/win32/advapi32/wine/cred.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/cred.c # Synced to Wine-1.7.27
|
||||||
reactos/dll/win32/advapi32/wine/crypt.c # Synced to Wine-1.7.27
|
reactos/dll/win32/advapi32/wine/crypt.c # Synced to Wine-1.7.27
|
||||||
|
|
Loading…
Reference in a new issue