Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

684 lines
20 KiB

typedef char * pchar_t;
typedef const char * pcchar_t;
#define TRUE 1
#define FALSE 0
// The 'operator-code' values for the decorated name specification
#define OC_ctor ((unsigned char)'0')
#define OC_dtor ((unsigned char)'1')
#define OC_new ((unsigned char)'2')
#define OC_delete ((unsigned char)'3')
#define OC_assign ((unsigned char)'4')
#define OC_rshift ((unsigned char)'5')
#define OC_lshift ((unsigned char)'6')
#define OC_not ((unsigned char)'7')
#define OC_equal ((unsigned char)'8')
#define OC_unequal ((unsigned char)'9')
#define OC_index ((unsigned char)'A')
#define OC_udc ((unsigned char)'B')
#define OC_pointer ((unsigned char)'C')
#define OC_star ((unsigned char)'D')
#define OC_incr ((unsigned char)'E')
#define OC_decr ((unsigned char)'F')
#define OC_minus ((unsigned char)'G')
#define OC_plus ((unsigned char)'H')
#define OC_amper ((unsigned char)'I')
#define OC_ptrmem ((unsigned char)'J')
#define OC_divide ((unsigned char)'K')
#define OC_modulo ((unsigned char)'L')
#define OC_less ((unsigned char)'M')
#define OC_leq ((unsigned char)'N')
#define OC_greater ((unsigned char)'O')
#define OC_geq ((unsigned char)'P')
#define OC_comma ((unsigned char)'Q')
#define OC_call ((unsigned char)'R')
#define OC_compl ((unsigned char)'S')
#define OC_xor ((unsigned char)'T')
#define OC_or ((unsigned char)'U')
#define OC_land ((unsigned char)'V')
#define OC_lor ((unsigned char)'W')
#define OC_asmul ((unsigned char)'X')
#define OC_asadd ((unsigned char)'Y')
#define OC_assub ((unsigned char)'Z')
#define OC_asdiv ((unsigned char)'0')
#define OC_asmod ((unsigned char)'1')
#define OC_asrshift ((unsigned char)'2')
#define OC_aslshift ((unsigned char)'3')
#define OC_asand ((unsigned char)'4')
#define OC_asor ((unsigned char)'5')
#define OC_asxor ((unsigned char)'6')
#define OC_vftable ((unsigned char)'7')
#define OC_vbtable ((unsigned char)'8')
#define OC_vcall ((unsigned char)'9')
#define OC_metatype ((unsigned char)'A')
#define OC_guard ((unsigned char)'B')
#define OC_uctor ((unsigned char)'C')
#define OC_udtor ((unsigned char)'D')
#define OC_vdeldtor ((unsigned char)'E')
#define OC_defctor ((unsigned char)'F')
#define OC_sdeldtor ((unsigned char)'G')
#define OC_vctor ((unsigned char)'H')
#define OC_vdtor ((unsigned char)'I')
#define OC_vallctor ((unsigned char)'J')
// Values for the 'type-encoding'
#define TE_isbadtype(t) ((t)==0xFFFF)
#define TE_setisbadtype(t) ((t)=0xFFFF)
#define TE_istruncated(t) ((t)==0xFFFE)
#define TE_setistruncated(t) ((t)=0xFFFE)
#define TE_isfunction(t) ((t)&0x8000)
#define TE_setisfunction(t) ((t)|=0x8000)
#define TE_isbased(t) ((t)&0x4000)
#define TE_setisbased(t) ((t)|=0x4000)
#define TE_isnear(t) (((t)&0x2000)==0x0000)
#define TE_setisnear(t) ((t)&=~0x2000)
#define TE_isfar(t) ((t)&0x2000)
#define TE_setisfar(t) ((t)|=0x2000)
#define TE_ismember(t) (TE_isfunction(t)?(((t)&0x1800)==0x0800):(((t)&0x6000)==0x0000))
#define TE_setismember(t) (TE_isfunction(t)?((t)=(((t)&~0x1800)|0x0800)):((t)=((t)&~0x6000)))
#define TE_isvirtual(t) (TE_isfunction(t)&&(((t)&0x0700)==0x0100))
#define TE_setisvirtual(t) ((t)=(((t)&~0x0700)|0x0100))
#define TE_isthunk(t) (TE_ismember(t)?((t)&0x0400):((t)&0x1000))
#define TE_isvcall(t) (TE_isfunction(t)?(((t)&0x1800)==0x1800):0)
#define TE_setisvcall(t) ((t)=(((t)&~0x9800)|0x9800))
#define TE_islocaldtor(t) (TE_isfunction(t)?(((t)&0x1800)==0x1000):0)
#define TE_setislocaldtor(t) ((t)=(((t)&~0x9800)|0x9000))
#define TE_isadjustor(t) (TE_ismember(t)&&(((t)&0x0700)==0x0400))
#define TE_setisadjustor(t) ((t)=(((t)&~0x0700)|0x0400))
#define TE_isvtoradj(t) (TE_ismember(t)&&(((t)&0x0700)==0x0500))
#define TE_setisvtoradj(t) ((t)=(((t)&~0x0700)|0x0500))
#define TE_ispublic(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0000):(((t)&0x1800)==0x0000)))
#define TE_setispublic(t) ((t)=(TE_isfunction(t)?((t)&~0x00C0):((t)&~0x1800)))
#define TE_isprivate(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0040):(((t)&0x1800)==0x0800)))
#define TE_setisprivate(t) ((t)=(TE_isfunction(t)?(((t)&~0x00C0)|0x0040):(((t)&~0x1800)|0x0800)))
#define TE_isprotected(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x00C0)==0x0080):(((t)&0x1800)==0x1000)))
#define TE_setisprotected(t) ((t)=(TE_isfunction(t)?(((t)&~0x00C0)|0x0080):(((t)&~0x1800)|0x1000)))
#define TE_isstatic(t) (TE_ismember(t)&&(TE_isfunction(t)?(((t)&0x0700)==0x0200):1))
#define TE_setisstatic(t) ((t)=(TE_isfunction(t)?(((t)&~0x0700)|0x0200):TE_setismember(t)))
#define TE_isdata(t) (!TE_isfunction(t))
#define TE_setisdata(t) ((t)&=~0x8000)
#define TE_isguard(t) (TE_isdata(t)&&(((t)&0x7800)==0x6000))
#define TE_setisguard(t) ((t)=(((t)&~0x7800)|0x6000))
#define TE_isvftable(t) (TE_isdata(t)&&(((t)&0x7800)==0x6800))
#define TE_setisvftable(t) ((t)=(((t)&~0x7800)|0x6800))
#define TE_isvbtable(t) (TE_isdata(t)&&(((t)&0x7800)==0x7000))
#define TE_setisvbtable(t) ((t)=(((t)&~0x7800)|0x7000))
#define TE_ismetaclass(t) (TE_isdata(t)&&(((t)&0x7800)==0x7800))
#define TE_setismetaclass(t) ((t)=(((t)&~0x7800)|0x7800))
#define TE_islocal(t) (TE_isdata(t)&&(((t)&0x6000)==0x2000))
#define TE_setislocal(t) ((t)=(((t)&~0x6000)|0x2000))
#define TE_isglobal(t) (TE_isdata(t)&&(((t)&0x6000)==0x4000))
#define TE_setisglobal(t) ((t)=(((t)&~0x6000)|0x4000))
#define TE_member ((unsigned char)0)
#define TE_static ((unsigned char)2)
#define TE_virtual ((unsigned char)4)
#define TE_adjustor ((unsigned char)6)
#define TE_external ((unsigned char)24)
#define TE_far ((unsigned char)0x01)
#define TE_private ((unsigned char)0x00)
#define TE_protect ((unsigned char)0x08)
#define TE_public ((unsigned char)0x10)
#define TE_access (TE_protect|TE_public)
#define TE_private_d ((unsigned char)0x00)
#define TE_protect_d ((unsigned char)0x01)
#define TE_public_d ((unsigned char)0x02)
#define TE_access_d (TE_protect_d|TE_public_d)
#define TE_private_vadj ((unsigned char)0x00)
#define TE_protect_vadj ((unsigned char)0x02)
#define TE_public_vadj ((unsigned char)0x04)
#define TE_access_vadj (TE_protect_vadj|TE_public_vadj)
#define TE_static_d ((unsigned char)'0')
#define TE_global ((unsigned char)'3')
#define TE_local ((unsigned char)'4')
#define TE_guard ((unsigned char)'5')
#define TE_vftable ((unsigned char)'6')
#define TE_vbtable ((unsigned char)'7')
#define TE_metatype ((unsigned char)'8')
// Values for the 'data-indirect-type'
#define DIT_near ((unsigned char)0x00)
#define DIT_far ((unsigned char)0x04)
#define DIT_huge ((unsigned char)0x08)
#define DIT_based ((unsigned char)0x0C)
#define DIT_modelmask ((unsigned char)0x0C)
#define DIT_const ((unsigned char)0x01)
#define DIT_volatile ((unsigned char)0x02)
#define DIT_member ((unsigned char)0x10)
// Values for the 'calling-convention'
#define CC_cdecl ((unsigned char)0x00)
#define CC_pascal ((unsigned char)0x02)
#define CC_thiscall ((unsigned char)0x04)
#define CC_stdcall ((unsigned char)0x06)
#define CC_fastcall ((unsigned char)0x08)
#define CC_interrupt ((unsigned char)0x0A)
#define CC_saveregs ((unsigned char)0x01)
// Values for the 'data-type'
#define DT_void 'X'
// Values for the 'reference-data-type'
#define RDT_array 'Y'
// Values for the 'pointer-data-type'
#define PoDT_void 'X'
// Values for the 'primary-data-type'
#define PDT_reference 'A'
#define PDT_volatileReference 'B'
// Values for the 'basic-data-type'
#define BDT_unsigned 0x01
#define BDT_const 0x01
#define BDT_volatile 0x02
#define BDT_schar 'C'
#define BDT_char 'D'
#define BDT_short 'F'
#define BDT_int 'H'
#define BDT_long 'J'
#define BDT_segment 'L'
#define BDT_float 'M'
#define BDT_double 'N'
#define BDT_longdouble 'O'
#define BDT_pointer 'P'
#define BDT_union 'T'
#define BDT_struct 'U'
#define BDT_class 'V'
#define BDT_enum 'W'
// Adding big ints overflows the available BDT_* codes, so we extend to
// 2 char codes, with a '_' as a lead in char
#define BDT_extend '_' //1st char of 2 char codes
#define BDT_int8 'D'
#define BDT_int16 'F'
#define BDT_int32 'H'
#define BDT_int64 'J'
#define BDT_int128 'L'
#define BDT_wchar_t 'V' // BUGBUG: Was 'W' in the Languages source
#define BDT_sint64 'A' // BUGBUG: The Languages source doesn't use
#define BDT_uint64 'B' // either of these values...
// Values for the 'enum-type'
#define ET_schar '0'
#define ET_uchar '1'
#define ET_sshort '2'
#define ET_ushort '3'
#define ET_sint '4'
#define ET_uint '5'
#define ET_slong '6'
#define ET_ulong '7'
// Values for the 'function-indirect-type'
#define FIT_near 0x00
#define FIT_far 0x01
#define FIT_member 0x02
#define FIT_based 0x04
// Values for the 'function-indirect-type'
#define AT_void 'X'
#define AT_ellipsis 'Z'
#define AT_endoflist '@'
// Values for 'indirect-type'
#define IT_isfunction(it) ((((it)>='6')&&((it)<='9'))||((it)=='_'))
// Values for the 'based-type'
#define BT_void '0'
#define BT_self '1'
#define BT_nearptr '2'
#define BT_farptr '3'
#define BT_hugeptr '4'
#define BT_basedptr '5'
#define BT_segment '6'
#define BT_segname '7'
#define BT_segaddr '8'
// Values for the 'based-type'
//#define TT_illegal '@' // An illegal value to keep the algorithm happy
// Values for the 'ecsu-data-indirect-type'
#define ECSU_near DIT_near
#define ECSU_far DIT_far
#define ECSU_huge DIT_huge
#define ECSU_based DIT_based
#define ECSU_modelmask DIT_modelmask
#define ECSU_const DIT_const
#define ECSU_volatile DIT_volatile
#define ECSU_valid (0x8000)
#define ECSU_invalid (0xFFFF)
#define ECSU_truncated (0xFFFE)
// Value for the 'vcall-model-type'
#define VMT_nTnCnV 'A'
#define VMT_nTfCnV 'B'
#define VMT_fTnCnV 'C'
#define VMT_fTfCnV 'D'
#define VMT_nTnCfV 'E'
#define VMT_nTfCfV 'F'
#define VMT_fTnCfV 'G'
#define VMT_fTfCfV 'H'
#define VMT_nTnCbV 'I'
#define VMT_nTfCbV 'J'
#define VMT_fTnCbV 'K'
#define VMT_fTfCbV 'L'
// Values for the 'letter' and 'number'
#define isValidLetter(n) (((n)=='_')||((n)=='$')||(((n)>='a')&&((n)<='z'))||(((n)>='A')&&((n)<='Z')))
#define isValidNumber(n) (((n)>='0')&&((n)<='9'))
#define isValidIdentChar(n) (isValidLetter(n)||isValidNumber(n))
// Values for the 'template-constant'
#define TC_nullptr '@'
#define TC_integral '0'
#define TC_address '1'
#define TC_fp '2'
#define virtual
const unsigned int memBlockSize = 508; // A '512' byte block including the header
class DName;
class DNameNode;
class Replicator;
class HeapManager;
class UnDecorator;
class charNode;
class pcharNode;
class pDNameNode;
class DNameStatusNode;
enum DNameStatus
{
DN_valid,
DN_invalid,
DN_truncated,
DN_error
};
enum NodeType
{
charNode_t,
pcharNode_t,
pDNameNode_t,
DNameStatusNode_t
};
enum Tokens
{
TOK_near,
TOK_nearSp,
TOK_nearP,
TOK_far,
TOK_farSp,
TOK_farP,
TOK_huge,
TOK_hugeSp,
TOK_hugeP,
TOK_basedLp,
TOK_cdecl,
TOK_pascal,
TOK_stdcall,
TOK_thiscall,
TOK_fastcall,
TOK_interrupt,
TOK_saveregs,
TOK_self,
TOK_segment,
TOK_segnameLpQ
};
class HeapManager
{
private:
struct Block {
Block * next;
void * memory;
Block () { next = 0;}
};
Block * head;
Block * tail;
unsigned int blockLeft;
public:
HeapManager ();
~HeapManager ();
void *getMemory ( unsigned int );
#define gnew new(heap,0)
#define rnew new(heap,1)
};
class DName
{
public:
DName ();
DName ( char );
DName ( const DName & );
DName ( DNameNode * );
DName ( pcchar_t );
DName ( pcchar_t&, char );
DName ( DNameStatus );
DName ( DName * );
DName ( unsigned long );
int isValid () const;
int isEmpty () const;
DNameStatus status () const;
DName & setPtrRef ();
int isPtrRef () const;
int isUDC () const;
int isSpecial () const;
void setIsUDC ();
void setIsSpecial ();
int length () const;
pchar_t getString ( pchar_t, int ) const;
DName operator + ( pcchar_t ) const;
DName operator + ( const DName & ) const;
DName operator + ( char ) const;
DName operator + ( DName * ) const;
DName operator + ( DNameStatus ) const;
DName & operator += ( char );
DName & operator += ( pcchar_t );
DName & operator += ( DName * );
DName & operator += ( DNameStatus );
DName & operator += ( const DName & );
DName & operator |= ( const DName & );
DName & operator = ( pcchar_t );
DName & operator = ( const DName & );
DName & operator = ( char );
DName & operator = ( DName * );
DName & operator = ( DNameStatus );
// Friends :
friend DName operator + ( char, const DName & );
friend DName operator + ( pcchar_t, const DName & );
friend DName operator + ( DNameStatus, const DName & );
private:
DNameNode * node;
DNameStatus stat;
unsigned int isIndir;
unsigned int isAUDC;
unsigned int isSpecialSym;
void doPchar ( pcchar_t, int );
};
class Replicator
{
private:
// Declare, in order to suppress automatic generation
void operator = ( const Replicator& );
int index;
DName * dNameBuffer[ 10 ];
const DName ErrorDName;
const DName InvalidDName;
public:
Replicator ();
int isFull () const;
Replicator & operator += ( const DName & );
const DName & operator [] ( int ) const;
};
class UnDecorator
{
private:
// Declare, in order to suppress automatic generation
void operator = ( const UnDecorator& );
Replicator ArgList;
Replicator ZNameList;
Replicator TemplateArgList;
Replicator * pArgList;
Replicator * pZNameList;
Replicator * pTemplateArgList;
pcchar_t gName;
pcchar_t name;
pchar_t outputString;
DWORD maxStringLength;
DWORD disableFlags;
DName getDecoratedName ( void );
DName getSymbolName ( void );
DName getZName ( void );
DName getOperatorName ( void );
DName getScope ( void );
DName getDimension ( void );
DName getSignedDimension ( void );
int getNumberOfDimensions ( void );
DName getTemplateName ( void );
DName getTemplateArgumentList( void );
DName getTemplateConstant( void );
DName composeDeclaration ( const DName & );
int getTypeEncoding ( void );
DName getBasedType ( void );
DName getECSUName ( void );
DName getEnumName ( void );
DName getCallingConvention ( void );
DName getReturnType ( DName * = 0 );
DName getDataType ( DName * );
DName getPrimaryDataType ( const DName & );
DName getDataIndirectType ( const DName &, char, const DName &, int = FALSE );
DName getDataIndirectType ();
DName getBasicDataType ( const DName & );
DName getECSUDataType ( int = 0 );
int getECSUDataIndirectType ();
DName getPtrRefType ( const DName &, const DName &, int );
DName getPtrRefDataType ( const DName &, int );
DName getArrayType ( DName * );
DName getArgumentTypes ( void );
DName getArgumentList ( void );
DName getThrowTypes ( void );
DName getLexicalFrame ( void );
DName getStorageConvention ( void );
DName getThisType ( void );
DName getPointerType ( const DName &, const DName & );
DName getReferenceType ( const DName &, const DName & );
DName getExternalDataType ( const DName & );
DName getSegmentName ( void );
DName getDisplacement ( void );
DName getCallIndex ( void );
DName getGuardNumber ( void );
DName getVfTableType ( const DName & );
DName getVbTableType ( const DName & );
DName getVCallThunkType ( void );
public:
UnDecorator ( pchar_t, pcchar_t, DWORD, DWORD );
int doUnderScore ();
int doMSKeywords ();
int doFunctionReturns ();
int doArguments ();
int doSpecial ();
int doAllocationModel ();
int doAllocationLanguage ();
int doThisTypes ();
int doAccessSpecifiers ();
int doThrowTypes ();
int doMemberTypes ();
int doReturnUDTModel ();
int do32BitNear ();
int doNameOnly ();
pcchar_t UScore ( Tokens );
operator pchar_t ();
};
class DNameNode
{
public:
virtual int length () const;
virtual pchar_t getString ( pchar_t, int ) const;
DNameNode * clone ();
DNameNode * nextNode () const;
DNameNode & operator += ( DNameNode * );
private:
NodeType typeIndex;
DNameNode * next;
protected:
DNameNode ( NodeType );
DNameNode ( const DNameNode & );
};
class charNode : public DNameNode
{
public:
charNode ( char );
virtual int length () const;
virtual pchar_t getString ( pchar_t, int ) const;
private:
char me;
};
class pcharNode : public DNameNode
{
public:
pcharNode ( pcchar_t, int = 0 );
virtual int length () const;
virtual pchar_t getString ( pchar_t, int ) const;
private:
pchar_t me;
int myLen;
};
class pDNameNode : public DNameNode
{
public:
pDNameNode ( DName * );
virtual int length () const;
virtual pchar_t getString ( pchar_t, int ) const;
private:
DName * me;
};
#define TruncationMessage (" ?? ")
#define TruncationMessageLength (4)
class DNameStatusNode : public DNameNode
{
private:
DNameStatus me;
int myLen;
public:
DNameStatusNode ( DNameStatus );
virtual int length () const;
virtual pchar_t getString ( pchar_t, int ) const;
};