ReactOS 0.4.16-dev-91-g764881a
libsupp.c File Reference
#include <ntdll.h>
#include <apisets.h>
#include <compat_undoc.h>
#include <debug.h>
Include dependency graph for libsupp.c:

Go to the source code of this file.

Classes

struct  _RTL_ATOM_HANDLE
 

Macros

#define NDEBUG
 
#define TAG_USTR   'RTSU'
 
#define RtlpAllocateStringMemory(Bytes, Tag)   RtlpAllocateMemory(Bytes, Tag)
 

Typedefs

typedef struct _RTL_ATOM_HANDLE RTL_ATOM_HANDLE
 
typedef struct _RTL_ATOM_HANDLEPRTL_ATOM_HANDLE
 

Functions

BOOLEAN NTAPI RtlpCheckForActiveDebugger (VOID)
 
BOOLEAN NTAPI RtlpSetInDbgPrint (VOID)
 
VOID NTAPI RtlpClearInDbgPrint (VOID)
 
KPROCESSOR_MODE NTAPI RtlpGetMode (VOID)
 
PPEB NTAPI RtlGetCurrentPeb (VOID)
 
VOID NTAPI RtlAcquirePebLock (VOID)
 
VOID NTAPI RtlReleasePebLock (VOID)
 
ULONG NTAPI RtlGetNtGlobalFlags (VOID)
 
NTSTATUS NTAPI RtlDeleteHeapLock (IN OUT PHEAP_LOCK Lock)
 
