Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1223 lines
28 KiB

  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. basedll.h
  5. Abstract:
  6. This module contains private function prototypes
  7. and types for the 32-bit windows base APIs.
  8. Author:
  9. Mark Lucovsky (markl) 18-Sep-1990
  10. Revision History:
  11. --*/
  12. #ifndef _BASEP_
  13. #define _BASEP_
  14. #if _MSC_VER > 1000
  15. #pragma once
  16. #endif
  17. #undef UNICODE
  18. #if defined(__cplusplus)
  19. extern "C" {
  20. #endif
  21. //
  22. // Include Common Definitions.
  23. //
  24. #include <base.h>
  25. #include <dbt.h>
  26. #include <sxstypes.h>
  27. //
  28. // Include DLL definitions for CSR
  29. //
  30. #include "ntcsrdll.h"
  31. #include "ntcsrsrv.h"
  32. #define NOEXTAPI
  33. #include <wdbgexts.h>
  34. #include <ntdbg.h>
  35. //
  36. // Include message definitions for communicating between client and server
  37. // portions of the Base portion of the Windows subsystem
  38. //
  39. #include "basemsg.h"
  40. #include "winuserp.h"
  41. #include "basesxs.h"
  42. typedef struct _CMDSHOW {
  43. WORD wMustBe2;
  44. WORD wShowWindowValue;
  45. } CMDSHOW, *PCMDSHOW;
  46. typedef struct _LOAD_MODULE_PARAMS {
  47. LPVOID lpEnvAddress;
  48. LPSTR lpCmdLine;
  49. PCMDSHOW lpCmdShow;
  50. DWORD dwReserved;
  51. } LOAD_MODULE_PARAMS, *PLOAD_MODULE_PARAMS;
  52. typedef struct _RELATIVE_NAME {
  53. STRING RelativeName;
  54. HANDLE ContainingDirectory;
  55. } RELATIVE_NAME, *PRELATIVE_NAME;
  56. extern HANDLE BaseDllHandle;
  57. extern HANDLE BaseNamedObjectDirectory;
  58. extern PVOID BaseHeap;
  59. extern RTL_HANDLE_TABLE BaseHeapHandleTable;
  60. extern UNICODE_STRING BaseWindowsDirectory;
  61. extern UNICODE_STRING BaseWindowsSystemDirectory;
  62. #ifdef WX86
  63. extern UNICODE_STRING BaseWindowsSys32x86Directory;
  64. #endif
  65. extern const UNICODE_STRING BasePathVariableName;
  66. extern const UNICODE_STRING BaseTmpVariableName;
  67. extern const UNICODE_STRING BaseTempVariableName;
  68. extern const UNICODE_STRING BaseUserProfileVariableName;
  69. extern const UNICODE_STRING BaseDotVariableName;
  70. extern const UNICODE_STRING BaseDotTmpSuffixName;
  71. extern const UNICODE_STRING BaseDotComSuffixName;
  72. extern const UNICODE_STRING BaseDotPifSuffixName;
  73. extern const UNICODE_STRING BaseDotExeSuffixName;
  74. extern UNICODE_STRING BaseDefaultPath;
  75. extern UNICODE_STRING BaseDefaultPathAppend;
  76. extern UNICODE_STRING BaseDllDirectory;
  77. extern RTL_CRITICAL_SECTION BaseDllDirectoryLock;
  78. extern PWSTR BaseCSDVersion;
  79. extern WORD BaseCSDNumber;
  80. extern WORD BaseRCNumber;
  81. extern const UNICODE_STRING BaseConsoleInput;
  82. extern const UNICODE_STRING BaseConsoleOutput;
  83. extern const UNICODE_STRING BaseConsoleGeneric;
  84. extern UNICODE_STRING BaseUnicodeCommandLine;
  85. extern ANSI_STRING BaseAnsiCommandLine;
  86. extern LPSTARTUPINFOA BaseAnsiStartupInfo;
  87. extern PBASE_STATIC_SERVER_DATA BaseStaticServerData;
  88. #if defined(BUILD_WOW6432) || defined(_WIN64)
  89. extern SYSTEM_BASIC_INFORMATION SysInfo;
  90. extern SYSTEM_PROCESSOR_INFORMATION NativeProcessorInfo;
  91. #endif
  92. extern UINT_PTR SystemRangeStart;
  93. extern BOOLEAN BaseRunningInServerProcess;
  94. extern ULONG BaseIniFileUpdateCount;
  95. #define ROUND_UP_TO_PAGES(SIZE) (((ULONG_PTR)(SIZE) + (ULONG_PTR)BASE_SYSINFO.PageSize - 1) & ~((ULONG_PTR)BASE_SYSINFO.PageSize - 1))
  96. #define ROUND_DOWN_TO_PAGES(SIZE) (((ULONG_PTR)(SIZE)) & ~((ULONG_PTR)BASE_SYSINFO.PageSize - 1))
  97. #define BASE_COPY_FILE_CHUNK (64*1024)
  98. #define BASE_MAX_PATH_STRING 4080
  99. extern BOOLEAN BasepFileApisAreOem;
  100. #define DATA_ATTRIBUTE_NAME L":$DATA"
  101. #define DATA_ATTRIBUTE_LENGTH (sizeof( DATA_ATTRIBUTE_NAME ) - sizeof( WCHAR ))
  102. extern WCHAR BasepDataAttributeType[];
  103. #define CERTAPP_KEY_NAME L"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\AppCertDlls"
  104. #define CERTAPP_ENTRYPOINT_NAME "CreateProcessNotify"
  105. #define CERTAPP_EMBEDDED_DLL_NAME L"EmbdTrst.DLL"
  106. #define CERTAPP_EMBEDDED_DLL_EP "ImageOkToRunOnEmbeddedNT"
  107. extern RTL_CRITICAL_SECTION gcsAppCert;
  108. extern LIST_ENTRY BasepAppCertDllsList;
  109. extern RTL_CRITICAL_SECTION gcsAppCompat;
  110. extern RTL_CRITICAL_SECTION BaseLZSemTable;
  111. NTSTATUS
  112. BasepConfigureAppCertDlls(
  113. IN PWSTR ValueName,
  114. IN ULONG ValueType,
  115. IN PVOID ValueData,
  116. IN ULONG ValueLength,
  117. IN PVOID Context,
  118. IN PVOID EntryContext
  119. );
  120. NTSTATUS
  121. BasepSaveAppCertRegistryValue(
  122. IN OUT PLIST_ENTRY ListHead,
  123. IN PWSTR Name,
  124. IN PWSTR Value OPTIONAL
  125. );
  126. typedef struct _BASEP_APPCERT_ENTRY {
  127. LIST_ENTRY Entry;
  128. UNICODE_STRING Name;
  129. NTSTATUS (WINAPI *fPluginCertFunc)(LPCWSTR lpApplicationName,ULONG Reason);
  130. } BASEP_APPCERT_ENTRY, *PBASEP_APPCERT_ENTRY;
  131. extern RTL_QUERY_REGISTRY_TABLE BasepAppCertTable[];
  132. #define APPCERT_IMAGE_OK_TO_RUN 1
  133. #define APPCERT_CREATION_ALLOWED 2
  134. #define APPCERT_CREATION_DENIED 3
  135. __inline
  136. BOOL
  137. BasepIsDataAttribute(
  138. ULONG Count,
  139. const WCHAR *Name
  140. )
  141. {
  142. return Count > DATA_ATTRIBUTE_LENGTH &&
  143. !_wcsnicmp( &Name[(Count - DATA_ATTRIBUTE_LENGTH) / sizeof( WCHAR )],
  144. BasepDataAttributeType,
  145. DATA_ATTRIBUTE_LENGTH / sizeof( WCHAR ));
  146. }
  147. PUNICODE_STRING
  148. Basep8BitStringToStaticUnicodeString(
  149. IN LPCSTR SourceString
  150. );
  151. BOOL
  152. Basep8BitStringToDynamicUnicodeString(
  153. OUT PUNICODE_STRING UnicodeString,
  154. IN LPCSTR lpSourceString
  155. );
  156. extern
  157. NTSTATUS
  158. (*Basep8BitStringToUnicodeString)(
  159. PUNICODE_STRING DestinationString,
  160. PANSI_STRING SourceString,
  161. BOOLEAN AllocateDestinationString
  162. );
  163. extern
  164. NTSTATUS
  165. (*BasepUnicodeStringTo8BitString)(
  166. PANSI_STRING DestinationString,
  167. PUNICODE_STRING SourceString,
  168. BOOLEAN AllocateDestinationString
  169. );
  170. extern
  171. ULONG
  172. (*BasepUnicodeStringTo8BitSize)(
  173. PUNICODE_STRING UnicodeString
  174. );
  175. ULONG
  176. BasepUnicodeStringToAnsiSize(
  177. PUNICODE_STRING UnicodeString
  178. );
  179. ULONG
  180. BasepUnicodeStringToOemSize(
  181. PUNICODE_STRING UnicodeString
  182. );
  183. extern
  184. ULONG
  185. (*Basep8BitStringToUnicodeSize)(
  186. PANSI_STRING AnsiString
  187. );
  188. ULONG
  189. BasepAnsiStringToUnicodeSize(
  190. PANSI_STRING AnsiString
  191. );
  192. ULONG
  193. BasepOemStringToUnicodeSize(
  194. PANSI_STRING OemString
  195. );
  196. HANDLE
  197. BaseGetNamedObjectDirectory(
  198. VOID
  199. );
  200. void
  201. BaseDllInitializeMemoryManager( VOID );
  202. typedef
  203. NTSTATUS
  204. (*BASECLIENTCONNECTROUTINE)(
  205. PVOID MustBeNull,
  206. PVOID ConnectionInformation,
  207. PULONG ConnectionInformationLength
  208. );
  209. POBJECT_ATTRIBUTES
  210. BaseFormatObjectAttributes(
  211. POBJECT_ATTRIBUTES ObjectAttributes,
  212. PSECURITY_ATTRIBUTES SecurityAttributes,
  213. PUNICODE_STRING ObjectName
  214. );
  215. PLARGE_INTEGER
  216. BaseFormatTimeOut(
  217. PLARGE_INTEGER TimeOut,
  218. DWORD Milliseconds
  219. );
  220. ULONG
  221. BaseSetLastNTError(
  222. NTSTATUS Status
  223. );
  224. VOID
  225. BaseSwitchStackThenTerminate(
  226. PVOID CurrentStack,
  227. PVOID NewStack,
  228. DWORD ExitCode
  229. );
  230. VOID
  231. BaseFreeStackAndTerminate(
  232. PVOID OldStack,
  233. DWORD ExitCode
  234. );
  235. NTSTATUS
  236. BaseCreateStack(
  237. HANDLE Process,
  238. SIZE_T StackSize,
  239. SIZE_T MaximumStackSize,
  240. PINITIAL_TEB InitialTeb
  241. );
  242. VOID
  243. BasepSwitchToFiber(
  244. PFIBER CurrentFiber,
  245. PFIBER NewFiber
  246. );
  247. VOID
  248. BaseFiberStart(
  249. VOID
  250. );
  251. VOID
  252. BaseThreadStart(
  253. LPTHREAD_START_ROUTINE lpStartAddress,
  254. LPVOID lpParameter
  255. );
  256. typedef DWORD (WINAPI *PPROCESS_START_ROUTINE)(
  257. VOID
  258. );
  259. VOID
  260. BaseProcessStart(
  261. PPROCESS_START_ROUTINE lpStartAddress
  262. );
  263. VOID
  264. BaseThreadStartThunk(
  265. LPTHREAD_START_ROUTINE lpStartAddress,
  266. LPVOID lpParameter
  267. );
  268. VOID
  269. BaseProcessStartThunk(
  270. LPVOID lpProcessStartAddress,
  271. LPVOID lpParameter
  272. );
  273. typedef enum _BASE_CONTEXT_TYPE {
  274. BaseContextTypeProcess,
  275. BaseContextTypeThread,
  276. BaseContextTypeFiber
  277. } BASE_CONTEXT_TYPE, *PBASE_CONTEXT_TYPE;
  278. VOID
  279. BaseInitializeContext(
  280. PCONTEXT Context,
  281. PVOID Parameter,
  282. PVOID InitialPc,
  283. PVOID InitialSp,
  284. BASE_CONTEXT_TYPE ContextType
  285. );
  286. #if defined(WX86) || defined(_AXP64_)
  287. NTSTATUS
  288. BaseCreateWx86Tib(
  289. HANDLE Process,
  290. HANDLE Thread,
  291. ULONG InitialPc,
  292. ULONG CommittedStackSize,
  293. ULONG MaximumStackSize,
  294. BOOLEAN EmulateInitialPc
  295. );
  296. #endif
  297. VOID
  298. BaseFreeThreadStack(
  299. HANDLE hProcess,
  300. HANDLE hThread,
  301. PINITIAL_TEB InitialTeb
  302. );
  303. #define BASE_PUSH_PROCESS_PARAMETERS_FLAG_APP_MANIFEST_PRESENT (0x00000001)
  304. BOOL
  305. BasePushProcessParameters(
  306. DWORD dwFlags,
  307. HANDLE Process,
  308. PPEB Peb,
  309. LPCWSTR ApplicationPathName,
  310. LPCWSTR CurrentDirectory,
  311. LPCWSTR CommandLine,
  312. LPVOID Environment,
  313. LPSTARTUPINFOW lpStartupInfo,
  314. DWORD dwCreationFlags,
  315. BOOL bInheritHandles,
  316. DWORD dwSubsystem,
  317. PVOID pAppCompatData,
  318. DWORD cbAppCompatData
  319. );
  320. LPWSTR
  321. BaseComputeProcessDllPath(
  322. LPCWSTR AppName,
  323. LPVOID Environment
  324. );
  325. LPWSTR
  326. BaseComputeProcessSearchPath(
  327. VOID
  328. );
  329. LPWSTR
  330. BaseComputeProcessExePath(
  331. LPCWSTR ExeName
  332. );
  333. extern PCLDR_DATA_TABLE_ENTRY BasepExeLdrEntry;
  334. VOID
  335. BasepLocateExeLdrEntry(
  336. IN PCLDR_DATA_TABLE_ENTRY Entry,
  337. IN PVOID Context,
  338. IN OUT BOOLEAN *StopEnumeration
  339. );
  340. FORCEINLINE
  341. VOID
  342. BasepCheckExeLdrEntry(
  343. VOID
  344. )
  345. {
  346. if (! BasepExeLdrEntry) {
  347. LdrEnumerateLoadedModules(0,
  348. &BasepLocateExeLdrEntry,
  349. NtCurrentPeb()->ImageBaseAddress);
  350. }
  351. }
  352. LPCWSTR
  353. BasepEndOfDirName(
  354. IN LPCWSTR FileName
  355. );
  356. DWORD
  357. BaseDebugAttachThread(
  358. LPVOID ThreadParameter
  359. );
  360. HANDLE
  361. BaseFindFirstDevice(
  362. PCUNICODE_STRING FileName,
  363. LPWIN32_FIND_DATAW lpFindFileData
  364. );
  365. PCUNICODE_STRING
  366. BaseIsThisAConsoleName(
  367. PCUNICODE_STRING FileNameString,
  368. DWORD dwDesiredAccess
  369. );
  370. typedef ULONG (FAR WINAPI *CSRREMOTEPROCPROC)(HANDLE, CLIENT_ID *);
  371. #if DBG
  372. VOID
  373. BaseHeapBreakPoint( VOID );
  374. #endif
  375. ULONG
  376. BasepOfShareToWin32Share(
  377. IN ULONG OfShare
  378. );
  379. //
  380. // Data structure for CopyFileEx context
  381. //
  382. typedef struct _COPYFILE_CONTEXT {
  383. LARGE_INTEGER TotalFileSize;
  384. LARGE_INTEGER TotalBytesTransferred;
  385. DWORD dwStreamNumber;
  386. LPBOOL lpCancel;
  387. LPVOID lpData;
  388. LPPROGRESS_ROUTINE lpProgressRoutine;
  389. } COPYFILE_CONTEXT, *LPCOPYFILE_CONTEXT;
  390. //
  391. // Data structure for tracking restart state
  392. //
  393. typedef struct _RESTART_STATE {
  394. CSHORT Type;
  395. CSHORT Size;
  396. DWORD NumberOfStreams;
  397. LARGE_INTEGER CreationTime;
  398. LARGE_INTEGER WriteTime;
  399. LARGE_INTEGER EndOfFile;
  400. LARGE_INTEGER FileSize;
  401. LARGE_INTEGER LastKnownGoodOffset;
  402. DWORD CurrentStream;
  403. DWORD Checksum;
  404. } RESTART_STATE, *PRESTART_STATE, *LPRESTART_STATE;
  405. #define SUCCESS_RETURNED_STATE 2
  406. DWORD
  407. BaseCopyStream(
  408. LPCWSTR lpExistingFileName,
  409. HANDLE hSourceFile,
  410. ACCESS_MASK SourceFileAccess OPTIONAL,
  411. LPCWSTR lpNewFileName,
  412. HANDLE hTargetFile OPTIONAL,
  413. LARGE_INTEGER *lpFileSize,
  414. LPDWORD lpCopyFlags,
  415. LPHANDLE lpDestFile,
  416. LPDWORD lpCopySize,
  417. LPCOPYFILE_CONTEXT *lpCopyFileContext,
  418. LPRESTART_STATE lpRestartState OPTIONAL,
  419. BOOL OpenFileAsReparsePoint,
  420. DWORD dwReparseTag,
  421. PDWORD DestFileFsAttributes
  422. );
  423. BOOL
  424. BasepCopyFileExW(
  425. LPCWSTR lpExistingFileName,
  426. LPCWSTR lpNewFileName,
  427. LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL,
  428. LPVOID lpData OPTIONAL,
  429. LPBOOL pbCancel OPTIONAL,
  430. DWORD dwCopyFlags,
  431. DWORD dwPrivCopyFlags,
  432. LPHANDLE phSource OPTIONAL,
  433. LPHANDLE phDest OPTIONAL
  434. );
  435. VOID
  436. BaseMarkFileForDelete(
  437. HANDLE File,
  438. DWORD FileAttributes
  439. );
  440. PVOID
  441. BasepMapModuleHandle(
  442. IN HMODULE hModule,
  443. IN BOOLEAN bResourcesOnly
  444. );
  445. ULONG_PTR
  446. BaseDllMapResourceIdA(
  447. PCSTR lpId
  448. );
  449. ULONG_PTR
  450. BaseDllMapResourceIdW(
  451. PCWSTR lpId
  452. );
  453. VOID
  454. BaseDllFreeResourceId(
  455. ULONG_PTR Id
  456. );
  457. //
  458. // Data structures and interfaces used by dllini.c
  459. //
  460. typedef struct _INIFILE_CACHE {
  461. struct _INIFILE_CACHE *Next;
  462. ULONG EnvironmentUpdateCount;
  463. UNICODE_STRING NtFileName;
  464. PINIFILE_MAPPING_FILENAME FileMapping;
  465. HANDLE FileHandle;
  466. BOOLEAN WriteAccess;
  467. BOOLEAN UnicodeFile;
  468. BOOLEAN LockedFile;
  469. ULONG EndOfFile;
  470. PVOID BaseAddress;
  471. SIZE_T CommitSize;
  472. SIZE_T RegionSize;
  473. ULONG UpdateOffset;
  474. ULONG UpdateEndOffset;
  475. ULONG DirectoryInformationLength;
  476. FILE_BASIC_INFORMATION BasicInformation;
  477. FILE_STANDARD_INFORMATION StandardInformation;
  478. } INIFILE_CACHE, *PINIFILE_CACHE;
  479. typedef enum _INIFILE_OPERATION {
  480. FlushProfiles,
  481. ReadKeyValue,
  482. WriteKeyValue,
  483. DeleteKey,
  484. ReadKeyNames,
  485. ReadSectionNames,
  486. ReadSection,
  487. WriteSection,
  488. DeleteSection,
  489. RefreshIniFileMapping
  490. } INIFILE_OPERATION;
  491. typedef struct _INIFILE_PARAMETERS {
  492. INIFILE_OPERATION Operation;
  493. BOOLEAN WriteOperation;
  494. BOOLEAN Unicode;
  495. BOOLEAN ValueBufferAllocated;
  496. PINIFILE_MAPPING_FILENAME IniFileNameMapping;
  497. PINIFILE_CACHE IniFile;
  498. UNICODE_STRING BaseFileName;
  499. UNICODE_STRING FileName;
  500. UNICODE_STRING NtFileName;
  501. ANSI_STRING ApplicationName;
  502. ANSI_STRING VariableName;
  503. UNICODE_STRING ApplicationNameU;
  504. UNICODE_STRING VariableNameU;
  505. BOOLEAN MultiValueStrings;
  506. union {
  507. //
  508. // This structure filled in for write operations
  509. //
  510. struct {
  511. LPSTR ValueBuffer;
  512. ULONG ValueLength;
  513. PWSTR ValueBufferU;
  514. ULONG ValueLengthU;
  515. };
  516. //
  517. // This structure filled in for read operations
  518. //
  519. struct {
  520. ULONG ResultChars;
  521. ULONG ResultMaxChars;
  522. LPSTR ResultBuffer;
  523. PWSTR ResultBufferU;
  524. };
  525. };
  526. //
  527. // Remaining fields only valid when parsing an on disk .INI file mapped into
  528. // memory.
  529. //
  530. PVOID TextCurrent;
  531. PVOID TextStart;
  532. PVOID TextEnd;
  533. ANSI_STRING SectionName;
  534. ANSI_STRING KeywordName;
  535. ANSI_STRING KeywordValue;
  536. PANSI_STRING AnsiSectionName;
  537. PANSI_STRING AnsiKeywordName;
  538. PANSI_STRING AnsiKeywordValue;
  539. UNICODE_STRING SectionNameU;
  540. UNICODE_STRING KeywordNameU;
  541. UNICODE_STRING KeywordValueU;
  542. PUNICODE_STRING UnicodeSectionName;
  543. PUNICODE_STRING UnicodeKeywordName;
  544. PUNICODE_STRING UnicodeKeywordValue;
  545. } INIFILE_PARAMETERS, *PINIFILE_PARAMETERS;
  546. NTSTATUS
  547. BaseDllInitializeIniFileMappings(
  548. PBASE_STATIC_SERVER_DATA StaticServerData
  549. );
  550. NTSTATUS
  551. BasepAcquirePrivilege(
  552. ULONG Privilege,
  553. PVOID *ReturnedState
  554. );
  555. NTSTATUS
  556. BasepAcquirePrivilegeEx(
  557. ULONG Privilege,
  558. PVOID *ReturnedState
  559. );
  560. VOID
  561. BasepReleasePrivilege(
  562. PVOID StatePointer
  563. );
  564. NTSTATUS
  565. NTAPI
  566. BaseCreateThreadPoolThread(
  567. PUSER_THREAD_START_ROUTINE Function,
  568. PVOID Parameter,
  569. HANDLE * ThreadHandle
  570. );
  571. NTSTATUS
  572. NTAPI
  573. BaseExitThreadPoolThread(
  574. NTSTATUS Status
  575. );
  576. //
  577. // Function for returning the volume name from a reparse point.
  578. //
  579. BOOL
  580. BasepGetVolumeNameFromReparsePoint(
  581. LPCWSTR lpszVolumeMountPoint,
  582. LPWSTR lpszVolumeName,
  583. DWORD cchBufferLength,
  584. PBOOL ResultOfOpen
  585. );
  586. #if defined(_WIN64) || defined(BUILD_WOW6432)
  587. //
  588. // COM+ Support routines
  589. //
  590. NTSTATUS
  591. BasepIsComplusILImage(
  592. IN HANDLE SectionImageHandle,
  593. OUT BOOLEAN *IsComplusILImage
  594. );
  595. #endif
  596. //
  597. // Definitions for memory handles used by Local/GlobalAlloc functions
  598. //
  599. typedef struct _BASE_HANDLE_TABLE_ENTRY {
  600. USHORT Flags;
  601. USHORT LockCount;
  602. union {
  603. PVOID Object; // Allocated handle
  604. ULONG Size; // Handle to discarded obj.
  605. };
  606. } BASE_HANDLE_TABLE_ENTRY, *PBASE_HANDLE_TABLE_ENTRY;
  607. #define BASE_HANDLE_MOVEABLE (USHORT)0x0002
  608. #define BASE_HANDLE_DISCARDABLE (USHORT)0x0004
  609. #define BASE_HANDLE_DISCARDED (USHORT)0x0008
  610. #define BASE_HANDLE_SHARED (USHORT)0x8000
  611. //
  612. // Handles are 32-bit pointers to the u.Object field of a
  613. // BASE_HANDLE_TABLE_ENTRY. Since this field is 4 bytes into the
  614. // structure and the structures are always on 8 byte boundaries, we can
  615. // test the 0x4 bit to see if it is a handle.
  616. //
  617. // In Sundown, these handles are 64-bit pointers to the u.Object field
  618. // which is 8 bytes into the structure. Therefore, we should test the
  619. // 0x8 bit to see if it is a handle.
  620. //
  621. //on sundown
  622. // #define BASE_HANDLE_MARK_BIT (ULONG_PTR)0x00000008
  623. //on 32 bit systems
  624. // #define BASE_HANDLE_MARK_BIT (ULONG_PTR)0x00000004
  625. //
  626. #define BASE_HANDLE_MARK_BIT (ULONG_PTR)FIELD_OFFSET(BASE_HANDLE_TABLE_ENTRY,Object)
  627. #define BASE_HEAP_FLAG_MOVEABLE HEAP_SETTABLE_USER_FLAG1
  628. #define BASE_HEAP_FLAG_DDESHARE HEAP_SETTABLE_USER_FLAG2
  629. extern ULONG BaseDllTag;
  630. #define MAKE_TAG( t ) (RTL_HEAP_MAKE_TAG( BaseDllTag, t ))
  631. #define TMP_TAG 0
  632. #define BACKUP_TAG 1
  633. #define INI_TAG 2
  634. #define FIND_TAG 3
  635. #define GMEM_TAG 4
  636. #define LMEM_TAG 5
  637. #define ENV_TAG 6
  638. #define RES_TAG 7
  639. #define VDM_TAG 8
  640. #include <vdmapi.h>
  641. #include "vdm.h"
  642. #include "basevdm.h"
  643. #include "stdlib.h" // for atol
  644. #include "stdio.h" // for atol
  645. #include <objidl.h> // needs nturtl.h
  646. #include <propset.h> // needs objidl.h
  647. #include <tsappcmp.h>
  648. //
  649. // Hydra function for supporting beeps on remote sessions
  650. //
  651. typedef HANDLE (WINAPI * PWINSTATIONBEEPOPEN)(ULONG);
  652. HANDLE WINAPI
  653. _WinStationBeepOpen(
  654. ULONG SessionId
  655. );
  656. PWINSTATIONBEEPOPEN pWinStationBeepOpen;
  657. //
  658. // Private functions for communication with CSR.
  659. //
  660. VOID
  661. CsrBasepSoundSentryNotification(
  662. ULONG VideoMode
  663. );
  664. NTSTATUS
  665. CsrBaseClientConnectToServer(
  666. PWSTR szSessionDir,
  667. PHANDLE phMutant,
  668. PBOOLEAN pServerProcess
  669. );
  670. NTSTATUS
  671. CsrBasepRefreshIniFileMapping(
  672. PUNICODE_STRING BaseFileName
  673. );
  674. NTSTATUS
  675. CsrBasepDefineDosDevice(
  676. DWORD dwFlags,
  677. PUNICODE_STRING pDeviceName,
  678. PUNICODE_STRING pTargetPath
  679. );
  680. UINT
  681. CsrBasepGetTempFile(
  682. VOID
  683. );
  684. NTSTATUS
  685. CsrBasepCreateProcess(
  686. PBASE_CREATEPROCESS_MSG a
  687. );
  688. VOID
  689. CsrBasepExitProcess(
  690. UINT uExitCode
  691. );
  692. NTSTATUS
  693. CsrBasepSetProcessShutdownParam(
  694. DWORD dwLevel,
  695. DWORD dwFlags
  696. );
  697. NTSTATUS
  698. CsrBasepGetProcessShutdownParam(
  699. LPDWORD lpdwLevel,
  700. LPDWORD lpdwFlags
  701. );
  702. NTSTATUS
  703. CsrBasepSetTermsrvAppInstallMode(
  704. BOOL bState
  705. );
  706. NTSTATUS
  707. CsrBasepSetClientTimeZoneInformation(
  708. IN PBASE_SET_TERMSRVCLIENTTIMEZONE c
  709. );
  710. NTSTATUS
  711. CsrBasepCreateThread(
  712. HANDLE ThreadHandle,
  713. CLIENT_ID ClientId
  714. );
  715. //
  716. // This should be merged with BasepCreateActCtx, its only caller.
  717. //
  718. #define BASEP_CREATE_ACTCTX_FLAG_NO_ADMIN_OVERRIDE 0x00000001
  719. NTSTATUS
  720. BasepCreateActCtx(
  721. ULONG Flags,
  722. IN PCACTCTXW ActParams,
  723. OUT PVOID* ActivationContextData
  724. );
  725. NTSTATUS
  726. CsrBasepCreateActCtx(
  727. IN PBASE_SXS_CREATE_ACTIVATION_CONTEXT_MSG Message
  728. );
  729. #if defined(BUILD_WOW6432)
  730. #include "ntwow64b.h"
  731. #endif
  732. BOOL TermsrvSyncUserIniFile(PINIFILE_PARAMETERS a);
  733. BOOL TermsrvLogInstallIniFile(PINIFILE_PARAMETERS a);
  734. extern PTERMSRVGETCOMPUTERNAME gpTermsrvGetComputerName;
  735. extern PTERMSRVADJUSTPHYMEMLIMITS gpTermsrvAdjustPhyMemLimits;
  736. extern PTERMSRVGETWINDOWSDIRECTORYA gpTermsrvGetWindowsDirectoryA;
  737. extern PTERMSRVGETWINDOWSDIRECTORYW gpTermsrvGetWindowsDirectoryW;
  738. extern PTERMSRVCONVERTSYSROOTTOUSERDIR gpTermsrvConvertSysRootToUserDir;
  739. extern PTERMSRVBUILDINIFILENAME gpTermsrvBuildIniFileName;
  740. extern PTERMSRVCORINIFILE gpTermsrvCORIniFile;
  741. extern PTERMSRVUPDATEALLUSERMENU gpTermsrvUpdateAllUserMenu;
  742. extern PGETTERMSRCOMPATFLAGS gpGetTermsrCompatFlags;
  743. extern PTERMSRVBUILDSYSINIPATH gpTermsrvBuildSysIniPath;
  744. extern PTERMSRVCOPYINIFILE gpTermsrvCopyIniFile;
  745. extern PTERMSRVGETSTRING gpTermsrvGetString;
  746. extern PTERMSRVLOGINSTALLINIFILE gpTermsrvLogInstallIniFile;
  747. //
  748. // For periodic timers that fire APCs set when a non-default activation context is active
  749. // we leak this structure.
  750. //
  751. #define BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_FREE_AFTER_CALLBACK (0x00000001)
  752. typedef struct _BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK {
  753. DWORD Flags;
  754. PVOID CallbackFunction;
  755. PVOID CallbackContext;
  756. PACTIVATION_CONTEXT ActivationContext;
  757. } BASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK, *PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK;
  758. #define BASEP_ALLOCATE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_FREE_AFTER_CALLBACK (0x00000001)
  759. #define BASEP_ALLOCATE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK_FLAG_DO_NOT_ALLOCATE_IF_PROCESS_DEFAULT (0x00000002)
  760. NTSTATUS
  761. BasepAllocateActivationContextActivationBlock(
  762. IN DWORD Flags,
  763. IN PVOID CallbackFunction,
  764. IN PVOID CallbackContext,
  765. OUT PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK *ActivationBlock
  766. );
  767. VOID
  768. BasepFreeActivationContextActivationBlock(
  769. IN PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK ActivationBlock
  770. );
  771. VOID
  772. WINAPI
  773. BasepActivationContextActivationIoCompletion(
  774. IN PVOID ApcContext, // actually PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK
  775. PIO_STATUS_BLOCK IoStatusBlock,
  776. DWORD Reserved
  777. );
  778. VOID
  779. CALLBACK
  780. BasepTimerAPCProc(
  781. IN PVOID ApcContext, // actually PBASE_ACTIVATION_CONTEXT_ACTIVATION_BLOCK
  782. IN ULONG TimerLowValue,
  783. IN LONG TimerHighValue
  784. );
  785. #define SXS_POLICY_SUFFIX L".Config"
  786. #define SXS_MANIFEST_SUFFIX L".Manifest"
  787. extern const UNICODE_STRING SxsPolicySuffix;
  788. typedef struct _SXS_CONSTANT_WIN32_NT_PATH_PAIR {
  789. PCUNICODE_STRING Win32;
  790. PCUNICODE_STRING Nt;
  791. } SXS_CONSTANT_WIN32_NT_PATH_PAIR, *PSXS_CONSTANT_WIN32_NT_PATH_PAIR;
  792. typedef const SXS_CONSTANT_WIN32_NT_PATH_PAIR* PCSXS_CONSTANT_WIN32_NT_PATH_PAIR;
  793. typedef struct _SXS_WIN32_NT_PATH_PAIR {
  794. PRTL_UNICODE_STRING_BUFFER Win32;
  795. PRTL_UNICODE_STRING_BUFFER Nt;
  796. } SXS_WIN32_NT_PATH_PAIR, *PSXS_WIN32_NT_PATH_PAIR;
  797. typedef const SXS_WIN32_NT_PATH_PAIR *PCSXS_WIN32_NT_PATH_PAIR;
  798. NTSTATUS
  799. BasepSxsCreateResourceStream(
  800. IN ULONG LdrCreateOutOfProcessImageFlags,
  801. PCSXS_CONSTANT_WIN32_NT_PATH_PAIR Win32NtPathPair,
  802. IN OUT PBASE_MSG_SXS_HANDLES Handles,
  803. IN ULONG_PTR MappedResourceName,
  804. OUT PBASE_MSG_SXS_STREAM MessageStream
  805. );
  806. NTSTATUS
  807. BasepSxsCreateFileStream(
  808. IN ACCESS_MASK AccessMask,
  809. PCSXS_CONSTANT_WIN32_NT_PATH_PAIR Win32NtPathPair,
  810. IN OUT PBASE_MSG_SXS_HANDLES Handles,
  811. OUT PBASE_MSG_SXS_STREAM MessageStream
  812. );
  813. // Pass the address of this to force policy to be empty.
  814. // It doesn't have a special address, just the right values.
  815. extern const SXS_OVERRIDE_STREAM SxsForceEmptyPolicy;
  816. VOID
  817. BasepSxsOverrideStreamToMessageStream(
  818. IN PCSXS_OVERRIDE_STREAM OverrideStream,
  819. OUT PBASE_MSG_SXS_STREAM MessageStream
  820. );
  821. #define BASEP_SXS_CREATESTREAMS_FLAG_LIKE_CREATEPROCESS 0x00000001
  822. NTSTATUS
  823. BasepSxsCreateStreams(
  824. IN ULONG Flags,
  825. IN ULONG LdrCreateOutOfProcessImageFlags,
  826. IN ACCESS_MASK AccessMask,
  827. IN PCSXS_OVERRIDE_STREAM OverrideManifest OPTIONAL,
  828. IN PCSXS_OVERRIDE_STREAM OverridePolicy OPTIONAL,
  829. IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestFilePathPair,
  830. IN OUT PBASE_MSG_SXS_HANDLES ManifestFileHandles,
  831. IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestImagePathPair,
  832. IN OUT PBASE_MSG_SXS_HANDLES ManifestImageHandles,
  833. // If none of the optional parameters are passed, then you could have directly
  834. // called a simpler function.
  835. IN ULONG_PTR MappedManifestResourceName OPTIONAL,
  836. IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR PolicyPathPair OPTIONAL,
  837. IN OUT PBASE_MSG_SXS_HANDLES PolicyHandles OPTIONAL,
  838. OUT PULONG MessageFlags,
  839. OUT PBASE_MSG_SXS_STREAM ManifestMessageStream,
  840. OUT PBASE_MSG_SXS_STREAM PolicyMessageStream OPTIONAL
  841. );
  842. BOOL
  843. BasepSxsIsStatusFileNotFoundEtc(
  844. NTSTATUS Status
  845. );
  846. BOOL
  847. BasepSxsIsStatusResourceNotFound(
  848. NTSTATUS Status
  849. );
  850. NTSTATUS
  851. BasepSxsCreateProcessCsrMessage(
  852. IN PCSXS_OVERRIDE_STREAM OverrideManifest OPTIONAL,
  853. IN PCSXS_OVERRIDE_STREAM OverridePolicy OPTIONAL,
  854. IN OUT PCSXS_WIN32_NT_PATH_PAIR ManifestFilePathPair,
  855. IN OUT PBASE_MSG_SXS_HANDLES ManifestFileHandles,
  856. IN PCSXS_CONSTANT_WIN32_NT_PATH_PAIR ManifestImagePathPair,
  857. IN OUT PBASE_MSG_SXS_HANDLES ManifestImageHandles,
  858. IN OUT PCSXS_WIN32_NT_PATH_PAIR PolicyPathPair,
  859. IN OUT PBASE_MSG_SXS_HANDLES PolicyHandles,
  860. IN OUT PRTL_UNICODE_STRING_BUFFER Win32AssemblyDirectoryBuffer,
  861. OUT PBASE_SXS_CREATEPROCESS_MSG Message
  862. );
  863. NTSTATUS
  864. BasepSxsGetProcessImageBaseAddress(
  865. PBASE_MSG_SXS_HANDLES Handles
  866. );
  867. VOID
  868. NTAPI
  869. BasepSxsActivationContextNotification(
  870. IN ULONG NotificationType,
  871. IN PACTIVATION_CONTEXT ActivationContext,
  872. IN const VOID *ActivationContextData,
  873. IN PVOID NotificationContext,
  874. IN PVOID NotificationData,
  875. IN OUT PBOOLEAN DisableNotification
  876. );
  877. VOID
  878. BasepSxsDbgPrintMessageStream(
  879. PCSTR Function,
  880. PCSTR StreamName,
  881. PBASE_MSG_SXS_STREAM MessageStream
  882. );
  883. extern const UNICODE_STRING SxsManifestSuffix;
  884. extern const UNICODE_STRING SxsPolicySuffix;
  885. VOID
  886. BasepSxsCloseHandles(
  887. IN PCBASE_MSG_SXS_HANDLES Handles
  888. );
  889. extern const WCHAR AdvapiDllString[];
  890. //
  891. // These functions implement apphelp cache functionality (ahcache.c)
  892. //
  893. //
  894. // Routines in ahcache.c
  895. //
  896. BOOL
  897. WINAPI
  898. BaseCheckAppcompatCache(
  899. LPCWSTR pwszPath,
  900. HANDLE hFile,
  901. PVOID pEnvironment,
  902. DWORD* dwReason
  903. );
  904. //
  905. // function that we call from winlogon
  906. //
  907. BOOL
  908. WINAPI
  909. BaseInitAppcompatCacheSupport(
  910. VOID
  911. );
  912. BOOL
  913. WINAPI
  914. BaseCleanupAppcompatCacheSupport(
  915. BOOL bWrite
  916. );
  917. //
  918. // function that calls into csrss to check on app's compatibility
  919. //
  920. BOOL
  921. NTAPI
  922. BaseCheckRunApp(
  923. IN HANDLE FileHandle,
  924. IN LPCWSTR pwszApplication,
  925. IN PVOID pEnvironment,
  926. IN USHORT uExeType,
  927. IN DWORD dwReason,
  928. OUT PVOID* ppData,
  929. OUT PDWORD pcbData,
  930. OUT PVOID* ppSxsData,
  931. OUT PDWORD pcbSxsData,
  932. OUT PDWORD pdwFusionFlag
  933. );
  934. VOID
  935. BasepFreeAppCompatData(
  936. PVOID pAppCompatData,
  937. SIZE_T cbAppCompatData,
  938. PVOID pSxsData,
  939. SIZE_T cbSxsData
  940. );
  941. NTSTATUS
  942. NTAPI
  943. BasepProbeForDllManifest(
  944. IN PVOID DllBase,
  945. IN PCWSTR FullDllPath,
  946. OUT PVOID *ActivationContext
  947. );
  948. #define BASEP_GET_MODULE_HANDLE_EX_NO_LOCK (0x00000001)
  949. BOOL
  950. BasepGetModuleHandleExW(
  951. IN DWORD dwPrivateFlags,
  952. IN DWORD dwPublicFlags,
  953. IN LPCWSTR lpModuleName,
  954. OUT HMODULE* phModule
  955. );
  956. #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_ERROR 1
  957. #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_SUCCESS 2
  958. #define BASEP_GET_MODULE_HANDLE_EX_PARAMETER_VALIDATION_CONTINUE 3
  959. ULONG
  960. BasepGetModuleHandleExParameterValidation(
  961. IN DWORD dwFlags,
  962. IN CONST VOID* lpModuleName,
  963. OUT HMODULE* phModule
  964. );
  965. #define BASEP_GET_TEMP_PATH_PRESERVE_TEB (0x00000001)
  966. DWORD
  967. BasepGetTempPathW(
  968. ULONG Flags,
  969. DWORD nBufferLength,
  970. LPWSTR lpBuffer
  971. );
  972. // There are defined in Termutil.c
  973. NTSTATUS
  974. BasepInitializeTermsrvFpns(
  975. VOID
  976. );
  977. BOOL
  978. IsCallerAdminOrSystem(
  979. VOID
  980. );
  981. BOOL
  982. IsTerminalServerCompatible(
  983. VOID
  984. );
  985. NTSTATUS
  986. IsTSAppCompatEnabled(
  987. OUT PBOOL
  988. );
  989. NTSTATUS
  990. GetPerUserWindowsDirectory(
  991. OUT PWCHAR TermSrvWindowsPath,
  992. IN SIZE_T InLength,
  993. IN PSIZE_T OutLength
  994. );
  995. UINT
  996. GetErrorMode(
  997. VOID
  998. );
  999. DWORD
  1000. GetThreadErrorMode(
  1001. VOID
  1002. );
  1003. #if defined(__cplusplus)
  1004. }
  1005. #endif
  1006. #endif // _BASEP_