ReactOS  0.4.15-dev-1206-g731eddf
libsupp.c File Reference
#include <ntdll.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
 

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)
 
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)
 
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 14 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 715 of file libsupp.c.

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

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 570 of file libsupp.c.

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

◆ 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 
101  entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
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 }
#define max(a, b)
Definition: svc.c:63
DWORD Id
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
unsigned int dir
Definition: maze.c:112
uint32_t entry
Definition: isohybrid.c:63
Definition: pedump.c:413
#define min(a, b)
Definition: monoChain.cc:55

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 );
140  entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
141  namelen = wcslen(name);
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 }
#define max(a, b)
Definition: svc.c:63
_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)
IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
Definition: res.c:95
GLint namelen
Definition: glext.h:7232
uint32_t ULONG_PTR
Definition: typedefs.h:65
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
unsigned int dir
Definition: maze.c:112
uint32_t entry
Definition: isohybrid.c:63
Definition: pedump.c:413
#define min(a, b)
Definition: monoChain.cc:55
Definition: name.c:38
GLuint res
Definition: glext.h:9613
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

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 }
smooth NULL
Definition: ftsmooth.c:416
unsigned int dir
Definition: maze.c:112
uint32_t entry
Definition: isohybrid.c:63
Definition: pedump.c:413

Referenced by find_entry().

◆ get_buffer()

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

Definition at line 688 of file libsupp.c.

689 {
690  WCHAR *p;
691 
692  if (CallerBuffer && CallerBuffer->MaximumLength > needed)
693  {
694  p = CallerBuffer->Buffer;
695  CallerBuffer->Length = needed - sizeof(WCHAR);
696  }
697  else
698  {
699  if (!bAllocateBuffer)
701 
702  if (CallerBuffer)
703  CallerBuffer->Buffer[0] = 0;
704 
705  p = RtlAllocateHeap(RtlGetProcessHeap(), 0, needed );
706  if (!p)
707  return STATUS_NO_MEMORY;
708  }
709  *buffer = p;
710 
711  return STATUS_SUCCESS;
712 }
USHORT MaximumLength
Definition: env_spec_w32.h:370
GLuint buffer
Definition: glext.h:5915
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
GLfloat GLfloat p
Definition: glext.h:8902
return STATUS_SUCCESS
Definition: btrfs.c:3014

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

◆ 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 }
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
static const WCHAR lang[]
Definition: wbemdisp.c:287
Definition: _list.h:228
unsigned int ULONG
Definition: retypes.h:1

Referenced by find_entry().

◆ RtlAcquirePebLock()

◆ RtlComputeImportTableHash()

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

Definition at line 1027 of file libsupp.c.

