mirror of https://github.com/lianthony/NT4.0
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
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 */
|