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.

431 lines
15 KiB

  1. /*++
  2. Copyright (c) Microsoft Corporation
  3. Module Name:
  4. sxsp.h
  5. Abstract:
  6. Include file for ntdll-private definitions of Side-By-Side data structures.
  7. Author:
  8. Michael J. Grier (mgrier) October 26, 2000
  9. Environment:
  10. Revision History:
  11. --*/
  12. #if !defined(_NTDLL_SXSP_H_INCLUDED_)
  13. #define _NTDLL_SXSP_H_INCLUDED_
  14. #include <nturtl.h>
  15. #include <sxstypes.h>
  16. typedef const void *PCVOID;
  17. //
  18. // Private definitions for activation context management stuff
  19. //
  20. #define NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
  21. //
  22. // Codes for the STATUS_SXS_CORRUPTION exception
  23. //
  24. #define SXS_CORRUPTION_CODE_FRAMELIST (1)
  25. #define SXS_CORRUPTION_CODE_FRAMELIST_SUBCODE_BAD_MAGIC (1)
  26. #define SXS_CORRUPTION_CODE_FRAMELIST_SUBCODE_BAD_INUSECOUNT (2)
  27. // SXS_CORRUPTION_CODE_FRAMELIST:
  28. //
  29. // ExceptionInformation[0] == SXS_CORRUPTION_CODE_FRAMELIST
  30. // ExceptionInformation[1] == one of: SXS_CORRUPTION_CODE_FRAMELIST_SUBCODE_BAD_MAGIC, SXS_CORRUPTION_CODE_FRAMELIST_SUBCODE_BAD_INUSECOUNT
  31. // ExceptionInformation[2] == Framelist list head in TEB
  32. // ExceptionInformation[3] == Framelist found to be corrupt
  33. #define SXS_CORRUPTION_ACTCTX_LIST (2)
  34. #define SXS_CORRUPTION_ACTCTX_LIST_RELEASING_NOT_IN_LIVE_LIST (1)
  35. // SXS_CORRUPTION_ACTCTX_LIST
  36. //
  37. // ExceptionInformation[0] = SXS_CORRUPTION_ACTCTX_LIST
  38. // ExceptionInformation[1] = One of SXS_CORRUPTION_ACTCTX_LIST_*
  39. // ExceptionInformation[2] = Pointer to the list of live activation contexts
  40. // ExceptionInformation[3] = Activation context not found in live list
  41. #define SXS_CORRUPTION_ACTCTX_MAGIC (1)
  42. #define SXS_CORRUPTION_ACTCTX_MAGIC_NOT_MATCHED (1)
  43. #define SXS_CORRUPTION_ACTCTX_MAGIC_NOT_ALIGNED (2)
  44. // SXS_CORRUPTION_ACTCTX_MAGIC
  45. //
  46. // ExceptionInformation[0] = SXS_CORRUPTION_ACTCTX_MAGIC
  47. // ExceptionInformation[1] = SXS_CORRUPTION_MAGIC_NOT_MATCHED or SXS_CORRUPTION_ACTCTX_MAGIC_NOT_ALIGNED
  48. // ExceptionInformation[2] = Pointer to the activation context that fails
  49. typedef struct _RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME {
  50. RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame;
  51. ULONG_PTR Cookie;
  52. PVOID ActivationStackBackTrace[8];
  53. } RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME;
  54. NTSYSAPI
  55. VOID
  56. NTAPI
  57. RtlpAssemblyStorageMapResolutionDefaultCallback(
  58. IN ULONG CallbackReason,
  59. IN OUT ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA *CallbackData,
  60. IN PVOID CallbackContext
  61. );
  62. typedef struct _ASSEMBLY_STORAGE_MAP_ENTRY {
  63. ULONG Flags;
  64. UNICODE_STRING DosPath; // stored with a trailing unicode null
  65. HANDLE Handle; // open file handle on the directory to lock it down
  66. } ASSEMBLY_STORAGE_MAP_ENTRY, *PASSEMBLY_STORAGE_MAP_ENTRY;
  67. #define ASSEMBLY_STORAGE_MAP_ASSEMBLY_ARRAY_IS_HEAP_ALLOCATED (0x00000001)
  68. typedef struct _ASSEMBLY_STORAGE_MAP {
  69. ULONG Flags;
  70. ULONG AssemblyCount;
  71. PASSEMBLY_STORAGE_MAP_ENTRY *AssemblyArray;
  72. } ASSEMBLY_STORAGE_MAP, *PASSEMBLY_STORAGE_MAP;
  73. #define ACTCTX_RELEASE_STACK_DEPTH (4)
  74. #define ACTCTX_RELEASE_STACK_SLOTS (4)
  75. typedef struct _ACTIVATION_CONTEXT {
  76. LONG RefCount;
  77. ULONG Flags;
  78. LIST_ENTRY Links;
  79. PCACTIVATION_CONTEXT_DATA ActivationContextData;
  80. PACTIVATION_CONTEXT_NOTIFY_ROUTINE NotificationRoutine;
  81. PVOID NotificationContext;
  82. ULONG SentNotifications[8];
  83. ULONG DisabledNotifications[8];
  84. ASSEMBLY_STORAGE_MAP StorageMap;
  85. PASSEMBLY_STORAGE_MAP_ENTRY InlineStorageMapEntries[32];
  86. ULONG StackTraceIndex;
  87. PVOID StackTraces[ACTCTX_RELEASE_STACK_SLOTS][ACTCTX_RELEASE_STACK_DEPTH];
  88. } ACTIVATION_CONTEXT;
  89. #define ACTIVATION_CONTEXT_NOTIFICATION_DESTROY_INDEX (ACTIVATION_CONTEXT_NOTIFICATION_DESTROY >> 5)
  90. #define ACTIVATION_CONTEXT_NOTIFICATION_DESTROY_MASK ((ULONG) (1 << (ACTIVATION_CONTEXT_NOTIFICATION_DESTROY & 0x1f)))
  91. #define ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY_INDEX (ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY >> 5)
  92. #define ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY_MASK ((ULONG) (1 << (ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY & 0x1f)))
  93. #define ACTIVATION_CONTEXT_NOTIFICATION_USED_INDEX (ACTIVATION_CONTEXT_NOTIFICATION_USED >> 5)
  94. #define ACTIVATION_CONTEXT_NOTIFICATION_USED_MASK ((ULONG) (1 << (ACTIVATION_CONTEXT_NOTIFICATION_USED & 0x1f)))
  95. #define HAS_ACTIVATION_CONTEXT_NOTIFICATION_BEEN_SENT(_pac, _nt) (((_pac)->SentNotifications[ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _INDEX] & ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _MASK) != 0)
  96. #define HAS_ACTIVATION_CONTEXT_NOTIFICATION_BEEN_DISABLED(_pac, _nt) (((_pac)->DisabledNotifications[ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _INDEX] & ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _MASK) != 0)
  97. #define ACTIVATION_CONTEXT_SHOULD_SEND_NOTIFICATION(_pac, _nt) \
  98. ((!IS_SPECIAL_ACTCTX(_pac)) && ((_pac)->NotificationRoutine != NULL) && ((!HAS_ACTIVATION_CONTEXT_NOTIFICATION_BEEN_SENT((_pac), _nt)) || (!HAS_ACTIVATION_CONTEXT_NOTIFICATION_BEEN_DISABLED((_pac), _nt))))
  99. #define RECORD_ACTIVATION_CONTEXT_NOTIFICATION_SENT(_pac, _nt) { (_pac)->SentNotifications[ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _INDEX] |= ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _MASK; }
  100. #define RECORD_ACTIVATION_CONTEXT_NOTIFICATION_DISABLED(_pac, _nt) { (_pac)->DisabledNotifications[ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _INDEX] |= ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt ## _MASK; }
  101. #define SEND_ACTIVATION_CONTEXT_NOTIFICATION(_pac, _nt, _data) \
  102. { \
  103. if (ACTIVATION_CONTEXT_SHOULD_SEND_NOTIFICATION((_pac), _nt)) { \
  104. BOOLEAN __DisableNotification = FALSE; \
  105. (*((_pac)->NotificationRoutine))( \
  106. ACTIVATION_CONTEXT_NOTIFICATION_ ## _nt, \
  107. (_pac), \
  108. (_pac)->ActivationContextData, \
  109. (_pac)->NotificationContext, \
  110. (_data), \
  111. &__DisableNotification); \
  112. RECORD_ACTIVATION_CONTEXT_NOTIFICATION_SENT((_pac), _nt); \
  113. if (__DisableNotification) \
  114. RECORD_ACTIVATION_CONTEXT_NOTIFICATION_DISABLED((_pac), _nt); \
  115. } \
  116. }
  117. //
  118. // Flags for ACTIVATION_CONTEXT
  119. //
  120. #define ACTIVATION_CONTEXT_ZOMBIFIED (0x00000001)
  121. #define ACTIVATION_CONTEXT_NOT_HEAP_ALLOCATED (0x00000002)
  122. //
  123. // Because activating an activation context may require a heap allocation
  124. // which may fail, sometimes (e.g. dispatching an APC) we must still
  125. // go forward with the operation. If there is an opportunity to
  126. // report the failure to activate back to the user, that should be done.
  127. // However, as in activating the necessary context prior to dispatching
  128. // an APC back to the user mode code, if the allocation fails, there is
  129. // no caller to whom to report the error.
  130. //
  131. // To alleviate this problem, failure paths should disable lookups on
  132. // the current stack frame via the RtlSetActivationContextSearchState()
  133. // API. Calling RtlSetActivationContextSearchState(FALSE) marks
  134. // the active frame as having lookups disabled. Attempts to query
  135. // the activation context stack will fail with the
  136. // STATUS_SXS_THREAD_QUERIES_DISABLED.
  137. //
  138. // This means that attempts to load libraries from within APCs where this
  139. // is true will fail, but it's surely better than either silently not
  140. // calling the APC or calling the APC with the wrong activation context
  141. // active.
  142. //
  143. #define ACTIVATION_CONTEXT_STACK_FRAMELIST_MAGIC 'tslF'
  144. typedef struct _ACTIVATION_CONTEXT_STACK_FRAMELIST {
  145. ULONG Magic; // Bit pattern to recognize a framelist
  146. ULONG FramesInUse;
  147. LIST_ENTRY Links;
  148. ULONG Flags;
  149. ULONG NotFramesInUse; // Inverted bits of FramesInUse. Useful for debugging.
  150. RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME Frames[32];
  151. } ACTIVATION_CONTEXT_STACK_FRAMELIST, *PACTIVATION_CONTEXT_STACK_FRAMELIST;
  152. #define RTLP_VALIDATE_ACTIVATION_CONTEXT_DATA_FLAG_VALIDATE_SIZE (0x00000001)
  153. #define RTLP_VALIDATE_ACTIVATION_CONTEXT_DATA_FLAG_VALIDATE_OFFSETS (0x00000002)
  154. #define RTLP_VALIDATE_ACTIVATION_CONTEXT_DATA_FLAG_VALIDATE_READONLY (0x00000004)
  155. NTSTATUS
  156. RtlpValidateActivationContextData(
  157. IN ULONG Flags OPTIONAL,
  158. IN PCACTIVATION_CONTEXT_DATA Data,
  159. IN SIZE_T BufferSize OPTIONAL
  160. );
  161. NTSTATUS
  162. RtlpFindUnicodeStringInSection(
  163. IN const ACTIVATION_CONTEXT_STRING_SECTION_HEADER UNALIGNED * Header,
  164. IN SIZE_T SectionSize,
  165. IN PCUNICODE_STRING StringToFind,
  166. OUT PACTIVATION_CONTEXT_SECTION_KEYED_DATA DataOut OPTIONAL,
  167. IN OUT PULONG HashAlgorithm,
  168. IN OUT PULONG PseudoKey,
  169. OUT PULONG UserDataSize OPTIONAL,
  170. OUT VOID CONST ** UserData OPTIONAL
  171. );
  172. NTSTATUS
  173. RtlpFindGuidInSection(
  174. IN const ACTIVATION_CONTEXT_GUID_SECTION_HEADER UNALIGNED * Header,
  175. IN const GUID *GuidToFind,
  176. OUT PACTIVATION_CONTEXT_SECTION_KEYED_DATA DataOut OPTIONAL
  177. );
  178. NTSTATUS
  179. RtlpLocateActivationContextSection(
  180. IN PCACTIVATION_CONTEXT_DATA ActivationContextData,
  181. IN const GUID *ExtensionGuid,
  182. IN ULONG Id,
  183. OUT PCVOID *SectionData,
  184. OUT ULONG *SectionLength
  185. );
  186. NTSTATUS
  187. RtlpCrackActivationContextStringSectionHeader(
  188. IN CONST VOID *SectionBase,
  189. IN SIZE_T SectionLength,
  190. OUT ULONG *FormatVersion OPTIONAL,
  191. OUT ULONG *DataFormatVersion OPTIONAL,
  192. OUT ULONG *SectionFlags OPTIONAL,
  193. OUT ULONG *ElementCount OPTIONAL,
  194. OUT PCACTIVATION_CONTEXT_STRING_SECTION_ENTRY *Elements OPTIONAL,
  195. OUT ULONG *HashAlgorithm OPTIONAL,
  196. OUT VOID CONST **SearchStructure OPTIONAL,
  197. OUT ULONG *UserDataSize OPTIONAL,
  198. OUT VOID CONST **UserData OPTIONAL
  199. );
  200. NTSTATUS
  201. RtlpGetActiveActivationContextApplicationDirectory(
  202. IN SIZE_T InLength,
  203. OUT PVOID OutBuffer,
  204. OUT SIZE_T *OutLength
  205. );
  206. NTSTATUS
  207. RtlpFindNextActivationContextSection(
  208. PFINDFIRSTACTIVATIONCONTEXTSECTION Context,
  209. OUT PCVOID *SectionData,
  210. ULONG *SectionLength,
  211. PACTIVATION_CONTEXT *ActivationContextOut
  212. );
  213. NTSTATUS
  214. RtlpAllocateActivationContextStackFrame(
  215. ULONG Flags,
  216. PTEB Teb,
  217. PRTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME *Frame
  218. );
  219. VOID
  220. RtlpFreeActivationContextStackFrame(
  221. PRTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME Frame
  222. );
  223. PSTR
  224. RtlpFormatGuidANSI(
  225. const GUID *Guid,
  226. PSTR Buffer,
  227. SIZE_T BufferLength
  228. );
  229. #define RTLP_DISALLOW_THE_EMPTY_ACTIVATION_CONTEXT(ActCtx) \
  230. { \
  231. ASSERT((ActCtx) != &RtlpTheEmptyActivationContext); \
  232. if ((ActCtx) == &RtlpTheEmptyActivationContext) { \
  233. DbgPrintEx( \
  234. DPFLTR_SXS_ID, \
  235. DPFLTR_ERROR_LEVEL, \
  236. "SXS: %s() passed the empty activation context\n", __FUNCTION__); \
  237. Status = STATUS_INVALID_PARAMETER; \
  238. goto Exit; \
  239. } \
  240. }
  241. #define RTLP_DISALLOW_THE_EMPTY_ACTIVATION_CONTEXT_DATA(ActCtxData) \
  242. { \
  243. ASSERT((ActCtxData) != &RtlpTheEmptyActivationContextData); \
  244. if ((ActCtxData) == &RtlpTheEmptyActivationContextData) { \
  245. DbgPrintEx( \
  246. DPFLTR_SXS_ID, \
  247. DPFLTR_ERROR_LEVEL, \
  248. "SXS: %s() passed the empty activation context data\n", __FUNCTION__); \
  249. Status = STATUS_INVALID_PARAMETER; \
  250. goto Exit; \
  251. } \
  252. }
  253. PACTIVATION_CONTEXT
  254. RtlpMapSpecialValuesToBuiltInActivationContexts(
  255. PACTIVATION_CONTEXT ActivationContext
  256. );
  257. NTSTATUS
  258. RtlpThreadPoolGetActiveActivationContext(
  259. PACTIVATION_CONTEXT* ActivationContext
  260. );
  261. NTSTATUS
  262. RtlpInitializeAssemblyStorageMap(
  263. PASSEMBLY_STORAGE_MAP Map,
  264. ULONG EntryCount,
  265. PASSEMBLY_STORAGE_MAP_ENTRY *EntryArray
  266. );
  267. VOID
  268. RtlpUninitializeAssemblyStorageMap(
  269. PASSEMBLY_STORAGE_MAP Map
  270. );
  271. NTSTATUS
  272. RtlpResolveAssemblyStorageMapEntry(
  273. IN OUT PASSEMBLY_STORAGE_MAP Map,
  274. IN PCACTIVATION_CONTEXT_DATA Data,
  275. IN ULONG AssemblyRosterIndex,
  276. IN PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_ROUTINE Callback,
  277. IN PVOID CallbackContext
  278. );
  279. NTSTATUS
  280. RtlpInsertAssemblyStorageMapEntry(
  281. IN PASSEMBLY_STORAGE_MAP Map,
  282. IN ULONG AssemblyRosterIndex,
  283. IN PCUNICODE_STRING StorageLocation,
  284. IN OUT HANDLE *OpenDirectoryHandle
  285. );
  286. NTSTATUS
  287. RtlpProbeAssemblyStorageRootForAssembly(
  288. IN ULONG Flags,
  289. IN PCUNICODE_STRING Root,
  290. IN PCUNICODE_STRING AssemblyDirectory,
  291. OUT PUNICODE_STRING PreAllocatedString,
  292. OUT PUNICODE_STRING DynamicString,
  293. OUT PUNICODE_STRING *StringUsed,
  294. IN OUT HANDLE *OpenDirectoryHandle
  295. );
  296. NTSTATUS
  297. RtlpGetAssemblyStorageMapRootLocation(
  298. IN HANDLE KeyHandle,
  299. IN PCUNICODE_STRING SubKeyName,
  300. OUT PUNICODE_STRING Root
  301. );
  302. #define RTLP_GET_ACTIVATION_CONTEXT_DATA_STORAGE_MAP_AND_ROSTER_HEADER_USE_PROCESS_DEFAULT (0x00000001)
  303. #define RTLP_GET_ACTIVATION_CONTEXT_DATA_STORAGE_MAP_AND_ROSTER_HEADER_USE_SYSTEM_DEFAULT (0x00000002)
  304. NTSTATUS
  305. RtlpGetActivationContextDataRosterHeader(
  306. IN ULONG Flags,
  307. IN PCACTIVATION_CONTEXT_DATA ActivationContextData,
  308. OUT PCACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER *AssemblyRosterHeader
  309. );
  310. NTSTATUS
  311. RtlpGetActivationContextDataStorageMapAndRosterHeader(
  312. IN ULONG Flags,
  313. IN PPEB Peb,
  314. IN PACTIVATION_CONTEXT ActivationContext,
  315. OUT PCACTIVATION_CONTEXT_DATA *ActivationContextData,
  316. OUT PASSEMBLY_STORAGE_MAP *AssemblyStorageMap,
  317. OUT PCACTIVATION_CONTEXT_DATA_ASSEMBLY_ROSTER_HEADER *AssemblyRosterHeader
  318. );
  319. #define RTLP_GET_ACTIVATION_CONTEXT_DATA_MAP_NULL_TO_EMPTY (0x00000001)
  320. NTSTATUS
  321. RtlpGetActivationContextData(
  322. IN ULONG Flags,
  323. IN PCACTIVATION_CONTEXT ActivationContext,
  324. IN PCFINDFIRSTACTIVATIONCONTEXTSECTION FindContext, OPTIONAL /* This is used for its flags. */
  325. OUT PCACTIVATION_CONTEXT_DATA * ActivationContextData
  326. );
  327. NTSTATUS
  328. RtlpFindActivationContextSection_FillOutReturnedData(
  329. IN ULONG Flags,
  330. OUT PACTIVATION_CONTEXT_SECTION_KEYED_DATA ReturnedData,
  331. IN OUT PACTIVATION_CONTEXT ActivationContext,
  332. IN PCFINDFIRSTACTIVATIONCONTEXTSECTION FindContext,
  333. IN const VOID * UNALIGNED Header,
  334. IN ULONG Header_UserDataOffset,
  335. IN ULONG Header_UserDataSize,
  336. IN ULONG SectionLength
  337. );
  338. VOID
  339. FASTCALL
  340. RtlpFreeCachedActivationContexts(
  341. VOID
  342. );
  343. #define ACTCTX_MAGIC_MARKER ((PVOID)(ULONG_PTR)('gMcA'))
  344. typedef struct _ACTIVATION_CONTEXT_WRAPPED {
  345. PVOID MagicMarker;
  346. ACTIVATION_CONTEXT ActivationContext;
  347. } ACTIVATION_CONTEXT_WRAPPED, *PACTIVATION_CONTEXT_WRAPPED;
  348. typedef const ACTIVATION_CONTEXT_WRAPPED *PCACTIVATION_CONTEXT_WRAPPED;
  349. extern const ACTIVATION_CONTEXT_DATA RtlpTheEmptyActivationContextData;
  350. extern const ACTIVATION_CONTEXT_WRAPPED RtlpTheEmptyActivationContextWrapped;
  351. #define RtlpTheEmptyActivationContext (RtlpTheEmptyActivationContextWrapped.ActivationContext)
  352. EXTERN_C BOOLEAN g_SxsKeepActivationContextsAlive;
  353. #endif // !defined(_NTDLL_SXSP_H_INCLUDED_)