windows-nt/Source/XPSP1/NT/base/wow64/mscpu/inc/entrypt.h
2020-09-26 16:20:57 +08:00

163 lines
2.8 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
entrypt.h
Abstract:
The interface to the entry point module.
Author:
16-Jun-1995 t-orig
Revision History:
--*/
#ifndef _ENTRYPT_H_
#define _ENTRYPT_H_
//
// Time to wait, in milliseconds, to sleep before retrying a memory
// allocation which failed due to lack of free pages.
//
#define CPU_WAIT_FOR_MEMORY_TIME 200
//
// Number of times to retry memory allocations
//
#define CPU_MAX_ALLOCATION_RETRIES 4
// Note: if BOTH is defined, than the code compiled will allow one to
// retrieve an entry point structure from either an intel or native
// address. If both is not defined, than an entry point structure
// can only be retrieved from an intel address. Defining both
// increases the cost (time and space) of most operation by a
// factor of 2.
//#define BOTH
// Set this to 1 if you suspect there is a heap corruption which is
// trashing the red-black trees. It creates a second red-black tree
// which mirrors the first, and walks both trees frequently to ensure
// they actually match. Since the checking mechanism uses NT asserts,
// this only works on a checked NT build using a checked CPU.
#define DBG_DUAL_TREES 0
//
// This timestamp is bumped whenever an entrypoint is added, split, or
// when all entrypoits are flushed. It an be used to determine if
// the entrypoints need to be re-searched afte switching from an Mrsw
// reader to an Mrsw Writer.
//
extern DWORD EntrypointTimestamp;
// The Entry Point Structure
typedef struct _entryPoint {
PVOID intelStart;
PVOID intelEnd;
PVOID nativeStart;
PVOID nativeEnd;
USHORT FlagsNeeded;
struct _entryPoint *SubEP;
#ifdef CODEGEN_PROFILE
ULONG SequenceNumber;
ULONG ExecutionCount;
ULONG CreationTime;
#endif
} ENTRYPOINT, *PENTRYPOINT;
// The colors
typedef enum {RED, BLACK} COL;
// The EPNODE structure
typedef struct _epNode
{
ENTRYPOINT ep;
struct _epNode *intelLeft;
struct _epNode *intelRight;
struct _epNode *intelParent;
COL intelColor;
#ifdef BOTH
struct _epNode *nativeLeft;
struct _epNode *nativeRight;
struct _epNode *nativeParent;
COL riscColor;
#endif
#if DBG_DUAL_TREES
struct _epNode *dual;
#endif
} EPNODE, *PEPNODE;
// Prototypes
INT
initializeEntryPointModule(
void
);
PENTRYPOINT
EPFromIntelAddr(
PVOID intelAddr
);
PENTRYPOINT
GetNextEPFromIntelAddr(
PVOID intelAddr
);
VOID
FlushEntrypoints(
VOID
);
#ifdef BOTH
PENTRYPOINT
EPFromNativeAddr(
PVOID nativeAddr
);
#endif
INT
insertEntryPoint(
PEPNODE pNewEntryPoint
);
INT
removeEntryPoint(
PEPNODE pEP
);
PVOID
EPAlloc(
DWORD cb
);
VOID
EPFree(
VOID
);
INT
initEPAlloc(
VOID
);
BOOLEAN
IsIntelRangeInCache(
PVOID Addr,
DWORD Length
);
#endif