mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 07:44:47 +00:00
kernel32: Move activation context creation to ntdll (based on a patch by Eric Pouech).
This commit is contained in:
parent
44c9758d05
commit
64f6fdc57e
|
@ -28,32 +28,15 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "winnls.h"
|
#include "winnls.h"
|
||||||
|
#include "winternl.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(actctx);
|
WINE_DEFAULT_DEBUG_CHANNEL(actctx);
|
||||||
|
|
||||||
|
|
||||||
#define ACTCTX_FLAGS_ALL (\
|
|
||||||
ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID |\
|
|
||||||
ACTCTX_FLAG_LANGID_VALID |\
|
|
||||||
ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID |\
|
|
||||||
ACTCTX_FLAG_RESOURCE_NAME_VALID |\
|
|
||||||
ACTCTX_FLAG_SET_PROCESS_DEFAULT |\
|
|
||||||
ACTCTX_FLAG_APPLICATION_NAME_VALID |\
|
|
||||||
ACTCTX_FLAG_SOURCE_IS_ASSEMBLYREF |\
|
|
||||||
ACTCTX_FLAG_HMODULE_VALID )
|
|
||||||
|
|
||||||
#define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
|
#define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
|
||||||
#define ACTCTX_FAKE_COOKIE ((ULONG_PTR) 0xf00bad)
|
#define ACTCTX_FAKE_COOKIE ((ULONG_PTR) 0xf00bad)
|
||||||
|
|
||||||
#define ACTCTX_MAGIC 0xC07E3E11
|
|
||||||
|
|
||||||
struct actctx
|
|
||||||
{
|
|
||||||
ULONG magic;
|
|
||||||
LONG ref_count;
|
|
||||||
};
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CreateActCtxA (KERNEL32.@)
|
* CreateActCtxA (KERNEL32.@)
|
||||||
*
|
*
|
||||||
|
@ -68,8 +51,7 @@ HANDLE WINAPI CreateActCtxA(PCACTCTXA pActCtx)
|
||||||
|
|
||||||
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
|
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
|
||||||
|
|
||||||
if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx) ||
|
if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx))
|
||||||
(pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
|
@ -138,44 +120,17 @@ done:
|
||||||
*/
|
*/
|
||||||
HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
|
HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
|
||||||
{
|
{
|
||||||
struct actctx* actctx;
|
NTSTATUS status;
|
||||||
DWORD ret = ERROR_SUCCESS;
|
HANDLE hActCtx;
|
||||||
|
|
||||||
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
|
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
|
||||||
|
|
||||||
if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx) ||
|
if ((status = RtlCreateActivationContext(&hActCtx, pActCtx)))
|
||||||
(pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(RtlNtStatusToDosError(status));
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
actctx = HeapAlloc(GetProcessHeap(), 0, sizeof(*actctx));
|
return hActCtx;
|
||||||
if (!actctx) return INVALID_HANDLE_VALUE;
|
|
||||||
|
|
||||||
actctx->magic = ACTCTX_MAGIC;
|
|
||||||
actctx->ref_count = 1;
|
|
||||||
|
|
||||||
if (ret == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
return (HANDLE)actctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseActCtx((HANDLE)actctx);
|
|
||||||
SetLastError(ret);
|
|
||||||
return INVALID_HANDLE_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct actctx* check_actctx(HANDLE h)
|
|
||||||
{
|
|
||||||
struct actctx* actctx = (struct actctx*)h;
|
|
||||||
|
|
||||||
switch (actctx->magic)
|
|
||||||
{
|
|
||||||
case ACTCTX_MAGIC: return actctx;
|
|
||||||
default:
|
|
||||||
SetLastError(ERROR_INVALID_HANDLE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -241,12 +196,7 @@ BOOL WINAPI GetCurrentActCtx(HANDLE* phActCtx)
|
||||||
*/
|
*/
|
||||||
void WINAPI AddRefActCtx(HANDLE hActCtx)
|
void WINAPI AddRefActCtx(HANDLE hActCtx)
|
||||||
{
|
{
|
||||||
struct actctx* actctx;
|
RtlAddRefActivationContext(hActCtx);
|
||||||
|
|
||||||
TRACE("%p\n", hActCtx);
|
|
||||||
|
|
||||||
if ((actctx = check_actctx(hActCtx)))
|
|
||||||
InterlockedIncrement( &actctx->ref_count );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -256,18 +206,7 @@ void WINAPI AddRefActCtx(HANDLE hActCtx)
|
||||||
*/
|
*/
|
||||||
void WINAPI ReleaseActCtx(HANDLE hActCtx)
|
void WINAPI ReleaseActCtx(HANDLE hActCtx)
|
||||||
{
|
{
|
||||||
struct actctx* actctx;
|
RtlReleaseActivationContext(hActCtx);
|
||||||
|
|
||||||
TRACE("%p\n", hActCtx);
|
|
||||||
|
|
||||||
if ((actctx = check_actctx(hActCtx)))
|
|
||||||
{
|
|
||||||
if (!InterlockedDecrement( &actctx->ref_count ))
|
|
||||||
{
|
|
||||||
actctx->magic = 0;
|
|
||||||
HeapFree(GetProcessHeap(), 0, actctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -9,6 +9,7 @@ EXTRALIBS = @IOKITLIB@
|
||||||
BASEADDRESS = 0x7bc00000
|
BASEADDRESS = 0x7bc00000
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
|
actctx.c \
|
||||||
atom.c \
|
atom.c \
|
||||||
cdrom.c \
|
cdrom.c \
|
||||||
critsection.c \
|
critsection.c \
|
||||||
|
|
137
dlls/ntdll/actctx.c
Normal file
137
dlls/ntdll/actctx.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
* Activation contexts
|
||||||
|
*
|
||||||
|
* Copyright 2004 Jon Griffiths
|
||||||
|
* Copyright 2007 Eric Pouech
|
||||||
|
* Copyright 2007 Jacek Caban for CodeWeavers
|
||||||
|
* Copyright 2007 Alexandre Julliard
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
#define NONAMELESSSTRUCT
|
||||||
|
#include "ntstatus.h"
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
|
#include "winternl.h"
|
||||||
|
#include "ntdll_misc.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(actctx);
|
||||||
|
|
||||||
|
#define ACTCTX_FLAGS_ALL (\
|
||||||
|
ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID |\
|
||||||
|
ACTCTX_FLAG_LANGID_VALID |\
|
||||||
|
ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID |\
|
||||||
|
ACTCTX_FLAG_RESOURCE_NAME_VALID |\
|
||||||
|
ACTCTX_FLAG_SET_PROCESS_DEFAULT |\
|
||||||
|
ACTCTX_FLAG_APPLICATION_NAME_VALID |\
|
||||||
|
ACTCTX_FLAG_SOURCE_IS_ASSEMBLYREF |\
|
||||||
|
ACTCTX_FLAG_HMODULE_VALID )
|
||||||
|
|
||||||
|
#define ACTCTX_MAGIC 0xC07E3E11
|
||||||
|
|
||||||
|
typedef struct _ACTIVATION_CONTEXT
|
||||||
|
{
|
||||||
|
ULONG magic;
|
||||||
|
int ref_count;
|
||||||
|
} ACTIVATION_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
|
||||||
|
{
|
||||||
|
ACTIVATION_CONTEXT *actctx = h;
|
||||||
|
|
||||||
|
if (!h || h == INVALID_HANDLE_VALUE) return NULL;
|
||||||
|
switch (actctx->magic)
|
||||||
|
{
|
||||||
|
case ACTCTX_MAGIC:
|
||||||
|
return actctx;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void actctx_addref( ACTIVATION_CONTEXT *actctx )
|
||||||
|
{
|
||||||
|
interlocked_xchg_add( &actctx->ref_count, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void actctx_release( ACTIVATION_CONTEXT *actctx )
|
||||||
|
{
|
||||||
|
if (interlocked_xchg_add( &actctx->ref_count, -1 ) == 1)
|
||||||
|
{
|
||||||
|
actctx->magic = 0;
|
||||||
|
RtlFreeHeap( GetProcessHeap(), 0, actctx );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RtlCreateActivationContext (NTDLL.@)
|
||||||
|
*
|
||||||
|
* Create an activation context.
|
||||||
|
*
|
||||||
|
* FIXME: function signature/prototype is wrong
|
||||||
|
*/
|
||||||
|
NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, const void *ptr )
|
||||||
|
{
|
||||||
|
const ACTCTXW *pActCtx = ptr; /* FIXME: not the right structure */
|
||||||
|
ACTIVATION_CONTEXT *actctx;
|
||||||
|
|
||||||
|
TRACE("%p %08x\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0);
|
||||||
|
|
||||||
|
if (!pActCtx || pActCtx->cbSize != sizeof(*pActCtx) ||
|
||||||
|
(pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (!(actctx = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*actctx) )))
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
|
||||||
|
actctx->magic = ACTCTX_MAGIC;
|
||||||
|
actctx->ref_count = 1;
|
||||||
|
|
||||||
|
*handle = actctx;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RtlAddRefActivationContext (NTDLL.@)
|
||||||
|
*/
|
||||||
|
void WINAPI RtlAddRefActivationContext( HANDLE handle )
|
||||||
|
{
|
||||||
|
ACTIVATION_CONTEXT *actctx;
|
||||||
|
|
||||||
|
if ((actctx = check_actctx( handle ))) actctx_addref( actctx );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* RtlReleaseActivationContext (NTDLL.@)
|
||||||
|
*/
|
||||||
|
void WINAPI RtlReleaseActivationContext( HANDLE handle )
|
||||||
|
{
|
||||||
|
ACTIVATION_CONTEXT *actctx;
|
||||||
|
|
||||||
|
if ((actctx = check_actctx( handle ))) actctx_release( actctx );
|
||||||
|
}
|
|
@ -407,7 +407,7 @@
|
||||||
# @ stub RtlAddAuditAccessObjectAce
|
# @ stub RtlAddAuditAccessObjectAce
|
||||||
# @ stub RtlAddCompoundAce
|
# @ stub RtlAddCompoundAce
|
||||||
# @ stub RtlAddRange
|
# @ stub RtlAddRange
|
||||||
# @ stub RtlAddRefActivationContext
|
@ stdcall RtlAddRefActivationContext(ptr)
|
||||||
# @ stub RtlAddRefMemoryStream
|
# @ stub RtlAddRefMemoryStream
|
||||||
@ stdcall RtlAddVectoredExceptionHandler(long ptr)
|
@ stdcall RtlAddVectoredExceptionHandler(long ptr)
|
||||||
# @ stub RtlAddressInSectionTable
|
# @ stub RtlAddressInSectionTable
|
||||||
|
@ -475,7 +475,7 @@
|
||||||
@ stdcall RtlCopyString(ptr ptr)
|
@ stdcall RtlCopyString(ptr ptr)
|
||||||
@ stdcall RtlCopyUnicodeString(ptr ptr)
|
@ stdcall RtlCopyUnicodeString(ptr ptr)
|
||||||
@ stdcall RtlCreateAcl(ptr long long)
|
@ stdcall RtlCreateAcl(ptr long long)
|
||||||
# @ stub RtlCreateActivationContext
|
@ stdcall RtlCreateActivationContext(ptr ptr)
|
||||||
@ stub RtlCreateAndSetSD
|
@ stub RtlCreateAndSetSD
|
||||||
@ stdcall RtlCreateAtomTable(long ptr)
|
@ stdcall RtlCreateAtomTable(long ptr)
|
||||||
# @ stub RtlCreateBootStatusDataFile
|
# @ stub RtlCreateBootStatusDataFile
|
||||||
|
@ -794,7 +794,7 @@
|
||||||
@ stub RtlRealSuccessor
|
@ stub RtlRealSuccessor
|
||||||
@ stub RtlRegisterSecureMemoryCacheCallback
|
@ stub RtlRegisterSecureMemoryCacheCallback
|
||||||
@ stub RtlRegisterWait
|
@ stub RtlRegisterWait
|
||||||
@ stub RtlReleaseActivationContext
|
@ stdcall RtlReleaseActivationContext(ptr)
|
||||||
@ stub RtlReleaseMemoryStream
|
@ stub RtlReleaseMemoryStream
|
||||||
@ stdcall RtlReleasePebLock()
|
@ stdcall RtlReleasePebLock()
|
||||||
@ stdcall RtlReleaseResource(ptr)
|
@ stdcall RtlReleaseResource(ptr)
|
||||||
|
|
|
@ -1985,7 +1985,8 @@ NTSTATUS WINAPI RtlAddAccessAllowedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
|
||||||
NTSTATUS WINAPI RtlAddAccessDeniedAce(PACL,DWORD,DWORD,PSID);
|
NTSTATUS WINAPI RtlAddAccessDeniedAce(PACL,DWORD,DWORD,PSID);
|
||||||
NTSTATUS WINAPI RtlAddAccessDeniedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
|
NTSTATUS WINAPI RtlAddAccessDeniedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
|
||||||
NTSTATUS WINAPI RtlAddAtomToAtomTable(RTL_ATOM_TABLE,const WCHAR*,RTL_ATOM*);
|
NTSTATUS WINAPI RtlAddAtomToAtomTable(RTL_ATOM_TABLE,const WCHAR*,RTL_ATOM*);
|
||||||
NTSTATUS WINAPI RtlAddAuditAccessAce(PACL,DWORD,DWORD,PSID,BOOL,BOOL);
|
NTSTATUS WINAPI RtlAddAuditAccessAce(PACL,DWORD,DWORD,PSID,BOOL,BOOL);
|
||||||
|
void WINAPI RtlAddRefActivationContext(HANDLE);
|
||||||
PVOID WINAPI RtlAddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER);
|
PVOID WINAPI RtlAddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER);
|
||||||
NTSTATUS WINAPI RtlAdjustPrivilege(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
|
NTSTATUS WINAPI RtlAdjustPrivilege(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
|
||||||
NTSTATUS WINAPI RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *);
|
NTSTATUS WINAPI RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *);
|
||||||
|
@ -2007,6 +2008,7 @@ NTSTATUS WINAPI RtlCharToInteger(PCSZ,ULONG,PULONG);
|
||||||
NTSTATUS WINAPI RtlCheckRegistryKey(ULONG, PWSTR);
|
NTSTATUS WINAPI RtlCheckRegistryKey(ULONG, PWSTR);
|
||||||
void WINAPI RtlClearAllBits(PRTL_BITMAP);
|
void WINAPI RtlClearAllBits(PRTL_BITMAP);
|
||||||
void WINAPI RtlClearBits(PRTL_BITMAP,ULONG,ULONG);
|
void WINAPI RtlClearBits(PRTL_BITMAP,ULONG,ULONG);
|
||||||
|
NTSTATUS WINAPI RtlCreateActivationContext(HANDLE*,const void*);
|
||||||
PDEBUG_BUFFER WINAPI RtlCreateQueryDebugBuffer(ULONG,BOOLEAN);
|
PDEBUG_BUFFER WINAPI RtlCreateQueryDebugBuffer(ULONG,BOOLEAN);
|
||||||
ULONG WINAPI RtlCompactHeap(HANDLE,ULONG);
|
ULONG WINAPI RtlCompactHeap(HANDLE,ULONG);
|
||||||
LONG WINAPI RtlCompareString(const STRING*,const STRING*,BOOLEAN);
|
LONG WINAPI RtlCompareString(const STRING*,const STRING*,BOOLEAN);
|
||||||
|
@ -2196,6 +2198,7 @@ void WINAPI RtlRaiseException(PEXCEPTION_RECORD);
|
||||||
void WINAPI RtlRaiseStatus(NTSTATUS);
|
void WINAPI RtlRaiseStatus(NTSTATUS);
|
||||||
ULONG WINAPI RtlRandom(PULONG);
|
ULONG WINAPI RtlRandom(PULONG);
|
||||||
PVOID WINAPI RtlReAllocateHeap(HANDLE,ULONG,PVOID,SIZE_T);
|
PVOID WINAPI RtlReAllocateHeap(HANDLE,ULONG,PVOID,SIZE_T);
|
||||||
|
void WINAPI RtlReleaseActivationContext(HANDLE);
|
||||||
void WINAPI RtlReleasePebLock(void);
|
void WINAPI RtlReleasePebLock(void);
|
||||||
void WINAPI RtlReleaseResource(LPRTL_RWLOCK);
|
void WINAPI RtlReleaseResource(LPRTL_RWLOCK);
|
||||||
ULONG WINAPI RtlRemoveVectoredExceptionHandler(PVOID);
|
ULONG WINAPI RtlRemoveVectoredExceptionHandler(PVOID);
|
||||||
|
|
Loading…
Reference in a new issue