1030 {
1031  UNIMPLEMENTED;
1032  return STATUS_NOT_IMPLEMENTED;
1033 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define UNIMPLEMENTED
Definition: debug.h:115

Referenced by BasepCheckWebBladeHashes().

◆ RtlDeleteHeapLock()

NTSTATUS NTAPI RtlDeleteHeapLock ( IN OUT PHEAP_LOCK  Lock)

Definition at line 101 of file libsupp.c.

102 {
103  return RtlDeleteCriticalSection(&Lock->CriticalSection);
104 }
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
Definition: CrNtStubs.h:75
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

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 821 of file libsupp.c.

830 {
834  UNICODE_STRING localStr, localStr2, *pstrParam;
835  WCHAR *p;
836  BOOLEAN GotExtension;
837  WCHAR c;
838  C_ASSERT(sizeof(UNICODE_NULL) == sizeof(WCHAR));
839 
840 
841  /* Check for invalid parameters */
842  if (!OriginalName)
843  {
845  }
846 
847  if (!DynamicString && !StaticString)
848  {
850  }
851 
852  if ((DynamicString) && (StaticString) && !(NewName))
853  {
855  }
856 
857  if (!OriginalName->Buffer || OriginalName->Length == 0)
858  {
860  }
861 
862  if (StaticString && (OriginalName == StaticString || OriginalName->Buffer == StaticString->Buffer))
863  {
865  }
866 
867  if (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 }
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS find_actctx_dll(PUNICODE_STRING pnameW, LPWSTR *fullname, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
Definition: libsupp.c:715
GLuint buffer
Definition: glext.h:5915
#define STATUS_SXS_KEY_NOT_FOUND
Definition: ntstatus.h:1389
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
#define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH
Definition: rtltypes.h:52
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
#define C_ASSERT(e)
Definition: intsafe.h:71
NTSYSAPI NTSTATUS NTAPI RtlComputePrivatizedDllName_U(_In_ PUNICODE_STRING DllName, _Inout_ PUNICODE_STRING RealName, _Inout_ PUNICODE_STRING LocalName)
Definition: path.c:467
#define STATUS_NOT_FOUND
Definition: shellext.h:72
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MAX_PATH
Definition: compat.h:34
const GLubyte * c
Definition: glext.h:8905
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
Status
Definition: gdiplustypes.h:24
const char * fullname
Definition: shader.c:1766
static const WCHAR L[]
Definition: oid.c:1250
#define NtCurrentPeb()
Definition: FLS.c:20
BOOLEAN NTAPI RtlDoesFileExists_UStr(IN PUNICODE_STRING FileName)
Definition: path.c:1384
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define DPRINT1
Definition: precomp.h:8
_In_ PUNICODE_STRING NewName
Definition: zwfuncs.h:1203
#define c
Definition: ke_i.h:80
NTSTATUS get_buffer(LPWSTR *buffer, SIZE_T needed, PUNICODE_STRING CallerBuffer, BOOLEAN bAllocateBuffer)
Definition: libsupp.c:688
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define ULONG_PTR
Definition: config.h:101
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
_Inout_opt_ PUNICODE_STRING Extension
Definition: fltkernel.h:1092
IN PUNICODE_STRING StaticString
IN PUNICODE_STRING IN PUNICODE_STRING DynamicString

Referenced by LdrGetDllHandleEx(), LdrLoadDll(), LdrpLoadImportModule(), LdrpSnapThunk(), LdrpUpdateLoadCount3(), RtlDosSearchPath_Ustr(), TestBuffers(), and TestRedirection().

◆ RtlEnterHeapLock()

NTSTATUS NTAPI RtlEnterHeapLock ( IN OUT PHEAP_LOCK  Lock,
IN BOOLEAN  Exclusive 
)

Definition at line 108 of file libsupp.c.

109 {
110  UNREFERENCED_PARAMETER(Exclusive);
111 
112  return RtlEnterCriticalSection(&Lock->CriticalSection);
113 }
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
Definition: CrNtStubs.h:75

Referenced by RtlAllocateHeap(), RtlDebugAllocateHeap(), RtlDebugFreeHeap(), RtlDebugGetUserInfoHeap(), RtlDebugReAllocateHeap(), RtlDebugSetUserFlagsHeap(), RtlDebugSetUserValueHeap(), RtlDebugSizeHeap(), RtlFreeHeap(), RtlGetUserInfoHeap(), RtlLockHeap(), RtlpDphEnterCriticalSection(), RtlpDphFreeDelayedBlocksFromHeap(), RtlpPageHeapCreate(), RtlpPageHeapDestroy(), RtlReAllocateHeap(), RtlSetUserFlagsHeap(), RtlSetUserValueHeap(), and RtlValidateHeap().

◆ RtlGetCurrentPeb()

◆ RtlGetNtGlobalFlags()

ULONG NTAPI RtlGetNtGlobalFlags ( VOID  )

Definition at line 93 of file libsupp.c.

94 {
95  PPEB pPeb = NtCurrentPeb();
96  return pPeb->NtGlobalFlag;
97 }
ULONG NtGlobalFlag
Definition: ntddk_ex.h:270
#define NtCurrentPeb()
Definition: FLS.c:20

Referenced by RtlCreateHeap(), and RtlCreateUserProcess().

◆ RtlGetTickCount()

ULONG NTAPI RtlGetTickCount ( VOID  )

Definition at line 1058 of file libsupp.c.

1059 {
1060  ULARGE_INTEGER TickCount;
1061 
1062 #ifdef _WIN64
1063  TickCount.QuadPart = *((volatile ULONG64*)&SharedUserData->TickCount);
1064 #else
1065  while (TRUE)
1066  {
1067  TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time;
1068  TickCount.LowPart = SharedUserData->TickCount.LowPart;
1069 
1070  if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time)
1071  break;
1072 
1073  YieldProcessor();
1074  }
1075 #endif
1076 
1077  return (ULONG)((UInt32x32To64(TickCount.LowPart,
1078  SharedUserData->TickCountMultiplier) >> 24) +
1079  UInt32x32To64((TickCount.HighPart << 8) & 0xFFFFFFFF,
1080  SharedUserData->TickCountMultiplier));
1081 }
#define TRUE
Definition: types.h:120
$ULONG LowPart
Definition: ntbasedef.h:570
FORCEINLINE VOID YieldProcessor(VOID)
Definition: ke.h:32
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:571
if(!(yy_init))
Definition: macro.lex.yy.c:714
unsigned __int64 ULONG64
Definition: imports.h:198
#define SharedUserData
unsigned int ULONG
Definition: retypes.h:1
#define UInt32x32To64(a, b)
Definition: intsafe.h:250

◆ RtlImageNtHeaderEx()

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

Definition at line 526 of file libsupp.c.

531 {
533 
534  /* Assume failure. This is also done in RtlpImageNtHeaderEx, but this is guarded by SEH. */
535  if (OutHeaders != NULL)
536  *OutHeaders = NULL;
537 
538  _SEH2_TRY
539  {
540  Status = RtlpImageNtHeaderEx(Flags, Base, Size, OutHeaders);
541  }
543  {
544  /* Fail with the SEH error */
546  }
547  _SEH2_END;
548 
549  return Status;
550 }
NTSTATUS NTAPI RtlpImageNtHeaderEx(_In_ ULONG Flags, _In_ PVOID Base, _In_ ULONG64 Size, _Out_ PIMAGE_NT_HEADERS *OutHeaders)
Definition: image.c:140
LONG NTSTATUS
Definition: precomp.h:26
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2373
_SEH2_TRY
Definition: create.c:4226
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
smooth NULL
Definition: ftsmooth.c:416
Status
Definition: gdiplustypes.h:24
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
_SEH2_END
Definition: create.c:4400
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12

◆ RtlInitializeHeapLock()

NTSTATUS NTAPI RtlInitializeHeapLock ( IN OUT PHEAP_LOCK Lock)

Definition at line 126 of file libsupp.c.

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

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

◆ RtlIsThreadWithinLoaderCallout()

BOOLEAN NTAPI RtlIsThreadWithinLoaderCallout ( VOID  )

Definition at line 348 of file libsupp.c.

349 {
351 }
PTEB LdrpTopLevelDllBeingLoadedTeb
Definition: libsupp.c:18
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

Referenced by ForceResetUserApiHook(), and LoadUserApiHook().

◆ RtlLeaveHeapLock()

NTSTATUS NTAPI RtlLeaveHeapLock ( IN OUT PHEAP_LOCK  Lock)

Definition at line 133 of file libsupp.c.

134 {
135  return RtlLeaveCriticalSection(&Lock->CriticalSection);
136 }
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
Definition: CrNtStubs.h:75

Referenced by RtlAllocateHeap(), RtlDebugAllocateHeap(), RtlDebugFreeHeap(), RtlDebugGetUserInfoHeap(), RtlDebugReAllocateHeap(), RtlDebugSetUserFlagsHeap(), RtlDebugSetUserValueHeap(), RtlDebugSizeHeap(), RtlFreeHeap(), RtlGetUserInfoHeap(), RtlpAllocateNonDedicated(), RtlpDphFreeDelayedBlocksFromHeap(), RtlpDphLeaveCriticalSection(), RtlpPageHeapCreate(), RtlpPageHeapDestroy(), RtlReAllocateHeap(), RtlSetUserFlagsHeap(), RtlSetUserValueHeap(), RtlUnlockHeap(), and RtlValidateHeap().

◆ RtlpAllocateMemory()

PVOID NTAPI RtlpAllocateMemory ( UINT  Bytes,
ULONG  Tag 
)

Definition at line 140 of file libsupp.c.

142 {
144 
145  return RtlAllocateHeap(RtlGetProcessHeap(),
146  0,
147  Bytes);
148 }
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
_In_ UINT Bytes
Definition: mmcopy.h:9
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
IN ULONG IN ULONG Tag
Definition: evtlib.h:159

◆ RtlpAllocAtomTable()

PRTL_ATOM_TABLE RtlpAllocAtomTable ( ULONG  Size)

Definition at line 410 of file libsupp.c.

411 {
412  return (PRTL_ATOM_TABLE)RtlAllocateHeap(RtlGetProcessHeap(),
414  Size);
415 }
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
struct atom_table ** PRTL_ATOM_TABLE
Definition: atom.c:43
#define HEAP_ZERO_MEMORY
Definition: compat.h:134

◆ RtlpAllocAtomTableEntry()

PRTL_ATOM_TABLE_ENTRY RtlpAllocAtomTableEntry ( ULONG  Size)

Definition at line 426 of file libsupp.c.

427 {
428  return (PRTL_ATOM_TABLE_ENTRY)RtlAllocateHeap(RtlGetProcessHeap(),
430  Size);
431 }
Definition: rtltypes.h:1669
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
#define HEAP_ZERO_MEMORY
Definition: compat.h:134

◆ RtlpCaptureStackLimits()

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

Definition at line 211 of file libsupp.c.

214 {
215  /* FIXME: Verify */
216  *StackBegin = (ULONG_PTR)NtCurrentTeb()->NtTib.StackLimit;
217  *StackEnd = (ULONG_PTR)NtCurrentTeb()->NtTib.StackBase;
218  return TRUE;
219 }
#define TRUE
Definition: types.h:120
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define ULONG_PTR
Definition: config.h:101

Referenced by RtlWalkFrameChain().

◆ RtlpCheckForActiveDebugger()

BOOLEAN NTAPI RtlpCheckForActiveDebugger ( VOID  )

Definition at line 25 of file libsupp.c.

26 {
27  /* Return the flag in the PEB */
28  return NtCurrentPeb()->BeingDebugged;
29 }
#define NtCurrentPeb()
Definition: FLS.c:20

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 201 of file libsupp.c.

205 {
206  /* Exception logging is not done in user-mode */
207 }

Referenced by RtlDispatchException().

◆ RtlpClearInDbgPrint()

VOID NTAPI RtlpClearInDbgPrint ( VOID  )

Definition at line 45 of file libsupp.c.

46 {
47  /* Clear the flag */
48  NtCurrentTeb()->InDbgPrint = FALSE;
49 }
#define FALSE
Definition: types.h:117
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

Referenced by vDbgPrintExWithPrefixInternal().

◆ RtlpCreateAtomHandle()

BOOLEAN RtlpCreateAtomHandle ( PRTL_ATOM_TABLE  AtomTable,
PRTL_ATOM_TABLE_ENTRY  Entry 
)

Definition at line 456 of file libsupp.c.

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

◆ RtlpCreateAtomHandleTable()

BOOLEAN RtlpCreateAtomHandleTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 394 of file libsupp.c.

395 {
397  sizeof(RTL_ATOM_HANDLE),
398  &AtomTable->RtlHandleTable);
399 
400  return TRUE;
401 }
#define TRUE
Definition: types.h:120
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 659 of file libsupp.c.

661 {
664  PLDR_DATA_TABLE_ENTRY Module;
665  PVOID ImageBase = NULL;
666 
667  RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
668  ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
670  while (Entry != ModuleListHead)
671  {
672  Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
673 
674  if ((ULONG_PTR)PcValue >= (ULONG_PTR)Module->DllBase &&
675  (ULONG_PTR)PcValue < (ULONG_PTR)Module->DllBase + Module->SizeOfImage)
676  {
677  ImageBase = Module->DllBase;
678  break;
679  }
680  Entry = Entry->Flink;
681  }
682  RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
683 
684  *BaseOfImage = ImageBase;
685  return ImageBase;
686 }
struct _Entry Entry
Definition: kefuncs.h:627
ULONG SizeOfImage
Definition: ldrtypes.h:143
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
uint32_t ULONG_PTR
Definition: typedefs.h:65
PVOID DllBase
Definition: btrfs_drv.h:1926
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
smooth NULL
Definition: ftsmooth.c:416
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
Definition: btrfs_drv.h:1922
Definition: typedefs.h:119
#define NtCurrentPeb()
Definition: FLS.c:20
LIST_ENTRY * ModuleListHead
Definition: kdpacket.c:23
base of all file and directory entries
Definition: entries.h:82

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

◆ RtlpDestroyAtomHandleTable()

VOID RtlpDestroyAtomHandleTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 404 of file libsupp.c.

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

◆ RtlpDestroyAtomTableLock()

VOID RtlpDestroyAtomTableLock ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 370 of file libsupp.c.

371 {
372  RtlDeleteCriticalSection(&AtomTable->CriticalSection);
373 }
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

◆ RtlpFreeAtomHandle()

VOID RtlpFreeAtomHandle ( PRTL_ATOM_TABLE  AtomTable,
PRTL_ATOM_TABLE_ENTRY  Entry 
)

Definition at line 442 of file libsupp.c.

443 {
444  PRTL_HANDLE_TABLE_ENTRY RtlHandleEntry;
445 
446  if (RtlIsValidIndexHandle(&AtomTable->RtlHandleTable,
447  (ULONG)Entry->HandleIndex,
448  &RtlHandleEntry))
449  {
450  RtlFreeHandle(&AtomTable->RtlHandleTable,
451  RtlHandleEntry);
452  }
453 }
NTSYSAPI BOOLEAN NTAPI RtlFreeHandle(_In_ PRTL_HANDLE_TABLE HandleTable, _In_ PRTL_HANDLE_TABLE_ENTRY Handle)
NTSYSAPI BOOLEAN WINAPI RtlIsValidIndexHandle(const RTL_HANDLE_TABLE *, ULONG Index, RTL_HANDLE **)
unsigned int ULONG
Definition: retypes.h:1
Definition: rtltypes.h:1244
base of all file and directory entries
Definition: entries.h:82

◆ RtlpFreeAtomTable()

VOID RtlpFreeAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 418 of file libsupp.c.

419 {
420  RtlFreeHeap(RtlGetProcessHeap(),
421  0,
422  AtomTable);
423 }
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606

◆ RtlpFreeAtomTableEntry()

VOID RtlpFreeAtomTableEntry ( PRTL_ATOM_TABLE_ENTRY  Entry)

Definition at line 434 of file libsupp.c.

435 {
436  RtlFreeHeap(RtlGetProcessHeap(),
437  0,
438  Entry);
439 }
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
base of all file and directory entries
Definition: entries.h:82

◆ RtlpFreeMemory()

VOID NTAPI RtlpFreeMemory ( PVOID  Mem,
ULONG  Tag 
)

Definition at line 153 of file libsupp.c.

155 {
157 
158  RtlFreeHeap(RtlGetProcessHeap(),
159  0,
160  Mem);
161 }
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
IN ULONG IN ULONG Tag
Definition: evtlib.h:159

◆ RtlpGetAtomEntry()

PRTL_ATOM_TABLE_ENTRY RtlpGetAtomEntry ( PRTL_ATOM_TABLE  AtomTable,
ULONG  Index 
)

Definition at line 492 of file libsupp.c.

493 {
494  PRTL_HANDLE_TABLE_ENTRY RtlHandle;
495 
496  if (RtlIsValidIndexHandle(&AtomTable->RtlHandleTable,
497  Index,
498  &RtlHandle))
499  {
500  PRTL_ATOM_HANDLE AtomHandle = (PRTL_ATOM_HANDLE)RtlHandle;
501 
502  return AtomHandle->AtomEntry;
503  }
504 
505  return NULL;
506 }
struct _RTL_ATOM_HANDLE * PRTL_ATOM_HANDLE
smooth NULL
Definition: ftsmooth.c:416
PRTL_ATOM_TABLE_ENTRY AtomEntry
Definition: libsupp.c:358
static const UCHAR Index[8]
Definition: usbohci.c:18
NTSYSAPI BOOLEAN WINAPI RtlIsValidIndexHandle(const RTL_HANDLE_TABLE *, ULONG Index, RTL_HANDLE **)
Definition: rtltypes.h:1244

◆ RtlpGetMode()

KPROCESSOR_MODE NTAPI RtlpGetMode ( VOID  )

Definition at line 53 of file libsupp.c.

54 {
55  return UserMode;
56 }

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

◆ 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 190 of file libsupp.c.

194 {
195  /* There's no such thing as a DPC stack in user-mode */
196  return FALSE;
197 }
#define FALSE
Definition: types.h:117

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 */
176  WantsRangeCheck = !(Flags & RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK);
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 */
227  if (Base <= MmHighestUserAddress)
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 }
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2373
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define STATUS_INVALID_IMAGE_FORMAT
Definition: ntstatus.h:359
#define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK
Definition: rtltypes.h:356
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:673
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
PVOID MmHighestUserAddress
Definition: rtlcompat.c:29
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:3014
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
Definition: ntddk_ex.h:187

