Reactos
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
59typedef struct _CODEPAGE_ENTRY
60{
61 LIST_ENTRY Entry;
62 UINT CodePage;
63 HANDLE SectionHandle;
64 PBYTE SectionMapping;
65 CPTABLEINFO CodePageTable;
66} CODEPAGE_ENTRY, *PCODEPAGE_ENTRY;
67
68typedef struct tagLOADPARMS32
69{
70 LPSTR lpEnvAddress;
71 LPSTR lpCmdLine;
72 WORD wMagicValue;
73 WORD wCmdShow;
74 DWORD dwReserved;
75} LOADPARMS32;
76
77typedef enum _BASE_SEARCH_PATH_TYPE
78{
79 BaseSearchPathInvalid,
80 BaseSearchPathDll,
81 BaseSearchPathApp,
82 BaseSearchPathDefault,
83 BaseSearchPathEnv,
84 BaseSearchPathCurrent,
85 BaseSearchPathMax
86} BASE_SEARCH_PATH_TYPE, *PBASE_SEARCH_PATH_TYPE;
87
88typedef enum _BASE_CURRENT_DIR_PLACEMENT
89{
90 BaseCurrentDirPlacementInvalid = -1,
91 BaseCurrentDirPlacementDefault,
92 BaseCurrentDirPlacementSafe,
93 BaseCurrentDirPlacementMax
94} BASE_CURRENT_DIR_PLACEMENT;
95
96typedef struct _BASEP_ACTCTX_BLOCK
97{
98 ULONG Flags;
99 PVOID ActivationContext;
100 PVOID CompletionContext;
101 LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine;
102} BASEP_ACTCTX_BLOCK, *PBASEP_ACTCTX_BLOCK;
103
104#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR 1
105#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2
106#define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3
107
108extern PBASE_STATIC_SERVER_DATA BaseStaticServerData;
109
110typedef
111DWORD
112(*WaitForInputIdleType)(
113 HANDLE hProcess,
114 DWORD dwMilliseconds);
115
116extern WaitForInputIdleType UserWaitForInputIdleRoutine;
117
118/* Flags for PrivCopyFileExW && BasepCopyFileExW */
119#define BASEP_COPY_METADATA 0x10
120#define BASEP_COPY_SACL 0x20
121#define BASEP_COPY_OWNER_AND_GROUP 0x40
122#define BASEP_COPY_DIRECTORY 0x80
123#define BASEP_COPY_BACKUP_SEMANTICS 0x100
124#define BASEP_COPY_REPLACE 0x200
125#define BASEP_COPY_SKIP_DACL 0x400
126#define BASEP_COPY_PUBLIC_MASK 0xF
127#define BASEP_COPY_BASEP_MASK 0xFFFFFFF0
128
129/* Flags for PrivMoveFileIdentityW */
130#define PRIV_DELETE_ON_SUCCESS 0x1
131#define PRIV_ALLOW_NON_TRACKABLE 0x2
132
133/* GLOBAL VARIABLES **********************************************************/
134
135extern BOOL bIsFileApiAnsi;
136extern HMODULE hCurrentModule;
137
138extern RTL_CRITICAL_SECTION BaseDllDirectoryLock;
139
140extern UNICODE_STRING BaseDllDirectory;
141extern UNICODE_STRING BaseDefaultPath;
142extern UNICODE_STRING BaseDefaultPathAppend;
143extern PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry;
144
145extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter;
146
147extern SYSTEM_BASIC_INFORMATION BaseCachedSysInfo;
148
149extern BOOLEAN BaseRunningInServerProcess;
150
151/* FUNCTION PROTOTYPES *******************************************************/
152
153VOID
154NTAPI
155BaseDllInitializeMemoryManager(VOID);
156
157PTEB GetTeb(VOID);
158
159PWCHAR FilenameA2W(LPCSTR NameA, BOOL alloc);
160DWORD FilenameW2A_N(LPSTR dest, INT destlen, LPCWSTR src, INT srclen);
161
162DWORD FilenameW2A_FitOrFail(LPSTR DestA, INT destLen, LPCWSTR SourceW, INT sourceLen);
163DWORD FilenameU2A_FitOrFail(LPSTR DestA, INT destLen, PUNICODE_STRING SourceU);
164
165#define HeapAlloc RtlAllocateHeap
166#define HeapReAlloc RtlReAllocateHeap
167#define HeapFree RtlFreeHeap
168#define _lread(a, b, c) (long)(_hread(a, b, (long)c))
169
170PLARGE_INTEGER
171WINAPI
172BaseFormatTimeOut(OUT PLARGE_INTEGER Timeout,
173 IN DWORD dwMilliseconds);
174
175POBJECT_ATTRIBUTES
176WINAPI
177BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes,
178 IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL,
179 IN PUNICODE_STRING ObjectName);
180
181NTSTATUS
182WINAPI
183BaseCreateStack(
184 _In_ HANDLE hProcess,
185 _In_opt_ SIZE_T StackCommit,
186 _In_opt_ SIZE_T StackReserve,
187 _Out_ PINITIAL_TEB InitialTeb);
188
189VOID
190WINAPI
191BaseFreeThreadStack(
192 _In_ HANDLE hProcess,
193 _In_ PINITIAL_TEB InitialTeb);
194
195VOID
196WINAPI
197BaseInitializeContext(IN PCONTEXT Context,
198 IN PVOID Parameter,
199 IN PVOID StartAddress,
200 IN PVOID StackAddress,
201 IN ULONG ContextType);
202
203VOID
204WINAPI
205BaseThreadStartupThunk(VOID);
206
207VOID
208WINAPI
209BaseProcessStartThunk(VOID);
210
211VOID
212NTAPI
213BasepFreeActivationContextActivationBlock(
214 IN PBASEP_ACTCTX_BLOCK ActivationBlock
215);
216
217NTSTATUS
218NTAPI
219BasepAllocateActivationContextActivationBlock(
220 IN DWORD Flags,
221 IN PVOID CompletionRoutine,
222 IN PVOID CompletionContext,
223 OUT PBASEP_ACTCTX_BLOCK *ActivationBlock
224);
225
226NTSTATUS
227NTAPI
228BasepProbeForDllManifest(
229 IN PVOID DllHandle,
230 IN PCWSTR FullDllName,
231 OUT PVOID *ActCtx
232);
233
234DECLSPEC_NORETURN
235VOID
236WINAPI
237BaseThreadStartup(
238 _In_ LPTHREAD_START_ROUTINE lpStartAddress,
239 _In_ LPVOID lpParameter);
240
241DECLSPEC_NORETURN
242VOID
243WINAPI
244BaseFiberStartup(VOID);
245
246typedef DWORD (WINAPI *PPROCESS_START_ROUTINE)(VOID);
247
248DECLSPEC_NORETURN
249VOID
250WINAPI
251BaseProcessStartup(
252 _In_ PPROCESS_START_ROUTINE lpStartAddress);
253
254PVOID
255WINAPI
256BasepIsRealtimeAllowed(IN BOOLEAN Keep);
257
258VOID
259WINAPI
260BasepAnsiStringToHeapUnicodeString(IN LPCSTR AnsiString,
261 OUT LPWSTR* UnicodeString);
262
263PUNICODE_STRING
264WINAPI
265Basep8BitStringToStaticUnicodeString(IN LPCSTR AnsiString);
266
267BOOLEAN
268WINAPI
269Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString,
270 IN LPCSTR String);
271
272typedef NTSTATUS (NTAPI *PRTL_CONVERT_STRING)(IN PUNICODE_STRING UnicodeString,
273 IN PANSI_STRING AnsiString,
274 IN BOOLEAN AllocateMemory);
275
276typedef ULONG (NTAPI *PRTL_COUNT_STRING)(IN PUNICODE_STRING UnicodeString);
277
278typedef NTSTATUS (NTAPI *PRTL_CONVERT_STRINGA)(IN PANSI_STRING AnsiString,
279 IN PCUNICODE_STRING UnicodeString,
280 IN BOOLEAN AllocateMemory);
281
282typedef ULONG (NTAPI *PRTL_COUNT_STRINGA)(IN PANSI_STRING UnicodeString);
283
284ULONG
285NTAPI
286BasepUnicodeStringToAnsiSize(IN PUNICODE_STRING String);
287
288ULONG
289NTAPI
290BasepAnsiStringToUnicodeSize(IN PANSI_STRING String);
291
292extern PRTL_CONVERT_STRING Basep8BitStringToUnicodeString;
293extern PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString;
294extern PRTL_COUNT_STRING BasepUnicodeStringTo8BitSize;
295extern PRTL_COUNT_STRINGA Basep8BitStringToUnicodeSize;
296
297extern UNICODE_STRING BaseWindowsDirectory, BaseWindowsSystemDirectory;
298extern HANDLE BaseNamedObjectDirectory;
299
300HANDLE
301WINAPI
302BaseGetNamedObjectDirectory(VOID);
303
304NTSTATUS
305WINAPI
306BasepMapFile(IN LPCWSTR lpApplicationName,
307 OUT PHANDLE hSection,
308 IN PUNICODE_STRING ApplicationName);
309
310PCODEPAGE_ENTRY FASTCALL
311IntGetCodePageEntry(UINT CodePage);
312
313LPWSTR
314WINAPI
315BaseComputeProcessDllPath(
316 IN LPWSTR FullPath,
317 IN PVOID Environment
318);
319
320LPWSTR
321WINAPI
322BaseComputeProcessExePath(
323 IN LPWSTR FullPath
324);
325
326ULONG
327WINAPI
328BaseIsDosApplication(
329 IN PUNICODE_STRING PathName,
330 IN NTSTATUS Status
331);
332
333NTSTATUS
334WINAPI
335BasepCheckBadapp(
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
347BOOLEAN
348WINAPI
349IsShimInfrastructureDisabled(
350 VOID
351);
352
353VOID
354WINAPI
355InitCommandLines(VOID);
356
357DWORD
358WINAPI
359BaseSetLastNTError(IN NTSTATUS Status);
360
361VOID
362NTAPI
363BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry,
364 IN PVOID Context,
365 OUT BOOLEAN *StopEnumeration);
366
367typedef NTSTATUS
368(NTAPI *PBASEP_APPCERT_PLUGIN_FUNC)(
369 IN LPWSTR ApplicationName,
370 IN ULONG CertFlag
371);
372
373typedef NTSTATUS
374(NTAPI *PBASEP_APPCERT_EMBEDDED_FUNC)(
375 IN LPWSTR ApplicationName
376);
377
378typedef NTSTATUS
379(NTAPI *PSAFER_REPLACE_PROCESS_THREAD_TOKENS)(
380 IN HANDLE Token,
381 IN HANDLE Process,
382 IN HANDLE Thread
383);
384
385typedef 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
392typedef 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
400typedef 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
406typedef struct _SXS_OVERRIDE_MANIFEST
407{
408 PCWCH Name;
409 PVOID Address;
410 ULONG Size;
411} SXS_OVERRIDE_MANIFEST, *PSXS_OVERRIDE_MANIFEST;
412
413NTSTATUS
414NTAPI
415BasepConfigureAppCertDlls(
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
424extern LIST_ENTRY BasepAppCertDllsList;
425extern RTL_CRITICAL_SECTION gcsAppCert;
426
427VOID
428WINAPI
429BaseMarkFileForDelete(
430 IN HANDLE FileHandle,
431 IN ULONG FileAttributes
432);
433
434BOOL
435BasepCopyFileExW(
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
447BOOL
448BasepGetVolumeNameForVolumeMountPoint(
449 IN LPCWSTR lpszMountPoint,
450 OUT LPWSTR lpszVolumeName,
451 IN DWORD cchBufferLength,
452 OUT LPBOOL IsAMountPoint
453);
454
455BOOL
456BasepGetVolumeNameFromReparsePoint(
457 IN LPCWSTR lpszMountPoint,
458 OUT LPWSTR lpszVolumeName,
459 IN DWORD cchBufferLength,
460 OUT LPBOOL IsAMountPoint
461);
462
463BOOL
464IsThisARootDirectory(
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 */
470VOID
471WINAPI
472BasepFreeAppCompatData(
473 IN PVOID AppCompatData,
474 IN PVOID AppCompatSxsData
475);
476
477NTSTATUS
478WINAPI
479BasepCheckWinSaferRestrictions(
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);