NTSTATUS NTAPI RtlEnterHeapLock (IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
 
BOOLEAN NTAPI RtlTryEnterHeapLock (IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
 
NTSTATUS NTAPI RtlInitializeHeapLock (IN OUT PHEAP_LOCK *Lock)
 
NTSTATUS NTAPI RtlLeaveHeapLock (IN OUT PHEAP_LOCK Lock)
 
PVOID NTAPI RtlpAllocateMemory (UINT Bytes, ULONG Tag)
 
VOID NTAPI RtlpFreeMemory (PVOID Mem, ULONG Tag)
 
VOID NTAPI RtlpSetHeapParameters (IN PRTL_HEAP_PARAMETERS Parameters)
 
BOOLEAN NTAPI RtlpHandleDpcStackException (IN PEXCEPTION_REGISTRATION_RECORD RegistrationFrame, IN ULONG_PTR RegistrationFrameEnd, IN OUT PULONG_PTR StackLow, IN OUT PULONG_PTR StackHigh)
 
VOID NTAPI RtlpCheckLogException (IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN PVOID ContextData, IN ULONG Size)
 
BOOLEAN NTAPI RtlpCaptureStackLimits (IN ULONG_PTR Ebp, IN ULONG_PTR *StackBegin, IN ULONG_PTR *StackEnd)
 
ULONG NTAPI RtlWalkFrameChain (OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags)
 
VOID NTAPI RtlpGetStackLimits (OUT PULONG_PTR LowLimit, OUT PULONG_PTR HighLimit)
 
BOOLEAN NTAPI RtlIsThreadWithinLoaderCallout (VOID)
 
NTSTATUS RtlpInitAtomTableLock (PRTL_ATOM_TABLE AtomTable)
 
VOID RtlpDestroyAtomTableLock (PRTL_ATOM_TABLE AtomTable)
 
BOOLEAN RtlpLockAtomTable (PRTL_ATOM_TABLE AtomTable)
 
VOID RtlpUnlockAtomTable (PRTL_ATOM_TABLE AtomTable)
 
BOOLEAN RtlpCreateAtomHandleTable (PRTL_ATOM_TABLE AtomTable)
 
VOID RtlpDestroyAtomHandleTable (PRTL_ATOM_TABLE AtomTable)
 
PRTL_ATOM_TABLE RtlpAllocAtomTable (ULONG Size)
 
VOID RtlpFreeAtomTable (PRTL_ATOM_TABLE AtomTable)
 
PRTL_ATOM_TABLE_ENTRY RtlpAllocAtomTableEntry (ULONG Size)
 
VOID RtlpFreeAtomTableEntry (PRTL_ATOM_TABLE_ENTRY Entry)
 
VOID RtlpFreeAtomHandle (PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
 
BOOLEAN RtlpCreateAtomHandle (PRTL_ATOM_TABLE AtomTable, PRTL_ATOM_TABLE_ENTRY Entry)
 
PRTL_ATOM_TABLE_ENTRY RtlpGetAtomEntry (PRTL_ATOM_TABLE AtomTable, ULONG Index)
 
NTSTATUS NTAPI RtlpImageNtHeaderEx (_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
 
NTSTATUS NTAPI RtlImageNtHeaderEx (_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
 
IMAGE_RESOURCE_DIRECTORYfind_entry_by_name (IMAGE_RESOURCE_DIRECTORY *dir, LPCWSTR name, void *root, int want_dir)
 
IMAGE_RESOURCE_DIRECTORYfind_entry_by_id (IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
 
IMAGE_RESOURCE_DIRECTORYfind_first_entry (IMAGE_RESOURCE_DIRECTORY *dir, void *root, int want_dir)
 
int push_language (USHORT *list, ULONG pos, WORD lang)
 
NTSTATUS find_entry (PVOID BaseAddress, LDR_RESOURCE_INFO *info, ULONG level, void **ret, int want_dir)
 
PVOID NTAPI RtlPcToFileHeader (IN PVOID PcValue, PVOID *BaseOfImage)
 
NTSTATUS get_buffer (LPWSTR *buffer, SIZE_T needed, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
 
NTSTATUS find_actctx_dll (PUNICODE_STRING pnameW, LPWSTR *fullname, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
 
NTSYSAPI NTSTATUS NTAPI RtlDosApplyFileIsolationRedirection_Ustr (IN ULONG Flags, IN PUNICODE_STRING OriginalName, IN PUNICODE_STRING Extension, IN OUT PUNICODE_STRING StaticString, IN OUT PUNICODE_STRING DynamicString, IN OUT PUNICODE_STRING *NewName, IN PULONG NewFlags, IN PSIZE_T FileNameSize, IN PSIZE_T RequiredLength)
 
static DWORD LdrpApisetVersion (VOID)
 
NTSYSAPI NTSTATUS NTAPI LdrpApplyFileNameRedirection (_In_ PUNICODE_STRING OriginalName, _In_ PUNICODE_STRING Extension, _Inout_opt_ PUNICODE_STRING StaticString, _Inout_opt_ PUNICODE_STRING DynamicString, _Inout_ PUNICODE_STRING *NewName, _Out_ PBOOLEAN RedirectedDll)
 
NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirection (IN BOOLEAN Wow64FsEnableRedirection)
 
NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirectionEx (IN PVOID Wow64FsEnableRedirection, OUT PVOID *OldFsRedirectionLevel)
 
NTSYSAPI NTSTATUS NTAPI RtlComputeImportTableHash (IN HANDLE FileHandle, OUT PCHAR Hash, IN ULONG ImportTableHashSize)
 
NTSTATUS NTAPI RtlpSafeCopyMemory (_Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination, _In_reads_bytes_(Length) CONST VOID UNALIGNED *Source, _In_ SIZE_T Length)
 
ULONG NTAPI RtlGetTickCount (VOID)
 

Variables

SIZE_T RtlpAllocDeallocQueryBufferSize = PAGE_SIZE
 
PTEB LdrpTopLevelDllBeingLoadedTeb = NULL
 
PVOID MmHighestUserAddress = (PVOID)MI_HIGHEST_USER_ADDRESS
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 16 of file libsupp.c.

◆ RtlpAllocateStringMemory

#define RtlpAllocateStringMemory (   Bytes,
  Tag 
)    RtlpAllocateMemory(Bytes, Tag)

Definition at line 1000 of file libsupp.c.

◆ TAG_USTR

#define TAG_USTR   'RTSU'

Definition at line 997 of file libsupp.c.

Typedef Documentation

◆ PRTL_ATOM_HANDLE

◆ RTL_ATOM_HANDLE

Function Documentation

◆ find_actctx_dll()

NTSTATUS find_actctx_dll ( PUNICODE_STRING  pnameW,
LPWSTR fullname,
PUNICODE_STRING  CallerBuffer,
BOOLEAN  bAllocateBuffer 
)

Definition at line 714 of file libsupp.c.

715{
716 static const WCHAR winsxsW[] = {'\\','w','i','n','s','x','s','\\'};
717 static const WCHAR dotManifestW[] = {'.','m','a','n','i','f','e','s','t',0};
718
719 ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *info;
720 ACTCTX_SECTION_KEYED_DATA data;
722 SIZE_T needed, size = 1024;
723 WCHAR *p;
724
725 data.cbSize = sizeof(data);
726 status = RtlFindActivationContextSectionString( FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
727 ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
728 pnameW, &data );
729 if (status != STATUS_SUCCESS)
730 {
731 //DPRINT1("RtlFindActivationContextSectionString returned 0x%x for %wZ\n", status, pnameW);
732 return status;
733 }
734
735 for (;;)
736 {
737 if (!(info = RtlAllocateHeap( RtlGetProcessHeap(), 0, size )))
738 {
740 goto done;
741 }
742 status = RtlQueryInformationActivationContext( 0, data.hActCtx, &data.ulAssemblyRosterIndex,
743 AssemblyDetailedInformationInActivationContext,
744 info, size, &needed );
745 if (status == STATUS_SUCCESS) break;
746 if (status != STATUS_BUFFER_TOO_SMALL) goto done;
747 RtlFreeHeap( RtlGetProcessHeap(), 0, info );
748 size = needed;
749 }
750
751 DPRINT("manifestpath === %S\n", info->lpAssemblyManifestPath);
752 DPRINT("DirectoryName === %S\n", info->lpAssemblyDirectoryName);
753 if (!info->lpAssemblyManifestPath /*|| !info->lpAssemblyDirectoryName*/)
754 {
756 goto done;
757 }
758
759 if ((p = wcsrchr( info->lpAssemblyManifestPath, '\\' )))
760 {
761 DWORD dirlen = info->ulAssemblyDirectoryNameLength / sizeof(WCHAR);
762
763 p++;
764 if (!info->lpAssemblyDirectoryName || _wcsnicmp( p, info->lpAssemblyDirectoryName, dirlen ) || wcsicmp( p + dirlen, dotManifestW ))
765 {
766 /* manifest name does not match directory name, so it's not a global
767 * windows/winsxs manifest; use the manifest directory name instead */
768 dirlen = p - info->lpAssemblyManifestPath;
769 needed = (dirlen + 1) * sizeof(WCHAR) + pnameW->Length;
770
771 status = get_buffer(fullname, needed, CallerBuffer, bAllocateBuffer);
772 if (!NT_SUCCESS(status))
773 goto done;
774
775 p = *fullname;
776
777 memcpy( p, info->lpAssemblyManifestPath, dirlen * sizeof(WCHAR) );
778 p += dirlen;
779 memcpy( p, pnameW->Buffer, pnameW->Length);
780 p += (pnameW->Length / sizeof(WCHAR));
781 *p = L'\0';
782
783 goto done;
784 }
785 }
786
787 needed = (wcslen(SharedUserData->NtSystemRoot) * sizeof(WCHAR) +
788 sizeof(winsxsW) + info->ulAssemblyDirectoryNameLength + pnameW->Length + 2*sizeof(WCHAR));
789
790 status = get_buffer(fullname, needed, CallerBuffer, bAllocateBuffer);
791 if (!NT_SUCCESS(status))
792 goto done;
793
794 p = *fullname;
795
796 wcscpy( p, SharedUserData->NtSystemRoot );
797 p += wcslen(p);
798 memcpy( p, winsxsW, sizeof(winsxsW) );
799 p += sizeof(winsxsW) / sizeof(WCHAR);
800 memcpy( p, info->lpAssemblyDirectoryName, info->ulAssemblyDirectoryNameLength );
801 p += info->ulAssemblyDirectoryNameLength / sizeof(WCHAR);
802 *p++ = L'\\';
803 memcpy( p, pnameW->Buffer, pnameW->Length);
804 p += (pnameW->Length / sizeof(WCHAR));
805 *p = L'\0';
806
807done:
808 RtlFreeHeap( RtlGetProcessHeap(), 0, info );
810 DPRINT("%S\n", fullname);
811 return status;
812}
LONG NTSTATUS
Definition: precomp.h:26
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:608
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS get_buffer(LPWSTR *buffer, SIZE_T needed, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
Definition: libsupp.c:687
#define wcsrchr
Definition: compat.h:16
#define wcsicmp
Definition: compat.h:15
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
NTSYSAPI NTSTATUS WINAPI RtlFindActivationContextSectionString(ULONG, const GUID *, ULONG, const UNICODE_STRING *, PVOID)
Definition: actctx.c:5907
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
Definition: actctx.c:5415
NTSYSAPI NTSTATUS WINAPI RtlQueryInformationActivationContext(ULONG, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T *)
Definition: actctx.c:5605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const char * fullname
Definition: shader.c:1766
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_SXS_KEY_NOT_FOUND
Definition: ntstatus.h:1389
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define SharedUserData
static const WCHAR dotManifestW[]
Definition: actctx.c:826
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:73
Definition: ps.c:97
ULONG_PTR SIZE_T
Definition: typedefs.h:80
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by RtlDosApplyFileIsolationRedirection_Ustr().

◆ find_entry()

NTSTATUS find_entry ( PVOID  BaseAddress,
LDR_RESOURCE_INFO info,
ULONG  level,
void **  ret,
int  want_dir 
)

Definition at line 569 of file libsupp.c.

571{
572 ULONG size;
573 void *root;
574 IMAGE_RESOURCE_DIRECTORY *resdirptr;
575 USHORT list[9]; /* list of languages to try */
576 int i, pos = 0;
577 LCID user_lcid, system_lcid;
578
581 if (size < sizeof(*resdirptr)) return STATUS_RESOURCE_DATA_NOT_FOUND;
582 resdirptr = root;
583
584 if (!level--) goto done;
585 if (!(*ret = find_entry_by_name( resdirptr, (LPCWSTR)info->Type, root, want_dir || level )))
587 if (!level--) return STATUS_SUCCESS;
588
589 resdirptr = *ret;
590 if (!(*ret = find_entry_by_name( resdirptr, (LPCWSTR)info->Name, root, want_dir || level )))
592 if (!level--) return STATUS_SUCCESS;
593 if (level) return STATUS_INVALID_PARAMETER; /* level > 3 */
594
595 /* 1. specified language */
596 pos = push_language( list, pos, info->Language );
597
598 /* 2. specified language with neutral sublanguage */
600
601 /* 3. neutral language with neutral sublanguage */
603
604 /* if no explicitly specified language, try some defaults */
605 if (PRIMARYLANGID(info->Language) == LANG_NEUTRAL)
606 {
607 /* user defaults, unless SYS_DEFAULT sublanguage specified */
608 if (SUBLANGID(info->Language) != SUBLANG_SYS_DEFAULT)
609 {
610 /* 4. current thread locale language */
611 pos = push_language( list, pos, LANGIDFROMLCID(NtCurrentTeb()->CurrentLocale) );
612
613 if (NT_SUCCESS(NtQueryDefaultLocale(TRUE, &user_lcid)))
614 {
615 /* 5. user locale language */
616 pos = push_language( list, pos, LANGIDFROMLCID(user_lcid) );
617
618 /* 6. user locale language with neutral sublanguage */
620 }
621 }
622
623 /* now system defaults */
624
625 if (NT_SUCCESS(NtQueryDefaultLocale(FALSE, &system_lcid)))
626 {
627 /* 7. system locale language */
628 pos = push_language( list, pos, LANGIDFROMLCID( system_lcid ) );
629
630 /* 8. system locale language with neutral sublanguage */
632 }
633
634 /* 9. English */
636 }
637
638 resdirptr = *ret;
639 for (i = 0; i < pos; i++)
640 if ((*ret = find_entry_by_id( resdirptr, list[i], root, want_dir ))) return STATUS_SUCCESS;
641
642 /* if no explicitly specified language, return the first entry */
643 if (PRIMARYLANGID(info->Language) == LANG_NEUTRAL)
644 {
645 if ((*ret = find_first_entry( resdirptr, root, want_dir ))) return STATUS_SUCCESS;
646 }
648
649done:
650 *ret = resdirptr;
651 return STATUS_SUCCESS;
652}
struct _root root
Definition: list.h:37
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
Definition: res.c:95
IMAGE_RESOURCE_DIRECTORY * find_entry_by_name(IMAGE_RESOURCE_DIRECTORY *dir, LPCWSTR name, void *root, int want_dir)
Definition: res.c:130
int push_language(USHORT *list, ULONG pos, WORD lang)
Definition: res.c:61
IMAGE_RESOURCE_DIRECTORY * find_first_entry(IMAGE_RESOURCE_DIRECTORY *dir, void *root, int want_dir)
Definition: res.c:75
#define RtlImageDirectoryEntryToData
Definition: compat.h:809
GLint level
Definition: gl.h:1546
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
#define NtCurrentTeb
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
NTSTATUS NTAPI NtQueryDefaultLocale(IN BOOLEAN UserProfile, OUT PLCID DefaultLocaleId)
Definition: locale.c:396
#define STATUS_RESOURCE_LANG_NOT_FOUND
Definition: ntstatus.h:648
#define STATUS_RESOURCE_NAME_NOT_FOUND
Definition: ntstatus.h:375
#define STATUS_RESOURCE_TYPE_NOT_FOUND
Definition: ntstatus.h:374
#define STATUS_RESOURCE_DATA_NOT_FOUND
Definition: ntstatus.h:373
unsigned short USHORT
Definition: pedump.c:61
#define IMAGE_DIRECTORY_ENTRY_RESOURCE
Definition: pedump.c:261
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANGID(l)
Definition: nls.h:17
#define LANG_ENGLISH
Definition: nls.h:52
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define SUBLANG_NEUTRAL
Definition: nls.h:167
#define SUBLANG_DEFAULT
Definition: nls.h:168
DWORD LCID
Definition: nls.h:13
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define SUBLANG_SYS_DEFAULT
Definition: nls.h:169
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
int ret
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ find_entry_by_id()

IMAGE_RESOURCE_DIRECTORY * find_entry_by_id ( IMAGE_RESOURCE_DIRECTORY dir,
WORD  id,
void root,
int  want_dir 
)

Definition at line 95 of file res.c.

97{
99 int min, max, pos;
100
102 min = dir->NumberOfNamedEntries;
103 max = min + dir->NumberOfIdEntries - 1;
104 while (min <= max)
105 {
106 pos = (min + max) / 2;
107 if (entry[pos].Id == id)
108 {
109 if (!entry[pos].DataIsDirectory == !want_dir)
110 {
111 DPRINT("root %p dir %p id %04x ret %p\n",
112 root, dir, id, (const char*)root + entry[pos].OffsetToDirectory);
113 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
114 }
115 break;
116 }
117 if (entry[pos].Id > id) max = pos - 1;
118 else min = pos + 1;
119 }
120 DPRINT("root %p dir %p id %04x not found\n", root, dir, id );
121 return NULL;
122}
DWORD Id
unsigned int dir
Definition: maze.c:112
uint32_t entry
Definition: isohybrid.c:63
#define min(a, b)
Definition: monoChain.cc:55
Definition: pedump.c:414
#define max(a, b)
Definition: svc.c:63

Referenced by find_entry().

◆ find_entry_by_name()

IMAGE_RESOURCE_DIRECTORY * find_entry_by_name ( IMAGE_RESOURCE_DIRECTORY dir,
LPCWSTR  name,
void root,
int  want_dir 
)

Definition at line 130 of file res.c.

133{
136 int min, max, res, pos;
137 size_t namelen;
138
139 if (!((ULONG_PTR)name & 0xFFFF0000)) return find_entry_by_id( dir, (ULONG_PTR)name & 0xFFFF, root, want_dir );
142 min = 0;
143 max = dir->NumberOfNamedEntries - 1;
144 while (min <= max)
145 {
146 pos = (min + max) / 2;
147 str = (const IMAGE_RESOURCE_DIR_STRING_U *)((const char *)root + entry[pos].NameOffset);
148 res = _wcsnicmp( name, str->NameString, str->Length );
149 if (!res && namelen == str->Length)
150 {
151 if (!entry[pos].DataIsDirectory == !want_dir)
152 {
153 DPRINT("root %p dir %p name %ws ret %p\n",
154 root, dir, name, (const char*)root + entry[pos].OffsetToDirectory);
155 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
156 }
157 break;
158 }
159 if (res < 0) max = pos - 1;
160 else min = pos + 1;
161 }
162 DPRINT("root %p dir %p name %ws not found\n", root, dir, name);
163 return NULL;
164}
GLuint res
Definition: glext.h:9613
GLint namelen
Definition: glext.h:7232
const WCHAR * str
IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
Definition: res.c:95
Definition: name.c:39
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by find_entry().

◆ find_first_entry()

IMAGE_RESOURCE_DIRECTORY * find_first_entry ( IMAGE_RESOURCE_DIRECTORY dir,
void root,
int  want_dir 
)

Definition at line 75 of file res.c.

77{
79 int pos;
80
81 for (pos = 0; pos < dir->NumberOfNamedEntries + dir->NumberOfIdEntries; pos++)
82 {
83 if (!entry[pos].DataIsDirectory == !want_dir)
84 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
85 }
86 return NULL;
87}

Referenced by find_entry().

◆ get_buffer()

NTSTATUS get_buffer ( LPWSTR buffer,
SIZE_T  needed,
PUNICODE_STRING  CallerBuffer,
BOOLEAN  bAllocateBuffer 
)

Definition at line 687 of file libsupp.c.

688{
689 WCHAR *p;
690
691 if (CallerBuffer && CallerBuffer->MaximumLength > needed)
692 {
693 p = CallerBuffer->Buffer;
694 CallerBuffer->Length = needed - sizeof(WCHAR);
695 }
696 else
697 {
698 if (!bAllocateBuffer)
700
701 if (CallerBuffer)
702 CallerBuffer->Buffer[0] = 0;
703
704 p = RtlAllocateHeap(RtlGetProcessHeap(), 0, needed );
705 if (!p)
706 return STATUS_NO_MEMORY;
707 }
708 *buffer = p;
709
710 return STATUS_SUCCESS;
711}
GLuint buffer
Definition: glext.h:5915
USHORT MaximumLength
Definition: env_spec_w32.h:370

Referenced by find_actctx_dll(), jpeg_fill_bit_buffer(), jpeg_huff_decode(), and RtlDosApplyFileIsolationRedirection_Ustr().

◆ LdrpApisetVersion()

static DWORD LdrpApisetVersion ( VOID  )
static

Definition at line 1004 of file libsupp.c.

1005{
1006 static DWORD CachedApisetVersion = ~0u;
1007
1008 if (CachedApisetVersion == ~0u)
1009 {
1010 DWORD CompatVersion = RosGetProcessCompatVersion();
1011
1012 switch (CompatVersion)
1013 {
1014 case 0:
1015 break;
1016 case _WIN32_WINNT_VISTA:
1017 /* No apisets in vista yet*/
1018 CachedApisetVersion = 0;
1019 break;
1020 case _WIN32_WINNT_WIN7:
1021 CachedApisetVersion = APISET_WIN7;
1022 DPRINT1("Activating apisets for Win7\n");
1023 break;
1024 case _WIN32_WINNT_WIN8:
1025 CachedApisetVersion = APISET_WIN8;
1026 DPRINT1("Activating apisets for Win8\n");
1027 break;
1029 CachedApisetVersion = APISET_WIN81;
1030 DPRINT1("Activating apisets for Win8.1\n");
1031 break;
1032 case _WIN32_WINNT_WIN10:
1033 CachedApisetVersion = APISET_WIN10;
1034 DPRINT1("Activating apisets for Win10\n");
1035 break;
1036 default:
1037 DPRINT1("Unknown version 0x%x\n", CompatVersion);
1038 CachedApisetVersion = 0;
1039 break;
1040 }
1041 }
1042
1043 return CachedApisetVersion;
1044}
#define APISET_WIN7
Definition: apisets.h:16
#define APISET_WIN8
Definition: apisets.h:17
#define APISET_WIN81
Definition: apisets.h:18
#define APISET_WIN10
Definition: apisets.h:19
#define DPRINT1
Definition: precomp.h:8
static DWORD RosGetProcessCompatVersion(VOID)
Definition: compat_undoc.h:22
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 * u
Definition: glfuncs.h:240
#define _WIN32_WINNT_WIN10
Definition: sdkddkver.h:32
#define _WIN32_WINNT_WINBLUE
Definition: sdkddkver.h:30
#define _WIN32_WINNT_WIN8
Definition: sdkddkver.h:29
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25

Referenced by LdrpApplyFileNameRedirection().

◆ LdrpApplyFileNameRedirection()

NTSYSAPI NTSTATUS NTAPI LdrpApplyFileNameRedirection ( _In_ PUNICODE_STRING  OriginalName,
_In_ PUNICODE_STRING  Extension,
_Inout_opt_ PUNICODE_STRING  StaticString,
_Inout_opt_ PUNICODE_STRING  DynamicString,
_Inout_ PUNICODE_STRING NewName,
_Out_ PBOOLEAN  RedirectedDll 
)

Definition at line 1049 of file libsupp.c.

1056{
1057
1058 /* Check for invalid parameters */
1059 if (!OriginalName)
1060 {
1062 }
1063
1064 if (!DynamicString && !StaticString)
1065 {
1067 }
1068
1069 if (!NewName)
1070 {
1072 }
1073
1074 *RedirectedDll = FALSE;
1075
1076 PCUNICODE_STRING PrevNewName = *NewName;
1077 UNICODE_STRING ApisetName = {0};
1079
1080 DWORD ApisetVersion = LdrpApisetVersion();
1081 if (ApisetVersion)
1082 {
1083 Status = ApiSetResolveToHost(ApisetVersion, OriginalName, RedirectedDll, &ApisetName);
1084 if (!NT_SUCCESS(Status))
1085 {
1086 DPRINT1("ApiSetResolveToHost FAILED: (Status 0x%x)\n", Status);
1087 return Status;
1088 }
1089 }
1090
1091 if (*RedirectedDll)
1092 {
1094 static const UNICODE_STRING System32 = RTL_CONSTANT_STRING(L"\\System32\\");
1095 PUNICODE_STRING ResultPath = NULL;
1096
1097 /* This is an apiset we can use */
1099
1100 SIZE_T Needed = System32.Length + ApisetName.Length + NtSystemRoot.Length + sizeof(UNICODE_NULL);
1101
1102 if (StaticString && StaticString->MaximumLength >= (USHORT)Needed)
1103 {
1104 StaticString->Length = 0;
1105 ResultPath = StaticString;
1106 }
1107 else if (DynamicString)
1108 {
1110 if (DynamicString->Buffer == NULL)
1111 {
1112 DPRINT1("LdrpApplyFileNameRedirection out of memory\n");
1113 return STATUS_NO_MEMORY;
1114 }
1116 DynamicString->Length = 0;
1117
1118 ResultPath = DynamicString;
1119 }
1120 else
1121 {
1122 DPRINT1("ERROR: LdrpApplyFileNameRedirection no inputbuffer valid\n");
1124 }
1125
1127 RtlAppendUnicodeStringToString(ResultPath, &System32);
1128 RtlAppendUnicodeStringToString(ResultPath, &ApisetName);
1129 DPRINT1("ApiSetResolveToHost redirected %wZ to %wZ\n", OriginalName, ResultPath);
1130 *NewName = ResultPath;
1131 }
1132 else
1133 {
1134 /* Check if the SxS Assemblies specify another file */
1135 Status = RtlDosApplyFileIsolationRedirection_Ustr(RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL, OriginalName, Extension, StaticString, DynamicString, NewName, NULL, NULL, NULL);
1136
1137 /* Check success */
1138 if (NT_SUCCESS(Status))
1139 {
1140 /* Let Ldrp know */
1141 *RedirectedDll = TRUE;
1142 }
1143 else if (Status == STATUS_SXS_KEY_NOT_FOUND)
1144 {
1145 ASSERT(*NewName == PrevNewName);
1147 }
1148 else
1149 {
1150 /* Unrecoverable SxS failure; did we get a string? */
1153 return Status;
1154 }
1155 }
1156
1157 return Status;
1158}
IN PUNICODE_STRING StaticString
IN PUNICODE_STRING IN PUNICODE_STRING DynamicString
#define TAG_USTR
Definition: libsupp.c:997
static DWORD LdrpApisetVersion(VOID)
Definition: libsupp.c:1004
#define RtlpAllocateStringMemory(Bytes, Tag)
Definition: libsupp.c:1000
NTSYSAPI NTSTATUS NTAPI RtlDosApplyFileIsolationRedirection_Ustr(IN ULONG Flags, IN PUNICODE_STRING OriginalName, IN PUNICODE_STRING Extension, IN OUT PUNICODE_STRING StaticString, IN OUT PUNICODE_STRING DynamicString, IN OUT PUNICODE_STRING *NewName, IN PULONG NewFlags, IN PSIZE_T FileNameSize, IN PSIZE_T RequiredLength)
Definition: libsupp.c:820
_Inout_opt_ PUNICODE_STRING Extension
Definition: fltkernel.h:1092
Status
Definition: gdiplustypes.h:25
#define ASSERT(a)
Definition: mode.c:44
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define UNICODE_NULL
UNICODE_STRING NtSystemRoot
Definition: init.c:76
NTSTATUS ApiSetResolveToHost(_In_ DWORD ApisetVersion, _In_ PCUNICODE_STRING ApiToResolve, _Out_ PBOOLEAN Resolved, _Out_ PUNICODE_STRING Output)
Definition: apisets.c:32
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
_In_ PUNICODE_STRING NewName
Definition: zwfuncs.h:1203

◆ push_language()

int push_language ( USHORT list,
ULONG  pos,
WORD  lang 
)

Definition at line 61 of file res.c.

62{
63 ULONG i;
64 for (i = 0; i < pos; i++) if (list[i] == lang) return pos;
65 list[pos++] = lang;
66 return pos;
67}
static const WCHAR lang[]
Definition: wbemdisp.c:287

Referenced by find_entry().

◆ RtlAcquirePebLock()

VOID NTAPI RtlAcquirePebLock ( VOID  )

Definition at line 74 of file libsupp.c.

75{
78}
#define NtCurrentPeb()
Definition: FLS.c:22
PPEB Peb
Definition: dllmain.c:27
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
PVOID FastPebLock
Definition: ntddk_ex.h:250

◆ RtlComputeImportTableHash()

NTSYSAPI NTSTATUS NTAPI RtlComputeImportTableHash ( IN HANDLE  FileHandle,
OUT PCHAR  Hash,
IN ULONG  ImportTableHashSize 
)

Definition at line 1191 of file libsupp.c.

1194{
1197}
#define UNIMPLEMENTED
Definition: debug.h:118
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239

Referenced by BasepCheckWebBladeHashes().

◆ RtlDeleteHeapLock()

NTSTATUS NTAPI RtlDeleteHeapLock ( IN OUT PHEAP_LOCK  Lock)

Definition at line 103 of file libsupp.c.

104{
105 return RtlDeleteCriticalSection(&Lock->CriticalSection);
106}
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:127

Referenced by RtlDestroyHeap(), and RtlpPageHeapDestroy().

◆ RtlDosApplyFileIsolationRedirection_Ustr()

NTSYSAPI NTSTATUS NTAPI RtlDosApplyFileIsolationRedirection_Ustr ( IN ULONG  Flags,
IN PUNICODE_STRING  OriginalName,
IN PUNICODE_STRING  Extension,
IN OUT PUNICODE_STRING  StaticString,
IN OUT PUNICODE_STRING  DynamicString,
IN OUT PUNICODE_STRING NewName,
IN PULONG  NewFlags,
IN PSIZE_T  FileNameSize,
IN PSIZE_T  RequiredLength 
)

Definition at line 820 of file libsupp.c.

829{
833 UNICODE_STRING localStr, localStr2, *pstrParam;
834 WCHAR *p;
835 BOOLEAN GotExtension;
836 WCHAR c;
837 C_ASSERT(sizeof(UNICODE_NULL) == sizeof(WCHAR));
838
839
840 /* Check for invalid parameters */
841 if (!OriginalName)
842 {
844 }
845
847 {
849 }
850
851 if ((DynamicString) && (StaticString) && !(NewName))
852 {
854 }
855
856 if (!OriginalName->Buffer || OriginalName->Length == 0)
857 {
859 }
860
861 if (StaticString && (OriginalName == StaticString || OriginalName->Buffer == StaticString->Buffer))
862 {
864 }
865
866 if ((Flags & RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL) &&
867 NtCurrentPeb()->ProcessParameters &&
868 (NtCurrentPeb()->ProcessParameters->Flags & RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH))
869 {
870 UNICODE_STRING RealName, LocalName;
871 WCHAR RealNameBuf[MAX_PATH], LocalNameBuf[MAX_PATH];
872
873 RtlInitEmptyUnicodeString(&RealName, RealNameBuf, sizeof(RealNameBuf));
874 RtlInitEmptyUnicodeString(&LocalName, LocalNameBuf, sizeof(LocalNameBuf));
875
876 Status = RtlComputePrivatizedDllName_U(OriginalName, &RealName, &LocalName);
877 if (!NT_SUCCESS(Status))
878 {
879 DPRINT1("RtlComputePrivatizedDllName_U failed for %wZ: 0x%lx\n", OriginalName, Status);
880 return Status;
881 }
882
883 if (RtlDoesFileExists_UStr(&LocalName))
884 {
886 if (NT_SUCCESS(Status))
887 {
888 RtlCopyMemory(fullname, LocalName.Buffer, LocalName.Length + sizeof(UNICODE_NULL));
889 }
890 else
891 {
892 DPRINT1("Error while retrieving buffer for %wZ: 0x%lx\n", OriginalName, Status);
893 }
894 }
895 else if (RtlDoesFileExists_UStr(&RealName))
896 {
898 if (NT_SUCCESS(Status))
899 {
900 RtlCopyMemory(fullname, RealName.Buffer, RealName.Length + sizeof(UNICODE_NULL));
901 }
902 else
903 {
904 DPRINT1("Error while retrieving buffer for %wZ: 0x%lx\n", OriginalName, Status);
905 }
906 }
907 else
908 {
910 }
911
912 if (RealName.Buffer != RealNameBuf)
913 RtlFreeUnicodeString(&RealName);
914 if (LocalName.Buffer != LocalNameBuf)
915 RtlFreeUnicodeString(&LocalName);
916
917 if (NT_SUCCESS(Status))
918 {
919 DPRINT("Redirecting %wZ to %S\n", OriginalName, fullname);
921 {
924 }
925 else
926 {
928 }
929 return Status;
930 }
931 }
932
933 pstrParam = OriginalName;
934
935 /* Get the file name with an extension */
936 p = OriginalName->Buffer + OriginalName->Length / sizeof(WCHAR) - 1;
937 GotExtension = FALSE;
938 while (p >= OriginalName->Buffer)
939 {
940 c = *p--;
941 if (c == L'.')
942 {
943 GotExtension = TRUE;
944 }
945 else if (c == L'\\')
946 {
947 localStr.Buffer = p + 2;
948 localStr.Length = OriginalName->Length - ((ULONG_PTR)localStr.Buffer - (ULONG_PTR)OriginalName->Buffer);
949 localStr.MaximumLength = OriginalName->MaximumLength - ((ULONG_PTR)localStr.Buffer - (ULONG_PTR)OriginalName->Buffer);
950 pstrParam = &localStr;
951 break;
952 }
953 }
954
955 if (!GotExtension)
956 {
957 if (!Extension)
958 {
960 }
961
962 if (pstrParam->Length + Extension->Length > sizeof(buffer))
963 {
964 //FIXME!
965 return STATUS_NO_MEMORY;
966 }
967
968 RtlInitEmptyUnicodeString(&localStr2, buffer, sizeof(buffer));
969 RtlAppendUnicodeStringToString(&localStr2, pstrParam);
971 pstrParam = &localStr2;
972 }
973
974 /* Use wine's function as long as we use wine's sxs implementation in ntdll */
976 if (!NT_SUCCESS(Status))
977 {
978 return Status;
979 }
980
981 DPRINT("Redirecting %wZ to %S\n", OriginalName, fullname);
982
984 {
987 }
988 else
989 {
991 }
992
993 return Status;
994}
unsigned char BOOLEAN
NTSTATUS find_actctx_dll(PUNICODE_STRING pnameW, LPWSTR *fullname, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
Definition: libsupp.c:714
#define MAX_PATH
Definition: compat.h:34
#define ULONG_PTR
Definition: config.h:101
const GLubyte * c
Definition: glext.h:8905
#define C_ASSERT(e)
Definition: intsafe.h:73
#define c
Definition: ke_i.h:80
NTSYSAPI NTSTATUS NTAPI RtlComputePrivatizedDllName_U(_In_ PUNICODE_STRING DllName, _Inout_ PUNICODE_STRING RealName, _Inout_ PUNICODE_STRING LocalName)
Definition: path.c:586
#define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH
Definition: rtltypes.h:52
BOOLEAN NTAPI RtlDoesFileExists_UStr(IN PUNICODE_STRING FileName)
Definition: path.c:1503
#define STATUS_NOT_FOUND
Definition: shellext.h:72
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by LdrpApplyFileNameRedirection(), RtlDosSearchPath_Ustr(), TestBuffers(), and TestRedirection().

◆ RtlEnterHeapLock()

◆ RtlGetCurrentPeb()

PPEB NTAPI RtlGetCurrentPeb ( VOID  )

Definition at line 65 of file libsupp.c.

66{
67 return NtCurrentPeb();
68}

◆ RtlGetNtGlobalFlags()

ULONG NTAPI RtlGetNtGlobalFlags ( VOID  )

Definition at line 95 of file libsupp.c.

96{
97 PPEB pPeb = NtCurrentPeb();
98 return pPeb->NtGlobalFlag;
99}
ULONG NtGlobalFlag
Definition: ntddk_ex.h:270

◆ RtlGetTickCount()

ULONG NTAPI RtlGetTickCount ( VOID  )

Definition at line 1222 of file libsupp.c.

1223{
1224 ULARGE_INTEGER TickCount;
1225
1226#ifdef _WIN64
1227 TickCount.QuadPart = *((volatile ULONG64*)&SharedUserData->TickCount);
1228#else
1229 while (TRUE)
1230 {
1231 TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time;
1232 TickCount.LowPart = SharedUserData->TickCount.LowPart;
1233
1234 if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time)
1235 break;
1236
1238 }
1239#endif
1240
1241 return (ULONG)((UInt32x32To64(TickCount.LowPart,
1242 SharedUserData->TickCountMultiplier) >> 24) +
1243 UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF,
1244 SharedUserData->TickCountMultiplier));
1245}
#define UInt32x32To64(a, b)
Definition: intsafe.h:252
if(dx< 0)
Definition: linetemp.h:194
unsigned __int64 ULONG64
Definition: imports.h:198
#define YieldProcessor
Definition: ke.h:48
$ULONG LowPart
Definition: ntbasedef.h:569
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:570

◆ RtlImageNtHeaderEx()

NTSTATUS NTAPI RtlImageNtHeaderEx ( _In_ ULONG  Flags,
_In_ PVOID  Base,
_In_ ULONG64  Size,
_Out_ PIMAGE_NT_HEADERS OutHeaders 
)

Definition at line 525 of file libsupp.c.

530{
532
533 /* Assume failure. This is also done in RtlpImageNtHeaderEx, but this is guarded by SEH. */
534 if (OutHeaders != NULL)
535 *OutHeaders = NULL;
536
538 {
539 Status = RtlpImageNtHeaderEx(Flags, Base, Size, OutHeaders);
540 }
542 {
543 /* Fail with the SEH error */
545 }
546 _SEH2_END;
547
548 return Status;
549}
NTSTATUS NTAPI RtlpImageNtHeaderEx(_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
Definition: image.c:140
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2451
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

◆ RtlInitializeHeapLock()

NTSTATUS NTAPI RtlInitializeHeapLock ( IN OUT PHEAP_LOCK Lock)

Definition at line 128 of file libsupp.c.

129{
130 return RtlInitializeCriticalSection(&(*Lock)->CriticalSection);
131}
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

Referenced by RtlpDphInitializeDelayedFreeQueue(), RtlpDphProcessStartupInitialization(), RtlpInitializeHeap(), and RtlpPageHeapCreate().

◆ RtlIsThreadWithinLoaderCallout()

BOOLEAN NTAPI RtlIsThreadWithinLoaderCallout ( VOID  )

Definition at line 347 of file libsupp.c.

348{
350}
PTEB LdrpTopLevelDllBeingLoadedTeb
Definition: libsupp.c:20

Referenced by CtfImmTIMActivate(), ForceResetUserApiHook(), and LoadUserApiHook().

◆ RtlLeaveHeapLock()

◆ RtlpAllocateMemory()

PVOID NTAPI RtlpAllocateMemory ( UINT  Bytes,
ULONG  Tag 
)

Definition at line 142 of file libsupp.c.

144{
146
147 return RtlAllocateHeap(RtlGetProcessHeap(),
148 0,
149 Bytes);
150}
_In_ UINT Bytes
Definition: mmcopy.h:9
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065

◆ RtlpAllocAtomTable()

PRTL_ATOM_TABLE RtlpAllocAtomTable ( ULONG  Size)

Definition at line 409 of file libsupp.c.

410{
411 return (PRTL_ATOM_TABLE)RtlAllocateHeap(RtlGetProcessHeap(),
413 Size);
414}
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
struct atom_table ** PRTL_ATOM_TABLE
Definition: atom.c:43

◆ RtlpAllocAtomTableEntry()

PRTL_ATOM_TABLE_ENTRY RtlpAllocAtomTableEntry ( ULONG  Size)

Definition at line 425 of file libsupp.c.

426{
427 return (PRTL_ATOM_TABLE_ENTRY)RtlAllocateHeap(RtlGetProcessHeap(),
429 Size);
430}
Definition: rtltypes.h:1672

◆ RtlpCaptureStackLimits()

BOOLEAN NTAPI RtlpCaptureStackLimits ( IN ULONG_PTR  Ebp,
IN ULONG_PTR StackBegin,
IN ULONG_PTR StackEnd 
)

Definition at line 213 of file libsupp.c.

216{
217 /* FIXME: Verify */
218 *StackBegin = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit;
219 *StackEnd = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase;
220 return TRUE;
221}

Referenced by RtlWalkFrameChain().

◆ RtlpCheckForActiveDebugger()

BOOLEAN NTAPI RtlpCheckForActiveDebugger ( VOID  )

Definition at line 27 of file libsupp.c.

28{
29 /* Return the flag in the PEB */
30 return NtCurrentPeb()->BeingDebugged;
31}

Referenced by RtlRaiseException(), RtlRaiseStatus(), and vDbgPrintExWithPrefixInternal().

◆ RtlpCheckLogException()

VOID NTAPI RtlpCheckLogException ( IN PEXCEPTION_RECORD  ExceptionRecord,
IN PCONTEXT  ContextRecord,
IN PVOID  ContextData,
IN ULONG  Size 
)

Definition at line 203 of file libsupp.c.

207{
208 /* Exception logging is not done in user-mode */
209}

Referenced by RtlDispatchException(), and RtlpUnwindInternal().

◆ RtlpClearInDbgPrint()

VOID NTAPI RtlpClearInDbgPrint ( VOID  )

Definition at line 47 of file libsupp.c.

48{
49 /* Clear the flag */
50 NtCurrentTeb()->InDbgPrint = FALSE;
51}

Referenced by vDbgPrintExWithPrefixInternal().

◆ RtlpCreateAtomHandle()

BOOLEAN RtlpCreateAtomHandle ( PRTL_ATOM_TABLE  AtomTable,
PRTL_ATOM_TABLE_ENTRY  Entry 
)

Definition at line 455 of file libsupp.c.

456{
457 ULONG HandleIndex;
458 PRTL_HANDLE_TABLE_ENTRY RtlHandle;
459
460 RtlHandle = RtlAllocateHandle(&AtomTable->RtlHandleTable,
461 &HandleIndex);
462 if (RtlHandle != NULL)
463 {
464 PRTL_ATOM_HANDLE AtomHandle = (PRTL_ATOM_HANDLE)RtlHandle;
465
466 /* FIXME - Handle Indexes >= 0xC000 ?! */
467 if (HandleIndex < 0xC000)
468 {
469 Entry->HandleIndex = (USHORT)HandleIndex;
470 Entry->Atom = 0xC000 + (USHORT)HandleIndex;
471
472 AtomHandle->AtomEntry = Entry;
473 AtomHandle->Handle.Flags = RTL_HANDLE_VALID;
474
475 return TRUE;
476 }
477 else
478 {
479 /* set the valid flag, otherwise RtlFreeHandle will fail! */
480 AtomHandle->Handle.Flags = RTL_HANDLE_VALID;
481
482 RtlFreeHandle(&AtomTable->RtlHandleTable,
483 RtlHandle);
484 }
485 }
486
487 return FALSE;
488}
struct _RTL_ATOM_HANDLE * PRTL_ATOM_HANDLE
NTSYSAPI BOOLEAN NTAPI RtlFreeHandle(_In_ PRTL_HANDLE_TABLE HandleTable, _In_ PRTL_HANDLE_TABLE_ENTRY Handle)
NTSYSAPI PRTL_HANDLE_TABLE_ENTRY NTAPI RtlAllocateHandle(_In_ PRTL_HANDLE_TABLE HandleTable, _Inout_ PULONG Index)
#define RTL_HANDLE_VALID
Definition: rtltypes.h:376
base of all file and directory entries
Definition: entries.h:83
RTL_HANDLE_TABLE_ENTRY Handle
Definition: libsupp.c:356
PRTL_ATOM_TABLE_ENTRY AtomEntry
Definition: libsupp.c:357
Definition: rtltypes.h:1247
ULONG Flags
Definition: rtltypes.h:1250

◆ RtlpCreateAtomHandleTable()

BOOLEAN RtlpCreateAtomHandleTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 393 of file libsupp.c.

394{
396 sizeof(RTL_ATOM_HANDLE),
397 &AtomTable->RtlHandleTable);
398
399 return TRUE;
400}
NTSYSAPI VOID NTAPI RtlInitializeHandleTable(_In_ ULONG TableSize, _In_ ULONG HandleSize, _In_ PRTL_HANDLE_TABLE HandleTable)

◆ RtlPcToFileHeader()

PVOID NTAPI RtlPcToFileHeader ( IN PVOID  PcValue,
PVOID BaseOfImage 
)

Definition at line 658 of file libsupp.c.

660{
664 PVOID ImageBase = NULL;
665
667 ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
669 while (Entry != ModuleListHead)
670 {
671 Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
672
673 if ((ULONG_PTR)PcValue >= (ULONG_PTR)Module->DllBase &&
674 (ULONG_PTR)PcValue < (ULONG_PTR)Module->DllBase + Module->SizeOfImage)
675 {
676 ImageBase = Module->DllBase;
677 break;
678 }
679 Entry = Entry->Flink;
680 }
682
683 *BaseOfImage = ImageBase;
684 return ImageBase;
685}
LIST_ENTRY * ModuleListHead
Definition: kdpacket.c:23
Definition: btrfs_drv.h:1876
ULONG SizeOfImage
Definition: ldrtypes.h:143
PVOID DllBase
Definition: btrfs_drv.h:1880
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by BasepGetModuleHandleExW(), RtlLookupFunctionTable(), and SeiGetModuleFromAddress().

◆ RtlpDestroyAtomHandleTable()

VOID RtlpDestroyAtomHandleTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 403 of file libsupp.c.

404{
405 RtlDestroyHandleTable(&AtomTable->RtlHandleTable);
406}
NTSYSAPI VOID NTAPI RtlDestroyHandleTable(_Inout_ PRTL_HANDLE_TABLE HandleTable)

◆ RtlpDestroyAtomTableLock()

VOID RtlpDestroyAtomTableLock ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 369 of file libsupp.c.

370{
371 RtlDeleteCriticalSection(&AtomTable->CriticalSection);
372}

◆ RtlpFreeAtomHandle()

VOID RtlpFreeAtomHandle ( PRTL_ATOM_TABLE  AtomTable,
PRTL_ATOM_TABLE_ENTRY  Entry 
)

Definition at line 441 of file libsupp.c.

442{
443 PRTL_HANDLE_TABLE_ENTRY RtlHandleEntry;
444
445 if (RtlIsValidIndexHandle(&AtomTable->RtlHandleTable,
446 (ULONG)Entry->HandleIndex,
447 &RtlHandleEntry))
448 {
449 RtlFreeHandle(&AtomTable->RtlHandleTable,
450 RtlHandleEntry);
451 }
452}
NTSYSAPI BOOLEAN WINAPI RtlIsValidIndexHandle(const RTL_HANDLE_TABLE *, ULONG Index, RTL_HANDLE **)

◆ RtlpFreeAtomTable()

VOID RtlpFreeAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 417 of file libsupp.c.

418{
419 RtlFreeHeap(RtlGetProcessHeap(),
420 0,
421 AtomTable);
422}

◆ RtlpFreeAtomTableEntry()

VOID RtlpFreeAtomTableEntry ( PRTL_ATOM_TABLE_ENTRY  Entry)

Definition at line 433 of file libsupp.c.

434{
435 RtlFreeHeap(RtlGetProcessHeap(),
436 0,
437 Entry);
438}

◆ RtlpFreeMemory()

VOID NTAPI RtlpFreeMemory ( PVOID  Mem,
ULONG  Tag 
)

Definition at line 155 of file libsupp.c.

157{
159
160 RtlFreeHeap(RtlGetProcessHeap(),
161 0,
162 Mem);
163}

◆ RtlpGetAtomEntry()

PRTL_ATOM_TABLE_ENTRY RtlpGetAtomEntry ( PRTL_ATOM_TABLE  AtomTable,
ULONG  Index 
)

Definition at line 491 of file libsupp.c.

492{
493 PRTL_HANDLE_TABLE_ENTRY RtlHandle;
494
495 if (RtlIsValidIndexHandle(&AtomTable->RtlHandleTable,
496 Index,
497 &RtlHandle))
498 {
499 PRTL_ATOM_HANDLE AtomHandle = (PRTL_ATOM_HANDLE)RtlHandle;
500
501 return AtomHandle->AtomEntry;
502 }
503
504 return NULL;
505}
_In_ WDFCOLLECTION _In_ ULONG Index

◆ RtlpGetMode()

KPROCESSOR_MODE NTAPI RtlpGetMode ( VOID  )

Definition at line 55 of file libsupp.c.

56{
57 return UserMode;
58}
#define UserMode
Definition: asm.h:35

Referenced by RtlCreateHeap(), RtlCreateProcessParameters(), RtlDestroyHeap(), RtlFreeHeap(), RtlpExtendHeap(), RtlpInitializeHeap(), and RtlWalkFrameChain().

◆ RtlpGetStackLimits()

VOID NTAPI RtlpGetStackLimits ( OUT PULONG_PTR  LowLimit,
OUT PULONG_PTR  HighLimit 
)

Definition at line 337 of file libsupp.c.

340{
341 *LowLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit;
342 *HighLimit = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase;
343}
_Out_ PULONG_PTR HighLimit
Definition: iofuncs.h:2885

Referenced by RtlDispatchException(), RtlpUnwindInternal(), RtlUnwind(), and RtlWalkFrameChain().

◆ RtlpHandleDpcStackException()

BOOLEAN NTAPI RtlpHandleDpcStackException ( IN PEXCEPTION_REGISTRATION_RECORD  RegistrationFrame,
IN ULONG_PTR  RegistrationFrameEnd,
IN OUT PULONG_PTR  StackLow,
IN OUT PULONG_PTR  StackHigh 
)

Definition at line 192 of file libsupp.c.

196{
197 /* There's no such thing as a DPC stack in user-mode */
198 return FALSE;
199}

Referenced by RtlDispatchException(), and RtlUnwind().

◆ RtlpImageNtHeaderEx()

NTSTATUS NTAPI RtlpImageNtHeaderEx ( _In_ ULONG  Flags,
_In_ PVOID  Base,
_In_ ULONG64  Size,
_Out_ PIMAGE_NT_HEADERS OutHeaders 
)

Definition at line 140 of file image.c.

145{
146 PIMAGE_NT_HEADERS NtHeaders;
147 PIMAGE_DOS_HEADER DosHeader;
148 BOOLEAN WantsRangeCheck;
149 ULONG NtHeaderOffset;
150
151 /* You must want NT Headers, no? */
152 if (OutHeaders == NULL)
153 {
154 DPRINT1("OutHeaders is NULL\n");
156 }
157
158 /* Assume failure */
159 *OutHeaders = NULL;
160
161 /* Validate Flags */
163 {
164 DPRINT1("Invalid flags: 0x%lx\n", Flags);
166 }
167
168 /* Validate base */
169 if ((Base == NULL) || (Base == (PVOID)-1))
170 {
171 DPRINT1("Invalid base address: %p\n", Base);
173 }
174
175 /* Check if the caller wants range checks */
177 if (WantsRangeCheck)
178 {
179 /* Make sure the image size is at least big enough for the DOS header */
180 if (Size < sizeof(IMAGE_DOS_HEADER))
181 {
182 DPRINT1("Size too small\n");
184 }
185 }
186
187 /* Check if the DOS Signature matches */
188 DosHeader = Base;
189 if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
190 {
191 /* Not a valid COFF */
192 DPRINT1("Invalid image DOS signature!\n");
194 }
195
196 /* Get the offset to the NT headers (and copy from LONG to ULONG) */
197 NtHeaderOffset = DosHeader->e_lfanew;
198
199 /* The offset must not be larger than 256MB, as a hard-coded check.
200 In Windows this check is only done in user mode, not in kernel mode,
201 but it shouldn't harm to have it anyway. Note that without this check,
202 other overflow checks would become necessary! */
203 if (NtHeaderOffset >= (256 * 1024 * 1024))
204 {
205 /* Fail */
206 DPRINT1("NT headers offset is larger than 256MB!\n");
208 }
209
210 /* Check if the caller wants validation */
211 if (WantsRangeCheck)
212 {
213 /* Make sure the file header fits into the size */
214 if ((NtHeaderOffset +
216 {
217 /* Fail */
218 DPRINT1("NT headers beyond image size!\n");
220 }
221 }
222
223 /* Now get a pointer to the NT Headers */
224 NtHeaders = (PIMAGE_NT_HEADERS)((ULONG_PTR)Base + NtHeaderOffset);
225
226 /* Check if the mapping is in user space */
228 {
229 /* Make sure we don't overflow into kernel space */
230 if ((PVOID)(NtHeaders + 1) > MmHighestUserAddress)
231 {
232 DPRINT1("Image overflows from user space into kernel space!\n");
234 }
235 }
236
237 /* Verify the PE Signature */
238 if (NtHeaders->Signature != IMAGE_NT_SIGNATURE)
239 {
240 /* Fail */
241 DPRINT1("Invalid image NT signature!\n");
243 }
244
245 /* Now return success and the NT header */
246 *OutHeaders = NtHeaders;
247 return STATUS_SUCCESS;
248}
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
Definition: ntddk_ex.h:187
#define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK
Definition: rtltypes.h:358
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:672
#define STATUS_INVALID_IMAGE_FORMAT
Definition: ntstatus.h:359
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89
PVOID MmHighestUserAddress
Definition: rtlcompat.c:29

◆ RtlpInitAtomTableLock()

NTSTATUS RtlpInitAtomTableLock ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 361 of file libsupp.c.

362{
363 RtlInitializeCriticalSection(&AtomTable->CriticalSection);
364 return STATUS_SUCCESS;
365}

◆ RtlpLockAtomTable()

BOOLEAN RtlpLockAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 376 of file libsupp.c.

377{
378 RtlEnterCriticalSection(&AtomTable->CriticalSection);
379 return TRUE;
380}

◆ RtlpSafeCopyMemory()

NTSTATUS NTAPI RtlpSafeCopyMemory ( _Out_writes_bytes_all_(Length) VOID UNALIGNED Destination,
_In_reads_bytes_(Length) CONST VOID UNALIGNED Source,
_In_ SIZE_T  Length 
)

Definition at line 1201 of file libsupp.c.

1205{
1206 _SEH2_TRY
1207 {
1209 }
1211 {
1213 }
1214 _SEH2_END;
1215
1216 return STATUS_SUCCESS;
1217}
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3016
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168

◆ RtlpSetHeapParameters()

VOID NTAPI RtlpSetHeapParameters ( IN PRTL_HEAP_PARAMETERS  Parameters)

Definition at line 176 of file libsupp.c.

177{
178 PPEB Peb;
179
180 /* Get PEB */
182
183 /* Apply defaults for non-set parameters */
184 if (!Parameters->SegmentCommit) Parameters->SegmentCommit = Peb->HeapSegmentCommit;
185 if (!Parameters->SegmentReserve) Parameters->SegmentReserve = Peb->HeapSegmentReserve;
186 if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = Peb->HeapDeCommitFreeBlockThreshold;
187 if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = Peb->HeapDeCommitTotalFreeThreshold;
188}
NTSYSAPI PEB *WINAPI RtlGetCurrentPeb(void)
Definition: libsupp.c:65
ULONG HeapDeCommitTotalFreeThreshold
Definition: ntddk_ex.h:277
ULONG HeapSegmentCommit
Definition: ntddk_ex.h:276
ULONG HeapSegmentReserve
Definition: ntddk_ex.h:275
ULONG HeapDeCommitFreeBlockThreshold
Definition: ntddk_ex.h:278
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869

Referenced by RtlCreateHeap().

◆ RtlpSetInDbgPrint()

BOOLEAN NTAPI RtlpSetInDbgPrint ( VOID  )

Definition at line 35 of file libsupp.c.

36{
37 /* Check if it's already set and return TRUE if so */
38 if (NtCurrentTeb()->InDbgPrint) return TRUE;
39
40 /* Set it and return */
41 NtCurrentTeb()->InDbgPrint = TRUE;
42 return FALSE;
43}

Referenced by vDbgPrintExWithPrefixInternal().

◆ RtlpUnlockAtomTable()

VOID RtlpUnlockAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 384 of file libsupp.c.

385{
386 RtlLeaveCriticalSection(&AtomTable->CriticalSection);
387}

◆ RtlReleasePebLock()

VOID NTAPI RtlReleasePebLock ( VOID  )

Definition at line 84 of file libsupp.c.

◆ RtlTryEnterHeapLock()

BOOLEAN NTAPI RtlTryEnterHeapLock ( IN OUT PHEAP_LOCK  Lock,
IN BOOLEAN  Exclusive 
)

Definition at line 119 of file libsupp.c.

120{
122
123 return RtlTryEnterCriticalSection(&Lock->CriticalSection);
124}
NTSYSAPI BOOLEAN NTAPI RtlTryEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

Referenced by RtlpDphEnterCriticalSection().

◆ RtlWalkFrameChain()

ULONG NTAPI RtlWalkFrameChain ( OUT PVOID Callers,
IN ULONG  Count,
IN ULONG  Flags 
)

Definition at line 229 of file libsupp.c.

232{
233 ULONG_PTR Stack, NewStack, StackBegin, StackEnd = 0;
234 ULONG Eip;
235 BOOLEAN Result, StopSearch = FALSE;
236 ULONG i = 0;
237
238 /* Get current EBP */
239#if defined(_M_IX86)
240#if defined __GNUC__
241 __asm__("mov %%ebp, %0" : "=r" (Stack) : );
242#elif defined(_MSC_VER)
243 __asm mov Stack, ebp
244#endif
245#elif defined(_M_MIPS)
246 __asm__("move $sp, %0" : "=r" (Stack) : );
247#elif defined(_M_PPC)
248 __asm__("mr %0,1" : "=r" (Stack) : );
249#elif defined(_M_ARM)
250#if defined __GNUC__
251 __asm__("mov sp, %0" : "=r"(Stack) : );
252#elif defined(_MSC_VER)
253 // FIXME: Hack. Probably won't work if this ever actually manages to run someday.
255#endif
256#else
257#error Unknown architecture
258#endif
259
260 /* Set it as the stack begin limit as well */
261 StackBegin = (ULONG_PTR)Stack;
262
263 /* Check if we're called for non-logging mode */
264 if (!Flags)
265 {
266 /* Get the actual safe limits */
268 &StackBegin,
269 &StackEnd);
270 if (!Result) return 0;
271 }
272
273 /* Use a SEH block for maximum protection */
275 {
276 /* Loop the frames */
277 for (i = 0; i < Count; i++)
278 {
279 /*
280 * Leave if we're past the stack,
281 * if we're before the stack,
282 * or if we've reached ourselves.
283 */
284 if ((Stack >= StackEnd) ||
285 (!i ? (Stack < StackBegin) : (Stack <= StackBegin)) ||
286 ((StackEnd - Stack) < (2 * sizeof(ULONG_PTR))))
287 {
288 /* We're done or hit a bad address */
289 break;
290 }
291
292 /* Get new stack and EIP */
293 NewStack = *(PULONG_PTR)Stack;
294 Eip = *(PULONG_PTR)(Stack + sizeof(ULONG_PTR));
295
296 /* Check if the new pointer is above the oldone and past the end */
297 if (!((Stack < NewStack) && (NewStack < StackEnd)))
298 {
299 /* Stop searching after this entry */
300 StopSearch = TRUE;
301 }
302
303 /* Also make sure that the EIP isn't a stack address */
304 if ((StackBegin < Eip) && (Eip < StackEnd)) break;
305
306 /* FIXME: Check that EIP is inside a loaded module */
307
308 /* Save this frame */
309 Callers[i] = (PVOID)Eip;
310
311 /* Check if we should continue */
312 if (StopSearch)
313 {
314 /* Return the next index */
315 i++;
316 break;
317 }
318
319 /* Move to the next stack */
320 Stack = NewStack;
321 }
322 }
324 {
325 /* No index */
326 i = 0;
327 }
328 _SEH2_END;
329
330 /* Return frames parsed */
331 return i;
332}
BOOLEAN NTAPI RtlpCaptureStackLimits(IN ULONG_PTR Ebp, IN ULONG_PTR *StackBegin, IN ULONG_PTR *StackEnd)
Definition: libsupp.c:213
int Count
Definition: noreturn.cpp:7
__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")
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
uint32_t * PULONG_PTR
Definition: typedefs.h:65
void * PVOID
Definition: typedefs.h:50
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
_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

Referenced by KeRosCaptureUserStackBackTrace(), lie_about_fs_type(), RtlCaptureStackBackTrace(), and TestStackWalk4().

◆ RtlWow64EnableFsRedirection()

NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirection ( IN BOOLEAN  Wow64FsEnableRedirection)

Definition at line 1166 of file libsupp.c.

1167{
1168 /* This is what Windows returns on x86 */
1170}

Referenced by Wow64EnableWow64FsRedirection().

◆ RtlWow64EnableFsRedirectionEx()

NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirectionEx ( IN PVOID  Wow64FsEnableRedirection,
OUT PVOID OldFsRedirectionLevel 
)

Definition at line 1178 of file libsupp.c.

1180{
1181 /* This is what Windows returns on x86 */
1183}

Referenced by Wow64DisableWow64FsRedirection(), and Wow64RevertWow64FsRedirection().

Variable Documentation

◆ LdrpTopLevelDllBeingLoadedTeb

PTEB LdrpTopLevelDllBeingLoadedTeb = NULL

Definition at line 20 of file libsupp.c.

Referenced by LdrpRunInitializeRoutines(), and RtlIsThreadWithinLoaderCallout().

◆ MmHighestUserAddress

PVOID MmHighestUserAddress = (PVOID)MI_HIGHEST_USER_ADDRESS

Definition at line 21 of file libsupp.c.

◆ RtlpAllocDeallocQueryBufferSize

SIZE_T RtlpAllocDeallocQueryBufferSize = PAGE_SIZE

Definition at line 19 of file libsupp.c.