ReactOS 0.4.15-dev-8245-gd24675b
libsupp.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/rtl/libsupp.c
5 * PURPOSE: RTL Support Routines
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
7 * Gunnar Dalsnes
8 */
9
10/* INCLUDES ******************************************************************/
11
12#include <ntoskrnl.h>
13#define NDEBUG
14#include <debug.h>
15
16extern ULONG NtGlobalFlag;
17
18typedef struct _RTL_RANGE_ENTRY
19{
23
26
27/* FUNCTIONS *****************************************************************/
28
32 IN PVOID PcValue,
33 OUT PVOID *BaseOfImage)
34{
35 PLDR_DATA_TABLE_ENTRY LdrEntry;
36 BOOLEAN InSystem;
38
39 /* Get the base for this file */
41 {
42 /* Acquire the loaded module spinlock */
44
45 /* We are in kernel */
46 *BaseOfImage = KiPcToFileHeader(PcValue, &LdrEntry, FALSE, &InSystem);
47
48 /* Release lock */
50 }
51 else
52 {
53 /* User mode is not handled here! */
54 *BaseOfImage = NULL;
55 }
56
57 return *BaseOfImage;
58}
59
60VOID
63{
64 /* Setup the lookaside list for allocations (not used yet) */
66 NULL,
67 NULL,
69 sizeof(RTL_RANGE_ENTRY),
70 'elRR',
71 16);
72}
73
77{
78 /* This check is meaningless in kernel-mode */
79 return FALSE;
80}
81
85{
86 /* Nothing to set in kernel mode */
87 return FALSE;
88}
89
90VOID
93{
94 /* Nothing to clear in kernel mode */
95}
96
100{
101 return KernelMode;
102}
103
104PVOID
105NTAPI
107 ULONG Tag)
108{
110 (SIZE_T)Bytes,
111 Tag);
112}
113
114VOID
115NTAPI
117 ULONG Tag)
118{
119 if (Tag == TAG_ASTR || Tag == TAG_OSTR || Tag == TAG_USTR)
120 ExFreePool(Mem);
121 else
123}
124
125/*
126 * @implemented
127 */
130{
131
132}
133
134/*
135 * @implemented
136 */
139{
140
141}
142
144NTAPI
146{
147 return STATUS_SUCCESS;
148}
149
150
151PPEB
152NTAPI
154{
155 return ((PEPROCESS)(KeGetCurrentThread()->ApcState.Process))->Peb;
156}
157
159NTAPI
161{
162 ExDeleteResourceLite(&Lock->Resource);
164
165 return STATUS_SUCCESS;
166}
167
169NTAPI
171{
173
174 if (Exclusive)
176 else
178
179 return STATUS_SUCCESS;
180}
181
183NTAPI
185{
188
189 if (Exclusive)
191 else
193
194 if (!Success)
196
197 return Success;
198}
199
201NTAPI
203{
205 sizeof(HEAP_LOCK),
206 TAG_RTHL);
207 if (HeapLock == NULL)
208 return STATUS_NO_MEMORY;
209
211 *Lock = HeapLock;
212
213 return STATUS_SUCCESS;
214}
215
217NTAPI
219{
220 ExReleaseResourceLite(&Lock->Resource);
222
223 return STATUS_SUCCESS;
224}
225
226struct _HEAP;
227
228VOID
229NTAPI
231{
233}
234
235VOID
236NTAPI
238{
240}
241
242VOID
244{
245}
246
247#if DBG
249CHECK_PAGED_CODE_RTL(char *file, int line)
250{
252 {
253 DbgPrint("%s:%i: Pagable code called at IRQL > APC_LEVEL (%u)\n", file, line, KeGetCurrentIrql());
254 ASSERT(FALSE);
255 }
256}
257#endif
258
259VOID
260NTAPI
262{
263 /* Apply defaults for non-set parameters */
264 if (!Parameters->SegmentCommit) Parameters->SegmentCommit = MmHeapSegmentCommit;
265 if (!Parameters->SegmentReserve) Parameters->SegmentReserve = MmHeapSegmentReserve;
266 if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = MmHeapDeCommitFreeBlockThreshold;
267 if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = MmHeapDeCommitTotalFreeThreshold;
268}
269
270VOID
271NTAPI
274 IN PVOID ContextData,
275 IN ULONG Size)
276{
277 /* Check the global flag */
279 {
280 /* FIXME: Log this exception */
281 }
282}
283
285NTAPI
287 IN ULONG_PTR RegistrationFrameEnd,
288 IN OUT PULONG_PTR StackLow,
289 IN OUT PULONG_PTR StackHigh)
290{
291 PKPRCB Prcb;
292 ULONG_PTR DpcStack;
293
294 /* Check if we are at DISPATCH or higher */
296 {
297 /* Get the PRCB and DPC Stack */
298 Prcb = KeGetCurrentPrcb();
299 DpcStack = (ULONG_PTR)Prcb->DpcStack;
300
301 /* Check if we are in a DPC and the stack matches */
302 if ((Prcb->DpcRoutineActive) &&
303 (RegistrationFrameEnd <= DpcStack) &&
304 ((ULONG_PTR)RegistrationFrame >= DpcStack - KERNEL_STACK_SIZE))
305 {
306 /* Update the limits to the DPC Stack's */
307 *StackHigh = DpcStack;
308 *StackLow = DpcStack - KERNEL_STACK_SIZE;
309 return TRUE;
310 }
311 }
312
313 /* Not in DPC stack */
314 return FALSE;
315}
316
317#if !defined(_ARM_) && !defined(_AMD64_)
318
320NTAPI
322 IN ULONG_PTR *StackBegin,
323 IN ULONG_PTR *StackEnd)
324{
326
327 /* Don't even try at ISR level or later */
328 if (KeGetCurrentIrql() > DISPATCH_LEVEL) return FALSE;
329
330 /* Start with defaults */
331 *StackBegin = Thread->StackLimit;
332 *StackEnd = (ULONG_PTR)Thread->StackBase;
333
334 /* Check if EBP is inside the stack */
335 if ((*StackBegin <= Ebp) && (Ebp <= *StackEnd))
336 {
337 /* Then make the stack start at EBP */
338 *StackBegin = Ebp;
339 }
340 else
341 {
342 /* Now we're going to assume we're on the DPC stack */
343 *StackEnd = (ULONG_PTR)(KeGetPcr()->Prcb->DpcStack);
344 *StackBegin = *StackEnd - KERNEL_STACK_SIZE;
345
346 /* Check if we seem to be on the DPC stack */
347 if ((*StackEnd) && (*StackBegin < Ebp) && (Ebp <= *StackEnd))
348 {
349 /* We're on the DPC stack */
350 *StackBegin = Ebp;
351 }
352 else
353 {
354 /* We're somewhere else entirely... use EBP for safety */
355 *StackBegin = Ebp;
356 *StackEnd = (ULONG_PTR)PAGE_ALIGN(*StackBegin);
357 }
358 }
359
360 /* Return success */
361 return TRUE;
362}
363
364/*
365 * @implemented
366 */
367ULONG
368NTAPI
370 IN ULONG Count,
371 IN ULONG Flags)
372{
373 ULONG_PTR Stack, NewStack, StackBegin, StackEnd = 0;
374 ULONG Eip;
375 BOOLEAN Result, StopSearch = FALSE;
376 ULONG i = 0;
378 PTEB Teb;
379 PKTRAP_FRAME TrapFrame;
380
381 /* Get current EBP */
382#if defined(_M_IX86)
383#if defined __GNUC__
384 __asm__("mov %%ebp, %0" : "=r" (Stack) : );
385#elif defined(_MSC_VER)
386 __asm mov Stack, ebp
387#endif
388#elif defined(_M_MIPS)
389 __asm__("move $sp, %0" : "=r" (Stack) : );
390#elif defined(_M_PPC)
391 __asm__("mr %0,1" : "=r" (Stack) : );
392#elif defined(_M_ARM)
393 __asm__("mov sp, %0" : "=r"(Stack) : );
394#else
395#error Unknown architecture
396#endif
397
398 /* Set it as the stack begin limit as well */
399 StackBegin = (ULONG_PTR)Stack;
400
401 /* Check if we're called for non-logging mode */
402 if (!Flags)
403 {
404 /* Get the actual safe limits */
406 &StackBegin,
407 &StackEnd);
408 if (!Result) return 0;
409 }
410
411 /* Use a SEH block for maximum protection */
413 {
414 /* Check if we want the user-mode stack frame */
415 if (Flags == 1)
416 {
417 /* Get the trap frame and TEB */
418 TrapFrame = KeGetTrapFrame(&Thread->Tcb);
419 Teb = Thread->Tcb.Teb;
420
421 /* Make sure we can trust the TEB and trap frame */
422 if (!(Teb) ||
425 {
426 /* Invalid or unsafe attempt to get the stack */
427 _SEH2_YIELD(return 0;)
428 }
429
430 /* Get the stack limits */
431 StackBegin = (ULONG_PTR)Teb->NtTib.StackLimit;
432 StackEnd = (ULONG_PTR)Teb->NtTib.StackBase;
433#ifdef _M_IX86
434 Stack = TrapFrame->Ebp;
435#elif defined(_M_PPC)
436 Stack = TrapFrame->Gpr1;
437#else
438#error Unknown architecture
439#endif
440
441 /* Validate them */
442 if (StackEnd <= StackBegin) _SEH2_YIELD(return 0);
443 ProbeForRead((PVOID)StackBegin,
444 StackEnd - StackBegin,
445 sizeof(CHAR));
446 }
447
448 /* Loop the frames */
449 for (i = 0; i < Count; i++)
450 {
451 /*
452 * Leave if we're past the stack,
453 * if we're before the stack,
454 * or if we've reached ourselves.
455 */
456 if ((Stack >= StackEnd) ||
457 (!i ? (Stack < StackBegin) : (Stack <= StackBegin)) ||
458 ((StackEnd - Stack) < (2 * sizeof(ULONG_PTR))))
459 {
460 /* We're done or hit a bad address */
461 break;
462 }
463
464 /* Get new stack and EIP */
465 NewStack = *(PULONG_PTR)Stack;
466 Eip = *(PULONG_PTR)(Stack + sizeof(ULONG_PTR));
467
468 /* Check if the new pointer is above the oldone and past the end */
469 if (!((Stack < NewStack) && (NewStack < StackEnd)))
470 {
471 /* Stop searching after this entry */
472 StopSearch = TRUE;
473 }
474
475 /* Also make sure that the EIP isn't a stack address */
476 if ((StackBegin < Eip) && (Eip < StackEnd)) break;
477
478 /* Check if we reached a user-mode address */
479 if (!(Flags) && !(Eip & 0x80000000)) break; // FIXME: 3GB breakage
480
481 /* Save this frame */
482 Callers[i] = (PVOID)Eip;
483
484 /* Check if we should continue */
485 if (StopSearch)
486 {
487 /* Return the next index */
488 i++;
489 break;
490 }
491
492 /* Move to the next stack */
493 Stack = NewStack;
494 }
495 }
497 {
498 /* No index */
499 i = 0;
500 }
501 _SEH2_END;
502
503 /* Return frames parsed */
504 return i;
505}
506
507#endif
508
509VOID
510NTAPI
512 OUT PULONG_PTR LowLimit,
514{
515 PKTHREAD CurrentThread = KeGetCurrentThread();
516 *LowLimit = (ULONG_PTR)CurrentThread->StackLimit;
517#ifdef _M_IX86
518 *HighLimit = (ULONG_PTR)CurrentThread->InitialStack -
519 sizeof(FX_SAVE_AREA);
520#else
521 *HighLimit = (ULONG_PTR)CurrentThread->InitialStack;
522#endif
523}
524
525/* RTL Atom Tables ************************************************************/
526
529{
530 ExInitializeFastMutex(&AtomTable->FastMutex);
531
532 return STATUS_SUCCESS;
533}
534
535
536VOID
538{
539}
540
541
544{
545 ExAcquireFastMutex(&AtomTable->FastMutex);
546 return TRUE;
547}
548
549VOID
551{
552 ExReleaseFastMutex(&AtomTable->FastMutex);
553}
554
557{
558 AtomTable->ExHandleTable = ExCreateHandleTable(NULL);
559 return (AtomTable->ExHandleTable != NULL);
560}
561
563NTAPI
565 IN PHANDLE_TABLE_ENTRY HandleTableEntry,
568{
569 /* Destroy and unlock the handle entry */
570 return ExDestroyHandle(HandleTable, Handle, HandleTableEntry);
571}
572
573VOID
575{
576 if (AtomTable->ExHandleTable)
577 {
578 ExSweepHandleTable(AtomTable->ExHandleTable,
580 AtomTable->ExHandleTable);
581 ExDestroyHandleTable(AtomTable->ExHandleTable, NULL);
582 AtomTable->ExHandleTable = NULL;
583 }
584}
585
588{
590 Size,
591 TAG_ATMT);
592 if (Table != NULL)
593 {
595 Size);
596 }
597
598 return Table;
599}
600
601VOID
603{
604 ExFreePoolWithTag(AtomTable, TAG_ATMT);
605}
606
609{
611
613 if (Entry != NULL)
614 {
616 }
617
618 return Entry;
619}
620
621VOID
623{
625}
626
627VOID
629{
630 ExDestroyHandle(AtomTable->ExHandleTable,
631 (HANDLE)((ULONG_PTR)Entry->HandleIndex << 2),
632 NULL);
633}
634
637{
638 HANDLE_TABLE_ENTRY ExEntry;
640 USHORT HandleIndex;
641
642 /* Initialize ex handle table entry */
643 ExEntry.Object = Entry;
644 ExEntry.GrantedAccess = 0x1; /* FIXME - valid handle */
645
646 /* Create ex handle */
647 Handle = ExCreateHandle(AtomTable->ExHandleTable,
648 &ExEntry);
649 if (!Handle) return FALSE;
650
651 /* Calculate HandleIndex (by getting rid of the first two bits) */
652 HandleIndex = (USHORT)((ULONG_PTR)Handle >> 2);
653
654 /* Index must be less than 0xC000 */
655 if (HandleIndex >= 0xC000)
656 {
657 /* Destroy ex handle */
658 ExDestroyHandle(AtomTable->ExHandleTable,
659 Handle,
660 NULL);
661
662 /* Return failure */
663 return FALSE;
664 }
665
666 /* Initialize atom table entry */
667 Entry->HandleIndex = HandleIndex;
668 Entry->Atom = 0xC000 + HandleIndex;
669
670 /* Return success */
671 return TRUE;
672}
673
676{
677 PHANDLE_TABLE_ENTRY ExEntry;
679
680 /* NOTE: There's no need to explicitly enter a critical region because it's
681 guaranteed that we're in a critical region right now (as we hold
682 the atom table lock) */
683
684 ExEntry = ExMapHandleToPointer(AtomTable->ExHandleTable,
685 (HANDLE)((ULONG_PTR)Index << 2));
686 if (ExEntry != NULL)
687 {
688 Entry = ExEntry->Object;
689
690 ExUnlockHandleTableEntry(AtomTable->ExHandleTable,
691 ExEntry);
692 }
693
694 return Entry;
695}
696
697/* Ldr SEH-Protected access to IMAGE_NT_HEADERS */
698
699/* Rtl SEH-Free version of this */
701NTAPI
706 _Out_ PIMAGE_NT_HEADERS *OutHeaders);
707
708/*
709 * @implemented
710 * @note: This is here, so that we do not drag SEH into rosload, freeldr and bootmgfw
711 */
713NTAPI
718 _Out_ PIMAGE_NT_HEADERS *OutHeaders)
719{
721
722 /* Assume failure. This is also done in RtlpImageNtHeaderEx, but this is guarded by SEH. */
723 if (OutHeaders != NULL)
724 *OutHeaders = NULL;
725
727 {
728 Status = RtlpImageNtHeaderEx(Flags, Base, Size, OutHeaders);
729 }
731 {
732 /* Fail with the SEH error */
734 }
735 _SEH2_END;
736
737 return Status;
738}
739
740/*
741 * Ldr Resource support code
742 */
743
745 LPCWSTR name, void *root,
746 int want_dir );
748 USHORT id, void *root, int want_dir );
750 void *root, int want_dir );
751
752/**********************************************************************
753 * find_entry
754 *
755 * Find a resource entry
756 */
758 ULONG level, void **ret, int want_dir )
759{
760 ULONG size;
761 void *root;
762 IMAGE_RESOURCE_DIRECTORY *resdirptr;
763
766 if (size < sizeof(*resdirptr)) return STATUS_RESOURCE_DATA_NOT_FOUND;
767 resdirptr = root;
768
769 if (!level--) goto done;
770 if (!(*ret = find_entry_by_name( resdirptr, (LPCWSTR)info->Type, root, want_dir || level )))
772 if (!level--) return STATUS_SUCCESS;
773
774 resdirptr = *ret;
775 if (!(*ret = find_entry_by_name( resdirptr, (LPCWSTR)info->Name, root, want_dir || level )))
777 if (!level--) return STATUS_SUCCESS;
778 if (level) return STATUS_INVALID_PARAMETER; /* level > 3 */
779
780 resdirptr = *ret;
781
782 if ((*ret = find_first_entry( resdirptr, root, want_dir ))) return STATUS_SUCCESS;
783
785
786done:
787 *ret = resdirptr;
788 return STATUS_SUCCESS;
789}
790
792NTAPI
797{
799 {
801 }
803 {
805 }
806 _SEH2_END;
807
808 return STATUS_SUCCESS;
809}
810
812NTAPI
815{
816 /* In the kernel we don't have vectored exception handlers */
817 return FALSE;
818}
819
820VOID
821NTAPI
824{
825 /* No vectored continue handlers either in kernel mode */
826 return;
827}
828
829#ifdef _M_AMD64
830
832NTAPI
834 _In_ DWORD64 ControlPc,
835 _Out_ PDWORD64 ImageBase,
836 _In_ PUNWIND_HISTORY_TABLE HistoryTable)
837{
838 /* No support for dynamic function tables in the kernel */
839 return NULL;
840}
841
842#endif
843
844/* EOF */
SIZE_T MmHeapSegmentReserve
Definition: mminit.c:366
SIZE_T MmHeapDeCommitFreeBlockThreshold
Definition: mminit.c:369
SIZE_T MmHeapDeCommitTotalFreeThreshold
Definition: mminit.c:368
SIZE_T MmHeapSegmentCommit
Definition: mminit.c:367
unsigned char BOOLEAN
unsigned int dir
Definition: maze.c:112
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI RtlImageNtHeaderEx(_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
Definition: libsupp.c:32
NTSTATUS NTAPI RtlpImageNtHeaderEx(_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
Definition: image.c:140
NTSTATUS NTAPI RtlpSafeCopyMemory(_Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination, _In_reads_bytes_(Length) CONST VOID UNALIGNED *Source, _In_ SIZE_T Length)
Definition: libsupp.c:52
PVOID NTAPI RtlpAllocateMemory(ULONG Bytes, ULONG Tag)
Definition: libsupp.c:35
VOID NTAPI RtlpFreeMemory(PVOID Mem, ULONG Tag)
Definition: libsupp.c:44
PVOID MmHighestUserAddress
Definition: libsupp.c:23
struct _root root
#define UNALIGNED
Definition: crtdefs.h:144
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOLEAN NTAPI RtlpCheckForActiveDebugger(VOID)
Definition: libsupp.c:27
NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock)
Definition: libsupp.c:128
VOID NTAPI RtlpCheckLogException(IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN PVOID ContextData, IN ULONG Size)
Definition: libsupp.c:203
IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
Definition: res.c:95
PRTL_ATOM_TABLE_ENTRY RtlpAllocAtomTableEntry(ULONG Size)
Definition: libsupp.c:425
#define TAG_USTR
Definition: libsupp.c:997
NTSTATUS NTAPI RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
Definition: libsupp.c:110
VOID NTAPI RtlpClearInDbgPrint(VOID)
Definition: libsupp.c:47
IMAGE_RESOURCE_DIRECTORY * find_entry_by_name(IMAGE_RESOURCE_DIRECTORY *dir, LPCWSTR name, void *root, int want_dir)
Definition: res.c:130
BOOLEAN RtlpLockAtomTable(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:376
ULONG NTAPI RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags)
Definition: libsupp.c:229
KPROCESSOR_MODE NTAPI RtlpGetMode(VOID)
Definition: libsupp.c:55
BOOLEAN NTAPI RtlpSetInDbgPrint(VOID)
Definition: libsupp.c:35
BOOLEAN NTAPI RtlpHandleDpcStackException(IN PEXCEPTION_REGISTRATION_RECORD RegistrationFrame, IN ULONG_PTR RegistrationFrameEnd, IN OUT PULONG_PTR StackLow, IN OUT PULONG_PTR StackHigh)
Definition: libsupp.c:192
VOID NTAPI RtlpSetHeapParameters(IN PRTL_HEAP_PARAMETERS Parameters)
Definition: libsupp.c:176
BOOLEAN NTAPI RtlTryEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
Definition: libsupp.c:119
NTSTATUS NTAPI RtlDeleteHeapLock(IN OUT PHEAP_LOCK Lock)
Definition: libsupp.c:103
PVOID NTAPI RtlPcToFileHeader(IN PVOID PcValue, PVOID *BaseOfImage)
Definition: libsupp.c:658
VOID RtlpFreeAtomTable(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:417
VOID RtlpDestroyAtomHandleTable(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:403
BOOLEAN RtlpCreateAtomHandleTable(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:393
VOID RtlpUnlockAtomTable(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:384
NTSTATUS RtlpInitAtomTableLock(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:361
VOID RtlpDestroyAtomTableLock(PRTL_ATOM_TABLE AtomTable)
Definition: libsupp.c:369
VOID RtlpFreeAtomTableEntry(PRTL_ATOM_TABLE_ENTRY Entry)
Definition: libsupp.c:433
IMAGE_RESOURCE_DIRECTORY * find_first_entry(IMAGE_RESOURCE_DIRECTORY *dir, void *root, int want_dir)
Definition: res.c:75
NTSTATUS find_entry(PVOID BaseAddress, LDR_RESOURCE_INFO *info, ULONG level, void **ret, int want_dir)
Definition: libsupp.c:569
PRTL_ATOM_TABLE RtlpAllocAtomTable(ULONG Size)
Definition: libsupp.c:409
PRTL_ATOM_TABLE_ENTRY RtlpGetAtomEntry(PRTL_ATOM_TABLE AtomTable, ULONG Index)
Definition: libsupp.c:491
NTSTATUS NTAPI RtlLeaveHeapLock(IN OUT PHEAP_LOCK Lock)
Definition: libsupp.c:135
BOOLEAN RtlpCreateAtomHandle(PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
Definition: libsupp.c:455
VOID RtlpFreeAtomHandle(PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
Definition: libsupp.c:441
BOOLEAN NTAPI RtlpCaptureStackLimits(IN ULONG_PTR Ebp, IN ULONG_PTR *StackBegin, IN ULONG_PTR *StackEnd)
Definition: libsupp.c:213
SIZE_T RtlpAllocDeallocQueryBufferSize
Definition: libsupp.c:19
VOID NTAPI RtlpGetStackLimits(OUT PULONG_PTR LowLimit, OUT PULONG_PTR HighLimit)
Definition: libsupp.c:337
#define RtlImageDirectoryEntryToData
Definition: compat.h:809
#define ULONG_PTR
Definition: config.h:101
PRUNTIME_FUNCTION NTAPI RtlpLookupDynamicFunctionEntry(_In_ DWORD64 ControlPc, _Out_ PDWORD64 ImageBase, _In_ PUNWIND_HISTORY_TABLE HistoryTable)
Definition: dynfntbl.c:271
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define APC_LEVEL
Definition: env_spec_w32.h:695
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
#define ExDeleteResourceLite(res)
Definition: env_spec_w32.h:647
#define NonPagedPool
Definition: env_spec_w32.h:307
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define ExAcquireResourceSharedLite(res, wait)
Definition: env_spec_w32.h:621
#define PagedPool
Definition: env_spec_w32.h:308
@ Success
Definition: eventcreate.c:712
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
__in PWDFDEVICE_INIT __in BOOLEAN Exclusive
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:25
ASMGENDATA Table[]
Definition: genincdata.c:61
GLint level
Definition: gl.h:1546
GLsizeiptr size
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:23
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:31
#define DbgPrint
Definition: hal.h:12
#define KeGetCurrentThread
Definition: hal.h:55
BOOL WINAPI HeapLock(HANDLE hHeap)
Definition: heapmem.c:123
static XMS_HANDLE HandleTable[XMS_MAX_HANDLES]
Definition: himem.c:83
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define FLG_ENABLE_EXCEPTION_LOGGING
Definition: pstypes.h:82
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:84
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:74
NTSYSAPI PEB *WINAPI RtlGetCurrentPeb(void)
Definition: libsupp.c:65
NTSYSAPI void WINAPI LdrShutdownThread(void)
Definition: ldrinit.c:1082
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
if(dx< 0)
Definition: linetemp.h:194
VOID NTAPI ExInitializePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
Definition: lookas.c:270
_In_ UINT Bytes
Definition: mmcopy.h:9
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
unsigned __int64 ULONG64
Definition: imports.h:198
struct atom_table ** PRTL_ATOM_TABLE
Definition: atom.c:43
#define _In_reads_bytes_(size)
Definition: ms_sal.h:321
#define _Out_writes_bytes_all_(size)
Definition: ms_sal.h:362
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
#define KernelMode
Definition: asm.h:34
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1161
#define KeGetPcr()
Definition: ketypes.h:81
struct _FX_SAVE_AREA FX_SAVE_AREA
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3004
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2439
int Count
Definition: noreturn.cpp:7
#define FASTCALL
Definition: nt_native.h:50
_IRQL_requires_same_ _In_ PVOID _Inout_ struct _CONTEXT * ContextRecord
Definition: ntbasedef.h:654
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
VOID NTAPI ExSweepHandleTable(IN PHANDLE_TABLE HandleTable, IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure, IN PVOID Context)
Definition: handle.c:1232
HANDLE NTAPI ExCreateHandle(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
Definition: handle.c:827
PHANDLE_TABLE NTAPI ExCreateHandleTable(IN PEPROCESS Process OPTIONAL)
Definition: handle.c:801
BOOLEAN NTAPI ExDestroyHandle(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle, IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL)
Definition: handle.c:984
VOID NTAPI ExDestroyHandleTable(IN PHANDLE_TABLE HandleTable, IN PVOID DestroyHandleProcedure OPTIONAL)
Definition: handle.c:963
PHANDLE_TABLE_ENTRY NTAPI ExMapHandleToPointer(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle)
Definition: handle.c:1046
VOID NTAPI ExUnlockHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
Definition: handle.c:923
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
#define KeGetTrapFrame(Thread)
Definition: ke.h:208
PVOID NTAPI KiPcToFileHeader(IN PVOID Eip, OUT PLDR_DATA_TABLE_ENTRY *LdrEntry, IN BOOLEAN DriversOnly, OUT PBOOLEAN InKernel)
Definition: bug.c:44
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1765
VOID NTAPI RtlInitializeRangeListPackage(VOID)
Definition: libsupp.c:62
BOOLEAN NTAPI RtlpCloseHandleCallback(IN PHANDLE_TABLE_ENTRY HandleTableEntry, IN HANDLE Handle, IN PVOID HandleTable)
Definition: libsupp.c:564
ULONG NtGlobalFlag
Definition: init.c:54
VOID NTAPI RtlpAddHeapToProcessList(struct _HEAP *Heap)
Definition: libsupp.c:230
VOID NTAPI RtlCallVectoredContinueHandlers(_In_ PEXCEPTION_RECORD ExceptionRecord, _In_ PCONTEXT Context)
Definition: libsupp.c:822
BOOLEAN NTAPI RtlCallVectoredExceptionHandlers(_In_ PEXCEPTION_RECORD ExceptionRecord, _In_ PCONTEXT Context)
Definition: libsupp.c:813
struct _RTL_RANGE_ENTRY * PRTL_RANGE_ENTRY
VOID RtlInitializeHeapManager(VOID)
Definition: libsupp.c:243
struct _RTL_RANGE_ENTRY RTL_RANGE_ENTRY
PAGED_LOOKASIDE_LIST RtlpRangeListEntryLookasideList
Definition: libsupp.c:24
VOID NTAPI RtlpRemoveHeapFromProcessList(struct _HEAP *Heap)
Definition: libsupp.c:237
#define STATUS_RESOURCE_NAME_NOT_FOUND
Definition: ntstatus.h:375
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_RESOURCE_TYPE_NOT_FOUND
Definition: ntstatus.h:374
#define STATUS_RESOURCE_DATA_NOT_FOUND
Definition: ntstatus.h:373
#define CONST
Definition: pedump.c:81
unsigned short USHORT
Definition: pedump.c:61
#define IMAGE_DIRECTORY_ENTRY_RESOURCE
Definition: pedump.c:261
BOOLEAN NTAPI KeIsAttachedProcess(VOID)
Definition: procobj.c:693
KSPIN_LOCK PsLoadedModuleSpinLock
Definition: sysldr.c:23
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
#define KERNEL_STACK_SIZE
#define STATUS_SUCCESS
Definition: shellext.h:65
base of all file and directory entries
Definition: entries.h:83
KTHREAD Tcb
Definition: pstypes.h:1103
Definition: extypes.h:596
PVOID Object
Definition: extypes.h:599
ULONG GrantedAccess
Definition: extypes.h:606
Definition: heap.c:52
UCHAR DpcRoutineActive
Definition: ketypes.h:772
PVOID DpcStack
Definition: ketypes.h:761
PVOID InitialStack
Definition: ketypes.h:1664
PVOID Teb
Definition: ketypes.h:1807
volatile VOID * StackLimit
Definition: ketypes.h:1665
ULONG Gpr1
Definition: ketypes.h:111
ULONG Ebp
Definition: ketypes.h:319
Definition: btrfs_drv.h:1876
Definition: typedefs.h:120
PVOID StackLimit
Definition: compat.h:713
PVOID StackBase
Definition: compat.h:712
Definition: rtltypes.h:1672
Definition: libsupp.c:19
LIST_ENTRY Entry
Definition: libsupp.c:20
RTL_RANGE Range
Definition: libsupp.c:21
Definition: compat.h:836
NT_TIB NtTib
Definition: ntddk_ex.h:332
Definition: fci.c:127
Definition: parser.c:49
Definition: name.c:39
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx shrl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm0 paddd mm4 psrad mm0 psrad mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx andl ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm0 psrad mm0 packssdw mm0 movd eax movw edi esi edx esi movl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm1 paddd mm5 psrad mm1 psrad mm5 packssdw mm1 packssdw mm5 psubd mm0 psubd mm4 psubsw mm0 psubsw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi subl esi addl edx edi decl ecx jnz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm1 psrad mm1 packssdw mm1 psubd mm0 psubsw mm0 movd eax movw edi emms popl ebx popl esi popl edi mov ebp
Definition: synth_sse3d.h:266
#define TAG_RTHL
Definition: tag.h:144
#define TAG_OSTR
Definition: tag.h:147
#define TAG_ATMT
Definition: tag.h:143
#define TAG_ASTR
Definition: tag.h:146
uint64_t * PDWORD64
Definition: typedefs.h:67
uint32_t * PULONG_PTR
Definition: typedefs.h:65
uint64_t DWORD64
Definition: typedefs.h:67
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
int ret
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:127
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST
_Out_ PULONG_PTR HighLimit
Definition: iofuncs.h:2885
#define POOL_COLD_ALLOCATION
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
#define PAGE_ALIGN(Va)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175