◆ RtlpInitAtomTableLock()

NTSTATUS RtlpInitAtomTableLock ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 362 of file libsupp.c.

363 {
364  RtlInitializeCriticalSection(&AtomTable->CriticalSection);
365  return STATUS_SUCCESS;
366 }
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ RtlpLockAtomTable()

BOOLEAN RtlpLockAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 377 of file libsupp.c.

378 {
379  RtlEnterCriticalSection(&AtomTable->CriticalSection);
380  return TRUE;
381 }
#define TRUE
Definition: types.h:120
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

◆ 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 1037 of file libsupp.c.

1041 {
1042  _SEH2_TRY
1043  {
1045  }
1047  {
1049  }
1050  _SEH2_END;
1051 
1052  return STATUS_SUCCESS;
1053 }
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
_SEH2_TRY
Definition: create.c:4226
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define _SEH2_YIELD(STMT_)
Definition: pseh2_64.h:8
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2937
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_SEH2_END
Definition: create.c:4400
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ RtlpSetHeapParameters()

VOID NTAPI RtlpSetHeapParameters ( IN PRTL_HEAP_PARAMETERS  Parameters)

Definition at line 174 of file libsupp.c.

175 {
176  PPEB Peb;
177 
178  /* Get PEB */
179  Peb = RtlGetCurrentPeb();
180 
181  /* Apply defaults for non-set parameters */
182  if (!Parameters->SegmentCommit) Parameters->SegmentCommit = Peb->HeapSegmentCommit;
183  if (!Parameters->SegmentReserve) Parameters->SegmentReserve = Peb->HeapSegmentReserve;
184  if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = Peb->HeapDeCommitFreeBlockThreshold;
185  if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = Peb->HeapDeCommitTotalFreeThreshold;
186 }
PPEB Peb
Definition: dllmain.c:27
ULONG HeapSegmentCommit
Definition: ntddk_ex.h:276
ULONG HeapSegmentReserve
Definition: ntddk_ex.h:275
PPEB NTAPI RtlGetCurrentPeb(VOID)
Definition: libsupp.c:63
_In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
Definition: iotypes.h:887
ULONG HeapDeCommitFreeBlockThreshold
Definition: ntddk_ex.h:278
ULONG HeapDeCommitTotalFreeThreshold
Definition: ntddk_ex.h:277

