// // 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); }