[KERNEL32][RTL] Diverse fixes/improvements for thread stack creation code. (#802)
[reactos.git] / dll / win32 / kernel32 / include / kernel32.h
1 #pragma once
2
3 //
4 // Kernel32 Filter IDs
5 //
6 #define kernel32file 200
7 #define kernel32ver 201
8 #define actctx 202
9 #define resource 203
10 #define kernel32session 204
11 #define comm 205
12 #define profile 206
13 #define nls 207
14
15
16 #if DBG
17 #define DEBUG_CHANNEL(ch) static ULONG gDebugChannel = ch;
18 #else
19 #define DEBUG_CHANNEL(ch)
20 #endif
21
22 #define TRACE(fmt, ...) TRACE__(gDebugChannel, fmt, ##__VA_ARGS__)
23 #define WARN(fmt, ...) WARN__(gDebugChannel, fmt, ##__VA_ARGS__)
24 #define FIXME(fmt, ...) WARN__(gDebugChannel, fmt,## __VA_ARGS__)
25 #define ERR(fmt, ...) ERR__(gDebugChannel, fmt, ##__VA_ARGS__)
26
27 #define STUB \
28 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); \
29 DPRINT1("%s() is UNIMPLEMENTED!\n", __FUNCTION__)
30
31 #define debugstr_a
32 #define debugstr_w
33 #define debugstr_wn
34 #define wine_dbgstr_w
35 #define debugstr_guid
36
37 #include "wine/unicode.h"
38 #include "baseheap.h"
39
40 #define MAGIC(c1,c2,c3,c4) ((c1) + ((c2)<<8) + ((c3)<<16) + ((c4)<<24))
41
42 #define MAGIC_HEAP MAGIC( 'H','E','A','P' )
43
44 #define ROUNDUP(a,b) ((((a)+(b)-1)/(b))*(b))
45 #define ROUNDDOWN(a,b) (((a)/(b))*(b))
46
47 #define ROUND_DOWN(n, align) \
48 (((ULONG)n) & ~((align) - 1l))
49
50 #define ROUND_UP(n, align) \
51 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
52
53 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
54
55 #define __TRY _SEH2_TRY
56 #define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
57 #define __ENDTRY _SEH2_END
58
59 /* Undocumented CreateProcess flag */
60 #define STARTF_SHELLPRIVATE 0x400
61
62 typedef struct _CODEPAGE_ENTRY
63 {
64 LIST_ENTRY Entry;
65 UINT CodePage;
66 HANDLE SectionHandle;
67 PBYTE SectionMapping;
68 CPTABLEINFO CodePageTable;
69 } CODEPAGE_ENTRY, *PCODEPAGE_ENTRY;
70
71 typedef struct tagLOADPARMS32
72 {
73 LPSTR lpEnvAddress;
74 LPSTR lpCmdLine;
75 WORD wMagicValue;
76 WORD wCmdShow;
77 DWORD dwReserved;
78 } LOADPARMS32;
79
80 typedef enum _BASE_SEARCH_PATH_TYPE
81 {
82 BaseSearchPathInvalid,
83 BaseSearchPathDll,
84 BaseSearchPathApp,
85 BaseSearchPathDefault,
86 BaseSearchPathEnv,
87 BaseSearchPathCurrent,
88 BaseSearchPathMax
89 } BASE_SEARCH_PATH_TYPE, *PBASE_SEARCH_PATH_TYPE;
90
91 typedef enum _BASE_CURRENT_DIR_PLACEMENT
92 {
93 BaseCurrentDirPlacementInvalid = -1,
94 BaseCurrentDirPlacementDefault,
95 BaseCurrentDirPlacementSafe,
96 BaseCurrentDirPlacementMax
97 } BASE_CURRENT_DIR_PLACEMENT;
98
99 typedef struct _BASEP_ACTCTX_BLOCK
100 {
101 ULONG Flags;
102 PVOID ActivationContext;
103 PVOID CompletionContext;
104 LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine;
105 } BASEP_ACTCTX_BLOCK, *PBASEP_ACTCTX_BLOCK;
106
107 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR 1
108 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2
109 #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3
110
111 extern PBASE_STATIC_SERVER_DATA BaseStaticServerData;
112
113 typedef
114 DWORD
115 (*WaitForInputIdleType)(
116 HANDLE hProcess,
117 DWORD dwMilliseconds);
118
119 extern WaitForInputIdleType UserWaitForInputIdleRoutine;
120
121 /* Flags for PrivCopyFileExW && BasepCopyFileExW */
122 #define BASEP_COPY_METADATA 0x10
123 #define BASEP_COPY_SACL 0x20
124 #define BASEP_COPY_OWNER_AND_GROUP 0x40
125 #define BASEP_COPY_DIRECTORY 0x80
126 #define BASEP_COPY_BACKUP_SEMANTICS 0x100
127 #define BASEP_COPY_REPLACE 0x200
128 #define BASEP_COPY_SKIP_DACL 0x400
129 #define BASEP_COPY_PUBLIC_MASK 0xF
130 #define BASEP_COPY_BASEP_MASK 0xFFFFFFF0
131
132 /* Flags for PrivMoveFileIdentityW */
133 #define PRIV_DELETE_ON_SUCCESS 0x1
134 #define PRIV_ALLOW_NON_TRACKABLE 0x2
135
136 /* GLOBAL VARIABLES **********************************************************/
137
138 extern BOOL bIsFileApiAnsi;
139 extern HMODULE hCurrentModule;
140
141 extern RTL_CRITICAL_SECTION BaseDllDirectoryLock;
142
143 extern UNICODE_STRING BaseDllDirectory;
144 extern UNICODE_STRING BaseDefaultPath;
145 extern UNICODE_STRING BaseDefaultPathAppend;
146 extern PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry;
147
148 extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter;
149
150 extern SYSTEM_BASIC_INFORMATION BaseCachedSysInfo;
151
152 extern BOOLEAN BaseRunningInServerProcess;
153
154 /* FUNCTION PROTOTYPES *******************************************************/
155
156 VOID
157 NTAPI
158 BaseDllInitializeMemoryManager(VOID);
159
160 PTEB GetTeb(VOID);
161
162 PWCHAR FilenameA2W(LPCSTR NameA, BOOL alloc);
163 DWORD FilenameW2A_N(LPSTR dest, INT destlen, LPCWSTR src, INT srclen);
164
165 DWORD FilenameW2A_FitOrFail(LPSTR DestA, INT destLen, LPCWSTR SourceW, INT sourceLen);
166 DWORD FilenameU2A_FitOrFail(LPSTR DestA, INT destLen, PUNICODE_STRING SourceU);
167
168 #define HeapAlloc RtlAllocateHeap
169 #define HeapReAlloc RtlReAllocateHeap
170 #define HeapFree RtlFreeHeap
171 #define _lread(a, b, c) (long)(_hread(a, b, (long)c))
172
173 PLARGE_INTEGER
174 WINAPI
175 BaseFormatTimeOut(OUT PLARGE_INTEGER Timeout,
176 IN DWORD dwMilliseconds);
177
178 POBJECT_ATTRIBUTES
179 WINAPI
180 BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes,
181 IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL,
182 IN PUNICODE_STRING ObjectName);
183
184 NTSTATUS
185 WINAPI
186 BaseCreateStack(
187 _In_ HANDLE hProcess,
188 _In_opt_ SIZE_T StackCommit,
189 _In_opt_ SIZE_T StackReserve,
190 _Out_ PINITIAL_TEB InitialTeb);
191
192 VOID
193 WINAPI
194 BaseFreeThreadStack(
195 _In_ HANDLE hProcess,
196 _In_ PINITIAL_TEB InitialTeb);
197
198 VOID
199 WINAPI
200 BaseInitializeContext(IN PCONTEXT Context,
201 IN PVOID Parameter,
202 IN PVOID StartAddress,
203 IN PVOID StackAddress,
204 IN ULONG ContextType);
205
206 VOID
207 WINAPI
208 BaseThreadStartupThunk(VOID);
209
210 VOID
211 WINAPI
212 BaseProcessStartThunk(VOID);
213
214 VOID
215 NTAPI
216 BasepFreeActivationContextActivationBlock(
217 IN PBASEP_ACTCTX_BLOCK ActivationBlock
218 );
219
220 NTSTATUS
221 NTAPI
222 BasepAllocateActivationContextActivationBlock(
223 IN DWORD Flags,
224 IN PVOID CompletionRoutine,
225 IN PVOID CompletionContext,
226 OUT PBASEP_ACTCTX_BLOCK *ActivationBlock
227 );
228
229 NTSTATUS
230 NTAPI
231 BasepProbeForDllManifest(
232 IN PVOID DllHandle,
233 IN PCWSTR FullDllName,
234 OUT PVOID *ActCtx
235 );
236
237 __declspec(noreturn)
238 VOID
239 WINAPI
240 BaseThreadStartup(LPTHREAD_START_ROUTINE lpStartAddress,
241 LPVOID lpParameter);
242
243 __declspec(noreturn)
244 VOID
245 WINAPI
246 BaseFiberStartup(VOID);
247
248 typedef UINT (WINAPI *PPROCESS_START_ROUTINE)(VOID);
249
250 VOID
251 WINAPI
252 BaseProcessStartup(PPROCESS_START_ROUTINE lpStartAddress);
253
254 PVOID
255 WINAPI
256 BasepIsRealtimeAllowed(IN BOOLEAN Keep);
257
258 VOID
259 WINAPI
260 BasepAnsiStringToHeapUnicodeString(IN LPCSTR AnsiString,
261 OUT LPWSTR* UnicodeString);
262
263 PUNICODE_STRING
264 WINAPI
265 Basep8BitStringToStaticUnicodeString(IN LPCSTR AnsiString);
266
267 BOOLEAN
268 WINAPI
269 Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString,
270 IN LPCSTR String);
271
272 typedef NTSTATUS (NTAPI *PRTL_CONVERT_STRING)(IN PUNICODE_STRING UnicodeString,
273 IN PANSI_STRING AnsiString,
274 IN BOOLEAN AllocateMemory);
275
276 typedef ULONG (NTAPI *PRTL_COUNT_STRING)(IN PUNICODE_STRING UnicodeString);
277
278 typedef NTSTATUS (NTAPI *PRTL_CONVERT_STRINGA)(IN PANSI_STRING AnsiString,
279 IN PCUNICODE_STRING UnicodeString,
280 IN BOOLEAN AllocateMemory);
281
282 typedef ULONG (NTAPI *PRTL_COUNT_STRINGA)(IN PANSI_STRING UnicodeString);
283
284 ULONG
285 NTAPI
286 BasepUnicodeStringToAnsiSize(IN PUNICODE_STRING String);
287
288 ULONG
289 NTAPI
290 BasepAnsiStringToUnicodeSize(IN PANSI_STRING String);
291
292 extern PRTL_CONVERT_STRING Basep8BitStringToUnicodeString;
293 extern PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString;
294 extern PRTL_COUNT_STRING BasepUnicodeStringTo8BitSize;
295 extern PRTL_COUNT_STRINGA Basep8BitStringToUnicodeSize;
296
297 extern UNICODE_STRING BaseWindowsDirectory, BaseWindowsSystemDirectory;
298 extern HANDLE BaseNamedObjectDirectory;
299
300 HANDLE
301 WINAPI
302 BaseGetNamedObjectDirectory(VOID);
303
304 NTSTATUS
305 WINAPI
306 BasepMapFile(IN LPCWSTR lpApplicationName,
307 OUT PHANDLE hSection,
308 IN PUNICODE_STRING ApplicationName);
309
310 PCODEPAGE_ENTRY FASTCALL
311 IntGetCodePageEntry(UINT CodePage);
312
313 LPWSTR
314 WINAPI
315 BaseComputeProcessDllPath(
316 IN LPWSTR FullPath,
317 IN PVOID Environment
318 );
319
320 LPWSTR
321 WINAPI
322 BaseComputeProcessExePath(
323 IN LPWSTR FullPath
324 );
325
326 ULONG
327 WINAPI
328 BaseIsDosApplication(
329 IN PUNICODE_STRING PathName,
330 IN NTSTATUS Status
331 );
332
333 NTSTATUS
334 WINAPI
335 BasepCheckBadapp(
336 IN HANDLE FileHandle,
337 IN PWCHAR ApplicationName,
338 IN PWCHAR Environment,
339 IN USHORT ExeType,
340 IN PVOID* SdbQueryAppCompatData,
341 IN PULONG SdbQueryAppCompatDataSize,
342 IN PVOID* SxsData,
343 IN PULONG SxsDataSize,
344 OUT PULONG FusionFlags
345 );
346
347 BOOLEAN
348 WINAPI
349 IsShimInfrastructureDisabled(
350 VOID
351 );
352
353 VOID
354 WINAPI
355 InitCommandLines(VOID);
356
357 DWORD
358 WINAPI
359 BaseSetLastNTError(IN NTSTATUS Status);
360
361 VOID
362 NTAPI
363 BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry,
364 IN PVOID Context,
365 OUT BOOLEAN *StopEnumeration);
366
367 typedef NTSTATUS
368 (NTAPI *PBASEP_APPCERT_PLUGIN_FUNC)(
369 IN LPWSTR ApplicationName,
370 IN ULONG CertFlag
371 );
372
373 typedef NTSTATUS
374 (NTAPI *PBASEP_APPCERT_EMBEDDED_FUNC)(
375 IN LPWSTR ApplicationName
376 );
377
378 typedef NTSTATUS
379 (NTAPI *PSAFER_REPLACE_PROCESS_THREAD_TOKENS)(
380 IN HANDLE Token,
381 IN HANDLE Process,
382 IN HANDLE Thread
383 );
384
385 typedef struct _BASEP_APPCERT_ENTRY
386 {
387 LIST_ENTRY Entry;
388 UNICODE_STRING Name;
389 PBASEP_APPCERT_PLUGIN_FUNC fPluginCertFunc;
390 } BASEP_APPCERT_ENTRY, *PBASEP_APPCERT_ENTRY;
391
392 typedef struct _BASE_MSG_SXS_HANDLES
393 {
394 HANDLE File;
395 HANDLE Process;
396 HANDLE Section;
397 LARGE_INTEGER ViewBase;
398 } BASE_MSG_SXS_HANDLES, *PBASE_MSG_SXS_HANDLES;
399
400 typedef struct _SXS_WIN32_NT_PATH_PAIR
401 {
402 PUNICODE_STRING Win32;
403 PUNICODE_STRING Nt;
404 } SXS_WIN32_NT_PATH_PAIR, *PSXS_WIN32_NT_PATH_PAIR;
405
406 typedef struct _SXS_OVERRIDE_MANIFEST
407 {
408 PCWCH Name;
409 PVOID Address;
410 ULONG Size;
411 } SXS_OVERRIDE_MANIFEST, *PSXS_OVERRIDE_MANIFEST;
412
413 NTSTATUS
414 NTAPI
415 BasepConfigureAppCertDlls(
416 IN PWSTR ValueName,
417 IN ULONG ValueType,
418 IN PVOID ValueData,
419 IN ULONG ValueLength,
420 IN PVOID Context,
421 IN PVOID EntryContext
422 );
423
424 extern LIST_ENTRY BasepAppCertDllsList;
425 extern RTL_CRITICAL_SECTION gcsAppCert;
426
427 VOID
428 WINAPI
429 BaseMarkFileForDelete(
430 IN HANDLE FileHandle,
431 IN ULONG FileAttributes
432 );
433
434 BOOL
435 BasepCopyFileExW(
436 IN LPCWSTR lpExistingFileName,
437 IN LPCWSTR lpNewFileName,
438 IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,
439 IN LPVOID lpData OPTIONAL,
440 IN LPBOOL pbCancel OPTIONAL,
441 IN DWORD dwCopyFlags,
442 IN DWORD dwBasepFlags,
443 OUT LPHANDLE lpExistingHandle,
444 OUT LPHANDLE lpNewHandle
445 );
446
447 BOOL
448 BasepGetVolumeNameForVolumeMountPoint(
449 IN LPCWSTR lpszMountPoint,
450 OUT LPWSTR lpszVolumeName,
451 IN DWORD cchBufferLength,
452 OUT LPBOOL IsAMountPoint
453 );
454
455 BOOL
456 BasepGetVolumeNameFromReparsePoint(
457 IN LPCWSTR lpszMountPoint,
458 OUT LPWSTR lpszVolumeName,
459 IN DWORD cchBufferLength,
460 OUT LPBOOL IsAMountPoint
461 );
462
463 BOOL
464 IsThisARootDirectory(
465 IN HANDLE VolumeHandle,
466 IN PUNICODE_STRING NtPathName
467 );
468
469 /* FIXME: This is EXPORTED! It should go in an external kernel32.h header */
470 VOID
471 WINAPI
472 BasepFreeAppCompatData(
473 IN PVOID AppCompatData,
474 IN PVOID AppCompatSxsData
475 );
476
477 NTSTATUS
478 WINAPI
479 BasepCheckWinSaferRestrictions(
480 IN HANDLE UserToken,
481 IN LPWSTR ApplicationName,
482 IN HANDLE FileHandle,
483 OUT PBOOLEAN InJob,
484 OUT PHANDLE NewToken,
485 OUT PHANDLE JobHandle
486 );