Referenced by RtlCreateHeap().

◆ RtlpSetInDbgPrint()

BOOLEAN NTAPI RtlpSetInDbgPrint ( VOID  )

Definition at line 33 of file libsupp.c.

34 {
35  /* Check if it's already set and return TRUE if so */
36  if (NtCurrentTeb()->InDbgPrint) return TRUE;
37 
38  /* Set it and return */
39  NtCurrentTeb()->InDbgPrint = TRUE;
40  return FALSE;
41 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

Referenced by vDbgPrintExWithPrefixInternal().

◆ RtlpUnlockAtomTable()

VOID RtlpUnlockAtomTable ( PRTL_ATOM_TABLE  AtomTable)

Definition at line 385 of file libsupp.c.

386 {
387  RtlLeaveCriticalSection(&AtomTable->CriticalSection);
388 }
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)

◆ RtlReleasePebLock()

◆ RtlTryEnterHeapLock()

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

Definition at line 117 of file libsupp.c.

118 {
119  UNREFERENCED_PARAMETER(Exclusive);
120 
121  return RtlTryEnterCriticalSection(&Lock->CriticalSection);
122 }
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
Definition: CrNtStubs.h:75
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 227 of file libsupp.c.

230 {
231  ULONG_PTR Stack, NewStack, StackBegin, StackEnd = 0;
232  ULONG Eip;
233  BOOLEAN Result, StopSearch = FALSE;
234  ULONG i = 0;
235 
236  /* Get current EBP */
237 #if defined(_M_IX86)
238 #if defined __GNUC__
239  __asm__("mov %%ebp, %0" : "=r" (Stack) : );
240 #elif defined(_MSC_VER)
241  __asm mov Stack, ebp
242 #endif
243 #elif defined(_M_MIPS)
244  __asm__("move $sp, %0" : "=r" (Stack) : );
245 #elif defined(_M_PPC)
246  __asm__("mr %0,1" : "=r" (Stack) : );
247 #elif defined(_M_ARM)
248 #if defined __GNUC__
249  __asm__("mov sp, %0" : "=r"(Stack) : );
250 #elif defined(_MSC_VER)
251  // FIXME: Hack. Probably won't work if this ever actually manages to run someday.
252  Stack = (ULONG_PTR)&Stack;
253 #endif
254 #else
255 #error Unknown architecture
256 #endif
257 
258  /* Set it as the stack begin limit as well */
259  StackBegin = (ULONG_PTR)Stack;
260 
261  /* Check if we're called for non-logging mode */
262  if (!Flags)
263  {
264  /* Get the actual safe limits */
266  &StackBegin,
267  &StackEnd);
268  if (!Result) return 0;
269  }
270 
271  /* Use a SEH block for maximum protection */
272  _SEH2_TRY
273  {
274  /* Loop the frames */
275  for (i = 0; i < Count; i++)
276  {
277  /*
278  * Leave if we're past the stack,
279  * if we're before the stack,
280  * or if we've reached ourselves.
281  */
282  if ((Stack >= StackEnd) ||
283  (!i ? (Stack < StackBegin) : (Stack <= StackBegin)) ||
284  ((StackEnd - Stack) < (2 * sizeof(ULONG_PTR))))
285  {
286  /* We're done or hit a bad address */
287  break;
288  }
289 
290  /* Get new stack and EIP */
291  NewStack = *(PULONG_PTR)Stack;
292  Eip = *(PULONG_PTR)(Stack + sizeof(ULONG_PTR));
293 
294  /* Check if the new pointer is above the oldone and past the end */
295  if (!((Stack < NewStack) && (NewStack < StackEnd)))
296  {
297  /* Stop searching after this entry */
298  StopSearch = TRUE;
299  }
300 
301  /* Also make sure that the EIP isn't a stack address */
302  if ((StackBegin < Eip) && (Eip < StackEnd)) break;
303 
304  /* FIXME: Check that EIP is inside a loaded module */
305 
306  /* Save this frame */
307  Callers[i] = (PVOID)Eip;
308 
309  /* Check if we should continue */
310  if (StopSearch)
311  {
312  /* Return the next index */
313  i++;
314  break;
315  }
316 
317  /* Move to the next stack */
318  Stack = NewStack;
319  }
320  }
322  {
323  /* No index */
324  i = 0;
325  }
326  _SEH2_END;
327 
328  /* Return frames parsed */
329  return i;
330 }
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx 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 mm1 mm5 paddd mm0 paddd mm4 mm0 mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 mm1 paddd mm0 mm0 packssdw mm0 movd eax movw edi esi edx esi 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 mm1 mm5 paddd mm1 paddd mm5 mm1 mm5 packssdw mm1 packssdw mm5 psubd mm0 psubd mm4 psubsw mm0 psubsw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 mm1 paddd mm1 mm1 packssdw mm1 psubd mm0 psubsw mm0 movd eax movw edi emms popl ebx popl esi popl edi mov ebp
Definition: synth_sse3d.h:248
#define TRUE
Definition: types.h:120
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1223
_SEH2_TRY
Definition: create.c:4226
uint32_t ULONG_PTR
Definition: typedefs.h:65
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
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 FALSE
Definition: types.h:117
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
unsigned char BOOLEAN
_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:426
void * PVOID
Definition: retypes.h:9
BOOLEAN NTAPI RtlpCaptureStackLimits(IN ULONG_PTR Ebp, IN ULONG_PTR *StackBegin, IN ULONG_PTR *StackEnd)
Definition: libsupp.c:211
_SEH2_END
Definition: create.c:4400
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
uint32_t * PULONG_PTR
Definition: typedefs.h:65
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6

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

