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.
468 lines
16 KiB
468 lines
16 KiB
/*****************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1988-1990 **/
|
|
/*****************************************************************/
|
|
/*** GLB.C - Declarations of global variables.
|
|
*
|
|
* DAMAGE
|
|
* Gregory A. Jones
|
|
*
|
|
* Modification history:
|
|
* G.A. Jones 09/07/88 Adapted from CHKDSK code.
|
|
* G.A. Jones 09/08/88 Added object stack declaration.
|
|
* G.A. Jones 09/09/88 Added item array, more messages.
|
|
* G.A. Jones 09/13/88 Added filesize variable.
|
|
* G.A. Jones 09/19/88 Changed number of items in a DIRENT.
|
|
* G.A. Jones 09/19/88 Added xxx_off[], xxx_siz[] arrays.
|
|
* G.A. Jones 09/20/88 Added date codes to xxx_siz[] arrays.
|
|
* G.A. Jones 09/20/88 Message fixes, month array.
|
|
* G.A. Jones 09/21/88 Added hfmax variable for HFSEC dump.
|
|
* G.A. Jones 10/12/88 Moved ATIM, CTIM from FNODE to DIRENT.
|
|
* G.A. Jones 10/19/88 Added dirblk banding support.
|
|
* davidbro 4/20/89 Added keystroke save/replay functionality
|
|
* S. Hern 4/25/89 Added redirect_input variable
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include "defs.h"
|
|
#include "types.h"
|
|
|
|
UCHAR disk_name [80]; /* holds the name of the disk to check */
|
|
USHORT disk_handle = 0; /* disk handle for direct access */
|
|
USHORT change = 0; /* set non-zero if /D specified */
|
|
USHORT redirect_input = 0; /* allow redirected input */
|
|
USHORT fUnsafe = 0; /* write without locking */
|
|
|
|
UCHAR *szKeySave = NULL; // NULL if not saving keystrokes,
|
|
// set to filename of save file by the
|
|
// /K: option
|
|
|
|
UCHAR *szKeyReplay = NULL; // NULL if not replaying keystrokes
|
|
// from a file, set to filename of
|
|
// replay file by /R: option
|
|
|
|
UCHAR *szLogFile = NULL; // NULL if no log file specified, set
|
|
// to filename of the log file by the
|
|
// /L: option
|
|
|
|
FILE *fpSave; // file for saving keystrokes
|
|
FILE *fpReplay; // file for replaying keystrokes
|
|
FILE *fpLog; // file for logging information
|
|
|
|
/*
|
|
* Various error messages for common exit problems.
|
|
*/
|
|
|
|
UCHAR version_str [] = "Pinball DAMAGE version 1.10\n";
|
|
UCHAR timestamp_str [] = "Built %s %s\n\n";
|
|
|
|
UCHAR argument_error_str [] = "Invalid parameter";
|
|
UCHAR open_error_str [] = "Cannot open drive";
|
|
UCHAR unknown_error_str [] = "Unknown error code %d";
|
|
UCHAR insf_mem_error_str [] = "Insufficient memory";
|
|
UCHAR read_error_str [] = "Error reading disk";
|
|
UCHAR write_error_str [] = "Error writing disk";
|
|
UCHAR usage_str [] = "Usage: DAMAGE [d:] [/d]\n";
|
|
UCHAR nonext_str [] = "There is no 'next' field in this structure.\n";
|
|
UCHAR noprev_str [] = "There is no 'previous' field in this structure.\n";
|
|
UCHAR cantsave_str [] = "Cannot open keystroke save file";
|
|
UCHAR cantreplay_str [] = "Cannot open keystroke replay file";
|
|
UCHAR cantlog_str [] = "Cannot open log file";
|
|
|
|
UCHAR *error_messages [] = {
|
|
"Successful operation",
|
|
argument_error_str,
|
|
open_error_str,
|
|
insf_mem_error_str,
|
|
read_error_str,
|
|
write_error_str,
|
|
cantsave_str,
|
|
cantreplay_str,
|
|
cantlog_str
|
|
};
|
|
|
|
UCHAR *bitmap = NULL; /* pointer to first copy of bitmap */
|
|
UCHAR *bitmap2 = NULL; /* pointer to second copy of bitmap */
|
|
|
|
ULONG number_of_sectors = 0L; /* number of sectors in partition */
|
|
ULONG partition_offset = 0L; /* where the partitions starts */
|
|
|
|
union blk scratch_blk; /* to read disk structures temporarily */
|
|
|
|
UCHAR curpath [1024]; /* which directory is being checked */
|
|
UCHAR scratch [512]; /* general scratch area -- input etc. */
|
|
ULONG filesize; /* size of currently displayed file */
|
|
USHORT hfmax; /* number of hotfix entries */
|
|
|
|
UCHAR *zeros; /* for zeroing blocks */
|
|
|
|
struct diskpacket dp; /* IOCTL packet for disk I/O */
|
|
struct parmpacket prm; /* contains volume's dimensions */
|
|
struct mbr ourmbr; /* contains image of master boot rec. */
|
|
|
|
/*
|
|
* The following arrays make it easy to get at signatures and block
|
|
* sizes without IF statements. They are ordered according to the
|
|
* TYPE_xxxx definitions in DEFS.H. If those definitions are changed,
|
|
* make sure that these arrays still match.
|
|
*/
|
|
|
|
USHORT sizes [] = {
|
|
SECTORS_PER_DIRBLK, SECTORS_PER_FNODE, SECTORS_PER_AB, SECTORS_PER_FNODE
|
|
};
|
|
|
|
ULONG sigs [] = {
|
|
DBSIGVAL, FNSIGVAL, ABSIGVAL, FNSIGVAL
|
|
};
|
|
|
|
/*
|
|
* This array defines the number of items in each kind of structure.
|
|
* For ordinary structures a positive number is recorded. Structures
|
|
* which are basically arrays, such as data runs, bitmaps, and bitmap
|
|
* indirect blocks, have special values recorded which indicate that
|
|
* an offset (in bytes or dwords) should be requested from the user.
|
|
* The array is indexed by a TYPE_xxxx value.
|
|
*/
|
|
|
|
#ifndef CODEPAGE
|
|
int maxitem [] = {
|
|
15, /* items in a super block */
|
|
100, /* bitmap indirect is an array of longwords - 100 on screen at a time */
|
|
-2, /* bitmap is an array of bits */
|
|
101, /* bad block list--fwdlink plus 100 bad sector numbers on screen */
|
|
3, /* hotfix list -- treat each array as one item */
|
|
18, /* FNODE - handle FN_AB as one item, FN_ALREC as one item, EAs as one */
|
|
16, /* DIRBLK - 5-item header plus one 11-item DIRENT */
|
|
5, /* ALSEC - 3-item header, ALBLK is one item, array is one item */
|
|
-3, /* data is an array of bytes */
|
|
-2 /* dirblk bitmap is an array of bits */
|
|
};
|
|
#else
|
|
int maxitem [] = {
|
|
15, /* items in a super block */
|
|
100, /* bitmap indirect is an array of longwords - 100 on screen at a time */
|
|
-2, /* bitmap is an array of bits */
|
|
101, /* bad block list--fwdlink plus 100 bad sector numbers on screen */
|
|
3, /* hotfix list -- treat each array as one item */
|
|
21, /* FNODE - handle FN_AB as one item, FN_ALREC as one item, EAs as one */
|
|
18, /* DIRBLK - 5-item header plus one 13-item DIRENT */
|
|
5, /* ALSEC - 3-item header, ALBLK is one item, array is one item */
|
|
-3, /* data is an array of bytes */
|
|
-2 /* dirblk bitmap is an array of bits */
|
|
};
|
|
#endif
|
|
|
|
/*
|
|
* The following definitions are for the structure which describes the
|
|
* object we're currently working on, as well as a stack of objects we've
|
|
* displayed so far.
|
|
*/
|
|
|
|
struct object currobj = {TYPE_SUPERB, (ULONG)SEC_SUPERB, 2L, 0L, NULL, 0, 0};
|
|
|
|
struct object objstack [MAX_OBJECTS];
|
|
USHORT stackptr = 0;
|
|
|
|
/*
|
|
* The following arrays define the offsets of various fields in structures,
|
|
* for the Change command to use. In each case, the offset is that within
|
|
* the current structure, not from the beginning of an enclosing one. Thus,
|
|
* the "offset" of AB_FLAG in the ALBLK field of an FNODE is zero, not
|
|
* FIELDOFFSET (struct FNODE, FN_AB).
|
|
*
|
|
* Item sizes are in bytes (as returned by FIELDSIZE, which uses sizeof()),
|
|
* but the code value 0 indicates a date to be typed as mm/dd/yy hh:mm:ss.
|
|
*/
|
|
|
|
USHORT superb_off [15] = {
|
|
FIELDOFFSET (struct SuperB, SB_SIG1),
|
|
FIELDOFFSET (struct SuperB, SB_SIG2),
|
|
FIELDOFFSET (struct SuperB, SB_VER),
|
|
FIELDOFFSET (struct SuperB, SB_FVER),
|
|
FIELDOFFSET (struct SuperB, SB_ROOT),
|
|
FIELDOFFSET (struct SuperB, SB_SEC),
|
|
FIELDOFFSET (struct SuperB, SB_BSEC),
|
|
FIELDOFFSET (struct SuperB, SB_BII.P),
|
|
FIELDOFFSET (struct SuperB, SB_BBL.P),
|
|
FIELDOFFSET (struct SuperB, SB_CDDAT),
|
|
FIELDOFFSET (struct SuperB, SB_DODAT),
|
|
FIELDOFFSET (struct SuperB, SB_DBSIZE),
|
|
FIELDOFFSET (struct SuperB, SB_DBLOW),
|
|
FIELDOFFSET (struct SuperB, SB_DBHIGH),
|
|
FIELDOFFSET (struct SuperB, SB_DBMAP),
|
|
};
|
|
|
|
#ifndef CODEPAGE
|
|
USHORT fnode_off [15] = {
|
|
FIELDOFFSET (struct FNODE, FN_SIG),
|
|
FIELDOFFSET (struct FNODE, FN_SRH),
|
|
FIELDOFFSET (struct FNODE, FN_FRH),
|
|
FIELDOFFSET (struct FNODE, FN_SIG),
|
|
FIELDOFFSET (struct FNODE, FN_HCNT),
|
|
FIELDOFFSET (struct FNODE, FN_CONTFN),
|
|
FIELDOFFSET (struct FNODE, FN_AclDiskLength),
|
|
FIELDOFFSET (struct FNODE, FN_AclSector),
|
|
FIELDOFFSET (struct FNODE, FN_AclFnodeLength),
|
|
FIELDOFFSET (struct FNODE, FN_AclDataFlag),
|
|
FIELDOFFSET (struct FNODE, FN_EaDiskLength),
|
|
FIELDOFFSET (struct FNODE, FN_EaSector),
|
|
FIELDOFFSET (struct FNODE, FN_EaFnodeLength),
|
|
FIELDOFFSET (struct FNODE, FN_EaDataFlag)
|
|
};
|
|
#else
|
|
/* node, flag is missing */
|
|
USHORT fnode_off [20] = {
|
|
FIELDOFFSET (struct FNODE, FN_SIG),
|
|
FIELDOFFSET (struct FNODE, FN_SRH),
|
|
FIELDOFFSET (struct FNODE, FN_FRH),
|
|
FIELDOFFSET (struct FNODE, FN_SIG),
|
|
FIELDOFFSET (struct FNODE, FN_HCNT),
|
|
FIELDOFFSET (struct FNODE, FN_CONTFN),
|
|
FIELDOFFSET (struct FNODE, FN_ACLBASE),
|
|
FIELDOFFSET (struct FNODE, FN_AclDiskLength),
|
|
FIELDOFFSET (struct FNODE, FN_AclSector),
|
|
FIELDOFFSET (struct FNODE, FN_AclFnodeLength),
|
|
FIELDOFFSET (struct FNODE, FN_AclDataFlag),
|
|
FIELDOFFSET (struct FNODE, FN_EaDiskLength),
|
|
FIELDOFFSET (struct FNODE, FN_EaSector),
|
|
FIELDOFFSET (struct FNODE, FN_EaFnodeLength),
|
|
FIELDOFFSET (struct FNODE, FN_EaDataFlag),
|
|
FIELDOFFSET (struct FNODE, FN_AB),
|
|
FIELDOFFSET (struct FNODE, FN_ALREC[0]),
|
|
FIELDOFFSET (struct FNODE, FN_VLEN),
|
|
FIELDOFFSET (struct FNODE, FN_NEACNT),
|
|
FIELDOFFSET (struct FNODE, FN_FREE[0])
|
|
};
|
|
#endif
|
|
|
|
USHORT fnab_off [4] = {
|
|
FIELDOFFSET (struct ALBLK, AB_FLAG),
|
|
FIELDOFFSET (struct ALBLK, AB_FCNT),
|
|
FIELDOFFSET (struct ALBLK, AB_OCNT),
|
|
FIELDOFFSET (struct ALBLK, AB_FREP)
|
|
};
|
|
|
|
USHORT ab_off [7] = {
|
|
FIELDOFFSET (struct ALSEC, AS_SIG),
|
|
FIELDOFFSET (struct ALSEC, AS_SEC),
|
|
FIELDOFFSET (struct ALSEC, AS_RENT),
|
|
FIELDOFFSET (struct ALSEC, AS_ALBLK.AB_FLAG),
|
|
FIELDOFFSET (struct ALSEC, AS_ALBLK.AB_FCNT),
|
|
FIELDOFFSET (struct ALSEC, AS_ALBLK.AB_OCNT),
|
|
FIELDOFFSET (struct ALSEC, AS_ALBLK.AB_FREP)
|
|
};
|
|
|
|
#ifndef CODEPAGE
|
|
USHORT dirent_off [10] = {
|
|
FIELDOFFSET (struct DIRENT, DIR_ELEN),
|
|
FIELDOFFSET (struct DIRENT, DIR_FLAG),
|
|
FIELDOFFSET (struct DIRENT, DIR_FN),
|
|
FIELDOFFSET (struct DIRENT, DIR_MTIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_SIZE),
|
|
FIELDOFFSET (struct DIRENT, DIR_ATIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_CTIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_EALEN),
|
|
FIELDOFFSET (struct DIRENT, DIR_NAML),
|
|
FIELDOFFSET (struct DIRENT, DIR_NAMA)
|
|
};
|
|
#else
|
|
USHORT dirent_off [12] = {
|
|
FIELDOFFSET (struct DIRENT, DIR_ELEN),
|
|
FIELDOFFSET (struct DIRENT, DIR_FLAG),
|
|
FIELDOFFSET (struct DIRENT, DIR_FN),
|
|
FIELDOFFSET (struct DIRENT, DIR_MTIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_SIZE),
|
|
FIELDOFFSET (struct DIRENT, DIR_ATIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_CTIM),
|
|
FIELDOFFSET (struct DIRENT, DIR_EALEN),
|
|
FIELDOFFSET (struct DIRENT, DIR_FLEX),
|
|
FIELDOFFSET (struct DIRENT, DIR_CPAGE),
|
|
FIELDOFFSET (struct DIRENT, DIR_NAML),
|
|
FIELDOFFSET (struct DIRENT, DIR_NAMA)
|
|
};
|
|
#endif
|
|
|
|
#ifdef CODEPAGE
|
|
USHORT cpinfoent_off [6] = {
|
|
FIELDOFFSET (struct CPINFOENT, CPI_CNTRY),
|
|
FIELDOFFSET (struct CPINFOENT, CPI_CPID),
|
|
FIELDOFFSET (struct CPINFOENT, CPI_CHKSUM),
|
|
FIELDOFFSET (struct CPINFOENT, CPI_DATASEC),
|
|
FIELDOFFSET (struct CPINFOENT, CPI_INDEX),
|
|
FIELDOFFSET (struct CPINFOENT, CPI_RNGECNT)
|
|
};
|
|
|
|
USHORT cpdataent_off [5] = {
|
|
FIELDOFFSET (struct CPDATAENT, CPD_CNTRY),
|
|
FIELDOFFSET (struct CPDATAENT, CPD_CPID),
|
|
FIELDOFFSET (struct CPDATAENT, CPD_RNGECNT),
|
|
FIELDOFFSET (struct CPDATAENT, CPD_TABLE[0]),
|
|
FIELDOFFSET (struct CPDATAENT, CPD_RNGE[0]),
|
|
};
|
|
|
|
USHORT cpdatasec_off [9] = {
|
|
FIELDOFFSET (struct CPDATASEC, CPS_SIG),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_DATACNT),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_INDEX),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_CHKSUM[0]),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_OFFSET[0]),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_CHKSUM[1]),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_OFFSET[1]),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_CHKSUM[2]),
|
|
FIELDOFFSET (struct CPDATASEC, CPS_OFFSET[2]),
|
|
};
|
|
#endif
|
|
|
|
USHORT superb_siz [20] = {
|
|
FIELDSIZE (struct SuperB, SB_SIG1),
|
|
FIELDSIZE (struct SuperB, SB_SIG2),
|
|
FIELDSIZE (struct SuperB, SB_VER),
|
|
FIELDSIZE (struct SuperB, SB_FVER),
|
|
FIELDSIZE (struct SuperB, SB_ROOT),
|
|
FIELDSIZE (struct SuperB, SB_SEC),
|
|
FIELDSIZE (struct SuperB, SB_BSEC),
|
|
FIELDSIZE (struct SuperB, SB_BII.P),
|
|
FIELDSIZE (struct SuperB, SB_BBL.P),
|
|
0, /* SB_CDDAT and */
|
|
0, /* SB_DODAT are both dates */
|
|
FIELDSIZE (struct SuperB, SB_DBSIZE),
|
|
FIELDSIZE (struct SuperB, SB_DBLOW),
|
|
FIELDSIZE (struct SuperB, SB_DBHIGH),
|
|
FIELDSIZE (struct SuperB, SB_DBMAP),
|
|
};
|
|
|
|
#ifndef CODEPAGE
|
|
USHORT fnode_siz [15] = {
|
|
FIELDSIZE (struct FNODE, FN_SIG),
|
|
FIELDSIZE (struct FNODE, FN_SRH),
|
|
FIELDSIZE (struct FNODE, FN_FRH),
|
|
FIELDSIZE (struct FNODE, FN_SIG),
|
|
FIELDSIZE (struct FNODE, FN_HCNT),
|
|
FIELDSIZE (struct FNODE, FN_CONTFN),
|
|
FIELDSIZE (struct FNODE, FN_AclDiskLength),
|
|
FIELDSIZE (struct FNODE, FN_AclSector),
|
|
FIELDSIZE (struct FNODE, FN_AclFnodeLength),
|
|
FIELDSIZE (struct FNODE, FN_AclDataFlag),
|
|
FIELDSIZE (struct FNODE, FN_EaDiskLength),
|
|
FIELDSIZE (struct FNODE, FN_EaSector),
|
|
FIELDSIZE (struct FNODE, FN_EaFnodeLength),
|
|
FIELDSIZE (struct FNODE, FN_EaDataFlag)
|
|
};
|
|
#else
|
|
/* note, previously, one more element than req'd */
|
|
USHORT fnode_siz [21] = {
|
|
FIELDSIZE (struct FNODE, FN_SIG),
|
|
FIELDSIZE (struct FNODE, FN_SRH),
|
|
FIELDSIZE (struct FNODE, FN_FRH),
|
|
FIELDSIZE (struct FNODE, FN_SIG),
|
|
FIELDSIZE (struct FNODE, FN_HCNT),
|
|
FIELDSIZE (struct FNODE, FN_CONTFN),
|
|
FIELDSIZE (struct FNODE, FN_ACLBASE),
|
|
FIELDSIZE (struct FNODE, FN_AclDiskLength),
|
|
FIELDSIZE (struct FNODE, FN_AclSector),
|
|
FIELDSIZE (struct FNODE, FN_AclFnodeLength),
|
|
FIELDSIZE (struct FNODE, FN_AclDataFlag),
|
|
FIELDSIZE (struct FNODE, FN_EaDiskLength),
|
|
FIELDSIZE (struct FNODE, FN_EaSector),
|
|
FIELDSIZE (struct FNODE, FN_EaFnodeLength),
|
|
FIELDSIZE (struct FNODE, FN_EaDataFlag),
|
|
FIELDSIZE (struct FNODE, FN_AB),
|
|
FIELDSIZE (struct FNODE, FN_ALREC[0]),
|
|
FIELDSIZE (struct FNODE, FN_VLEN),
|
|
FIELDSIZE (struct FNODE, FN_NEACNT),
|
|
FIELDSIZE (struct FNODE, FN_FREE[0])
|
|
};
|
|
#endif
|
|
|
|
USHORT fnab_siz [4] = {
|
|
FIELDSIZE (struct ALBLK, AB_FLAG),
|
|
FIELDSIZE (struct ALBLK, AB_FCNT),
|
|
FIELDSIZE (struct ALBLK, AB_OCNT),
|
|
FIELDSIZE (struct ALBLK, AB_FREP)
|
|
};
|
|
|
|
USHORT ab_siz [7] = {
|
|
FIELDSIZE (struct ALSEC, AS_SIG),
|
|
FIELDSIZE (struct ALSEC, AS_SEC),
|
|
FIELDSIZE (struct ALSEC, AS_RENT),
|
|
FIELDSIZE (struct ALSEC, AS_ALBLK.AB_FLAG),
|
|
FIELDSIZE (struct ALSEC, AS_ALBLK.AB_FCNT),
|
|
FIELDSIZE (struct ALSEC, AS_ALBLK.AB_OCNT),
|
|
FIELDSIZE (struct ALSEC, AS_ALBLK.AB_FREP)
|
|
};
|
|
|
|
#ifndef CODEPAGE
|
|
USHORT dirent_siz [10] = {
|
|
FIELDSIZE (struct DIRENT, DIR_ELEN),
|
|
FIELDSIZE (struct DIRENT, DIR_FLAG),
|
|
FIELDSIZE (struct DIRENT, DIR_FN),
|
|
0, /* DIR_MTIM is a date */
|
|
FIELDSIZE (struct DIRENT, DIR_SIZE),
|
|
0, /* DIR_ATIM and */
|
|
0, /* DIR_CTIM are both dates */
|
|
FIELDSIZE (struct DIRENT, DIR_EALEN),
|
|
FIELDSIZE (struct DIRENT, DIR_NAML),
|
|
FIELDSIZE (struct DIRENT, DIR_NAMA)
|
|
};
|
|
#else
|
|
USHORT dirent_siz [12] = {
|
|
FIELDSIZE (struct DIRENT, DIR_ELEN),
|
|
FIELDSIZE (struct DIRENT, DIR_FLAG),
|
|
FIELDSIZE (struct DIRENT, DIR_FN),
|
|
0, /* DIR_MTIM is a date */
|
|
FIELDSIZE (struct DIRENT, DIR_SIZE),
|
|
0, /* DIR_ATIM and */
|
|
0, /* DIR_CTIM are both dates */
|
|
FIELDSIZE (struct DIRENT, DIR_EALEN),
|
|
FIELDSIZE (struct DIRENT, DIR_FLEX),
|
|
FIELDSIZE (struct DIRENT, DIR_CPAGE),
|
|
FIELDSIZE (struct DIRENT, DIR_NAML),
|
|
FIELDSIZE (struct DIRENT, DIR_NAMA)
|
|
};
|
|
#endif
|
|
|
|
#ifdef CODEPAGE
|
|
USHORT cpinfoent_siz [6] = {
|
|
FIELDSIZE (struct CPINFOENT, CPI_CNTRY),
|
|
FIELDSIZE (struct CPINFOENT, CPI_CPID),
|
|
FIELDSIZE (struct CPINFOENT, CPI_CHKSUM),
|
|
FIELDSIZE (struct CPINFOENT, CPI_DATASEC),
|
|
FIELDSIZE (struct CPINFOENT, CPI_INDEX),
|
|
FIELDSIZE (struct CPINFOENT, CPI_RNGECNT)
|
|
};
|
|
|
|
USHORT cpdataent_siz [5] = {
|
|
FIELDSIZE (struct CPDATAENT, CPD_CNTRY),
|
|
FIELDSIZE (struct CPDATAENT, CPD_CPID),
|
|
FIELDSIZE (struct CPDATAENT, CPD_RNGECNT),
|
|
FIELDSIZE (struct CPDATAENT, CPD_TABLE),
|
|
FIELDSIZE (struct CPDATAENT, CPD_RNGE[0]),
|
|
};
|
|
|
|
USHORT cpdatasec_siz [9] = {
|
|
FIELDSIZE (struct CPDATASEC, CPS_SIG),
|
|
FIELDSIZE (struct CPDATASEC, CPS_DATACNT),
|
|
FIELDSIZE (struct CPDATASEC, CPS_INDEX),
|
|
FIELDSIZE (struct CPDATASEC, CPS_CHKSUM[0]),
|
|
FIELDSIZE (struct CPDATASEC, CPS_OFFSET[0]),
|
|
FIELDSIZE (struct CPDATASEC, CPS_CHKSUM[1]),
|
|
FIELDSIZE (struct CPDATASEC, CPS_CHKSUM[1]),
|
|
FIELDSIZE (struct CPDATASEC, CPS_OFFSET[2]),
|
|
FIELDSIZE (struct CPDATASEC, CPS_OFFSET[2]),
|
|
};
|
|
#endif
|
|
|
|
UCHAR *months [12] = {
|
|
"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"
|
|
};
|
|
|
|
struct tm tm;
|
|
|
|
struct vioprm mode25 = {
|
|
12, 1, 4, 80, 25, 640, 350
|
|
};
|
|
|
|
struct vioprm mode43 = {
|
|
12, 1, 4, 80, 43, 640, 350
|
|
};
|