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.
 
 
 
 
 
 

192 lines
6.6 KiB

/*****************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990 **/
/*****************************************************************/
/** codepage.h - Code Page structures (disk & memory)
*
* HISTORY
* 19-May-1989 15:54:38 Mark Hitch [markh] first draft
* 31-Aug-1989 17:30:24 Greg Jones [gregj] moved to Pinball
* 03-Sep-1989 19:13:00 Greg Jones [gregj] added CPLIST structure
*/
/*
* Constant Definitions
*/
#define SBCS 0 /* single byte code */
#define DBCS 1 /* first of DBCS code */
#define DBCS_2 2 /* 2nd byte of DBCS code */
#define CASEMAP_SIZE 256 /* size of a casemap table */
#define DBCSFLAG_SIZE (CASEMAP_SIZE << 1) /* size of DBCS flag table */
#define PREMAPPED 0xff /* flag indicating that string */
/* is already casemapped */
#define DBCSCHAR 0x02 /* casemap table translates all DBCS */
/* start characters to this value */
/*** Code Page - disk image
*
* Each volume has one or more sectors which contain information about
* the code pages stored on the volume. This information contains the
* ordering (index) of each code page, the country code, the code page
* id, lsn and offset of the code page information.
*
* Each Code Page Info sector contains up to 31 code page descriptions
* (including the locations of the code page data).
*
* Each Code Page Data sector contains up to 3 entries of code page data.
*
* Since all code pages case conversion is identical for character
* values 0-127, only 128 bytes are necessary for code page case
* conversion information.
*
* DBCS pairs are packed, with a trailing 0,0 pair terminating the list.
* No DBCS is indicated by a 0,0 pair.
*
* Currently no DBCS Code Page has more than 2 byte pairs, but we don't
* want to limit it to that.
*
* Code Page 850 is only stored once, since the case table is the same for
* ALL countries, and there is never DBCS support. It is stored with a
* 0 country code for easy matching.
*
* If no Code Page is specified in Config.Sys, a code page (valid for the
* specified or default country) is loaded anyway. DosGetCP return 0, but
* HPFS saves the actual Code Page number.
*/
/** DBCS_RNGE - DBCS range byte pairs
*/
struct DBCS_RNGE {
unsigned char dbcs_rnge_start;
unsigned char dbcs_rnge_end;
}; /* DBCS_RNGE */
typedef struct DBCS_RNGE DBCS_RNGE;
typedef struct DBCS_RNGE * PDBCS_RNGE;
/** CPINFOENT - Code Page information entry
*
* For each code page described, contains country code, code page ID,
* checksum of code page data, lsn & offset of the code page data and
* the count of DBCS ranges.
*/
struct CPINFOENT {
unsigned short CPI_CNTRY; /* country code */
unsigned short CPI_CPID; /* code page id */
unsigned long CPI_CHKSUM; /* checksum of code page data */
unsigned long CPI_DATASEC; /* lsn containing code page data */
unsigned short CPI_INDEX; /* index of code page (on volume) */
unsigned short CPI_RNGECNT; /* # of DBCS ranges (0 -> no DBCS) */
}; /* CPINFOENT */
typedef struct CPINFOENT CPINFOENT;
typedef CPINFOENT * PCPINFOENT;
/** CPINFOSEC - Code Page information sector
*
* Each CodePageSector contains information about 31 code pages and
* which LSN contains the code page data. Also contains count
* of code pages described by the sector and the next CodePageSector
* lsn if there are more code pages.
*/
#define CPPERINFOSEC 31
struct CPINFOSEC {
unsigned long CP_SIG; /* signature of code page descriptor */
unsigned long CP_INFOCNT; /* count of cp info's in this lsn */
unsigned long CP_INDEX; /* index of 1st code page in this lsn */
unsigned long CP_NEXTSEC; /* next sector, if more Code Pages */
#ifdef MASM
unsigned char CP_INFO [512-16]; /* code page entries start here */
#else
struct CPINFOENT CP_INFO [CPPERINFOSEC]; /* code page entries */
#endif
}; /* CPINFOSEC */
typedef struct CPINFOSEC CPINFOSEC;
typedef CPINFOSEC * PCPINFOSEC;
/** CPDATASEC - Code Page Data Sector header
*
* Header of sector contain 1-3 code page data elements.
*/
#define CPPERDATASEC 3
struct CPDATASEC {
unsigned long CPS_SIG; /* == CPSSIGVAL */
unsigned short CPS_DATACNT; /* count of code pages in this sector */
unsigned short CPS_INDEX; /* index of first code page in sector */
unsigned long CPS_CHKSUM [CPPERDATASEC]; /* checksum of code page data area */
unsigned short CPS_OFFSET [CPPERDATASEC]; /* offset to each Code Page Data entry */
}; /* CPDATASEC */
typedef struct CPDATASEC CPDATASEC;
typedef CPDATASEC * PCPDATASEC;
/** CPDATAENT - Code Page Data entry
*
* For each code page, there is one of these structures. It contains
* the case conversion table for the upper half of the single-byte
* characters (the lower half is always translated using a fixed rule).
*/
struct CPDATAENT {
unsigned short CPD_CNTRY; /* country code */
unsigned short CPD_CPID; /* code page id */
unsigned short CPD_RNGECNT; /* # of DBCS ranges */
unsigned char CPD_TABLE [128]; /* case conversion table for byte values */
/* greater than 127 */
#ifdef MASM
unsigned char CPD_RNGE; /* leadbyte ranges start here */
#else
struct DBCS_RNGE CPD_RNGE [1]; /* variable array of byte pairs */
/* (CPD_RNGECNT + 1, with trailing 0,0) */
#endif
}; /* CPDATAENT */
typedef struct CPDATAENT CPDATAENT;
typedef CPDATAENT * PCPDATAENT;
/*** Code Page Sector Signatures
*/
#define VAL_M1 ((('M'-'A')*40+('A'-'A'))*40+'H'-'A')
#define VAL_M2 ((('M'-'A')*40+('G'-'A'))*40+'H'-'A')
#ifdef MASM
#define CPSIGVAL VAL_M1*40*40*40 + VAL_M2 /* infosec */
#define CPSSIGVAL 40000000h + VAL_M1*40*40*40 + VAL_M2 /* datasec */
#else
#define CPSIGVAL ((ULONG)VAL_M1*40*40*40 + (ULONG)VAL_M2 )
#define CPSSIGVAL (0x40000000L + (ULONG)VAL_M1*40*40*40 + (ULONG)VAL_M2)
#endif
/*
* Internal codepage structures for Pinball
*/
/*
* CPLISTENT - global structure which keeps track of all known codepages
* in the system. Each CPLIST describes one codepage, containing
* its codepage ID, country code, and casemap for all characters.
* DBCS lead bytes have already been mapped to 0x01 in the casemap.
*/
struct CPLISTENT {
unsigned long CPL_NEXT; /* ptr to next CPLIST in chain */
unsigned short CPL_COUNTRY; /* country code for this codepage */
unsigned short CPL_CODEPAGE; /* codepage ID for this codepage */
unsigned char CPL_free[3]; /* unused */
unsigned char CPL_DBCSFLAG; /* non-zero if codepage has DBCS */
unsigned char CPL_CASEMAP [256]; /* table mapping chars to uppercase */
}; /* CPLISTENT */