◆ RtlWow64EnableFsRedirection()

NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirection ( IN BOOLEAN  Wow64FsEnableRedirection)

Definition at line 1002 of file libsupp.c.

1003 {
1004  /* This is what Windows returns on x86 */
1005  return STATUS_NOT_IMPLEMENTED;
1006 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239

Referenced by Wow64EnableWow64FsRedirection().

◆ RtlWow64EnableFsRedirectionEx()

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

Definition at line 1014 of file libsupp.c.

1016 {
1017  /* This is what Windows returns on x86 */
1018  return STATUS_NOT_IMPLEMENTED;
1019 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239

Referenced by Wow64DisableWow64FsRedirection(), and Wow64RevertWow64FsRedirection().

Variable Documentation

◆ LdrpTopLevelDllBeingLoadedTeb

PTEB LdrpTopLevelDllBeingLoadedTeb = NULL

Definition at line 18 of file libsupp.c.

Referenced by LdrpRunInitializeRoutines(), and RtlIsThreadWithinLoaderCallout().

◆ MmHighestUserAddress

PVOID MmHighestUserAddress = (PVOID)MI_HIGHEST_USER_ADDRESS

Definition at line 19 of file libsupp.c.

◆ RtlpAllocDeallocQueryBufferSize

SIZE_T RtlpAllocDeallocQueryBufferSize = PAGE_SIZE

Definition at line 17 of file libsupp.c.