163 lines
2.8 KiB
C
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
|