2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Runtime Library
4 * PURPOSE: Activation Context Support
5 * FILE: lib/rtl/actctx.c
6 * PROGRAMERS: Stefan Ginsberg (stefan__100__@hotmail.com)
9 /* INCLUDES *****************************************************************/
16 #define QUERY_ACTCTX_FLAG_ACTIVE (0x00000001)
18 #define ACTCTX_FLAGS_ALL (\
19 ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID |\
20 ACTCTX_FLAG_LANGID_VALID |\
21 ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID |\
22 ACTCTX_FLAG_RESOURCE_NAME_VALID |\
23 ACTCTX_FLAG_SET_PROCESS_DEFAULT |\
24 ACTCTX_FLAG_APPLICATION_NAME_VALID |\
25 ACTCTX_FLAG_SOURCE_IS_ASSEMBLYREF |\
26 ACTCTX_FLAG_HMODULE_VALID )
28 #define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
29 #define ACTCTX_FAKE_COOKIE ((ULONG_PTR) 0xf00bad)
32 /* INTERNAL FUNCTIONS *******************************************************/
34 static NTSTATUS
open_nt_file( HANDLE
*handle
, UNICODE_STRING
*name
)
36 OBJECT_ATTRIBUTES attr
;
39 attr
.Length
= sizeof(attr
);
40 attr
.RootDirectory
= 0;
41 attr
.Attributes
= OBJ_CASE_INSENSITIVE
;
42 attr
.ObjectName
= name
;
43 attr
.SecurityDescriptor
= NULL
;
44 attr
.SecurityQualityOfService
= NULL
;
45 return NtOpenFile( handle
, GENERIC_READ
, &attr
, &io
, FILE_SHARE_READ
, FILE_SYNCHRONOUS_IO_ALERT
);
49 /* FUNCTIONS ***************************************************************/
53 RtlAddRefActivationContext(PVOID Context
)
60 RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
,
64 return STATUS_NOT_IMPLEMENTED
;
69 RtlAllocateActivationContextStack(IN PVOID
*Context
)
72 return STATUS_NOT_IMPLEMENTED
;
77 RtlGetActiveActivationContext(IN PVOID
*Context
)
80 if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
82 *Context = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext;
83 RtlAddRefActivationContext(*Context);
88 *Context
= ACTCTX_FAKE_HANDLE
;
89 return STATUS_SUCCESS
;
94 RtlReleaseActivationContext(IN PVOID
*Context
)
101 RtlFindActivationContextSectionString(IN ULONG dwFlags
,
102 IN
const GUID
*ExtensionGuid
,
103 IN ULONG SectionType
,
104 IN PUNICODE_STRING SectionName
,
105 IN OUT PVOID ReturnedData
)
107 PACTCTX_SECTION_KEYED_DATA Data
= ReturnedData
;
111 if (!Data
|| Data
->cbSize
< offsetof(ACTCTX_SECTION_KEYED_DATA
, ulAssemblyRosterIndex
) ||
112 !SectionName
|| !SectionName
->Buffer
)
114 return STATUS_INVALID_PARAMETER
;
117 return STATUS_NOT_IMPLEMENTED
;
122 RtlQueryInformationActivationContext(DWORD dwFlags
,
127 SIZE_T cbBuffer OPTIONAL
,
128 SIZE_T
*pcbWrittenOrRequired OPTIONAL
)
131 return STATUS_NOT_IMPLEMENTED
;
136 RtlQueryInformationActiveActivationContext(ULONG ulInfoClass
,
138 SIZE_T cbBuffer OPTIONAL
,
139 SIZE_T
*pcbWrittenOrRequired OPTIONAL
)
141 return RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_ACTIVE
,
147 pcbWrittenOrRequired
);
152 RtlZombifyActivationContext(PVOID Context
)
156 if (Context
== ACTCTX_FAKE_HANDLE
)
157 return STATUS_SUCCESS
;
159 return STATUS_NOT_IMPLEMENTED
;
164 RtlDeactivateActivationContext(DWORD dwFlags
,
169 if (ulCookie
== ACTCTX_FAKE_COOKIE
)
170 return STATUS_SUCCESS
;
172 return STATUS_NOT_IMPLEMENTED
;
177 RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
)
180 return STATUS_NOT_IMPLEMENTED
;
185 RtlActivateActivationContext(IN ULONG Unknown
, IN HANDLE Handle
, OUT PULONG_PTR Cookie
)
188 PRTL_ACTIVATION_CONTEXT_STACK_FRAME Frame;
190 Frame = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*Frame) );
192 return STATUS_NO_MEMORY;
194 Frame->Previous = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame;
195 Frame->ActivationContext = Handle;
197 NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = Frame;
198 RtlAddRefActivationContext(Handle);
200 *Cookie = (ULONG_PTR)Frame;
201 DPRINT( "%p Cookie=%lx\n", Handle, *Cookie );
207 *Cookie
= ACTCTX_FAKE_COOKIE
;
208 return STATUS_SUCCESS
;
213 RtlCreateActivationContext(OUT PHANDLE Handle
, IN OUT PVOID ReturnedData
)
215 PCACTCTXW pActCtx
= (PCACTCTXW
) ReturnedData
;
216 UNICODE_STRING NameW
;
217 NTSTATUS Status
= STATUS_SUCCESS
;
218 HANDLE hFile
= INVALID_HANDLE_VALUE
;
222 if (!pActCtx
|| (pActCtx
->cbSize
< sizeof(*pActCtx
)) ||
223 (pActCtx
->dwFlags
& ~ACTCTX_FLAGS_ALL
))
224 return STATUS_INVALID_PARAMETER
;
227 if (pActCtx
->lpSource
)
229 if (!RtlDosPathNameToNtPathName_U(pActCtx
->lpSource
, &NameW
, NULL
, NULL
))
231 Status
= STATUS_NO_SUCH_FILE
;
234 Status
= open_nt_file( &hFile
, &NameW
);
235 if (!NT_SUCCESS(Status
))
237 RtlFreeUnicodeString( &NameW
);
242 if (pActCtx
->dwFlags
& ACTCTX_FLAG_RESOURCE_NAME_VALID
)
244 /* if we have a resource it's a PE file */
245 if (pActCtx
->dwFlags
& ACTCTX_FLAG_HMODULE_VALID
)
248 else if (pActCtx
->lpSource
)
253 Status
= STATUS_INVALID_PARAMETER
;
264 RtlFreeUnicodeString( &NameW
);
266 *Handle
= ACTCTX_FAKE_HANDLE
;
270 if (hFile
) NtClose( hFile
);