/*++ Copyright (c) 1998 Microsoft Corporation Module Name: csrsxs.c Abstract: This module implements functions that are used by the Side-by-Side Win32 APIs. Author: Samer Arafeh (samera) 20-May-2000 Revision History: Jay Krell (a-JayK) June, July 2000 factored/merged with sxs.c, source code duplication eliminated moved file opening out of csrss.exe to client process --*/ #include "basedll.h" #include #include typedef void * POINTER_32 PVOID32; #define DPFLTR_LEVEL_STATUS(x) ((NT_SUCCESS(x) \ || (x) == STATUS_OBJECT_NAME_NOT_FOUND \ || (x) == STATUS_RESOURCE_DATA_NOT_FOUND \ || (x) == STATUS_RESOURCE_TYPE_NOT_FOUND \ || (x) == STATUS_RESOURCE_NAME_NOT_FOUND \ || (x) == STATUS_RESOURCE_LANG_NOT_FOUND \ || (x) == STATUS_SXS_CANT_GEN_ACTCTX \ ) \ ? DPFLTR_TRACE_LEVEL : DPFLTR_ERROR_LEVEL) VOID BasepSxsDbgPrintMessageStream( PCSTR Function, PCSTR StreamName, PBASE_MSG_SXS_STREAM MessageStream ) { KdPrintEx(( DPFLTR_SXS_ID, DPFLTR_TRACE_LEVEL, "SXS: %s() %s {\n" "SXS: FileType:%s\n" "SXS: PathType:%s\n" "SXS: Path:%wZ\n" "SXS: FileHandle:%p\n" "SXS: HandleType:%s\n" "SXS: Handle:%p\n" "SXS: Offset:0x%I64x\n" "SXS: Size:0x%Ix\n" "SXS: }\n", Function, StreamName, (MessageStream->FileType == BASE_MSG_FILETYPE_NONE ? "None" : MessageStream->FileType == BASE_MSG_FILETYPE_XML ? "Xml" : MessageStream->FileType == BASE_MSG_FILETYPE_PRECOMPILED_XML ? "PrecompiledXml" : "Unknown"), (MessageStream->PathType == BASE_MSG_PATHTYPE_NONE ? "None" : MessageStream->PathType == BASE_MSG_PATHTYPE_FILE ? "File" : MessageStream->PathType == BASE_MSG_PATHTYPE_URL ? "Url" : MessageStream->PathType == BASE_MSG_PATHTYPE_OVERRIDE ? "Override" : "Unknown"), &MessageStream->Path, MessageStream->FileHandle, (MessageStream->HandleType == BASE_MSG_HANDLETYPE_NONE ? "None" : MessageStream->HandleType == BASE_MSG_HANDLETYPE_PROCESS ? "Process" : MessageStream->HandleType == BASE_MSG_HANDLETYPE_CLIENT_PROCESS ? "ClientProcess" : MessageStream->HandleType == BASE_MSG_HANDLETYPE_SECTION ? "Section" : "Unknown"), MessageStream->Handle, MessageStream->Offset, MessageStream->Size)); } NTSTATUS CsrBasepCreateActCtx( IN PBASE_SXS_CREATE_ACTIVATION_CONTEXT_MSG Message ) { NTSTATUS Status; #if defined(BUILD_WOW6432) Status = NtWow64CsrBasepCreateActCtx(Message); #else BASE_API_MSG m; PCSR_CAPTURE_HEADER CaptureBuffer = NULL; // // BUILD_WOW64 means we are 64bit code in a 32bit process "between" csrss and a 32bit client. // We are in the static thunk library linked into wow64.dll. // // Neither native x86 nor native ia64 code needs to worry about the pointer sizes here. // #if defined(BUILD_WOW64) PVOID ActivationContextDataLocal64 = NULL; PVOID32* ActivationContextDataOut32 = NULL; #endif #if DBG KdPrintEx(( DPFLTR_SXS_ID, DPFLTR_TRACE_LEVEL, "SXS: %s() Message {\n" "SXS: Flags:(%s | %s | %s)\n" "SXS: ProcessorArchitecture:%lx\n" "SXS: LangId:%lx\n" "SXS: AssemblyDirectory:%wZ\n" "SXS: TextualAssemblyIdentity:%wZ\n" "SXS: }\n", __FUNCTION__, (Message->Flags & BASE_MSG_SXS_MANIFEST_PRESENT) ? "MANIFEST_PRESENT" : "0", (Message->Flags & BASE_MSG_SXS_POLICY_PRESENT) ? "POLICY_PRESENT" : "0", (Message->Flags & BASE_MSG_SXS_TEXTUAL_ASSEMBLY_IDENTITY_PRESENT) ? "TEXTUAL_ASSEMBLY_IDENTITY_PRESENT" : "0", Message->ProcessorArchitecture, Message->LangId, &Message->AssemblyDirectory, &Message->TextualAssemblyIdentity )); if (Message->Flags & BASE_MSG_SXS_MANIFEST_PRESENT) { BasepSxsDbgPrintMessageStream(__FUNCTION__, "Manifest", &Message->Manifest); } if (Message->Flags & BASE_MSG_SXS_POLICY_PRESENT) { BasepSxsDbgPrintMessageStream(__FUNCTION__, "Policy", &Message->Policy); } #endif m.u.SxsCreateActivationContext = *Message; { const PUNICODE_STRING StringsToCapture[] = { &m.u.SxsCreateActivationContext.Manifest.Path, ( Message->Flags & BASE_MSG_SXS_POLICY_PRESENT ) ? &m.u.SxsCreateActivationContext.Policy.Path : NULL, &m.u.SxsCreateActivationContext.AssemblyDirectory, ( Message->Flags & BASE_MSG_SXS_TEXTUAL_ASSEMBLY_IDENTITY_PRESENT ) ? &m.u.SxsCreateActivationContext.TextualAssemblyIdentity : NULL }; Status = CsrCaptureMessageMultiUnicodeStringsInPlace( &CaptureBuffer, RTL_NUMBER_OF(StringsToCapture), StringsToCapture ); if (!NT_SUCCESS(Status)) { DbgPrintEx(DPFLTR_SXS_ID, DPFLTR_LEVEL_STATUS(Status), "SXS: %s() CsrCaptureMessageMultiUnicodeStringsInPlace failed\n", __FUNCTION__); goto Exit; } } #if defined(BUILD_WOW64) if (m.u.SxsCreateActivationContext.ActivationContextData != NULL) { ActivationContextDataOut32 = (PVOID32*)m.u.SxsCreateActivationContext.ActivationContextData; m.u.SxsCreateActivationContext.ActivationContextData = (PVOID*)&ActivationContextDataLocal64; } #endif Status = CsrClientCallServer((PCSR_API_MSG) &m, CaptureBuffer, CSR_MAKE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSxsCreateActivationContext), sizeof(*Message)); #if defined(BUILD_WOW64) if ((m.u.SxsCreateActivationContext.ActivationContextData != NULL) && (ActivationContextDataOut32 != NULL)) { *ActivationContextDataOut32 = (PVOID32) ActivationContextDataLocal64; } #endif Exit: if ( CaptureBuffer != NULL ) CsrFreeCaptureBuffer(CaptureBuffer); #endif return Status; }