WaveHdr prepare/unprepare/submit now gets handled within the context of the
[reactos.git] / reactos / lib / rtl / actctx.c
1 /*
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)
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #include <rtl.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 #define QUERY_ACTCTX_FLAG_ACTIVE (0x00000001)
17
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 )
27
28 #define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa)
29 #define ACTCTX_FAKE_COOKIE ((ULONG_PTR) 0xf00bad)
30
31
32 /* INTERNAL FUNCTIONS *******************************************************/
33
34 static NTSTATUS open_nt_file( HANDLE *handle, UNICODE_STRING *name )
35 {
36 OBJECT_ATTRIBUTES attr;
37 IO_STATUS_BLOCK io;
38
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 );
46 }
47
48
49 /* FUNCTIONS ***************************************************************/
50
51 VOID
52 NTAPI
53 RtlAddRefActivationContext(PVOID Context)
54 {
55 UNIMPLEMENTED;
56 }
57
58 NTSTATUS
59 NTAPI
60 RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
61 IN PVOID Context)
62 {
63 UNIMPLEMENTED;
64 return STATUS_NOT_IMPLEMENTED;
65 }
66
67 NTSTATUS
68 NTAPI
69 RtlAllocateActivationContextStack(IN PVOID *Context)
70 {
71 UNIMPLEMENTED;
72 return STATUS_NOT_IMPLEMENTED;
73 }
74
75 NTSTATUS
76 NTAPI
77 RtlGetActiveActivationContext(IN PVOID *Context)
78 {
79 /*
80 if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
81 {
82 *Context = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext;
83 RtlAddRefActivationContext(*Context);
84 }
85 else
86 *Context = 0;
87 */
88 *Context = ACTCTX_FAKE_HANDLE;
89 return STATUS_SUCCESS;
90 }
91
92 VOID
93 NTAPI
94 RtlReleaseActivationContext(IN PVOID *Context)
95 {
96 UNIMPLEMENTED;
97 }
98
99 NTSTATUS
100 NTAPI
101 RtlFindActivationContextSectionString(IN ULONG dwFlags,
102 IN const GUID *ExtensionGuid,
103 IN ULONG SectionType,
104 IN PUNICODE_STRING SectionName,
105 IN OUT PVOID ReturnedData)
106 {
107 PACTCTX_SECTION_KEYED_DATA Data = ReturnedData;
108
109 UNIMPLEMENTED;
110
111 if (!Data || Data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) ||
112 !SectionName || !SectionName->Buffer)
113 {
114 return STATUS_INVALID_PARAMETER;
115 }
116
117 return STATUS_NOT_IMPLEMENTED;
118 }
119
120 NTSTATUS
121 NTAPI
122 RtlQueryInformationActivationContext(DWORD dwFlags,
123 PVOID Context,
124 PVOID pvSubInstance,
125 ULONG ulInfoClass,
126 PVOID pvBuffer,
127 SIZE_T cbBuffer OPTIONAL,
128 SIZE_T *pcbWrittenOrRequired OPTIONAL)
129 {
130 UNIMPLEMENTED;
131 return STATUS_NOT_IMPLEMENTED;
132 }
133
134 NTSTATUS
135 NTAPI
136 RtlQueryInformationActiveActivationContext(ULONG ulInfoClass,
137 PVOID pvBuffer,
138 SIZE_T cbBuffer OPTIONAL,
139 SIZE_T *pcbWrittenOrRequired OPTIONAL)
140 {
141 return RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_ACTIVE,
142 NULL,
143 NULL,
144 ulInfoClass,
145 pvBuffer,
146 cbBuffer,
147 pcbWrittenOrRequired);
148 }
149
150 NTSTATUS
151 NTAPI
152 RtlZombifyActivationContext(PVOID Context)
153 {
154 UNIMPLEMENTED;
155
156 if (Context == ACTCTX_FAKE_HANDLE)
157 return STATUS_SUCCESS;
158
159 return STATUS_NOT_IMPLEMENTED;
160 }
161
162 NTSTATUS
163 NTAPI
164 RtlDeactivateActivationContext(DWORD dwFlags,
165 ULONG_PTR ulCookie)
166 {
167 UNIMPLEMENTED;
168
169 if (ulCookie == ACTCTX_FAKE_COOKIE)
170 return STATUS_SUCCESS;
171
172 return STATUS_NOT_IMPLEMENTED;
173 }
174
175 NTSTATUS
176 NTAPI
177 RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame)
178 {
179 UNIMPLEMENTED;
180 return STATUS_NOT_IMPLEMENTED;
181 }
182
183 NTSTATUS
184 NTAPI
185 RtlActivateActivationContext(IN ULONG Unknown, IN HANDLE Handle, OUT PULONG_PTR Cookie)
186 {
187 /*
188 PRTL_ACTIVATION_CONTEXT_STACK_FRAME Frame;
189
190 Frame = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*Frame) );
191 if (!Frame)
192 return STATUS_NO_MEMORY;
193
194 Frame->Previous = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame;
195 Frame->ActivationContext = Handle;
196 Frame->Flags = 0;
197 NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = Frame;
198 RtlAddRefActivationContext(Handle);
199
200 *Cookie = (ULONG_PTR)Frame;
201 DPRINT( "%p Cookie=%lx\n", Handle, *Cookie );
202 */
203
204 UNIMPLEMENTED;
205
206 if (Cookie)
207 *Cookie = ACTCTX_FAKE_COOKIE;
208 return STATUS_SUCCESS;
209 }
210
211 NTSTATUS
212 NTAPI
213 RtlCreateActivationContext(OUT PHANDLE Handle, IN OUT PVOID ReturnedData)
214 {
215 PCACTCTXW pActCtx = (PCACTCTXW) ReturnedData;
216 UNICODE_STRING NameW;
217 NTSTATUS Status = STATUS_SUCCESS;
218 HANDLE hFile = INVALID_HANDLE_VALUE;
219
220 UNIMPLEMENTED;
221
222 if (!pActCtx || (pActCtx->cbSize < sizeof(*pActCtx)) ||
223 (pActCtx->dwFlags & ~ACTCTX_FLAGS_ALL))
224 return STATUS_INVALID_PARAMETER;
225
226 NameW.Buffer = NULL;
227 if (pActCtx->lpSource)
228 {
229 if (!RtlDosPathNameToNtPathName_U(pActCtx->lpSource, &NameW, NULL, NULL))
230 {
231 Status = STATUS_NO_SUCH_FILE;
232 goto Error;
233 }
234 Status = open_nt_file( &hFile, &NameW );
235 if (!NT_SUCCESS(Status))
236 {
237 RtlFreeUnicodeString( &NameW );
238 goto Error;
239 }
240 }
241
242 if (pActCtx->dwFlags & ACTCTX_FLAG_RESOURCE_NAME_VALID)
243 {
244 /* if we have a resource it's a PE file */
245 if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID)
246 {
247 }
248 else if (pActCtx->lpSource)
249 {
250 }
251 else
252 {
253 Status = STATUS_INVALID_PARAMETER;
254 }
255 }
256 else
257 {
258 /* manifest file */
259 }
260
261 if (hFile)
262 NtClose( hFile );
263 if (NameW.Buffer)
264 RtlFreeUnicodeString( &NameW );
265
266 *Handle = ACTCTX_FAKE_HANDLE;
267 return Status;
268
269 Error:
270 if (hFile) NtClose( hFile );
271 return Status;
272
273 }