1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 ////////////////////////////////////////////////////////////////////
6 #ifndef __UDF_STRUCT_SUPPORT_H__
7 #define __UDF_STRUCT_SUPPORT_H__
10 #include "osta_misc.h"
14 // memory re-allocation (returns new buffer size)
15 uint32
UDFMemRealloc(IN int8
* OldBuff
, // old buffer
16 IN uint32 OldLength
, // old buffer size
17 OUT int8
** NewBuff
, // address to store new pointer
18 IN uint32 NewLength
); // required size
19 // convert offset in extent to Lba & calculate block parameters
20 // it also returns pointer to last valid entry & flags
22 UDFExtentOffsetToLba(IN PVCB Vcb
,
23 IN PEXTENT_AD Extent
, // Extent array
24 IN int64 Offset
, // offset in extent
25 OUT uint32
* SectorOffset
,
26 OUT uint32
* AvailLength
, // available data in this block
30 // locate frag containing specified Lba in extent
34 IN PEXTENT_MAP Extent
, // Extent array
39 //#define LBA_OUT_OF_EXTENT ((LONG)(-1))
40 //#define LBA_NOT_ALLOCATED ((LONG)(-2))
42 // read data at any offset from extent
43 OSSTATUS
UDFReadExtent(IN PVCB Vcb
,
44 IN PEXTENT_INFO ExtInfo
, // Extent array
45 IN int64 Offset
, // offset in extent
49 OUT uint32
* ReadBytes
);
50 // builds mapping for specified amount of data at any offset from specified extent.
52 UDFReadExtentLocation(IN PVCB Vcb
,
53 IN PEXTENT_INFO ExtInfo
, // Extent array
54 IN int64 Offset
, // offset in extent to start SubExtent from
55 OUT PEXTENT_MAP
* _SubExtInfo
, // SubExtent mapping array
56 IN OUT uint32
* _SubExtInfoSz
, // IN: maximum number fragments to get
57 // OUT: actually obtained fragments
58 OUT int64
* _NextOffset
// offset, caller can start from to continue
60 // calculate total length of extent
61 int64
UDFGetExtentLength(IN PEXTENT_MAP Extent
); // Extent array
62 // convert compressed Unicode to standard
64 __fastcall
UDFDecompressUnicode(IN OUT PUNICODE_STRING UName
,
67 OUT uint16
* valueCRC
);
68 // calculate hashes for directory search
69 uint8
UDFBuildHashEntry(IN PVCB Vcb
,
70 IN PUNICODE_STRING Name
,
71 OUT PHASH_ENTRY hashes
,
74 #define HASH_POSIX 0x01
75 #define HASH_ULFN 0x02
78 #define HASH_KEEP_NAME 0x08 // keep DOS '.' and '..' intact
80 // get dirindex's frame
81 PDIR_INDEX_ITEM
UDFDirIndexGetFrame(IN PDIR_INDEX_HDR hDirNdx
,
87 void UDFDirIndexFree(PDIR_INDEX_HDR hDirNdx
);
89 OSSTATUS
UDFDirIndexGrow(IN PDIR_INDEX_HDR
* _hDirNdx
,
92 OSSTATUS
UDFDirIndexTrunc(IN PDIR_INDEX_HDR
* _hDirNdx
,
94 // init variables for scan (using knowledge about internal structure)
95 BOOLEAN
UDFDirIndexInitScan(IN PUDF_FILE_INFO DirInfo
, //
96 OUT PUDF_DIR_SCAN_CONTEXT Context
,
99 PDIR_INDEX_ITEM
UDFDirIndexScan(PUDF_DIR_SCAN_CONTEXT Context
,
100 PUDF_FILE_INFO
* _FileInfo
);
101 // build directory index
102 OSSTATUS
UDFIndexDirectory(IN PVCB Vcb
,
103 IN OUT PUDF_FILE_INFO FileInfo
);
104 // search for specified file in specified directory &
105 // returns corresponding offset in extent if found.
106 OSSTATUS
UDFFindFile(IN PVCB Vcb
,
107 IN BOOLEAN IgnoreCase
,
108 IN BOOLEAN NotDeleted
,
109 IN PUNICODE_STRING Name
,
110 IN PUDF_FILE_INFO DirInfo
,
111 IN OUT uint_di
* Index
);
113 __inline OSSTATUS
UDFFindFile__(IN PVCB Vcb
,
114 IN BOOLEAN IgnoreCase
,
115 IN PUNICODE_STRING Name
,
116 IN PUDF_FILE_INFO DirInfo
)
118 if(!DirInfo
->Dloc
->DirIndex
)
119 return STATUS_NOT_A_DIRECTORY
;
121 return UDFFindFile(Vcb
, IgnoreCase
, TRUE
, Name
, DirInfo
, &i
);
124 // calculate file mapping length (in bytes) including ZERO-terminator
125 uint32
UDFGetMappingLength(IN PEXTENT_MAP Extent
);
126 // merge 2 sequencial file mappings
128 __fastcall
UDFMergeMappings(IN PEXTENT_MAP Extent
,
129 IN PEXTENT_MAP Extent2
);
130 // build file mapping according to ShortAllocDesc (SHORT_AD) array
131 PEXTENT_MAP
UDFShortAllocDescToMapping(IN PVCB Vcb
,
133 IN PLONG_AD AllocDesc
,
134 IN uint32 AllocDescLength
,
135 IN uint32 SubCallCount
,
136 OUT PEXTENT_INFO AllocLoc
);
137 // build file mapping according to LongAllocDesc (LONG_AD) array
138 PEXTENT_MAP
UDFLongAllocDescToMapping(IN PVCB Vcb
,
139 IN PLONG_AD AllocDesc
,
140 IN uint32 AllocDescLength
,
141 IN uint32 SubCallCount
,
142 OUT PEXTENT_INFO AllocLoc
);
143 // build file mapping according to ExtendedAllocDesc (EXT_AD) array
144 PEXTENT_MAP
UDFExtAllocDescToMapping(IN PVCB Vcb
,
145 IN PLONG_AD AllocDesc
,
146 IN uint32 AllocDescLength
,
147 IN uint32 SubCallCount
,
148 OUT PEXTENT_INFO AllocLoc
);
149 // build file mapping according to (Extended)FileEntry
150 PEXTENT_MAP
UDFReadMappingFromXEntry(IN PVCB Vcb
,
153 IN OUT uint32
* Offset
,
154 OUT PEXTENT_INFO AllocLoc
);
155 // read FileEntry described in FileIdentDesc
156 OSSTATUS
UDFReadFileEntry(IN PVCB Vcb
,
157 // IN PFILE_IDENT_DESC FileDesc,
159 IN OUT PFILE_ENTRY FileEntry
, // here we can also get ExtendedFileEntry
160 IN OUT uint16
* Ident
);
161 // scan FileSet sequence & return last valid FileSet
162 OSSTATUS
UDFFindLastFileSet(IN PVCB Vcb
,
163 IN lb_addr
*Addr
, // Addr for the 1st FileSet
164 IN OUT PFILE_SET_DESC FileSetDesc
);
165 // read all sparing tables & stores them in contiguos memory
166 OSSTATUS
UDFLoadSparingTable(IN PVCB Vcb
,
167 IN PSPARABLE_PARTITION_MAP PartMap
);
168 // build mapping for extent
170 __fastcall
UDFExtentToMapping_(IN PEXTENT_AD Extent
171 #ifdef UDF_TRACK_EXTENT_TO_MAPPING
174 #endif //UDF_TRACK_EXTENT_TO_MAPPING
177 #ifdef UDF_TRACK_EXTENT_TO_MAPPING
178 #define UDFExtentToMapping(e) UDFExtentToMapping_(e, UDF_BUG_CHECK_ID, __LINE__)
179 #else //UDF_TRACK_EXTENT_TO_MAPPING
180 #define UDFExtentToMapping(e) UDFExtentToMapping_(e)
181 #endif //UDF_TRACK_EXTENT_TO_MAPPING
183 // This routine remaps sectors from bad packet
185 __fastcall
UDFRemapPacket(IN PVCB Vcb
,
187 IN BOOLEAN RemapSpared
);
189 // This routine releases sector mapping when entire packet is marked as free
191 __fastcall
UDFUnmapRange(IN PVCB Vcb
,
195 // return physical address for relocated sector
197 __fastcall
UDFRelocateSector(IN PVCB Vcb
,
201 __fastcall
UDFAreSectorsRelocated(IN PVCB Vcb
,
203 IN uint32 BlockCount
);
204 // build mapping for relocated extent
206 __fastcall
UDFRelocateSectors(IN PVCB Vcb
,
208 IN uint32 BlockCount
);
209 // check for presence of given char among specified ones
210 BOOLEAN
UDFUnicodeInString(IN uint8
* string
,
211 IN WCHAR ch
); // Unicode char to search for.
214 __fastcall
UDFIsIllegalChar(IN WCHAR ch
);
215 // translate udfName to dosName using OSTA compliant.
216 #define UDFDOSName__(Vcb, DosName, UdfName, FileInfo) \
217 UDFDOSName(Vcb, DosName, UdfName, (FileInfo) && ((FileInfo)->Index < 2));
220 __fastcall
UDFDOSName(IN PVCB Vcb
,
221 IN OUT PUNICODE_STRING DosName
,
222 IN PUNICODE_STRING UdfName
,
223 IN BOOLEAN KeepIntact
);
226 __fastcall
UDFDOSName201(IN OUT PUNICODE_STRING DosName
,
227 IN PUNICODE_STRING UdfName
,
228 IN BOOLEAN KeepIntact
);
231 __fastcall
UDFDOSName200(IN OUT PUNICODE_STRING DosName
,
232 IN PUNICODE_STRING UdfName
,
233 IN BOOLEAN KeepIntact
,
237 __fastcall
UDFDOSName100(IN OUT PUNICODE_STRING DosName
,
238 IN PUNICODE_STRING UdfName
,
239 IN BOOLEAN KeepIntact
);
241 // return length of bit-chain starting from Offs bit
246 #else // NO X86 optimization , use generic C/C++
247 uint32
UDFGetBitmapLen(
252 // scan disc free space bitmap for minimal suitable extent
253 uint32
UDFFindMinSuitableExtent(IN PVCB Vcb
,
254 IN uint32 Length
, // in blocks
255 IN uint32 SearchStart
,
257 OUT uint32
* MaxExtLen
,
258 IN uint8 AllocFlags
);
260 #ifdef UDF_CHECK_DISK_ALLOCATION
261 // mark space described by Mapping as Used/Freed (optionaly)
262 void UDFCheckSpaceAllocation_(IN PVCB Vcb
,
265 #ifdef UDF_TRACK_ONDISK_ALLOCATION
267 IN uint32 BugCheckId
,
269 #endif //UDF_TRACK_ONDISK_ALLOCATION
272 #ifdef UDF_TRACK_ONDISK_ALLOCATION
273 #define UDFCheckSpaceAllocation(Vcb, FileInfo, Map, asXXX) \
274 UDFCheckSpaceAllocation_(Vcb, Map, asXXX, (uint32)FileInfo, UDF_BUG_CHECK_ID,__LINE__);
275 #else //UDF_TRACK_ONDISK_ALLOCATION
276 #define UDFCheckSpaceAllocation(Vcb, FileInfo, Map, asXXX) \
277 UDFCheckSpaceAllocation_(Vcb, Map, asXXX);
278 #endif //UDF_TRACK_ONDISK_ALLOCATION
279 #else // UDF_CHECK_DISK_ALLOCATION
280 #define UDFCheckSpaceAllocation(Vcb, FileInfo, Map, asXXX) {;}
281 #endif //UDF_CHECK_DISK_ALLOCATION
283 // mark space described by Mapping as Used/Freed (optionaly)
284 // this routine doesn't acquire any resource
286 UDFMarkSpaceAsXXXNoProtect_(
290 #ifdef UDF_TRACK_ONDISK_ALLOCATION
292 IN uint32 BugCheckId
,
294 #endif //UDF_TRACK_ONDISK_ALLOCATION
297 #ifdef UDF_TRACK_ONDISK_ALLOCATION
298 #define UDFMarkSpaceAsXXXNoProtect(Vcb, FileInfo, Map, asXXX) \
299 UDFMarkSpaceAsXXXNoProtect_(Vcb, Map, asXXX, (uint32)FileInfo, UDF_BUG_CHECK_ID,__LINE__);
300 #else //UDF_TRACK_ONDISK_ALLOCATION
301 #define UDFMarkSpaceAsXXXNoProtect(Vcb, FileInfo, Map, asXXX) \
302 UDFMarkSpaceAsXXXNoProtect_(Vcb, Map, asXXX);
303 #endif //UDF_TRACK_ONDISK_ALLOCATION
306 // mark space described by Mapping as Used/Freed (optionaly)
307 void UDFMarkSpaceAsXXX_(IN PVCB Vcb
,
310 #ifdef UDF_TRACK_ONDISK_ALLOCATION
312 IN uint32 BugCheckId
,
314 #endif //UDF_TRACK_ONDISK_ALLOCATION
317 #ifdef UDF_TRACK_ONDISK_ALLOCATION
318 #define UDFMarkSpaceAsXXX(Vcb, FileInfo, Map, asXXX) \
319 UDFMarkSpaceAsXXX_(Vcb, Map, asXXX, (uint32)FileInfo, UDF_BUG_CHECK_ID,__LINE__);
320 #else //UDF_TRACK_ONDISK_ALLOCATION
321 #define UDFMarkSpaceAsXXX(Vcb, FileInfo, Map, asXXX) \
322 UDFMarkSpaceAsXXX_(Vcb, Map, asXXX);
323 #endif //UDF_TRACK_ONDISK_ALLOCATION
327 #define AS_DISCARDED 0x02
330 // build mapping for Length bytes in FreeSpace
331 OSSTATUS
UDFAllocFreeExtent_(IN PVCB Vcb
,
333 IN uint32 SearchStart
,
335 OUT PEXTENT_INFO Extent
,
337 #ifdef UDF_TRACK_ALLOC_FREE_EXTENT
340 #endif //UDF_TRACK_ALLOC_FREE_EXTENT
343 #ifdef UDF_TRACK_ALLOC_FREE_EXTENT
344 #define UDFAllocFreeExtent(v, l, ss, sl, e, af) UDFAllocFreeExtent_(v, l, ss, sl, e, af, UDF_BUG_CHECK_ID, __LINE__)
345 #else //UDF_TRACK_ALLOC_FREE_EXTENT
346 #define UDFAllocFreeExtent(v, l, ss, sl, e, af) UDFAllocFreeExtent_(v, l, ss, sl, e, af)
347 #endif //UDF_TRACK_ALLOC_FREE_EXTENT
351 UDFGetPartFreeSpace(IN PVCB Vcb
,
354 #define UDF_PREALLOC_CLASS_FE 0x00
355 #define UDF_PREALLOC_CLASS_DIR 0x01
357 // try to find cached allocation
359 UDFGetCachedAllocation(
361 IN uint32 ParentLocation
,
362 OUT PEXTENT_INFO Ext
,
363 OUT uint32
* Items
, // optional
366 // put released pre-allocation to cache
368 UDFStoreCachedAllocation(
370 IN uint32 ParentLocation
,
375 // discard all cached allocations
377 UDFFlushAllCachedAllocations(
381 // allocate space for FE
382 OSSTATUS
UDFAllocateFESpace(IN PVCB Vcb
,
383 IN PUDF_FILE_INFO DirInfo
,
385 IN PEXTENT_INFO FEExtInfo
,
387 #ifndef UDF_READ_ONLY_BUILD
388 // free space FE's allocation
389 void UDFFreeFESpace(IN PVCB Vcb
,
390 IN PUDF_FILE_INFO DirInfo
,
391 IN PEXTENT_INFO FEExtInfo
);
392 #endif //UDF_READ_ONLY_BUILD
394 #define FLUSH_FE_KEEP FALSE
395 #define FLUSH_FE_FOR_DEL TRUE
398 void UDFFlushFESpace(IN PVCB Vcb
,
399 IN PUDF_DATALOC_INFO Dloc
,
400 IN BOOLEAN Discard
= FLUSH_FE_KEEP
);
401 // discard file allocation
402 void UDFFreeFileAllocation(IN PVCB Vcb
,
403 IN PUDF_FILE_INFO DirInfo
,
404 IN PUDF_FILE_INFO FileInfo
);
405 // convert physical address to logical in specified partition
406 uint32
UDFPhysLbaToPart(IN PVCB Vcb
,
409 /*#define UDFPhysLbaToPart(Vcb, PartNum, Addr) \
410 ((Addr - Vcb->Partitions[PartNum].PartitionRoot) >> Vcb->LB2B_Bits)*/
411 // initialize Tag structure.
412 void UDFSetUpTag(IN PVCB Vcb
,
416 // build content for AllocDesc sequence for specified extent
417 OSSTATUS
UDFBuildShortAllocDescs(IN PVCB Vcb
,
419 OUT int8
** Buff
, // data for AllocLoc
421 IN OUT PUDF_FILE_INFO FileInfo
);
422 // build data for AllocDesc sequence for specified
423 OSSTATUS
UDFBuildLongAllocDescs(IN PVCB Vcb
,
425 OUT int8
** Buff
, // data for AllocLoc
427 IN OUT PUDF_FILE_INFO FileInfo
);
428 // builds FileEntry & associated AllocDescs for specified extent.
429 OSSTATUS
UDFBuildFileEntry(IN PVCB Vcb
,
430 IN PUDF_FILE_INFO DirInfo
,
431 IN PUDF_FILE_INFO FileInfo
,
433 IN uint16 AllocMode
, // short/long/ext/in-icb
435 IN BOOLEAN Extended
/*,
436 OUT PFILE_ENTRY* FEBuff,
438 OUT PEXTENT_INFO FEExtInfo*/);
439 // find partition containing given physical sector
441 __fastcall
UDFGetPartNumByPhysLba(IN PVCB Vcb
,
443 // add given bitmap to existing one
444 #define UDF_FSPACE_BM 0x00
445 #define UDF_ZSPACE_BM 0x01
447 OSSTATUS
UDFAddXSpaceBitmap(IN PVCB Vcb
,
451 // subtract given Bitmap to existing one
452 OSSTATUS
UDFDelXSpaceBitmap(IN PVCB Vcb
,
455 // build FreeSpaceBitmap (internal) according to media parameters & input data
456 OSSTATUS
UDFBuildFreeSpaceBitmap(IN PVCB Vcb
,
458 IN PPARTITION_HEADER_DESC phd
,
460 // fill ExtentInfo for specified FileEntry
461 OSSTATUS
UDFLoadExtInfo(IN PVCB Vcb
,
464 IN OUT PEXTENT_INFO FExtInfo
,
465 IN OUT PEXTENT_INFO AExtInfo
);
466 // convert standard Unicode to compressed
468 __fastcall
UDFCompressUnicode(IN PUNICODE_STRING UName
,
470 IN OUT uint32
* Length
);
471 // build FileIdent for specified FileEntry.
472 OSSTATUS
UDFBuildFileIdent(IN PVCB Vcb
,
473 IN PUNICODE_STRING fn
,
474 IN PLONG_AD FileEntryIcb
, // virtual address of FileEntry
476 OUT PFILE_IDENT_DESC
* _FileId
,
477 OUT uint32
* FileIdLen
);
478 // rebuild mapping on write attempts to Alloc-Not-Rec area.
479 OSSTATUS
UDFMarkAllocatedAsRecorded(IN PVCB Vcb
,
482 IN PEXTENT_INFO ExtInfo
); // Extent array
483 // rebuild mapping on write attempts to Not-Alloc-Not-Rec area
484 OSSTATUS
UDFMarkNotAllocatedAsAllocated(IN PVCB Vcb
,
487 IN PEXTENT_INFO ExtInfo
); // Extent array
488 OSSTATUS
UDFMarkAllocatedAsNotXXX(IN PVCB Vcb
,
491 IN PEXTENT_INFO ExtInfo
, // Extent array
492 IN BOOLEAN Deallocate
);
494 __inline OSSTATUS
UDFMarkAllocatedAsNotAllocated(IN PVCB Vcb
,
497 IN PEXTENT_INFO ExtInfo
)
499 return UDFMarkAllocatedAsNotXXX(Vcb
, Offset
, Length
, ExtInfo
, TRUE
);
502 #define UDFMarkAllocatedAsNotAllocated(Vcb, Off, Len, Ext) \
503 UDFMarkAllocatedAsNotXXX(Vcb, Off, Len, Ext, TRUE)
507 __inline OSSTATUS
UDFMarkRecordedAsAllocated(IN PVCB Vcb
,
510 IN PEXTENT_INFO ExtInfo
)
512 return UDFMarkAllocatedAsNotXXX(Vcb
, Offset
, Length
, ExtInfo
, FALSE
);
515 #define UDFMarkRecordedAsAllocated(Vcb, Off, Len, Ext) \
516 UDFMarkAllocatedAsNotXXX(Vcb, Off, Len, Ext, FALSE)
518 // write data at any offset from specified extent.
519 OSSTATUS
UDFWriteExtent(IN PVCB Vcb
,
520 IN PEXTENT_INFO ExtInfo
, // Extent array
521 IN int64 Offset
, // offset in extent
523 IN BOOLEAN Direct
, // setting this flag delays flushing of given
524 // data to indefinite term
526 OUT uint32
* WrittenBytes
);
528 // deallocate/zero data at any offset from specified extent.
529 OSSTATUS
UDFZeroExtent(IN PVCB Vcb
,
530 IN PEXTENT_INFO ExtInfo
, // Extent array
531 IN int64 Offset
, // offset in extent
533 IN BOOLEAN Deallocate
, // deallocate frag or just mark as unrecorded
534 IN BOOLEAN Direct
, // setting this flag delays flushing of given
535 // data to indefinite term
536 OUT uint32
* WrittenBytes
);
538 #define UDFZeroExtent__(Vcb, Ext, Off, Len, Dir, WB) \
539 UDFZeroExtent(Vcb, Ext, Off, Len, FALSE, Dir, WB)
541 #define UDFSparseExtent__(Vcb, Ext, Off, Len, Dir, WB) \
542 UDFZeroExtent(Vcb, Ext, Off, Len, TRUE, Dir, WB)
545 __fastcall
UDFPartStart(PVCB Vcb
,
548 __fastcall
UDFPartEnd(PVCB Vcb
,
550 // resize extent & associated mapping
551 OSSTATUS
UDFResizeExtent(IN PVCB Vcb
,
554 IN BOOLEAN AlwaysInIcb
, // must be TRUE for AllocDescs
555 OUT PEXTENT_INFO ExtInfo
);
556 // (re)build AllocDescs data & resize associated extent
557 OSSTATUS
UDFBuildAllocDescs(IN PVCB Vcb
,
559 IN OUT PUDF_FILE_INFO FileInfo
,
560 OUT int8
** AllocData
);
561 // set informationLength field in (Ext)FileEntry
562 void UDFSetFileSize(IN PUDF_FILE_INFO FileInfo
,
564 // sync cached FileSize from DirNdx and actual FileSize from FE
565 void UDFSetFileSizeInDirNdx(IN PVCB Vcb
,
566 IN PUDF_FILE_INFO FileInfo
,
568 // get informationLength field in (Ext)FileEntry
569 int64
UDFGetFileSize(IN PUDF_FILE_INFO FileInfo
);
571 int64
UDFGetFileSizeFromDirNdx(IN PVCB Vcb
,
572 IN PUDF_FILE_INFO FileInfo
);
573 // set lengthAllocDesc field in (Ext)FileEntry
574 void UDFSetAllocDescLen(IN PVCB Vcb
,
575 IN PUDF_FILE_INFO FileInfo
);
576 // change fileLinkCount field in (Ext)FileEntry
577 void UDFChangeFileLinkCount(IN PUDF_FILE_INFO FileInfo
,
578 IN BOOLEAN Increase
);
579 #define UDFIncFileLinkCount(fi) UDFChangeFileLinkCount(fi, TRUE)
580 #define UDFDecFileLinkCount(fi) UDFChangeFileLinkCount(fi, FALSE)
582 void UDFSetEntityID_imp_(IN EntityID
* eID
,
586 // get fileLinkCount field from (Ext)FileEntry
587 uint16
UDFGetFileLinkCount(IN PUDF_FILE_INFO FileInfo
);
588 #ifdef UDF_CHECK_UTIL
589 // set fileLinkCount field in (Ext)FileEntry
592 IN PUDF_FILE_INFO FileInfo
,
595 #endif //UDF_CHECK_UTIL
597 #define UDFSetEntityID_imp(eID, Str) \
598 UDFSetEntityID_imp_(eID, (uint8*)(Str), sizeof(Str));
600 void UDFReadEntityID_Domain(PVCB Vcb
,
602 // get lengthExtendedAttr field in (Ext)FileEntry
603 uint32
UDFGetFileEALength(IN PUDF_FILE_INFO FileInfo
);
604 // set UniqueID field in (Ext)FileEntry
605 void UDFSetFileUID(IN PVCB Vcb
,
606 IN PUDF_FILE_INFO FileInfo
);
607 // get UniqueID field in (Ext)FileEntry
608 int64
UDFGetFileUID(IN PUDF_FILE_INFO FileInfo
);
609 // change counters in LVID
610 void UDFChangeFileCounter(IN PVCB Vcb
,
611 IN BOOLEAN FileCounter
,
612 IN BOOLEAN Increase
);
613 #define UDFIncFileCounter(Vcb) UDFChangeFileCounter(Vcb, TRUE, TRUE);
614 #define UDFDecFileCounter(Vcb) UDFChangeFileCounter(Vcb, TRUE, FALSE);
615 #define UDFIncDirCounter(Vcb) UDFChangeFileCounter(Vcb, FALSE, TRUE);
616 #define UDFDecDirCounter(Vcb) UDFChangeFileCounter(Vcb, FALSE, FALSE);
618 OSSTATUS
UDFWriteFile__(IN PVCB Vcb
,
619 IN PUDF_FILE_INFO FileInfo
,
624 OUT uint32
* WrittenBytes
);
625 // mark file as deleted & decrease file link counter.
626 OSSTATUS
UDFUnlinkFile__(IN PVCB Vcb
,
627 IN PUDF_FILE_INFO FileInfo
,
628 IN BOOLEAN FreeSpace
);
629 // delete all files in directory (FreeSpace = TRUE)
630 OSSTATUS
UDFUnlinkAllFilesInDir(IN PVCB Vcb
,
631 IN PUDF_FILE_INFO DirInfo
);
632 // init UDF_FILE_INFO structure for specifiend file
633 OSSTATUS
UDFOpenFile__(IN PVCB Vcb
,
634 IN BOOLEAN IgnoreCase
,
635 IN BOOLEAN NotDeleted
,
636 IN PUNICODE_STRING fn
,
637 IN PUDF_FILE_INFO DirInfo
,
638 OUT PUDF_FILE_INFO
* _FileInfo
,
639 IN uint_di
* IndexToOpen
);
640 // init UDF_FILE_INFO structure for root directory
641 OSSTATUS
UDFOpenRootFile__(IN PVCB Vcb
,
643 OUT PUDF_FILE_INFO FileInfo
);
644 // free all memory blocks referenced by given FileInfo
645 uint32
UDFCleanUpFile__(IN PVCB Vcb
,
646 IN PUDF_FILE_INFO FileInfo
);
647 #define UDF_FREE_NOTHING 0x00
648 #define UDF_FREE_FILEINFO 0x01
649 #define UDF_FREE_DLOC 0x02
650 // create zero-sized file
651 OSSTATUS
UDFCreateFile__(IN PVCB Vcb
,
652 IN BOOLEAN IgnoreCase
,
653 IN PUNICODE_STRING fn
,
657 IN BOOLEAN CreateNew
,
658 IN OUT PUDF_FILE_INFO DirInfo
,
659 OUT PUDF_FILE_INFO
* _FileInfo
);
660 // read data from file described with FileInfo
662 This routine reads data from file described by FileInfo
665 OSSTATUS
UDFReadFile__(IN PVCB Vcb
,
666 IN PUDF_FILE_INFO FileInfo
,
667 IN int64 Offset
, // offset in extent
671 OUT uint32
* ReadBytes
)
673 ValidateFileInfo(FileInfo
);
675 return UDFReadExtent(Vcb
, &(FileInfo
->Dloc
->DataLoc
), Offset
, Length
, Direct
, Buffer
, ReadBytes
);
676 } // end UDFReadFile__()*/
679 This routine reads data from file described by FileInfo
682 OSSTATUS
UDFReadFileLocation__(IN PVCB Vcb
,
683 IN PUDF_FILE_INFO FileInfo
,
684 IN int64 Offset
, // offset in extent to start SubExtent from
685 OUT PEXTENT_MAP
* SubExtInfo
, // SubExtent mapping array
686 IN OUT uint32
* SubExtInfoSz
, // IN: maximum number fragments to get
687 // OUT: actually obtained fragments
688 OUT int64
* NextOffset
// offset, caller can start from to continue
691 ValidateFileInfo(FileInfo
);
693 return UDFReadExtentLocation(Vcb
, &(FileInfo
->Dloc
->DataLoc
), Offset
, SubExtInfo
, SubExtInfoSz
, NextOffset
);
694 } // end UDFReadFile__()*/
697 #define UDFReadFile__(Vcb, FileInfo, Offset, Length, Direct, Buffer, ReadBytes) \
698 (UDFReadExtent(Vcb, &((FileInfo)->Dloc->DataLoc), Offset, Length, Direct, Buffer, ReadBytes))
701 // zero data in file described by FileInfo
703 OSSTATUS
UDFZeroFile__(IN PVCB Vcb
,
704 IN PUDF_FILE_INFO FileInfo
,
705 IN int64 Offset
, // offset in extent
708 OUT uint32
* ReadBytes
);
709 // make sparse area in file described by FileInfo
711 OSSTATUS
UDFSparseFile__(IN PVCB Vcb
,
712 IN PUDF_FILE_INFO FileInfo
,
713 IN int64 Offset
, // offset in extent
716 OUT uint32
* ReadBytes
);
717 // pad sector tail with zeros
718 OSSTATUS
UDFPadLastSector(IN PVCB Vcb
,
719 IN PEXTENT_INFO ExtInfo
);
720 // update AllocDesc sequence, FileIdent & FileEntry
721 OSSTATUS
UDFCloseFile__(IN PVCB Vcb
,
722 IN PUDF_FILE_INFO FileInfo
);
723 // load specified bitmap.
724 OSSTATUS
UDFPrepareXSpaceBitmap(IN PVCB Vcb
,
725 IN OUT PSHORT_AD XSpaceBitmap
,
726 IN OUT PEXTENT_INFO XSBMExtInfo
,
729 // update Freed & Unallocated space bitmaps
730 OSSTATUS
UDFUpdateXSpaceBitmaps(IN PVCB Vcb
,
732 IN PPARTITION_HEADER_DESC phd
); // partition header pointing to Bitmaps
733 // update Partition Desc & associated data structures
734 OSSTATUS
UDFUpdatePartDesc(PVCB Vcb
,
736 // update Logical volume integrity descriptor
737 OSSTATUS
UDFUpdateLogicalVolInt(PVCB Vcb
,
739 // blank Unalloc Space Desc
740 OSSTATUS
UDFUpdateUSpaceDesc(IN PVCB Vcb
,
742 // update Volume Descriptor Sequence
743 OSSTATUS
UDFUpdateVDS(IN PVCB Vcb
,
747 // rebuild & flushes all system areas
748 OSSTATUS
UDFUmount__(IN PVCB Vcb
);
749 // move file from DirInfo1 to DirInfo2 & renames it to fn
750 OSSTATUS
UDFRenameMoveFile__(IN PVCB Vcb
,
751 IN BOOLEAN IgnoreCase
,
752 IN OUT BOOLEAN
* Replace
, // replace if destination file exists
753 IN PUNICODE_STRING fn
, // destination
754 // IN uint32 ExtAttrSz,
755 IN OUT PUDF_FILE_INFO DirInfo1
,
756 IN OUT PUDF_FILE_INFO DirInfo2
,
757 IN OUT PUDF_FILE_INFO FileInfo
); // source (opened)
758 // change file size (on disc)
759 OSSTATUS
UDFResizeFile__(IN PVCB Vcb
,
760 IN OUT PUDF_FILE_INFO FileInfo
,
762 // transform zero-sized file to directory
763 OSSTATUS
UDFRecordDirectory__(IN PVCB Vcb
,
764 IN OUT PUDF_FILE_INFO DirInfo
); // source (opened)
765 // remove all DELETED entries from Dir & resize it.
766 #ifndef UDF_READ_ONLY_BUILD
767 OSSTATUS
UDFPackDirectory__(IN PVCB Vcb
,
768 IN OUT PUDF_FILE_INFO FileInfo
); // source (opened)
769 // rebuild tags for all entries from Dir.
771 UDFReTagDirectory(IN PVCB Vcb
,
772 IN OUT PUDF_FILE_INFO FileInfo
); // source (opened)
773 #endif //UDF_READ_ONLY_BUILD
775 OSSTATUS
UDFLoadVAT(IN PVCB Vcb
,
777 // get volume free space
779 __fastcall
UDFGetFreeSpace(IN PVCB Vcb
);
780 // get volume total space
782 __fastcall
UDFGetTotalSpace(IN PVCB Vcb
);
783 // get DirIndex for specified FileInfo
784 PDIR_INDEX_HDR
UDFGetDirIndexByFileInfo(IN PUDF_FILE_INFO FileInfo
);
785 // check if the file has been found is deleted
786 /*BOOLEAN UDFIsDeleted(IN PDIR_INDEX_ITEM DirNdx);*/
787 #define UDFIsDeleted(DirNdx) \
788 (((DirNdx)->FileCharacteristics & FILE_DELETED) ? TRUE : FALSE)
789 // check Directory flag
790 /*BOOLEAN UDFIsADirectory(IN PUDF_FILE_INFO FileInfo);*/
791 #define UDFIsADirectory(FileInfo) \
792 (((FileInfo) && ((FileInfo)->Dloc) && ((FileInfo)->Dloc->DirIndex || ((FileInfo)->FileIdent && ((FileInfo)->FileIdent->fileCharacteristics & FILE_DIRECTORY)))) ? TRUE : FALSE)
793 // calculate actual allocation size
794 /*int64 UDFGetFileAllocationSize(IN PVCB Vcb,
795 IN PUDF_FILE_INFO FileInfo);*/
796 #define UDFGetFileAllocationSize(Vcb, FileInfo) \
797 (((FileInfo)->Dloc->DataLoc.Mapping) ? UDFGetExtentLength((FileInfo)->Dloc->DataLoc.Mapping) : Vcb->LBlockSize)
798 // check if the directory is empty
799 BOOLEAN
UDFIsDirEmpty(IN PDIR_INDEX_HDR hCurDirNdx
);
801 OSSTATUS
UDFFlushFE(IN PVCB Vcb
,
802 IN PUDF_FILE_INFO FileInfo
,
805 OSSTATUS
UDFFlushFI(IN PVCB Vcb
,
806 IN PUDF_FILE_INFO FileInfo
,
808 // flush all metadata & update counters
809 OSSTATUS
UDFFlushFile__(IN PVCB Vcb
,
810 IN PUDF_FILE_INFO FileInfo
,
811 IN ULONG FlushFlags
= 0);
812 // check if the file is flushed
813 #define UDFIsFlushed(FI) \
815 !(FI->Dloc->FE_Flags & UDF_FE_FLAG_FE_MODIFIED) && \
816 !(FI->Dloc->DataLoc.Modified) && \
817 !(FI->Dloc->AllocLoc.Modified) &&\
818 !(FI->Dloc->FELoc.Modified) && \
819 !(UDFGetDirIndexByFileInfo(FI)[FI->Index].FI_Flags & UDF_FI_FLAG_FI_MODIFIED) )
820 // compare opened directories
821 BOOLEAN
UDFCompareFileInfo(IN PUDF_FILE_INFO f1
,
822 IN PUDF_FILE_INFO f2
);
825 __fastcall
UDFPackMapping(IN PVCB Vcb
,
826 IN PEXTENT_INFO ExtInfo
); // Extent array
827 // check if all the data is in cache.
828 BOOLEAN
UDFIsExtentCached(IN PVCB Vcb
,
829 IN PEXTENT_INFO ExtInfo
, // Extent array
830 IN int64 Offset
, // offset in extent
832 IN BOOLEAN ForWrite
);
833 /*BOOLEAN UDFIsFileCached__(IN PVCB Vcb,
834 IN PUDF_FILE_INFO FileInfo,
835 IN int64 Offset, // offset in extent
837 IN BOOLEAN ForWrite);*/
838 #define UDFIsFileCached__(Vcb, FileInfo, Offset, Length, ForWrite) \
839 (UDFIsExtentCached(Vcb, &((FileInfo)->Dloc->DataLoc), Offset, Length, ForWrite))
840 // check if specified sector belongs to a file
841 ULONG
UDFIsBlockAllocated(IN
void* _Vcb
,
844 OSSTATUS
UDFUpdateVolIdent(IN PVCB Vcb
,
845 IN UDF_VDS_RECORD Lba
,
846 IN PUNICODE_STRING VolIdent
);
847 // calculate checksum for unicode string (for DOS-names)
849 __fastcall
UDFUnicodeCksum(PWCHAR s
,
851 //#define UDFUnicodeCksum(s,n) UDFCrc((uint8*)(s), (n)*sizeof(WCHAR))
855 UDFUnicodeCksum150(PWCHAR s
,
859 __fastcall
crc32(IN uint8
* s
,
861 // calculate a 16-bit CRC checksum using ITU-T V.41 polynomial
863 __fastcall
UDFCrc(IN uint8
* Data
,
865 // read the first block of a tagged descriptor & check it
866 OSSTATUS
UDFReadTagged(IN PVCB Vcb
,
871 // get physycal Lba for partition-relative addr
873 __fastcall
UDFPartLbaToPhys(IN PVCB Vcb
,
875 // look for Anchor(s) at all possible locations
876 lba_t
UDFFindAnchor(PVCB Vcb
); // Volume control block
877 // look for Volume recognition sequence
878 uint32
UDFFindVRS(PVCB Vcb
);
879 // process Primary volume descriptor
880 void UDFLoadPVolDesc(PVCB Vcb
,
881 int8
* Buf
); // pointer to buffer containing PVD
883 #define UDFGetLVIDiUse(Vcb) \
884 ( ((Vcb) && (Vcb)->LVid) ? \
885 ( (LogicalVolIntegrityDescImpUse*) \
886 ( ((int8*)(Vcb->LVid+1)) + \
887 Vcb->LVid->numOfPartitions*2*sizeof(uint32))) \
890 // load Logical volume integrity descriptor
891 OSSTATUS
UDFLoadLogicalVolInt(PDEVICE_OBJECT DeviceObject
,
894 // load Logical volume descriptor
895 OSSTATUS
UDFLoadLogicalVol(PDEVICE_OBJECT DeviceObject
,
899 // process Partition descriptor
900 OSSTATUS
UDFLoadPartDesc(PVCB Vcb
,
902 // scan VDS & fill special array
903 OSSTATUS
UDFReadVDS(IN PVCB Vcb
,
906 IN PUDF_VDS_RECORD vds
,
908 // process a main/reserve volume descriptor sequence.
909 OSSTATUS
UDFProcessSequence(IN PDEVICE_OBJECT DeviceObject
,
913 OUT lb_addr
*fileset
);
914 // Verifies a main/reserve volume descriptor sequence.
915 OSSTATUS
UDFVerifySequence(IN PDEVICE_OBJECT DeviceObject
,
919 OUT lb_addr
*fileset
);
920 // remember some useful info about FileSet & RootDir location
921 void UDFLoadFileset(IN PVCB Vcb
,
922 IN PFILE_SET_DESC fset
,
924 OUT lb_addr
*sysstream
);
925 // load partition info
926 OSSTATUS
UDFLoadPartition(IN PDEVICE_OBJECT DeviceObject
,
928 OUT lb_addr
*fileset
);
929 // check if this is an UDF-formatted disk
930 OSSTATUS
UDFGetDiskInfoAndVerify(IN PDEVICE_OBJECT DeviceObject
, // the target device object
931 IN PVCB Vcb
); // Volume control block from this DevObj
932 // create hard link for the file
933 OSSTATUS
UDFHardLinkFile__(IN PVCB Vcb
,
934 IN BOOLEAN IgnoreCase
,
935 IN OUT BOOLEAN
* Replace
, // replace if destination file exists
936 IN PUNICODE_STRING fn
, // destination
937 IN OUT PUDF_FILE_INFO DirInfo1
,
938 IN OUT PUDF_FILE_INFO DirInfo2
,
939 IN OUT PUDF_FILE_INFO FileInfo
); // source (opened)
941 LONG
UDFFindDloc(IN PVCB Vcb
,
944 LONG
UDFFindFreeDloc(IN PVCB Vcb
,
947 OSSTATUS
UDFAcquireDloc(IN PVCB Vcb
,
948 IN PUDF_DATALOC_INFO Dloc
);
950 OSSTATUS
UDFReleaseDloc(IN PVCB Vcb
,
951 IN PUDF_DATALOC_INFO Dloc
);
953 OSSTATUS
UDFStoreDloc(IN PVCB Vcb
,
954 IN PUDF_FILE_INFO fi
,
957 OSSTATUS
UDFRemoveDloc(IN PVCB Vcb
,
958 IN PUDF_DATALOC_INFO Dloc
);
960 OSSTATUS
UDFUnlinkDloc(IN PVCB Vcb
,
961 IN PUDF_DATALOC_INFO Dloc
);
963 void UDFFreeDloc(IN PVCB Vcb
,
964 IN PUDF_DATALOC_INFO Dloc
);
966 void UDFRelocateDloc(IN PVCB Vcb
,
967 IN PUDF_DATALOC_INFO Dloc
,
970 void UDFReleaseDlocList(IN PVCB Vcb
);
972 PUDF_FILE_INFO
UDFLocateParallelFI(PUDF_FILE_INFO di
, // parent FileInfo
976 PUDF_FILE_INFO
UDFLocateAnyParallelFI(PUDF_FILE_INFO fi
); // FileInfo to start search from
978 void UDFInsertLinkedFile(PUDF_FILE_INFO fi
, // FileInfo to be added to chain
979 PUDF_FILE_INFO fi2
); // any FileInfo fro the chain
981 OSSTATUS
UDFCreateRootFile__(IN PVCB Vcb
,
982 // IN uint16 AllocMode, // short/long/ext/in-icb // always in-ICB
987 OUT PUDF_FILE_INFO
* _FileInfo
);
988 // try to create StreamDirectory associated with given file
989 OSSTATUS
UDFCreateStreamDir__(IN PVCB Vcb
,
990 IN PUDF_FILE_INFO FileInfo
, // file containing stream-dir
991 OUT PUDF_FILE_INFO
* _SDirInfo
);
993 OSSTATUS
UDFOpenStreamDir__(IN PVCB Vcb
,
994 IN PUDF_FILE_INFO FileInfo
, // file containing stream-dir
995 OUT PUDF_FILE_INFO
* _SDirInfo
);
997 #define UDFIsAStreamDir(FI) ((FI) && ((FI)->Dloc) && ((FI)->Dloc->FE_Flags & UDF_FE_FLAG_IS_SDIR))
999 #define UDFHasAStreamDir(FI) ((FI) && ((FI)->Dloc) && ((FI)->Dloc->FE_Flags & UDF_FE_FLAG_HAS_SDIR))
1001 #define UDFIsAStream(FI) ((FI) && UDFIsAStreamDir((FI)->ParentFile))
1003 #define UDFIsSDirDeleted(FI) ((FI) && (FI)->Dloc && ((FI)->Dloc->FE_Flags & UDF_FE_FLAG_IS_DEL_SDIR))
1004 // Record updated VAT (if updated)
1005 OSSTATUS
UDFRecordVAT(IN PVCB Vcb
);
1007 OSSTATUS
UDFModifyVAT(IN PVCB Vcb
,
1011 OSSTATUS
UDFUpdateVAT(IN
void* _Vcb
,
1013 IN uint32
* RelocTab
,
1017 __fastcall
UDFUnPackMapping(IN PVCB Vcb
,
1018 IN PEXTENT_INFO ExtInfo
); // Extent array
1020 OSSTATUS
UDFConvertFEToNonInICB(IN PVCB Vcb
,
1021 IN PUDF_FILE_INFO FileInfo
,
1022 IN uint8 NewAllocMode
);
1024 OSSTATUS
UDFConvertFEToExtended(IN PVCB Vcb
,
1025 IN PUDF_FILE_INFO FileInfo
);
1027 #define UDFGetPartNumByPartNdx(Vcb, pi) (Vcb->Partitions[pi].PartitionNum)
1030 __fastcall
UDFPartLen(PVCB Vcb
,
1033 OSSTATUS
UDFPretendFileDeleted__(IN PVCB Vcb
,
1034 IN PUDF_FILE_INFO FileInfo
);
1036 #define UDFStreamsSupported(Vcb) \
1037 (Vcb->maxUDFWriteRev >= 0x0200)
1039 #define UDFNtAclSupported(Vcb) \
1040 (Vcb->maxUDFWriteRev >= 0x0200)
1042 #define UDFReferenceFile__(fi) \
1044 UDFInterlockedIncrement((PLONG)&((fi)->RefCount)); \
1045 UDFInterlockedIncrement((PLONG)&((fi)->Dloc->LinkRefCount)); \
1046 if((fi)->ParentFile) { \
1047 UDFInterlockedIncrement((PLONG)&((fi)->ParentFile->OpenCount)); \
1051 #define UDFReferenceFileEx__(fi,i) \
1053 UDFInterlockedExchangeAdd((PLONG)&((fi)->RefCount),i); \
1054 UDFInterlockedExchangeAdd((PLONG)&((fi)->Dloc->LinkRefCount),i); \
1055 if((fi)->ParentFile) { \
1056 UDFInterlockedExchangeAdd((PLONG)&((fi)->ParentFile->OpenCount),i); \
1060 #define UDFDereferenceFile__(fi) \
1062 UDFInterlockedDecrement((PLONG)&((fi)->RefCount)); \
1063 UDFInterlockedDecrement((PLONG)&((fi)->Dloc->LinkRefCount)); \
1064 if((fi)->ParentFile) { \
1065 UDFInterlockedDecrement((PLONG)&((fi)->ParentFile->OpenCount)); \
1069 #define UDFIsDirEmpty__(fi) UDFIsDirEmpty((fi)->Dloc->DirIndex)
1070 #define UDFIsDirOpened__(fi) (fi->OpenCount)
1072 #define UDFSetFileAllocMode__(fi, mode) \
1074 (fi)->Dloc->DataLoc.Flags = \
1075 ((fi)->Dloc->DataLoc.Flags & ~EXTENT_FLAG_ALLOC_MASK) | (mode & EXTENT_FLAG_ALLOC_MASK); \
1078 #define UDFGetFileAllocMode__(fi) ((fi)->Dloc->DataLoc.Flags & EXTENT_FLAG_ALLOC_MASK)
1080 #define UDFGetFileICBAllocMode__(fi) (((PFILE_ENTRY)((fi)->Dloc->FileEntry))->icbTag.flags & ICB_FLAG_ALLOC_MASK)
1082 #ifndef UDF_LIMIT_DIR_SIZE // release
1083 #define UDF_DIR_INDEX_FRAME_SH 9
1085 #define UDF_DIR_INDEX_FRAME_SH 7
1088 #define UDF_DIR_INDEX_FRAME ((uint_di)(1 << UDF_DIR_INDEX_FRAME_SH))
1090 #define UDF_DIR_INDEX_FRAME_GRAN (32)
1091 #define UDF_DIR_INDEX_FRAME_GRAN_MASK (UDF_DIR_INDEX_FRAME_GRAN-1)
1092 #define AlignDirIndex(n) ((n+UDF_DIR_INDEX_FRAME_GRAN_MASK) & ~(UDF_DIR_INDEX_FRAME_GRAN_MASK))
1094 #if defined _X86_ && !defined UDF_LIMIT_DIR_SIZE
1099 IN PDIR_INDEX_HDR hDirNdx
,
1103 #else // NO X86 optimization , use generic C/C++
1104 __inline PDIR_INDEX_ITEM
UDFDirIndex(IN PDIR_INDEX_HDR hDirNdx
,
1107 #ifdef UDF_LIMIT_DIR_SIZE
1108 if( hDirNdx
&& (i
< hDirNdx
->LastFrameCount
))
1109 return &( (((PDIR_INDEX_ITEM
*)(hDirNdx
+1))[0])[i
] );
1110 #else //UDF_LIMIT_DIR_SIZE
1113 ((j
= (i
>> UDF_DIR_INDEX_FRAME_SH
)) < (k
= hDirNdx
->FrameCount
) ) &&
1114 ((i
= (i
& (UDF_DIR_INDEX_FRAME
-1))) < ((j
< (k
-1)) ? UDF_DIR_INDEX_FRAME
: hDirNdx
->LastFrameCount
)) )
1115 return &( (((PDIR_INDEX_ITEM
*)(hDirNdx
+1))[j
])[i
] );
1116 #endif // UDF_LIMIT_DIR_SIZE
1121 #define UDFDirIndexGetLastIndex(di) ((((di)->FrameCount - 1) << UDF_DIR_INDEX_FRAME_SH) + (di)->LastFrameCount)
1123 // arr - bit array, bit - number of bit
1127 #define CheckAddr(addr) {ASSERT((uint32)(addr) > 0x1000);}
1129 #define CheckAddr(addr) {ASSERT((uint32)(addr) & 0x80000000);}
1132 #define UDFGetBit(arr, bit) UDFGetBit__((uint32*)(arr), bit)
1141 #define UDFSetBit(arr, bit) UDFSetBit__((uint32*)(arr), bit)
1150 #define UDFSetBits(arr, bit, bc) UDFSetBits__((uint32*)(arr), bit, bc)
1159 #define UDFClrBit(arr, bit) UDFClrBit__((uint32*)(arr), bit)
1168 #define UDFClrBits(arr, bit, bc) UDFClrBits__((uint32*)(arr), bit, bc)
1177 #else // NO X86 optimization , use generic C/C++
1179 #define UDFGetBit(arr, bit) ( (BOOLEAN) ( ((((uint32*)(arr))[(bit)>>5]) >> ((bit)&31)) &1 ) )
1180 #define UDFSetBit(arr, bit) ( (((uint32*)(arr))[(bit)>>5]) |= (((uint32)1) << ((bit)&31)) )
1181 #define UDFClrBit(arr, bit) ( (((uint32*)(arr))[(bit)>>5]) &= (~(((uint32)1) << ((bit)&31))) )
1183 #define UDFSetBits(arr, bit, bc) \
1185 for(j=0;j<bc;j++) { \
1186 UDFSetBit(arr, bit+j); \
1189 #define UDFClrBits(arr, bit, bc) \
1191 for(j=0;j<bc;j++) { \
1192 UDFClrBit(arr, bit+j); \
1197 #define UDFGetUsedBit(arr,bit) (!UDFGetBit(arr,bit))
1198 #define UDFGetFreeBit(arr,bit) UDFGetBit(arr,bit)
1199 #define UDFSetUsedBit(arr,bit) UDFClrBit(arr,bit)
1200 #define UDFSetFreeBit(arr,bit) UDFSetBit(arr,bit)
1201 #define UDFSetUsedBits(arr,bit,bc) UDFClrBits(arr,bit,bc)
1202 #define UDFSetFreeBits(arr,bit,bc) UDFSetBits(arr,bit,bc)
1204 #define UDFGetBadBit(arr,bit) UDFGetBit(arr,bit)
1206 #define UDFGetZeroBit(arr,bit) UDFGetBit(arr,bit)
1207 #define UDFSetZeroBit(arr,bit) UDFSetBit(arr,bit)
1208 #define UDFClrZeroBit(arr,bit) UDFClrBit(arr,bit)
1209 #define UDFSetZeroBits(arr,bit,bc) UDFSetBits(arr,bit,bc)
1210 #define UDFClrZeroBits(arr,bit,bc) UDFClrBits(arr,bit,bc)
1212 #if defined UDF_DBG || defined _CONSOLE
1213 #ifdef UDF_TRACK_ONDISK_ALLOCATION_OWNERS
1214 #define UDFSetFreeBitOwner(Vcb, i) (Vcb)->FSBM_Bitmap_owners[i] = 0;
1215 #define UDFSetUsedBitOwner(Vcb, i, o) (Vcb)->FSBM_Bitmap_owners[i] = o;
1216 #define UDFGetUsedBitOwner(Vcb, i) ((Vcb)->FSBM_Bitmap_owners[i])
1217 #define UDFCheckUsedBitOwner(Vcb, i, o) { \
1218 ASSERT(i<(Vcb)->FSBM_BitCount); \
1219 if((Vcb)->FSBM_Bitmap_owners[i] != -1) { \
1220 ASSERT((Vcb)->FSBM_Bitmap_owners[i] == o); \
1222 ASSERT((Vcb)->FSBM_Bitmap_owners[i] != 0); \
1223 (Vcb)->FSBM_Bitmap_owners[i] = o; \
1226 #define UDFCheckFreeBitOwner(Vcb, i) ASSERT((Vcb)->FSBM_Bitmap_owners[i] == 0);
1228 #define UDFSetFreeBitOwner(Vcb, i)
1229 #define UDFSetUsedBitOwner(Vcb, i, o)
1230 #define UDFCheckUsedBitOwner(Vcb, i, o)
1231 #define UDFCheckFreeBitOwner(Vcb, i)
1232 #endif //UDF_TRACK_ONDISK_ALLOCATION_OWNERS
1234 #define UDFSetFreeBitOwner(Vcb, i)
1235 #define UDFSetUsedBitOwner(Vcb, i, o)
1236 #define UDFCheckUsedBitOwner(Vcb, i, o)
1237 #define UDFCheckFreeBitOwner(Vcb, i)
1240 #ifdef UDF_TRACK_FS_STRUCTURES
1243 UDFRegisterFsStructure(
1246 uint32 Length
// sectors
1248 #else //UDF_TRACK_FS_STRUCTURES
1249 #define UDFRegisterFsStructure(Vcb, Lba, Length) {NOTHING;}
1250 #endif //UDF_TRACK_FS_STRUCTURES
1252 extern const char hexChar
[];
1254 #define UDF_MAX_VERIFY_CACHE (8*1024*1024/2048)
1255 #define UDF_VERIFY_CACHE_LOW (4*1024*1024/2048)
1256 #define UDF_VERIFY_CACHE_GRAN (512*1024/2048)
1257 #define UDF_SYS_CACHE_STOP_THR (10*1024*1024/2048)
1269 #define PH_FORGET_VERIFIED 0x00800000
1270 #define PH_READ_VERIFY_CACHE 0x00400000
1271 #define PH_KEEP_VERIFY_CACHE 0x00200000
1276 IN
void* Buffer
, // Target buffer
1279 // OUT uint32* WrittenBytes,
1286 IN
void* Buffer
, // Target buffer
1289 // OUT uint32* ReadBytes,
1301 #define UFD_VERIFY_FLAG_FORCE 0x01
1302 #define UFD_VERIFY_FLAG_WAIT 0x02
1303 #define UFD_VERIFY_FLAG_BG 0x04
1304 #define UFD_VERIFY_FLAG_LOCKED 0x10
1319 __fastcall
UDFVIsStored(
1324 if(!Vcb
->VerifyCtx
.VInited
)
1326 return UDFGetBit(Vcb
->VerifyCtx
.StoredBitMap
, lba
);
1327 } // end UDFVIsStored()
1337 #endif // __UDF_STRUCT_SUPPORT_H__