488 lines
12 KiB
C
488 lines
12 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
ntrtlp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Include file for NT runtime routines that are callable by both
|
|||
|
kernel mode code in the executive and user mode code in various
|
|||
|
NT subsystems, but which are private interfaces.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David N. Cutler (davec) 15-Aug-1989
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
These routines are dynamically linked in the caller's executable and
|
|||
|
are callable in either kernel mode or user mode.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _NTRTLP_
|
|||
|
#define _NTRTLP_
|
|||
|
#include <ntos.h>
|
|||
|
#include <nturtl.h>
|
|||
|
#include <zwapi.h>
|
|||
|
#include <sxstypes.h>
|
|||
|
|
|||
|
#if defined(_AMD64_)
|
|||
|
#include "amd64\ntrtlamd64.h"
|
|||
|
|
|||
|
#elif defined(_X86_)
|
|||
|
#include "i386\ntrtl386.h"
|
|||
|
|
|||
|
#elif defined(_IA64_)
|
|||
|
#include "ia64\ntrtli64.h"
|
|||
|
|
|||
|
#else
|
|||
|
#error "no target architecture"
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef BLDR_KERNEL_RUNTIME
|
|||
|
#undef try
|
|||
|
#define try if(1)
|
|||
|
#undef except
|
|||
|
#define except(a) else if (0)
|
|||
|
#undef finally
|
|||
|
#define finally if (1)
|
|||
|
#undef GetExceptionCode
|
|||
|
#define GetExceptionCode() 1
|
|||
|
#define finally if (1)
|
|||
|
#endif
|
|||
|
|
|||
|
#include "string.h"
|
|||
|
#include "wchar.h"
|
|||
|
|
|||
|
//
|
|||
|
// Machine state reporting. See machine specific includes for more.
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpGetStackLimits (
|
|||
|
OUT PULONG_PTR LowLimit,
|
|||
|
OUT PULONG_PTR HighLimit
|
|||
|
);
|
|||
|
|
|||
|
#if defined(_WIN64)
|
|||
|
|
|||
|
PRUNTIME_FUNCTION
|
|||
|
RtlpLookupFunctionTable (
|
|||
|
IN PVOID ControlPc,
|
|||
|
OUT PVOID *ImageBase,
|
|||
|
|
|||
|
#if defined(_IA64_)
|
|||
|
|
|||
|
OUT PULONG64 Gp,
|
|||
|
#endif
|
|||
|
|
|||
|
OUT PULONG SizeOfTable
|
|||
|
);
|
|||
|
|
|||
|
extern PVOID RtlpFunctionAddressTable[];
|
|||
|
extern UNWIND_HISTORY_TABLE RtlpUnwindHistoryTable;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
LONG
|
|||
|
LdrpCompareResourceNames(
|
|||
|
IN ULONG ResourceName,
|
|||
|
IN const IMAGE_RESOURCE_DIRECTORY* ResourceDirectory,
|
|||
|
IN const IMAGE_RESOURCE_DIRECTORY_ENTRY* ResourceDirectoryEntry
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LdrpSearchResourceSection(
|
|||
|
IN PVOID DllHandle,
|
|||
|
IN const ULONG_PTR* ResourceIdPath,
|
|||
|
IN ULONG ResourceIdPathLength,
|
|||
|
IN BOOLEAN FindDirectoryEntry,
|
|||
|
OUT PVOID *ResourceDirectoryOrData
|
|||
|
);
|
|||
|
|
|||
|
LONG
|
|||
|
LdrpCompareResourceNames_U(
|
|||
|
IN ULONG_PTR ResourceName,
|
|||
|
IN const IMAGE_RESOURCE_DIRECTORY* ResourceDirectory,
|
|||
|
IN const IMAGE_RESOURCE_DIRECTORY_ENTRY* ResourceDirectoryEntry
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LdrpSearchResourceSection_U(
|
|||
|
IN PVOID DllHandle,
|
|||
|
IN const ULONG_PTR* ResourceIdPath,
|
|||
|
IN ULONG ResourceIdPathLength,
|
|||
|
IN ULONG Flags,
|
|||
|
OUT PVOID *ResourceDirectoryOrData
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LdrpAccessResourceData(
|
|||
|
IN PVOID DllHandle,
|
|||
|
IN const IMAGE_RESOURCE_DATA_ENTRY* ResourceDataEntry,
|
|||
|
OUT PVOID *Address OPTIONAL,
|
|||
|
OUT PULONG Size OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LdrpAccessResourceDataNoMultipleLanguage(
|
|||
|
IN PVOID DllHandle,
|
|||
|
IN const IMAGE_RESOURCE_DATA_ENTRY* ResourceDataEntry,
|
|||
|
OUT PVOID *Address OPTIONAL,
|
|||
|
OUT PULONG Size OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpAnsiPszToUnicodePsz(
|
|||
|
IN PCHAR AnsiString,
|
|||
|
IN WCHAR *UnicodeString,
|
|||
|
IN USHORT AnsiStringLength
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
RtlpDidUnicodeToOemWork(
|
|||
|
IN PCOEM_STRING OemString,
|
|||
|
IN PCUNICODE_STRING UnicodeString
|
|||
|
);
|
|||
|
|
|||
|
extern CONST CCHAR RtlpBitsClearAnywhere[256];
|
|||
|
extern CONST CCHAR RtlpBitsClearLow[256];
|
|||
|
extern CONST CCHAR RtlpBitsClearHigh[256];
|
|||
|
extern CONST CCHAR RtlpBitsClearTotal[256];
|
|||
|
|
|||
|
//
|
|||
|
// Macro that tells how many contiguous bits are set (i.e., 1) in
|
|||
|
// a byte
|
|||
|
//
|
|||
|
|
|||
|
#define RtlpBitSetAnywhere( Byte ) RtlpBitsClearAnywhere[ (~(Byte) & 0xFF) ]
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Macro that tells how many contiguous LOW order bits are set
|
|||
|
// (i.e., 1) in a byte
|
|||
|
//
|
|||
|
|
|||
|
#define RtlpBitsSetLow( Byte ) RtlpBitsClearLow[ (~(Byte) & 0xFF) ]
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Macro that tells how many contiguous HIGH order bits are set
|
|||
|
// (i.e., 1) in a byte
|
|||
|
//
|
|||
|
|
|||
|
#define RtlpBitsSetHigh( Byte ) RtlpBitsClearHigh[ (~(Byte) & 0xFF) ]
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Macro that tells how many set bits (i.e., 1) there are in a byte
|
|||
|
//
|
|||
|
|
|||
|
#define RtlpBitsSetTotal( Byte ) RtlpBitsClearTotal[ (~(Byte) & 0xFF) ]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Upcase data table
|
|||
|
//
|
|||
|
|
|||
|
extern PUSHORT Nls844UnicodeUpcaseTable;
|
|||
|
extern PUSHORT Nls844UnicodeLowercaseTable;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Macros for Upper Casing a Unicode Code Point.
|
|||
|
//
|
|||
|
|
|||
|
#define LOBYTE(w) ((UCHAR)((w)))
|
|||
|
#define HIBYTE(w) ((UCHAR)(((USHORT)((w)) >> 8) & 0xFF))
|
|||
|
#define GET8(w) ((ULONG)(((w) >> 8) & 0xff))
|
|||
|
#define GETHI4(w) ((ULONG)(((w) >> 4) & 0xf))
|
|||
|
#define GETLO4(w) ((ULONG)((w) & 0xf))
|
|||
|
|
|||
|
/***************************************************************************\
|
|||
|
* TRAVERSE844W
|
|||
|
*
|
|||
|
* Traverses the 8:4:4 translation table for the given wide character. It
|
|||
|
* returns the final value of the 8:4:4 table, which is a WORD in length.
|
|||
|
*
|
|||
|
* Broken Down Version:
|
|||
|
* --------------------
|
|||
|
* Incr = pTable[GET8(wch)];
|
|||
|
* Incr = pTable[Incr + GETHI4(wch)];
|
|||
|
* Value = pTable[Incr + GETLO4(wch)];
|
|||
|
*
|
|||
|
* DEFINED AS A MACRO.
|
|||
|
*
|
|||
|
* 05-31-91 JulieB Created.
|
|||
|
\***************************************************************************/
|
|||
|
|
|||
|
#define TRAVERSE844W(pTable, wch) \
|
|||
|
( (pTable)[(pTable)[(pTable)[GET8((wch))] + GETHI4((wch))] + GETLO4((wch))] )
|
|||
|
|
|||
|
//
|
|||
|
// NLS_UPCASE - Based on julieb's macros in nls.h
|
|||
|
//
|
|||
|
// We will have this upcase macro quickly shortcircuit out if the value
|
|||
|
// is within the normal ANSI range (i.e., < 127). We actually won't bother
|
|||
|
// with the 5 values above 'z' because they won't happen very often and
|
|||
|
// coding it this way lets us get out after 1 compare for value less than
|
|||
|
// 'a' and 2 compares for lowercase a-z.
|
|||
|
//
|
|||
|
|
|||
|
#define NLS_UPCASE(wch) ( \
|
|||
|
((wch) < 'a' ? \
|
|||
|
(wch) \
|
|||
|
: \
|
|||
|
((wch) <= 'z' ? \
|
|||
|
(wch) - ('a'-'A') \
|
|||
|
: \
|
|||
|
((WCHAR)((wch) + TRAVERSE844W(Nls844UnicodeUpcaseTable,(wch)))) \
|
|||
|
) \
|
|||
|
) \
|
|||
|
)
|
|||
|
|
|||
|
#define NLS_DOWNCASE(wch) ( \
|
|||
|
((wch) < 'A' ? \
|
|||
|
(wch) \
|
|||
|
: \
|
|||
|
((wch) <= 'Z' ? \
|
|||
|
(wch) + ('a'-'A') \
|
|||
|
: \
|
|||
|
((WCHAR)((wch) + TRAVERSE844W(Nls844UnicodeLowercaseTable,(wch)))) \
|
|||
|
) \
|
|||
|
) \
|
|||
|
)
|
|||
|
|
|||
|
#if DBG && defined(NTOS_KERNEL_RUNTIME)
|
|||
|
#define RTL_PAGED_CODE() PAGED_CODE()
|
|||
|
#else
|
|||
|
#define RTL_PAGED_CODE()
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The follow definition is used to support the Rtl compression engine
|
|||
|
// Every compression format that NT supports will need to supply
|
|||
|
// these set of routines in order to be called by NtRtl.
|
|||
|
//
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_COMPRESS_WORKSPACE_SIZE) (
|
|||
|
IN USHORT CompressionEngine,
|
|||
|
OUT PULONG CompressBufferWorkSpaceSize,
|
|||
|
OUT PULONG CompressFragmentWorkSpaceSize
|
|||
|
);
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_COMPRESS_BUFFER) (
|
|||
|
IN USHORT CompressionEngine,
|
|||
|
IN PUCHAR UncompressedBuffer,
|
|||
|
IN ULONG UncompressedBufferSize,
|
|||
|
OUT PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
IN ULONG UncompressedChunkSize,
|
|||
|
OUT PULONG FinalCompressedSize,
|
|||
|
IN PVOID WorkSpace
|
|||
|
);
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_DECOMPRESS_BUFFER) (
|
|||
|
OUT PUCHAR UncompressedBuffer,
|
|||
|
IN ULONG UncompressedBufferSize,
|
|||
|
IN PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
OUT PULONG FinalUncompressedSize
|
|||
|
);
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_DECOMPRESS_FRAGMENT) (
|
|||
|
OUT PUCHAR UncompressedFragment,
|
|||
|
IN ULONG UncompressedFragmentSize,
|
|||
|
IN PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
IN ULONG FragmentOffset,
|
|||
|
OUT PULONG FinalUncompressedSize,
|
|||
|
IN PVOID WorkSpace
|
|||
|
);
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_DESCRIBE_CHUNK) (
|
|||
|
IN OUT PUCHAR *CompressedBuffer,
|
|||
|
IN PUCHAR EndOfCompressedBufferPlus1,
|
|||
|
OUT PUCHAR *ChunkBuffer,
|
|||
|
OUT PULONG ChunkSize
|
|||
|
);
|
|||
|
|
|||
|
typedef NTSTATUS (*PRTL_RESERVE_CHUNK) (
|
|||
|
IN OUT PUCHAR *CompressedBuffer,
|
|||
|
IN PUCHAR EndOfCompressedBufferPlus1,
|
|||
|
OUT PUCHAR *ChunkBuffer,
|
|||
|
IN ULONG ChunkSize
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Here is the declarations of the LZNT1 routines
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlCompressWorkSpaceSizeLZNT1 (
|
|||
|
IN USHORT CompressionEngine,
|
|||
|
OUT PULONG CompressBufferWorkSpaceSize,
|
|||
|
OUT PULONG CompressFragmentWorkSpaceSize
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlCompressBufferLZNT1 (
|
|||
|
IN USHORT CompressionEngine,
|
|||
|
IN PUCHAR UncompressedBuffer,
|
|||
|
IN ULONG UncompressedBufferSize,
|
|||
|
OUT PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
IN ULONG UncompressedChunkSize,
|
|||
|
OUT PULONG FinalCompressedSize,
|
|||
|
IN PVOID WorkSpace
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlDecompressBufferLZNT1 (
|
|||
|
OUT PUCHAR UncompressedBuffer,
|
|||
|
IN ULONG UncompressedBufferSize,
|
|||
|
IN PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
OUT PULONG FinalUncompressedSize
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlDecompressFragmentLZNT1 (
|
|||
|
OUT PUCHAR UncompressedFragment,
|
|||
|
IN ULONG UncompressedFragmentSize,
|
|||
|
IN PUCHAR CompressedBuffer,
|
|||
|
IN ULONG CompressedBufferSize,
|
|||
|
IN ULONG FragmentOffset,
|
|||
|
OUT PULONG FinalUncompressedSize,
|
|||
|
IN PVOID WorkSpace
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlDescribeChunkLZNT1 (
|
|||
|
IN OUT PUCHAR *CompressedBuffer,
|
|||
|
IN PUCHAR EndOfCompressedBufferPlus1,
|
|||
|
OUT PUCHAR *ChunkBuffer,
|
|||
|
OUT PULONG ChunkSize
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlReserveChunkLZNT1 (
|
|||
|
IN OUT PUCHAR *CompressedBuffer,
|
|||
|
IN PUCHAR EndOfCompressedBufferPlus1,
|
|||
|
OUT PUCHAR *ChunkBuffer,
|
|||
|
IN ULONG ChunkSize
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlpSecMemFreeVirtualMemory(
|
|||
|
IN HANDLE ProcessHandle,
|
|||
|
IN OUT PVOID *BaseAddress,
|
|||
|
IN OUT PSIZE_T RegionSize,
|
|||
|
IN ULONG FreeType
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Define procedure prototypes for architecture specific debug support routines.
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DebugPrint(
|
|||
|
IN PSTRING Output,
|
|||
|
IN ULONG ComponentId,
|
|||
|
IN ULONG Level
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
DebugPrompt(
|
|||
|
IN PSTRING Output,
|
|||
|
IN PSTRING Input
|
|||
|
);
|
|||
|
|
|||
|
#endif // _NTRTLP_
|
|||
|
|
|||
|
//
|
|||
|
// Procedure prototype for exception logging routines.
|
|||
|
|
|||
|
ULONG
|
|||
|
RtlpLogExceptionHandler(
|
|||
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|||
|
IN PCONTEXT ContextRecord,
|
|||
|
IN ULONG_PTR ControlPc,
|
|||
|
IN PVOID HandlerData,
|
|||
|
IN ULONG Size
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RtlpLogLastExceptionDisposition(
|
|||
|
IN ULONG LogIndex,
|
|||
|
IN EXCEPTION_DISPOSITION Disposition
|
|||
|
);
|
|||
|
|
|||
|
#ifndef NTOS_KERNEL_RUNTIME
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
RtlCallVectoredExceptionHandlers(
|
|||
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|||
|
IN PCONTEXT ContextRecord
|
|||
|
);
|
|||
|
|
|||
|
#define NO_ALTERNATE_RESOURCE_MODULE ((PVOID)(LONG_PTR)-1)
|
|||
|
|
|||
|
typedef struct _ALT_RESOURCE_MODULE {
|
|||
|
//
|
|||
|
// Module handle for module known to application,
|
|||
|
// whose resource accesses we want to redirect.
|
|||
|
//
|
|||
|
PVOID ModuleBase;
|
|||
|
//
|
|||
|
// Module handle for module we loaded under the covers,
|
|||
|
// to which resource access will be redirected; will be
|
|||
|
// NO_ALTERNATE_RESOURCE_MODULE if we tried and failed to load
|
|||
|
// the alternate resource module for the module represented by
|
|||
|
// ModuleBase.
|
|||
|
//
|
|||
|
PVOID AlternateModule;
|
|||
|
} ALT_RESOURCE_MODULE, *PALT_RESOURCE_MODULE;
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
LdrpVerifyAlternateResourceModule(
|
|||
|
IN PWSTR LangID,
|
|||
|
IN PVOID Module,
|
|||
|
IN PVOID AlternateModule,
|
|||
|
IN LPWSTR BaseDllName
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
LdrpSetAlternateResourceModuleHandle(
|
|||
|
IN PVOID Module,
|
|||
|
IN PVOID AlternateModule
|
|||
|
);
|
|||
|
#endif
|
|||
|
|
|||
|
#define NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
|
|||
|
|
|||
|
#if !defined(NTOS_KERNEL_RUNTIME)
|
|||
|
|
|||
|
#if DBG
|
|||
|
PCUNICODE_STRING RtlpGetImagePathName(VOID);
|
|||
|
#define RtlpGetCurrentProcessId() (HandleToUlong(NtCurrentTeb()->ClientId.UniqueProcess))
|
|||
|
#define RtlpGetCurrentThreadId() (HandleToUlong(NtCurrentTeb()->ClientId.UniqueThread))
|
|||
|
#endif
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
RtlpThreadPoolGetActiveActivationContext(
|
|||
|
PACTIVATION_CONTEXT* ActivationContext
|
|||
|
);
|
|||
|
|
|||
|
#endif // !defined(NTOS_KERNEL_RUNTIME)
|
|||
|
|