windows-nt/Source/XPSP1/NT/base/boot/bootcode/ntfs/ia64/genntfs.c
2020-09-26 16:20:57 +08:00

400 lines
12 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// No Check-in Source Code.
//
// Do not make this code available to non-Microsoft personnel
// without Intel's express permission
//
/**
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
***
*** The information and source code contained herein is the exclusive
*** property of Intel Corporation and may not be disclosed, examined
*** or reproduced in whole or in part without explicit written authorization
*** from the company.
**/
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
genntfs.c
Abstract:
This module implements a program which generates IA64 machine dependent
structure offset definitions for kernel structures that are accessed in
assembly code.
Author:
David N. Cutler (davec) 27-Mar-1990
Revision History:
Allen M. Kay (akay) 25-Jan-1996 Modified this file for IA64.
--*/
//#include "ki.h"
//#pragma hdrstop
//#define HEADER_FILE
#include "ntos.h"
#include "stdio.h"
#include "stdlib.h"
#include "zwapi.h"
#include "nt.h"
#include "excpt.h"
#include "ntdef.h"
#include "ntkeapi.h"
#include "ntia64.h"
#include "ntimage.h"
#include "ntseapi.h"
#include "ntobapi.h"
#include "ntlpcapi.h"
#include "ntioapi.h"
#include "ntmmapi.h"
#include "ntldr.h"
#include "ntpsapi.h"
#include "ntexapi.h"
#include "ntnls.h"
#include "nturtl.h"
#include "ntcsrmsg.h"
#include "ntcsrsrv.h"
#include "ntxcapi.h"
#include "ia64.h"
#include "arc.h"
#include "ntstatus.h"
#include "kxia64.h"
#include "stdarg.h"
#include "setjmp.h"
#include "ntioapi.h"
#include "fsrtl.h"
//#include "index.h"
#include "nodetype.h"
#include "ntfs.h"
#include "ntfsstru.h"
#include "ntfsdata.h"
#include "ntfslog.h"
#include "ntfsproc.h"
//
// Define architecture specific generation macros.
//
#define genAlt(Name, Type, Member) \
dumpf("#define " #Name " 0x%lx\n", OFFSET(Type, Member))
#define genCom(Comment) \
dumpf("\n"); \
dumpf("//\n"); \
dumpf("// " Comment "\n"); \
dumpf("//\n"); \
dumpf("\n")
#define genDef(Prefix, Type, Member) \
dumpf("#define " #Prefix #Member " 0x%lx\n", OFFSET(Type, Member))
#define genDef2(Prefix, Type, Name, Member) \
dumpf("#define " #Prefix #Name " 0x%lx\n", OFFSET(Type, Member))
#define genVal(Name, Value) \
dumpf("#define " #Name " 0x%lx\n", Value)
#define genSpc() dumpf("\n");
//
// Define member offset computation macro.
//
#define OFFSET(type, field) ((LONG)(&((type *)0)->field))
FILE *NtfsDefs;
//
// EnableInc(a) - Enables output to goto specified include file
//
#define EnableInc(a) OutputEnabled |= a;
//
// DisableInc(a) - Disables output to goto specified include file
//
#define DisableInc(a) OutputEnabled &= ~a;
ULONG OutputEnabled;
#define NTFSDEFS 0x01
#define KERNEL NTFSDEFS
VOID dumpf (const char *format, ...);
//
// This routine returns the bit number right to left of a field.
//
LONG
t (
IN ULONG z
)
{
LONG i;
for (i = 0; i < 32; i += 1) {
if ((z >> i) & 1) {
break;
}
}
return i;
}
//
// This program generates the IA64 machine dependent assembler offset
// definitions.
//
VOID
main (argc, argv)
int argc;
char *argv[];
{
char *outName;
//
// Create file for output.
//
if (argc == 2) {
outName = argv[ 1 ];
} else {
outName = "ntfsdefs.h";
}
outName = argc >= 2 ? argv[1] : "ntfsdefs.h";
NtfsDefs = fopen( outName, "w" );
if (NtfsDefs == NULL) {
fprintf( stderr, "GENNTFS: Cannot open %s for writing.\n", outName);
perror("NTFSDEFS");
exit(1);
}
fprintf( stderr, "GENNTFS: Writing %s header file.\n", outName );
//
// Constant definitions
//
dumpf("\n");
dumpf("//\n");
dumpf("// Constant definitions\n");
dumpf("//\n");
dumpf("\n");
genVal(LowPart, 0);
genVal(HighPart, 4);
genVal(MASTER_FILE_TABLE_NUMBER, MASTER_FILE_TABLE_NUMBER);
genVal(MASTER_FILE_TABLE2_NUMBER, MASTER_FILE_TABLE2_NUMBER);
genVal(LOG_FILE_NUMBER, LOG_FILE_NUMBER);
genVal(VOLUME_DASD_NUMBER, VOLUME_DASD_NUMBER);
genVal(ATTRIBUTE_DEF_TABLE_NUMBER, ATTRIBUTE_DEF_TABLE_NUMBER);
genVal(ROOT_FILE_NAME_INDEX_NUMBER, ROOT_FILE_NAME_INDEX_NUMBER);
genVal(BIT_MAP_FILE_NUMBER, BIT_MAP_FILE_NUMBER);
genVal(BOOT_FILE_NUMBER, BOOT_FILE_NUMBER);
genVal(BAD_CLUSTER_FILE_NUMBER, BAD_CLUSTER_FILE_NUMBER);
genVal(QUOTA_TABLE_NUMBER, QUOTA_TABLE_NUMBER);
genVal(UPCASE_TABLE_NUMBER, UPCASE_TABLE_NUMBER);
genVal($STANDARD_INFORMATION, $STANDARD_INFORMATION);
genVal($ATTRIBUTE_LIST, $ATTRIBUTE_LIST);
genVal($FILE_NAME, $FILE_NAME);
genVal($OBJECT_ID, $OBJECT_ID);
genVal($SECURITY_DESCRIPTOR, $SECURITY_DESCRIPTOR);
genVal($VOLUME_NAME, $VOLUME_NAME);
genVal($VOLUME_INFORMATION, $VOLUME_INFORMATION);
genVal($DATA, $DATA);
genVal($INDEX_ROOT, $INDEX_ROOT);
genVal($INDEX_ALLOCATION, $INDEX_ALLOCATION);
genVal($BITMAP, $BITMAP);
genVal($SYMBOLIC_LINK, $SYMBOLIC_LINK);
genVal($EA_INFORMATION, $EA_INFORMATION);
genVal($EA, $EA);
genVal($FIRST_USER_DEFINED_ATTRIBUTE, $FIRST_USER_DEFINED_ATTRIBUTE);
genVal($END, $END);
genVal(SEQUENCE_NUMBER_STRIDE, SEQUENCE_NUMBER_STRIDE);
//
// MFT_SEGMENT_REFERENCE
//
genDef(REF_, MFT_SEGMENT_REFERENCE, SegmentNumberLowPart);
genDef(REF_, MFT_SEGMENT_REFERENCE, SegmentNumberHighPart);
genDef(REF_, MFT_SEGMENT_REFERENCE, SequenceNumber);
//
// MULTI_SECTOR_HEADER
//
genDef(MSH_, MULTI_SECTOR_HEADER, Signature);
genDef(MSH_, MULTI_SECTOR_HEADER, UpdateSequenceArrayOffset);
genDef(MSH_, MULTI_SECTOR_HEADER, UpdateSequenceArraySize);
//
// FILE_RECORD_SEGMENT_HEADER
//
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, MultiSectorHeader);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, Lsn);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, SequenceNumber);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, ReferenceCount);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, FirstAttributeOffset);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, Flags);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, FirstFreeByte);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, BytesAvailable);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, BaseFileRecordSegment);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, NextAttributeInstance);
genDef(FRS_, FILE_RECORD_SEGMENT_HEADER, UpdateArrayForCreateOnly);
genVal(FILE_RECORD_SEGMENT_IN_USE, FILE_RECORD_SEGMENT_IN_USE);
genVal(FILE_FILE_NAME_INDEX_PRESENT, FILE_FILE_NAME_INDEX_PRESENT);
//
// ATTRIBUTE_RECORD_HEADER
//
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, TypeCode);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, RecordLength);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, FormCode);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, NameLength);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, NameOffset);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, Flags);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, Instance);
genDef(ATTR_, ATTRIBUTE_RECORD_HEADER, Form);
//
// Resident
//
genDef2(RES_,ATTRIBUTE_RECORD_HEADER,ValueLength,Form.Resident.ValueLength);
genDef2(RES_,ATTRIBUTE_RECORD_HEADER,ValueOffset,Form.Resident.ValueOffset);
genDef2(RES_,ATTRIBUTE_RECORD_HEADER,ResidentFlags,Form.Resident.ResidentFlags);
genDef2(RES_,ATTRIBUTE_RECORD_HEADER,Reserved,Form.Resident.Reserved);
//
// Nonresident
//
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,LowestVcn,Form.Nonresident.LowestVcn);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,HighestVcn,Form.Nonresident.HighestVcn);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,MappingPairOffset,Form.Nonresident.MappingPairsOffset);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,CompressionUnit,Form.Nonresident.CompressionUnit);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,Reserved,Form.Nonresident.Reserved);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,AllocatedLength,Form.Nonresident.AllocatedLength);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,FileSize,Form.Nonresident.FileSize);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,ValidDataLength,Form.Nonresident.ValidDataLength);
genDef2(NONRES_,ATTRIBUTE_RECORD_HEADER,TotalAllocated,Form.Nonresident.TotalAllocated);
genVal(RESIDENT_FORM, RESIDENT_FORM);
genVal(NONRESIDENT_FORM, NONRESIDENT_FORM);
genVal(ATTRIBUTE_FLAG_COMPRESSION_MASK, ATTRIBUTE_FLAG_COMPRESSION_MASK);
//
// ATTRIBUTE_LIST_ENTRY
//
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, AttributeTypeCode);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, RecordLength);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, AttributeNameLength);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, AttributeNameOffset);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, LowestVcn);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, SegmentReference);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, Instance);
genDef(ATTRLIST_, ATTRIBUTE_LIST_ENTRY, AttributeName);
genVal(FAT_DIRENT_ATTR_READ_ONLY, FAT_DIRENT_ATTR_READ_ONLY);
genVal(FAT_DIRENT_ATTR_HIDDEN, FAT_DIRENT_ATTR_HIDDEN);
genVal(FAT_DIRENT_ATTR_SYSTEM, FAT_DIRENT_ATTR_SYSTEM);
genVal(FAT_DIRENT_ATTR_VOLUME_ID, FAT_DIRENT_ATTR_VOLUME_ID);
genVal(FAT_DIRENT_ATTR_ARCHIVE, FAT_DIRENT_ATTR_ARCHIVE);
genVal(FAT_DIRENT_ATTR_DEVICE, FAT_DIRENT_ATTR_DEVICE);
//
// DUPLICATED_INFORMATION
//
genDef(DUPINFO_, DUPLICATED_INFORMATION, CreationTime);
genDef(DUPINFO_, DUPLICATED_INFORMATION, LastModificationTime);
genDef(DUPINFO_, DUPLICATED_INFORMATION, LastChangeTime);
genDef(DUPINFO_, DUPLICATED_INFORMATION, LastAccessTime);
genDef(DUPINFO_, DUPLICATED_INFORMATION, AllocatedLength);
genDef(DUPINFO_, DUPLICATED_INFORMATION, FileSize);
genDef(DUPINFO_, DUPLICATED_INFORMATION, FileAttributes);
genDef(DUPINFO_, DUPLICATED_INFORMATION, PackedEaSize);
genDef(DUPINFO_, DUPLICATED_INFORMATION, Reserved);
//
// FILE_NAME
//
genDef(FN_, FILE_NAME, ParentDirectory);
genDef(FN_, FILE_NAME, Info);
genDef(FN_, FILE_NAME, FileNameLength);
genDef(FN_, FILE_NAME, Flags);
genDef(FN_, FILE_NAME, FileName);
genVal(FILE_NAME_NTFS, FILE_NAME_NTFS);
genVal(FILE_NAME_DOS, FILE_NAME_DOS);
genVal(FILE_NAME_LINK, 4);
//
// INDEX_HEADER
//
genDef(IH_, INDEX_HEADER, FirstIndexEntry);
genDef(IH_, INDEX_HEADER, FirstFreeByte);
genDef(IH_, INDEX_HEADER, BytesAvailable);
genDef(IH_, INDEX_HEADER, Flags);
genDef(IH_, INDEX_HEADER, Reserved);
genVal(INDEX_NODE, INDEX_NODE);
//
// INDEX_ROOT
//
genDef(IR_, INDEX_ROOT, IndexedAttributeType);
genDef(IR_, INDEX_ROOT, CollationRule);
genDef(IR_, INDEX_ROOT, BytesPerIndexBuffer);
genDef(IR_, INDEX_ROOT, BlocksPerIndexBuffer);
genDef(IR_, INDEX_ROOT, Reserved);
genDef(IR_, INDEX_ROOT, IndexHeader);
//
// INDEX_ALLOCATION_BUFFER
//
genDef(IB_, INDEX_ALLOCATION_BUFFER, MultiSectorHeader);
genDef(IB_, INDEX_ALLOCATION_BUFFER, Lsn);
genDef(IB_, INDEX_ALLOCATION_BUFFER, ThisBlock);
genDef(IB_, INDEX_ALLOCATION_BUFFER, IndexHeader);
genDef(IB_, INDEX_ALLOCATION_BUFFER, UpdateSequenceArray);
//
// INDEX_ENTRY
//
genDef(IE_, INDEX_ENTRY, FileReference);
genDef(IE_, INDEX_ENTRY, Length);
genDef(IE_, INDEX_ENTRY, AttributeLength);
genDef(IE_, INDEX_ENTRY, Flags);
genDef(IE_, INDEX_ENTRY, Reserved);
genVal(INDEX_ENTRY_NODE, INDEX_ENTRY_NODE);
genVal(INDEX_ENTRY_END, INDEX_ENTRY_END);
fclose(NtfsDefs);
}
VOID
dumpf (const char *format, ...)
{
va_list(arglist);
va_start(arglist, format);
// if (OutputEnabled & NTFSDEFS) {
vfprintf (NtfsDefs, format, arglist);
// }
va_end(arglist);
}