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.
 
 
 
 
 
 

134 lines
4.1 KiB

/*****************************************************************************
* *
* BTPRIV.H *
* *
* Copyright (C) Microsoft Corporation 1989 - 1994 *
* All Rights reserved. *
* *
*****************************************************************************/
#ifndef HC_H
#include "hc.h"
#endif
// cache flags
const BYTE CACHE_DIRTY = 1; // means block has been modified in memory
const BYTE CACHE_VALID = 4; // means block is in memory
/***************************************************************************\
*
* Macros
*
\***************************************************************************/
// Get the real size of a cache block
#define CbCacheBlock(qbthr) \
(sizeof(CACHE_BLOCK) - sizeof(DISK_BLOCK) + (qbthr)->bth.cbBlock)
// convert a BK into a file offset
#define LifFromBk(bk, qbthr) \
((int) (bk) * (int) (qbthr)->bth.cbBlock + (int) sizeof(BTH))
// get a pointer to the cache block cached for the given level
#define QCacheBlock(qbthr, wLevel) \
((PCACHE) ((qbthr) ->pCache + (wLevel) * CbCacheBlock(qbthr)))
// get and set prev and next BK (defined for leaf blocks only)
#define BkPrev(pcache) *(BK *) ((pcache)->db.rgbBlock)
#define BkNext(pcache) *(((BK *) ((pcache)->db.rgbBlock)) + 1)
#define SetBkPrev(pcache, bk) (BkPrev(pcache) = (BK) bk)
#define SetBkNext(pcache, bk) (BkNext(pcache) = (BK) bk)
// For btree map functions: returns byte number of x-th btree map record
#define LcbFromBk(x) (sizeof(BK) + x * sizeof(MAPREC))
/***************************************************************************\
*
* Types
*
\***************************************************************************/
// In-memory struct referring to a btree.
/*
Btree leaf or internal node. Keys and records live in rgbBlock[].
See btree.doc for details.
*/
// REVIEW: change to 32-bit integer for alignment?
typedef struct {
INT16 cbSlack; // unused bytes in block
INT16 cKeys; // count of keys in block
BYTE rgbBlock[1]; // the block (real size cbBlock - 4)
} DISK_BLOCK;
// Btree node as it exists in the in-memory cache.
// REVIEW: bFlags has been changed to 32-bit values for alignment
typedef struct {
DWORD bk; // IDs which block is cached
DWORD bFlags; // dirty, cache valid
DISK_BLOCK db;
} CACHE_BLOCK, *PCACHE;
// One record of a btree map.
typedef struct { // One record of a btree map {
LONG cPreviousKeys; // total # of keys in previous blocks
BK bk; // The block number
} MAPREC, *QMAPREC;
/*
Auxiliary index of btree leaves.
Used for indexing a given % of the way into a btree.
*/
typedef struct {
INT16 cTotalBk;
MAPREC table[1]; // sorted by MAPREC's cPreviousKeys field
} MAPBT, *QMAPBT; // and is in-order list of leaf nodes
/***************************************************************************\
*
* Function Prototypes
*
\***************************************************************************/
int STDCALL CbSizeKey(KEY, QBTHR, BOOL);
int STDCALL CbSizeRec(void*, QBTHR);
BOOL STDCALL FReadBlock(PCACHE, QBTHR);
PCACHE STDCALL QFromBk(DWORD, int, QBTHR);
RC_TYPE STDCALL RcWriteBlock(PCACHE, QBTHR);
int STDCALL WCmpKey(KEY, KEY, KT);
RC_TYPE STDCALL RcFlushCache(QBTHR);
// KT specific routines
RC_TYPE STDCALL RcScanLeaf(BK bk, KEY key, int wLevel, QBTHR qbthr, void* qRec, QBTPOS qbtpos);
BK STDCALL BkScanInternal(BK bk, KEY key, int wLevel, QBTHR qbthr, int* piKey);
BK STDCALL BkScanSzInternal(BK, KEY, int, QBTHR, int*);
RC_TYPE STDCALL RcScanSzLeaf(BK, KEY, int, QBTHR, void*, QBTPOS);
BK STDCALL BkScanLInternal(BK, KEY, int, QBTHR, int*);
RC_TYPE STDCALL RcScanLLeaf(BK, KEY, int, QBTHR, void*, QBTPOS);
BK STDCALL BkScanSziInternal(BK, KEY, int, QBTHR, int*);
RC_TYPE STDCALL RcScanSziLeaf(BK, KEY, int, QBTHR, void*, QBTPOS);
BK STDCALL BkScanSziScandInternal(BK, KEY, int, QBTHR, int*);
RC_TYPE STDCALL RcScanSziScandLeaf(BK, KEY, int, QBTHR, void*, QBTPOS);
BK STDCALL BkScanSzNLSInternal(BK bk, KEY key, int wLevel, QBTHR qbthr, int* piKey);
RC_TYPE STDCALL RcScanSzNLSLeaf(BK, KEY, int, QBTHR, void*, QBTPOS);
DWORD STDCALL BkAlloc(QBTHR qbthr);