1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 ////////////////////////////////////////////////////////////////////
12 This file contains ECMA-167 definitions
16 #ifndef __ECMA_167_H__
17 #define __ECMA_167_H__
19 typedef uint8 dstring
;
21 #define UDF_COMP_ID_8 0x08
22 #define UDF_COMP_ID_16 0x10
24 /* make sure all structures are packed! */
27 /* CS0 Charspec (ECMA 167 1/7.2.1) */
30 uint8 charSetInfo
[63];
33 /* Timestamp (ECMA 167 1/7.3) */
35 uint16 typeAndTimezone
;
43 uint8 hundredsOfMicroseconds
;
47 typedef timestamp UDF_TIME_STAMP
;
48 typedef UDF_TIME_STAMP
* PUDF_TIME_STAMP
;
50 /* Timestamp types (ECMA 167 1/7.3.1) */
51 #define TIMESTAMP_TYPE_CUT 0x0000U
52 #define TIMESTAMP_TYPE_LOCAL 0x0001U
53 #define TIMESTAMP_TYPE_AGREEMENT 0x0002U
54 #define TIMESTAMP_OFFSET_MASK 0x0FFFU
55 #define TIMESTAMP_NO_OFFSET 0x0800U
57 /* Entity Identifier (ECMA 167 1/7.4) */
63 #define regid EntityID
65 /* Entity identifier flags (ECMA 167 1/7.4.1) */
66 #define ENTITYID_FLAGS_DIRTY 0x01U
67 #define ENTITYID_FLAGS_PROTECTED 0x02U
69 /* Volume Structure Descriptor (ECMA 167 2/9.1) */
71 struct VolStructDesc
{
73 uint8 stdIdent
[STD_ID_LEN
];
75 uint8 structData
[2041];
78 /* Std structure identifiers (ECMA 167 2/9.1.2) */
79 #define STD_ID_BEA01 "BEA01"
80 #define STD_ID_BOOT2 "BOOT2"
81 #define STD_ID_CD001 "CD001"
82 #define STD_ID_CDW02 "CDW02"
83 #define STD_ID_NSR02 "NSR02"
84 #define STD_ID_NSR03 "NSR03"
85 #define STD_ID_TEA01 "TEA01"
87 /* Beginning Extended Area Descriptor (ECMA 167 2/9.2) */
88 struct BeginningExtendedAreaDesc
{
90 uint8 stdIdent
[STD_ID_LEN
];
92 uint8 structData
[2041];
95 /* Terminating Extended Area Descriptor (ECMA 167 2/9.3) */
96 struct TerminatingExtendedAreaDesc
{
98 uint8 stdIdent
[STD_ID_LEN
];
100 uint8 structData
[2041];
103 /* Boot Descriptor (ECMA 167 2/9.4) */
104 typedef struct _BootDesc
{
106 uint8 stdIdent
[STD_ID_LEN
];
109 EntityID architectureType
;
111 uint32 bootExtLocation
;
112 uint32 bootExtLength
;
115 timestamp descCreationDateAndTime
;
119 } BootDesc
, *PBootDesc
;
121 /* Boot flags (ECMA 167 2/9.4.12) */
122 #define BOOT_FLAGS_ERASE 1
124 /* Extent Descriptor (ECMA 167 3/7.1) */
126 typedef struct _EXTENT_AD
{
128 uint32 extLocation
; // Lba
129 } EXTENT_AD
, *PEXTENT_AD
;
131 typedef EXTENT_AD extent_ad
;
133 typedef EXTENT_AD EXTENT_MAP
;
134 typedef PEXTENT_AD PEXTENT_MAP
;
136 /* Descriptor Tag (ECMA 167 3/7.2) */
144 uint16 descCRCLength
;
148 typedef tag DESC_TAG
;
149 typedef DESC_TAG
* PDESC_TAG
;
151 /* Tag Identifiers (ECMA 167 3/7.2.1) */
152 #define TID_UNUSED_DESC 0x0000U
153 #define TID_PRIMARY_VOL_DESC 0x0001U
154 #define TID_ANCHOR_VOL_DESC_PTR 0x0002U
155 #define TID_VOL_DESC_PTR 0x0003U
156 #define TID_IMP_USE_VOL_DESC 0x0004U
157 #define TID_PARTITION_DESC 0x0005U
158 #define TID_LOGICAL_VOL_DESC 0x0006U
159 #define TID_UNALLOC_SPACE_DESC 0x0007U
160 #define TID_TERMINATING_DESC 0x0008U
161 #define TID_LOGICAL_VOL_INTEGRITY_DESC 0x0009U
163 /* Tag Identifiers (ECMA 167 4/7.2.1) */
164 #define TID_FILE_SET_DESC 0x0100U
165 #define TID_FILE_IDENT_DESC 0x0101U
166 #define TID_ALLOC_EXTENT_DESC 0x0102U
167 #define TID_INDIRECT_ENTRY 0x0103U
168 #define TID_TERMINAL_ENTRY 0x0104U
169 #define TID_FILE_ENTRY 0x0105U
170 #define TID_EXTENDED_ATTRE_HEADER_DESC 0x0106U
171 #define TID_UNALLOCATED_SPACE_ENTRY 0x0107U
172 #define TID_SPACE_BITMAP_DESC 0x0108U
173 #define TID_PARTITION_INTEGRITY_ENTRY 0x0109U
174 #define TID_EXTENDED_FILE_ENTRY 0x010AU
176 /* NSR Descriptor (ECMA 167 3/9.1) */
179 uint8 stdIdent
[STD_ID_LEN
];
182 uint8 structData
[2040];
185 /* Primary Volume Descriptor (ECMA 167 3/10.1) */
186 struct PrimaryVolDesc
{
188 uint32 volDescSeqNum
;
189 uint32 primaryVolDescNum
;
190 dstring volIdent
[32];
193 uint16 interchangeLvl
;
194 uint16 maxInterchangeLvl
;
196 uint32 maxCharSetList
;
197 dstring volSetIdent
[128];
198 charspec descCharSet
;
199 charspec explanatoryCharSet
;
200 extent_ad volAbstract
;
201 extent_ad volCopyright
;
203 timestamp recordingDateAndTime
;
206 uint32 predecessorVolDescSeqLocation
;
211 /* Primary volume descriptor flags (ECMA 167 3/10.1.21) */
212 #define VOL_SET_IDENT 1
214 /* Anchor Volume Descriptor Pointer (ECMA 167 3/10.2) */
215 struct AnchorVolDescPtr
{
217 extent_ad mainVolDescSeqExt
;
218 extent_ad reserveVolDescSeqExt
;
222 /* Volume Descriptor Pointer (ECMA 167 3/10.3) */
225 uint32 volDescSeqNum
;
226 extent_ad nextVolDescSeqExt
;
230 #define MAX_VDS_PARTS 32
232 /* Implementation Use Volume Descriptor (ECMA 167 3/10.4) */
233 struct ImpUseVolDesc
{
235 uint32 volDescSeqNum
;
240 /* Partition Descriptor (ECMA 167 3/10.5) */
241 struct PartitionDesc
{
243 uint32 volDescSeqNum
;
244 uint16 partitionFlags
;
245 uint16 partitionNumber
;
246 EntityID partitionContents
;
247 uint8 partitionContentsUse
[128];
249 uint32 partitionStartingLocation
;
250 uint32 partitionLength
;
256 /* Partition Flags (ECMA 167 3/10.5.3) */
257 #define PARTITION_FLAGS_ALLOC 1
259 /* Partition Contents (ECMA 167 3/10.5.5) */
260 #define PARTITION_CONTENTS_FDC01 "+FDC01"
261 #define PARTITION_CONTENTS_CD001 "+CD001"
262 #define PARTITION_CONTENTS_CDW02 "+CDW02"
263 #define PARTITION_CONTENTS_NSR02 "+NSR02"
264 #define PARTITION_CONTENTS_NSR03 "+NSR03"
266 /* Partition Access Types (ECMA 167 3/10.5.7) */
267 #define PARTITION_ACCESS_NONE 0
268 #define PARTITION_ACCESS_R 1
269 #define PARTITION_ACCESS_WO 2
270 #define PARTITION_ACCESS_RW 3
271 #define PARTITION_ACCESS_OW 4
272 #define PARTITION_ACCESS_MAX_KNOWN PARTITION_ACCESS_OW
274 /* Logical Volume Descriptor (ECMA 167 3/10.6) */
275 struct LogicalVolDesc
{
277 uint32 volDescSeqNum
;
278 charspec descCharSet
;
279 dstring logicalVolIdent
[128];
280 uint32 logicalBlockSize
;
281 EntityID domainIdent
;
282 uint8 logicalVolContentsUse
[16]; /* used to find fileset */
283 uint32 mapTableLength
;
284 uint32 numPartitionMaps
;
287 extent_ad integritySeqExt
;
288 // uint8 partitionMaps[0];
291 /* Generic Partition Map (ECMA 167 3/10.7.1) */
292 struct GenericPartitionMap
{
293 uint8 partitionMapType
;
294 uint8 partitionMapLength
;
295 // uint8 partitionMapping[0];
298 /* Partition Map Type (ECMA 167 3/10.7.1.1) */
299 #define PARTITION_MAP_TYPE_NONE 0
300 #define PARTITION_MAP_TYPE_1 1
301 #define PARTITION_MAP_TYPE_2 2
303 /* Type 1 Partition Map (ECMA 167 3/10.7.2) */
304 struct GenericPartitionMap1
{
305 uint8 partitionMapType
;
306 uint8 partitionMapLength
;
311 /* Type 2 Partition Map (ECMA 167 3/10.7.3) */
312 struct GenericPartitionMap2
{
313 uint8 partitionMapType
; /* 2 */
314 uint8 partitionMapLength
;
315 uint8 partitionIdent
[62];
318 /* Unallocated Space Descriptor (ECMA 167 3/10.8) */
319 typedef struct _UNALLOC_SPACE_DESC
{
321 uint32 volDescSeqNum
;
322 uint32 numAllocDescs
;
323 // extent_ad allocDescs[0];
324 } UNALLOC_SPACE_DESC
, *PUNALLOC_SPACE_DESC
;
326 typedef UNALLOC_SPACE_DESC UnallocatedSpaceDesc
;
328 /* Terminating Descriptor (ECMA 3/10.9) */
329 struct TerminatingDesc
{
337 uint32 volDescSeqNum
;
340 /* Logical Volume Integrity Descriptor (ECMA 167 3/10.10) */
342 struct LogicalVolIntegrityDesc
{
344 timestamp recordingDateAndTime
;
345 uint32 integrityType
;
346 extent_ad nextIntegrityExt
;
347 uint8 logicalVolContentsUse
[32];
348 uint32 numOfPartitions
;
349 uint32 lengthOfImpUse
;
350 // uint32 freeSpaceTable[0];
351 // uint32 sizeTable[0];
355 /* Integrity Types (ECMA 167 3/10.10.3) */
356 #define INTEGRITY_TYPE_OPEN 0
357 #define INTEGRITY_TYPE_CLOSE 1
359 /* Recorded Address (ECMA 167 4/7.1) */
361 uint32 logicalBlockNum
;
362 uint16 partitionReferenceNum
;
365 /* Extent interpretation (ECMA 167 4/14.14.1.1) */
366 #define EXTENT_RECORDED_ALLOCATED 0x00
367 #define EXTENT_NOT_RECORDED_ALLOCATED 0x01
368 #define EXTENT_NOT_RECORDED_NOT_ALLOCATED 0x02
369 #define EXTENT_NEXT_EXTENT_ALLOCDESC 0x03
371 /* Long Allocation Descriptor (ECMA 167 4/14.14.2) */
377 /* upper 2 bits of extLength indicate type */
378 typedef long_ad LONG_AD
;
379 typedef LONG_AD
* PLONG_AD
;
381 /* File Set Descriptor (ECMA 167 4/14.1) */
382 typedef struct _FILE_SET_DESC
{
384 timestamp recordingDateAndTime
;
385 uint16 interchangeLvl
;
386 uint16 maxInterchangeLvl
;
388 uint32 maxCharSetList
;
390 uint32 fileSetDescNum
;
391 charspec logicalVolIdentCharSet
;
392 dstring logicalVolIdent
[128];
393 charspec fileSetCharSet
;
394 dstring fileSetIdent
[32];
395 dstring copyrightFileIdent
[32];
396 dstring abstractFileIdent
[32];
397 long_ad rootDirectoryICB
; //points to Allocation Ext Descriptor
398 EntityID domainIdent
;
400 long_ad streamDirectoryICB
;
402 } FILE_SET_DESC
, *PFILE_SET_DESC
;
404 /* Short Allocation Descriptor (ECMA 167 4/14.14.1) */
405 typedef struct _SHORT_AD
{
408 } SHORT_AD
, *PSHORT_AD
;
410 typedef SHORT_AD short_ad
;
412 /* Partition Header Descriptor (ECMA 167 4/14.3) */
413 typedef struct _PARTITION_HEADER_DESC
{
414 short_ad unallocatedSpaceTable
;
415 short_ad unallocatedSpaceBitmap
; // 0 - allocated, 1 - free
416 short_ad partitionIntegrityTable
;
417 short_ad freedSpaceTable
;
418 short_ad freedSpaceBitmap
; // 0 - ???? 1 - freed
420 } PARTITION_HEADER_DESC
, *PPARTITION_HEADER_DESC
;
422 /* File Identifier Descriptor (ECMA 167 4/14.4) */
424 typedef struct _FILE_IDENT_DESC
{
426 uint16 fileVersionNum
;
427 uint8 fileCharacteristics
;
428 uint8 lengthFileIdent
;
430 uint16 lengthOfImpUse
;
432 // uint8 fileIdent[0];
434 } FILE_IDENT_DESC
, *PFILE_IDENT_DESC
;
436 /* File Characteristics (ECMA 167 4/14.4.3) */
437 #define FILE_HIDDEN 0x01
438 #define FILE_DIRECTORY 0x02
439 #define FILE_DELETED 0x04
440 #define FILE_PARENT 0x08
441 #define FILE_METADATA 0x10 /* UDF 2.0 */
443 /* Allocation Ext Descriptor (ECMA 167 4/14.5) */
444 typedef struct _ALLOC_EXT_DESC
{
446 uint32 previousAllocExtLocation
;
447 uint32 lengthAllocDescs
;
448 } ALLOC_EXT_DESC
, *PALLOC_EXT_DESC
;
450 /* ICB Tag (ECMA 167 4/14.6) */
452 uint32 priorRecordedNumDirectEntries
;
454 uint16 strategyParameter
;
458 lb_addr parentICBLocation
;
462 /* ICB File Type (ECMA 167 4/14.6.6) */
463 #define UDF_FILE_TYPE_NONE 0x00U
464 #define UDF_FILE_TYPE_UNALLOC 0x01U
465 #define UDF_FILE_TYPE_INTEGRITY 0x02U
466 #define UDF_FILE_TYPE_INDIRECT 0x03U
467 #define UDF_FILE_TYPE_DIRECTORY 0x04U
468 #define UDF_FILE_TYPE_REGULAR 0x05U
469 #define UDF_FILE_TYPE_BLOCK 0x06U
470 #define UDF_FILE_TYPE_CHAR 0x07U
471 #define UDF_FILE_TYPE_EXTENDED 0x08U
472 #define UDF_FILE_TYPE_FIFO 0x09U
473 #define UDF_FILE_TYPE_SOCKET 0x0aU
474 #define UDF_FILE_TYPE_TERMINAL 0x0bU
475 #define UDF_FILE_TYPE_SYMLINK 0x0cU
476 #define UDF_FILE_TYPE_STREAMDIR 0x0dU /* ECMA 167 4/13 */
478 /* ICB Flags (ECMA 167 4/14.6.8) */
479 #define ICB_FLAG_ALLOC_MASK 0x0007U
480 #define ICB_FLAG_SORTED 0x0008U
481 #define ICB_FLAG_NONRELOCATABLE 0x0010U
482 #define ICB_FLAG_ARCHIVE 0x0020U
483 #define ICB_FLAG_SETUID 0x0040U
484 #define ICB_FLAG_SETGID 0x0080U
485 #define ICB_FLAG_STICKY 0x0100U
486 #define ICB_FLAG_CONTIGUOUS 0x0200U
487 #define ICB_FLAG_SYSTEM 0x0400U
488 #define ICB_FLAG_TRANSFORMED 0x0800U
489 #define ICB_FLAG_MULTIVERSIONS 0x1000U
491 /* ICB Flags Allocation type(ECMA 167 4/14.6.8) */
492 #define ICB_FLAG_AD_SHORT 0
493 #define ICB_FLAG_AD_LONG 1
494 #define ICB_FLAG_AD_EXTENDED 2
495 #define ICB_FLAG_AD_IN_ICB 3
497 /* Indirect Entry (ECMA 167 4/14.7) */
498 struct IndirectEntry
{
504 /* Terminal Entry (ECMA 167 4/14.8) */
505 struct TerminalEntry
{
510 /* File Entry (ECMA 167 4/14.9) */
512 typedef struct _FILE_ENTRY
{
518 uint16 fileLinkCount
;
520 uint8 recordDisplayAttr
;
522 uint64 informationLength
;
523 uint64 logicalBlocksRecorded
;
524 timestamp accessTime
;
525 timestamp modificationTime
;
528 long_ad extendedAttrICB
;
530 uint64 uniqueID
; /* 0= root, 16- (2^32-1) */
532 uint32 lengthExtendedAttr
;
533 uint32 lengthAllocDescs
;
534 // uint8 extendedAttr[0];
535 // uint8 allocDescs[0];
536 } FILE_ENTRY
, *PFILE_ENTRY
;
538 /* File Permissions (ECMA 167 4/14.9.5) */
539 #define PERM_O_EXEC 0x00000001U
540 #define PERM_O_WRITE 0x00000002U
541 #define PERM_O_READ 0x00000004U
542 #define PERM_O_CHATTR 0x00000008U
543 #define PERM_O_DELETE 0x00000010U
544 #define PERM_G_EXEC 0x00000020U
545 #define PERM_G_WRITE 0x00000040U
546 #define PERM_G_READ 0x00000080U
547 #define PERM_G_CHATTR 0x00000100U
548 #define PERM_G_DELETE 0x00000200U
549 #define PERM_U_EXEC 0x00000400U
550 #define PERM_U_WRITE 0x00000800U
551 #define PERM_U_READ 0x00001000U
552 #define PERM_U_CHATTR 0x00002000U
553 #define PERM_U_DELETE 0x00004000U
555 /* File Record Format (ECMA 167 4/14.9.7) */
556 #define RECORD_FMT_NONE 0
557 #define RECORD_FMT_FIXED_PAD 1
558 #define RECORD_FMT_FIXED 2
559 #define RECORD_FMT_VARIABLE8 3
560 #define RECORD_FMT_VARIABLE16 4
561 #define RECORD_FMT_VARIABLE16_MSB 5
562 #define RECORD_FMT_VARIABLE32 6
563 #define RECORD_FMT_PRINT 7
564 #define RECORD_FMT_LF 8
565 #define RECORD_FMT_CR 9
566 #define RECORD_FMT_CRLF 10
567 #define RECORD_FMT_LFCR 10
569 /* Extended Attribute Header Descriptor (ECMA 167 4/14.10.1) */
570 struct ExtendedAttrHeaderDesc
{
572 uint32 impAttrLocation
;
573 uint32 appAttrLocation
;
576 /* Generic Attribute Format (ECMA 4/14.10.2) */
577 struct GenericAttrFormat
{
582 // uint8 attrData[0];
585 /* Character Set Attribute Format (ECMA 4/14.10.3) */
586 struct CharSetAttrFormat
{
587 uint32 attrType
; /* 1 */
588 uint8 attrSubtype
; /* 1 */
591 uint32 escapeSeqLength
;
593 // uint8 escapeSeq[0];
596 /* Alternate Permissions (ECMA 167 4/14.10.4) */
597 struct AlternatePermissionsExtendedAttr
{
598 uint32 attrType
; /* 3 */
599 uint8 attrSubtype
; /* 1 */
607 /* File Times Extended Attribute (ECMA 167 4/14.10.5) */
608 struct FileTimesExtendedAttr
{
609 uint32 attrType
; /* 5 */
610 uint8 attrSubtype
; /* 1 */
614 uint32 fileTimeExistence
;
615 // timestamp fileTimes[0];
618 /* FileTimeExistence (ECMA 167 4/14.10.5.6) */
619 #define FTE_CREATION 0
620 #define FTE_DELETION 2
621 #define FTE_EFFECTIVE 3
624 /* Information Times Extended Attribute (ECMA 167 4/14.10.6) */
625 struct InfoTimesExtendedAttr
{
626 uint32 attrType
; /* 6 */
627 uint8 attrSubtype
; /* 1 */
631 uint32 infoTimeExistence
;
632 // uint8 infoTimes[0];
635 /* Device Specification Extended Attribute (ECMA 167 4/14.10.7) */
636 struct DeviceSpecificationExtendedAttr
{
637 uint32 attrType
; /* 12 */
638 uint8 attrSubtype
; /* 1 */
642 uint32 majorDeviceIdent
;
643 uint32 minorDeviceIdent
;
647 /* Implementation Use Extended Attr (ECMA 167 4/14.10.8) */
648 struct ImpUseExtendedAttr
{
649 uint32 attrType
; /* 2048 */
650 uint8 attrSubtype
; /* 1 */
658 /* Application Use Extended Attribute (ECMA 167 4/14.10.9) */
659 struct AppUseExtendedAttr
{
660 uint32 attrType
; /* 65536 */
661 uint8 attrSubtype
; /* 1 */
669 #define EXTATTR_CHAR_SET 1
670 #define EXTATTR_ALT_PERMS 3
671 #define EXTATTR_FILE_TIMES 5
672 #define EXTATTR_INFO_TIMES 6
673 #define EXTATTR_DEV_SPEC 12
674 #define EXTATTR_IMP_USE 2048
675 #define EXTATTR_APP_USE 65536
678 /* Unallocated Space Entry (ECMA 167 4/14.11) */
679 struct UnallocatedSpaceEntry
{
682 uint32 lengthAllocDescs
;
683 // uint8 allocDescs[0];
686 /* Space Bitmap Descriptor (ECMA 167 4/14.12) */
687 typedef struct _SPACE_BITMAP_DESC
{
691 // uint8 bitmap[0]; // describes blocks from Lba=0 to Lba=LAST_LBA
692 } SPACE_BITMAP_DESC
, *PSPACE_BITMAP_DESC
;
694 typedef SPACE_BITMAP_DESC SpaceBitmapDesc
;
696 /* Partition Integrity Entry (ECMA 167 4/14.13) */
697 struct PartitionIntegrityEntry
{
700 timestamp recordingDateAndTime
;
707 #define INTEGRITY_TYPE_STABLE 2
709 /* Extended Allocation Descriptor (ECMA 167 4/14.14.3) */
710 typedef struct _EXT_AD
{ /* ECMA 167 4/14.14.3 */
712 uint32 recordedLength
;
713 uint32 informationLength
;
717 typedef EXT_AD ext_ad
;
719 /* Logical Volume Header Descriptor (ECMA 167 4/14.5) */
720 struct LogicalVolHeaderDesc
{
725 /* Path Component (ECMA 167 4/14.16.1) */
726 struct PathComponent
{
728 uint8 lengthComponentIdent
;
729 uint16 componentFileVersionNum
;
730 // dstring componentIdent[0];
733 #define COMPONENT_TYPE_ROOT_X 0x01 /* originator & recipient know its value */
734 #define COMPONENT_TYPE_ROOT 0x02 /* root of the volume */
735 #define COMPONENT_TYPE_PARENT 0x03 /* predecessor's parent dir */
736 #define COMPONENT_TYPE_CURENT 0x04 /* same as predecessor's dir */
737 #define COMPONENT_TYPE_OBJECT 0x05 /* terminal entry */
739 /* File Entry (ECMA 167 4/14.17) */
741 typedef struct _EXTENDED_FILE_ENTRY
{
747 uint16 fileLinkCount
;
749 uint8 recordDisplayAttr
;
751 uint64 informationLength
;
753 uint64 logicalBlocksRecorded
;
754 timestamp accessTime
;
755 timestamp modificationTime
;
756 timestamp createTime
;
760 long_ad extendedAttrICB
;
761 long_ad streamDirectoryICB
;
764 uint32 lengthExtendedAttr
;
765 uint32 lengthAllocDescs
;
766 // uint8 extendedAttr[0];
767 // uint8 allocDescs[0];
768 } EXTENDED_FILE_ENTRY
, *PEXTENDED_FILE_ENTRY
;
770 typedef EXTENDED_FILE_ENTRY ExtendedFileEntry
;
774 #endif /* __ECMA_167_H__ */