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 ); 487