[UDFS] Fix includes. CORE-9774
[reactos.git] / reactos / drivers / filesystems / udfs / udf_info / udf_info.h
1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 ////////////////////////////////////////////////////////////////////
5
6 #ifndef __UDF_STRUCT_SUPPORT_H__
7 #define __UDF_STRUCT_SUPPORT_H__
8
9 #include "ecma_167.h"
10 #include "osta_misc.h"
11 #include "udf_rel.h"
12 #include "wcache.h"
13
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
21 uint32
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
27 OUT uint32* Flags,
28 OUT uint32* Index);
29
30 // locate frag containing specified Lba in extent
31 ULONG
32 UDFLocateLbaInExtent(
33 IN PVCB Vcb,
34 IN PEXTENT_MAP Extent, // Extent array
35 IN lba_t lba
36 );
37
38 // see udf_rel.h
39 //#define LBA_OUT_OF_EXTENT ((LONG)(-1))
40 //#define LBA_NOT_ALLOCATED ((LONG)(-2))
41
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
46 IN uint32 Length,
47 IN BOOLEAN Direct,
48 OUT int8* Buffer,
49 OUT uint32* ReadBytes);
50 // builds mapping for specified amount of data at any offset from specified extent.
51 OSSTATUS
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
59 );
60 // calculate total length of extent
61 int64 UDFGetExtentLength(IN PEXTENT_MAP Extent); // Extent array
62 // convert compressed Unicode to standard
63 void
64 __fastcall UDFDecompressUnicode(IN OUT PUNICODE_STRING UName,
65 IN uint8* CS0,
66 IN uint32 Length,
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,
72 IN uint8 Mask);
73
74 #define HASH_POSIX 0x01
75 #define HASH_ULFN 0x02
76 #define HASH_DOS 0x04
77 #define HASH_ALL 0x07
78 #define HASH_KEEP_NAME 0x08 // keep DOS '.' and '..' intact
79
80 // get dirindex's frame
81 PDIR_INDEX_ITEM UDFDirIndexGetFrame(IN PDIR_INDEX_HDR hDirNdx,
82 IN uint32 Frame,
83 OUT uint32* FrameLen,
84 OUT uint_di* Index,
85 IN uint_di Rel);
86 // release DirIndex
87 void UDFDirIndexFree(PDIR_INDEX_HDR hDirNdx);
88 // grow DirIndex
89 OSSTATUS UDFDirIndexGrow(IN PDIR_INDEX_HDR* _hDirNdx,
90 IN uint_di d);
91 // truncate DirIndex
92 OSSTATUS UDFDirIndexTrunc(IN PDIR_INDEX_HDR* _hDirNdx,
93 IN uint_di d);
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,
97 IN uint_di Index);
98 //
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);
112
113 __inline OSSTATUS UDFFindFile__(IN PVCB Vcb,
114 IN BOOLEAN IgnoreCase,
115 IN PUNICODE_STRING Name,
116 IN PUDF_FILE_INFO DirInfo)
117 {
118 if(!DirInfo->Dloc->DirIndex)
119 return STATUS_NOT_A_DIRECTORY;
120 uint_di i=0;
121 return UDFFindFile(Vcb, IgnoreCase, TRUE, Name, DirInfo, &i);
122 }
123
124 // calculate file mapping length (in bytes) including ZERO-terminator
125 uint32 UDFGetMappingLength(IN PEXTENT_MAP Extent);
126 // merge 2 sequencial file mappings
127 PEXTENT_MAP
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,
132 IN uint32 PartNum,
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,
151 IN uint32 PartNum,
152 IN tag* XEntry,
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,
158 IN long_ad* Icb,
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
169 PEXTENT_MAP
170 __fastcall UDFExtentToMapping_(IN PEXTENT_AD Extent
171 #ifdef UDF_TRACK_EXTENT_TO_MAPPING
172 ,IN ULONG src,
173 IN ULONG line
174 #endif //UDF_TRACK_EXTENT_TO_MAPPING
175 );
176
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
182
183 // This routine remaps sectors from bad packet
184 OSSTATUS
185 __fastcall UDFRemapPacket(IN PVCB Vcb,
186 IN uint32 Lba,
187 IN BOOLEAN RemapSpared);
188
189 // This routine releases sector mapping when entire packet is marked as free
190 OSSTATUS
191 __fastcall UDFUnmapRange(IN PVCB Vcb,
192 IN uint32 Lba,
193 IN uint32 BCount);
194
195 // return physical address for relocated sector
196 uint32
197 __fastcall UDFRelocateSector(IN PVCB Vcb,
198 IN uint32 Lba);
199 // check
200 BOOLEAN
201 __fastcall UDFAreSectorsRelocated(IN PVCB Vcb,
202 IN uint32 Lba,
203 IN uint32 BlockCount);
204 // build mapping for relocated extent
205 PEXTENT_MAP
206 __fastcall UDFRelocateSectors(IN PVCB Vcb,
207 IN uint32 Lba,
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.
212 // validate char
213 BOOLEAN
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));
218
219 void
220 __fastcall UDFDOSName(IN PVCB Vcb,
221 IN OUT PUNICODE_STRING DosName,
222 IN PUNICODE_STRING UdfName,
223 IN BOOLEAN KeepIntact);
224
225 void
226 __fastcall UDFDOSName201(IN OUT PUNICODE_STRING DosName,
227 IN PUNICODE_STRING UdfName,
228 IN BOOLEAN KeepIntact);
229
230 void
231 __fastcall UDFDOSName200(IN OUT PUNICODE_STRING DosName,
232 IN PUNICODE_STRING UdfName,
233 IN BOOLEAN KeepIntact,
234 IN BOOLEAN Mode150);
235
236 void
237 __fastcall UDFDOSName100(IN OUT PUNICODE_STRING DosName,
238 IN PUNICODE_STRING UdfName,
239 IN BOOLEAN KeepIntact);
240
241 // return length of bit-chain starting from Offs bit
242 #ifdef _X86_
243 uint32
244 __stdcall
245 UDFGetBitmapLen(
246 #else // NO X86 optimization , use generic C/C++
247 uint32 UDFGetBitmapLen(
248 #endif // _X86_
249 uint32* Bitmap,
250 uint32 Offs,
251 uint32 Lim);
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,
256 IN uint32 SearchLim,
257 OUT uint32* MaxExtLen,
258 IN uint8 AllocFlags);
259
260 #ifdef UDF_CHECK_DISK_ALLOCATION
261 // mark space described by Mapping as Used/Freed (optionaly)
262 void UDFCheckSpaceAllocation_(IN PVCB Vcb,
263 IN PEXTENT_MAP Map,
264 IN uint32 asXXX
265 #ifdef UDF_TRACK_ONDISK_ALLOCATION
266 ,IN uint32 FE_lba,
267 IN uint32 BugCheckId,
268 IN uint32 Line
269 #endif //UDF_TRACK_ONDISK_ALLOCATION
270 );
271
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
282
283 // mark space described by Mapping as Used/Freed (optionaly)
284 // this routine doesn't acquire any resource
285 void
286 UDFMarkSpaceAsXXXNoProtect_(
287 IN PVCB Vcb,
288 IN PEXTENT_MAP Map,
289 IN uint32 asXXX
290 #ifdef UDF_TRACK_ONDISK_ALLOCATION
291 ,IN uint32 FE_lba,
292 IN uint32 BugCheckId,
293 IN uint32 Line
294 #endif //UDF_TRACK_ONDISK_ALLOCATION
295 );
296
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
304
305
306 // mark space described by Mapping as Used/Freed (optionaly)
307 void UDFMarkSpaceAsXXX_(IN PVCB Vcb,
308 IN PEXTENT_MAP Map,
309 IN uint32 asXXX
310 #ifdef UDF_TRACK_ONDISK_ALLOCATION
311 ,IN uint32 FE_lba,
312 IN uint32 BugCheckId,
313 IN uint32 Line
314 #endif //UDF_TRACK_ONDISK_ALLOCATION
315 );
316
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
324
325 #define AS_FREE 0x00
326 #define AS_USED 0x01
327 #define AS_DISCARDED 0x02
328 #define AS_BAD 0x04
329
330 // build mapping for Length bytes in FreeSpace
331 OSSTATUS UDFAllocFreeExtent_(IN PVCB Vcb,
332 IN int64 Length,
333 IN uint32 SearchStart,
334 IN uint32 SearchLim,
335 OUT PEXTENT_INFO Extent,
336 IN uint8 AllocFlags
337 #ifdef UDF_TRACK_ALLOC_FREE_EXTENT
338 ,IN uint32 src,
339 IN uint32 line
340 #endif //UDF_TRACK_ALLOC_FREE_EXTENT
341 );
342
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
348 //
349
350 uint32 __fastcall
351 UDFGetPartFreeSpace(IN PVCB Vcb,
352 IN uint32 partNum);
353
354 #define UDF_PREALLOC_CLASS_FE 0x00
355 #define UDF_PREALLOC_CLASS_DIR 0x01
356
357 // try to find cached allocation
358 OSSTATUS
359 UDFGetCachedAllocation(
360 IN PVCB Vcb,
361 IN uint32 ParentLocation,
362 OUT PEXTENT_INFO Ext,
363 OUT uint32* Items, // optional
364 IN uint32 AllocClass
365 );
366 // put released pre-allocation to cache
367 OSSTATUS
368 UDFStoreCachedAllocation(
369 IN PVCB Vcb,
370 IN uint32 ParentLocation,
371 IN PEXTENT_INFO Ext,
372 IN uint32 Items,
373 IN uint32 AllocClass
374 );
375 // discard all cached allocations
376 OSSTATUS
377 UDFFlushAllCachedAllocations(
378 IN PVCB Vcb,
379 IN uint32 AllocClass
380 );
381 // allocate space for FE
382 OSSTATUS UDFAllocateFESpace(IN PVCB Vcb,
383 IN PUDF_FILE_INFO DirInfo,
384 IN uint32 PartNum,
385 IN PEXTENT_INFO FEExtInfo,
386 IN uint32 Len);
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
393
394 #define FLUSH_FE_KEEP FALSE
395 #define FLUSH_FE_FOR_DEL TRUE
396
397 // flush FE charge
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,
407 IN uint32 PartNum,
408 IN uint32 Addr);
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,
413 IN tag* Tag,
414 IN uint16 DataLen,
415 IN uint32 TagLoc);
416 // build content for AllocDesc sequence for specified extent
417 OSSTATUS UDFBuildShortAllocDescs(IN PVCB Vcb,
418 IN uint32 PartNum,
419 OUT int8** Buff, // data for AllocLoc
420 IN uint32 InitSz,
421 IN OUT PUDF_FILE_INFO FileInfo);
422 // build data for AllocDesc sequence for specified
423 OSSTATUS UDFBuildLongAllocDescs(IN PVCB Vcb,
424 IN uint32 PartNum,
425 OUT int8** Buff, // data for AllocLoc
426 IN uint32 InitSz,
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,
432 IN uint32 PartNum,
433 IN uint16 AllocMode, // short/long/ext/in-icb
434 IN uint32 ExtAttrSz,
435 IN BOOLEAN Extended/*,
436 OUT PFILE_ENTRY* FEBuff,
437 OUT uint32* FELen,
438 OUT PEXTENT_INFO FEExtInfo*/);
439 // find partition containing given physical sector
440 uint32
441 __fastcall UDFGetPartNumByPhysLba(IN PVCB Vcb,
442 IN uint32 Lba);
443 // add given bitmap to existing one
444 #define UDF_FSPACE_BM 0x00
445 #define UDF_ZSPACE_BM 0x01
446
447 OSSTATUS UDFAddXSpaceBitmap(IN PVCB Vcb,
448 IN uint32 PartNum,
449 IN PSHORT_AD bm,
450 IN ULONG bm_type);
451 // subtract given Bitmap to existing one
452 OSSTATUS UDFDelXSpaceBitmap(IN PVCB Vcb,
453 IN uint32 PartNum,
454 IN PSHORT_AD bm);
455 // build FreeSpaceBitmap (internal) according to media parameters & input data
456 OSSTATUS UDFBuildFreeSpaceBitmap(IN PVCB Vcb,
457 IN uint32 PartNdx,
458 IN PPARTITION_HEADER_DESC phd,
459 IN uint32 Lba);
460 // fill ExtentInfo for specified FileEntry
461 OSSTATUS UDFLoadExtInfo(IN PVCB Vcb,
462 IN PFILE_ENTRY fe,
463 IN PLONG_AD fe_loc,
464 IN OUT PEXTENT_INFO FExtInfo,
465 IN OUT PEXTENT_INFO AExtInfo);
466 // convert standard Unicode to compressed
467 void
468 __fastcall UDFCompressUnicode(IN PUNICODE_STRING UName,
469 IN OUT uint8** _CS0,
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
475 IN uint32 ImpUseLen,
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,
480 IN int64 Offset,
481 IN uint32 Length,
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,
485 IN int64 Offset,
486 IN uint32 Length,
487 IN PEXTENT_INFO ExtInfo); // Extent array
488 OSSTATUS UDFMarkAllocatedAsNotXXX(IN PVCB Vcb,
489 IN int64 Offset,
490 IN uint32 Length,
491 IN PEXTENT_INFO ExtInfo, // Extent array
492 IN BOOLEAN Deallocate);
493 #ifdef DBG
494 __inline OSSTATUS UDFMarkAllocatedAsNotAllocated(IN PVCB Vcb,
495 IN int64 Offset,
496 IN uint32 Length,
497 IN PEXTENT_INFO ExtInfo)
498 {
499 return UDFMarkAllocatedAsNotXXX(Vcb, Offset, Length, ExtInfo, TRUE);
500 }
501 #else
502 #define UDFMarkAllocatedAsNotAllocated(Vcb, Off, Len, Ext) \
503 UDFMarkAllocatedAsNotXXX(Vcb, Off, Len, Ext, TRUE)
504 #endif //DBG
505
506 #ifdef DBG
507 __inline OSSTATUS UDFMarkRecordedAsAllocated(IN PVCB Vcb,
508 IN int64 Offset,
509 IN uint32 Length,
510 IN PEXTENT_INFO ExtInfo)
511 {
512 return UDFMarkAllocatedAsNotXXX(Vcb, Offset, Length, ExtInfo, FALSE);
513 }
514 #else
515 #define UDFMarkRecordedAsAllocated(Vcb, Off, Len, Ext) \
516 UDFMarkAllocatedAsNotXXX(Vcb, Off, Len, Ext, FALSE)
517 #endif //DBG
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
522 IN uint32 Length,
523 IN BOOLEAN Direct, // setting this flag delays flushing of given
524 // data to indefinite term
525 IN int8* Buffer,
526 OUT uint32* WrittenBytes);
527
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
532 IN uint32 Length,
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);
537
538 #define UDFZeroExtent__(Vcb, Ext, Off, Len, Dir, WB) \
539 UDFZeroExtent(Vcb, Ext, Off, Len, FALSE, Dir, WB)
540
541 #define UDFSparseExtent__(Vcb, Ext, Off, Len, Dir, WB) \
542 UDFZeroExtent(Vcb, Ext, Off, Len, TRUE, Dir, WB)
543
544 uint32
545 __fastcall UDFPartStart(PVCB Vcb,
546 uint32 PartNum);
547 uint32
548 __fastcall UDFPartEnd(PVCB Vcb,
549 uint32 PartNum);
550 // resize extent & associated mapping
551 OSSTATUS UDFResizeExtent(IN PVCB Vcb,
552 IN uint32 PartNum,
553 IN int64 Length,
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,
558 IN uint32 PartNum,
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,
563 IN int64 Size);
564 // sync cached FileSize from DirNdx and actual FileSize from FE
565 void UDFSetFileSizeInDirNdx(IN PVCB Vcb,
566 IN PUDF_FILE_INFO FileInfo,
567 IN int64* ASize);
568 // get informationLength field in (Ext)FileEntry
569 int64 UDFGetFileSize(IN PUDF_FILE_INFO FileInfo);
570 //
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)
581 // ee
582 void UDFSetEntityID_imp_(IN EntityID* eID,
583 IN uint8* Str,
584 IN uint32 Len);
585
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
590 void
591 UDFSetFileLinkCount(
592 IN PUDF_FILE_INFO FileInfo,
593 uint16 LinkCount
594 );
595 #endif //UDF_CHECK_UTIL
596
597 #define UDFSetEntityID_imp(eID, Str) \
598 UDFSetEntityID_imp_(eID, (uint8*)(Str), sizeof(Str));
599 //
600 void UDFReadEntityID_Domain(PVCB Vcb,
601 EntityID* eID);
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);
617 // write to file
618 OSSTATUS UDFWriteFile__(IN PVCB Vcb,
619 IN PUDF_FILE_INFO FileInfo,
620 IN int64 Offset,
621 IN uint32 Length,
622 IN BOOLEAN Direct,
623 IN int8* Buffer,
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,
642 IN lb_addr* RootLoc,
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,
654 IN uint32 ExtAttrSz,
655 IN uint32 ImpUseLen,
656 IN BOOLEAN Extended,
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
661 /*
662 This routine reads data from file described by FileInfo
663 */
664 __inline
665 OSSTATUS UDFReadFile__(IN PVCB Vcb,
666 IN PUDF_FILE_INFO FileInfo,
667 IN int64 Offset, // offset in extent
668 IN uint32 Length,
669 IN BOOLEAN Direct,
670 OUT int8* Buffer,
671 OUT uint32* ReadBytes)
672 {
673 ValidateFileInfo(FileInfo);
674
675 return UDFReadExtent(Vcb, &(FileInfo->Dloc->DataLoc), Offset, Length, Direct, Buffer, ReadBytes);
676 } // end UDFReadFile__()*/
677
678 /*
679 This routine reads data from file described by FileInfo
680 */
681 __inline
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
689 )
690 {
691 ValidateFileInfo(FileInfo);
692
693 return UDFReadExtentLocation(Vcb, &(FileInfo->Dloc->DataLoc), Offset, SubExtInfo, SubExtInfoSz, NextOffset);
694 } // end UDFReadFile__()*/
695
696 /*
697 #define UDFReadFile__(Vcb, FileInfo, Offset, Length, Direct, Buffer, ReadBytes) \
698 (UDFReadExtent(Vcb, &((FileInfo)->Dloc->DataLoc), Offset, Length, Direct, Buffer, ReadBytes))
699 */
700
701 // zero data in file described by FileInfo
702 __inline
703 OSSTATUS UDFZeroFile__(IN PVCB Vcb,
704 IN PUDF_FILE_INFO FileInfo,
705 IN int64 Offset, // offset in extent
706 IN uint32 Length,
707 IN BOOLEAN Direct,
708 OUT uint32* ReadBytes);
709 // make sparse area in file described by FileInfo
710 __inline
711 OSSTATUS UDFSparseFile__(IN PVCB Vcb,
712 IN PUDF_FILE_INFO FileInfo,
713 IN int64 Offset, // offset in extent
714 IN uint32 Length,
715 IN BOOLEAN Direct,
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,
727 IN OUT int8** XSBM,
728 IN OUT uint32* XSl);
729 // update Freed & Unallocated space bitmaps
730 OSSTATUS UDFUpdateXSpaceBitmaps(IN PVCB Vcb,
731 IN uint32 PartNum,
732 IN PPARTITION_HEADER_DESC phd); // partition header pointing to Bitmaps
733 // update Partition Desc & associated data structures
734 OSSTATUS UDFUpdatePartDesc(PVCB Vcb,
735 int8* Buf);
736 // update Logical volume integrity descriptor
737 OSSTATUS UDFUpdateLogicalVolInt(PVCB Vcb,
738 BOOLEAN Close);
739 // blank Unalloc Space Desc
740 OSSTATUS UDFUpdateUSpaceDesc(IN PVCB Vcb,
741 int8* Buf);
742 // update Volume Descriptor Sequence
743 OSSTATUS UDFUpdateVDS(IN PVCB Vcb,
744 IN uint32 block,
745 IN uint32 lastblock,
746 IN uint32 flags);
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,
761 IN int64 NewLength);
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.
770 OSSTATUS
771 UDFReTagDirectory(IN PVCB Vcb,
772 IN OUT PUDF_FILE_INFO FileInfo); // source (opened)
773 #endif //UDF_READ_ONLY_BUILD
774 // load VAT.
775 OSSTATUS UDFLoadVAT(IN PVCB Vcb,
776 IN uint32 PartNdx);
777 // get volume free space
778 int64
779 __fastcall UDFGetFreeSpace(IN PVCB Vcb);
780 // get volume total space
781 int64
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);
800 // flush FE
801 OSSTATUS UDFFlushFE(IN PVCB Vcb,
802 IN PUDF_FILE_INFO FileInfo,
803 IN uint32 PartNum);
804 // flush FI
805 OSSTATUS UDFFlushFI(IN PVCB Vcb,
806 IN PUDF_FILE_INFO FileInfo,
807 IN uint32 PartNum);
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) \
814 ( 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);
823 // pack mappings
824 void
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
831 IN uint32 Length,
832 IN BOOLEAN ForWrite);
833 /*BOOLEAN UDFIsFileCached__(IN PVCB Vcb,
834 IN PUDF_FILE_INFO FileInfo,
835 IN int64 Offset, // offset in extent
836 IN uint32 Length,
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,
842 IN uint32 Lba);
843 // record VolIdent
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)
848 uint16
849 __fastcall UDFUnicodeCksum(PWCHAR s,
850 uint32 n);
851 //#define UDFUnicodeCksum(s,n) UDFCrc((uint8*)(s), (n)*sizeof(WCHAR))
852 //
853 uint16
854 __fastcall
855 UDFUnicodeCksum150(PWCHAR s,
856 uint32 n);
857
858 uint32
859 __fastcall crc32(IN uint8* s,
860 IN uint32 len);
861 // calculate a 16-bit CRC checksum using ITU-T V.41 polynomial
862 uint16
863 __fastcall UDFCrc(IN uint8* Data,
864 IN uint32 Size);
865 // read the first block of a tagged descriptor & check it
866 OSSTATUS UDFReadTagged(IN PVCB Vcb,
867 IN int8* Buf,
868 IN uint32 Block,
869 IN uint32 Location,
870 OUT uint16 *Ident);
871 // get physycal Lba for partition-relative addr
872 uint32
873 __fastcall UDFPartLbaToPhys(IN PVCB Vcb,
874 IN lb_addr* Addr);
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
882 //
883 #define UDFGetLVIDiUse(Vcb) \
884 ( ((Vcb) && (Vcb)->LVid) ? \
885 ( (LogicalVolIntegrityDescImpUse*) \
886 ( ((int8*)(Vcb->LVid+1)) + \
887 Vcb->LVid->numOfPartitions*2*sizeof(uint32))) \
888 : NULL)
889
890 // load Logical volume integrity descriptor
891 OSSTATUS UDFLoadLogicalVolInt(PDEVICE_OBJECT DeviceObject,
892 PVCB Vcb,
893 extent_ad loc);
894 // load Logical volume descriptor
895 OSSTATUS UDFLoadLogicalVol(PDEVICE_OBJECT DeviceObject,
896 PVCB Vcb,
897 int8* Buf,
898 lb_addr *fileset);
899 // process Partition descriptor
900 OSSTATUS UDFLoadPartDesc(PVCB Vcb,
901 int8* Buf);
902 // scan VDS & fill special array
903 OSSTATUS UDFReadVDS(IN PVCB Vcb,
904 IN uint32 block,
905 IN uint32 lastblock,
906 IN PUDF_VDS_RECORD vds,
907 IN int8* Buf);
908 // process a main/reserve volume descriptor sequence.
909 OSSTATUS UDFProcessSequence(IN PDEVICE_OBJECT DeviceObject,
910 IN PVCB Vcb,
911 IN uint32 block,
912 IN uint32 lastblock,
913 OUT lb_addr *fileset);
914 // Verifies a main/reserve volume descriptor sequence.
915 OSSTATUS UDFVerifySequence(IN PDEVICE_OBJECT DeviceObject,
916 IN PVCB Vcb,
917 IN uint32 block,
918 IN uint32 lastblock,
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,
923 OUT lb_addr *root,
924 OUT lb_addr *sysstream);
925 // load partition info
926 OSSTATUS UDFLoadPartition(IN PDEVICE_OBJECT DeviceObject,
927 IN PVCB Vcb,
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)
940 //
941 LONG UDFFindDloc(IN PVCB Vcb,
942 IN uint32 Lba);
943 //
944 LONG UDFFindFreeDloc(IN PVCB Vcb,
945 IN uint32 Lba);
946 //
947 OSSTATUS UDFAcquireDloc(IN PVCB Vcb,
948 IN PUDF_DATALOC_INFO Dloc);
949 //
950 OSSTATUS UDFReleaseDloc(IN PVCB Vcb,
951 IN PUDF_DATALOC_INFO Dloc);
952 //
953 OSSTATUS UDFStoreDloc(IN PVCB Vcb,
954 IN PUDF_FILE_INFO fi,
955 IN uint32 Lba);
956 //
957 OSSTATUS UDFRemoveDloc(IN PVCB Vcb,
958 IN PUDF_DATALOC_INFO Dloc);
959 //
960 OSSTATUS UDFUnlinkDloc(IN PVCB Vcb,
961 IN PUDF_DATALOC_INFO Dloc);
962 //
963 void UDFFreeDloc(IN PVCB Vcb,
964 IN PUDF_DATALOC_INFO Dloc);
965 //
966 void UDFRelocateDloc(IN PVCB Vcb,
967 IN PUDF_DATALOC_INFO Dloc,
968 IN uint32 NewLba);
969 //
970 void UDFReleaseDlocList(IN PVCB Vcb);
971 //
972 PUDF_FILE_INFO UDFLocateParallelFI(PUDF_FILE_INFO di, // parent FileInfo
973 uint_di i, // Index
974 PUDF_FILE_INFO fi);
975 //
976 PUDF_FILE_INFO UDFLocateAnyParallelFI(PUDF_FILE_INFO fi); // FileInfo to start search from
977 //
978 void UDFInsertLinkedFile(PUDF_FILE_INFO fi, // FileInfo to be added to chain
979 PUDF_FILE_INFO fi2); // any FileInfo fro the chain
980 //
981 OSSTATUS UDFCreateRootFile__(IN PVCB Vcb,
982 // IN uint16 AllocMode, // short/long/ext/in-icb // always in-ICB
983 IN uint32 PartNum,
984 IN uint32 ExtAttrSz,
985 IN uint32 ImpUseLen,
986 IN BOOLEAN Extended,
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);
992 //
993 OSSTATUS UDFOpenStreamDir__(IN PVCB Vcb,
994 IN PUDF_FILE_INFO FileInfo, // file containing stream-dir
995 OUT PUDF_FILE_INFO* _SDirInfo);
996 //
997 #define UDFIsAStreamDir(FI) ((FI) && ((FI)->Dloc) && ((FI)->Dloc->FE_Flags & UDF_FE_FLAG_IS_SDIR))
998 //
999 #define UDFHasAStreamDir(FI) ((FI) && ((FI)->Dloc) && ((FI)->Dloc->FE_Flags & UDF_FE_FLAG_HAS_SDIR))
1000 //
1001 #define UDFIsAStream(FI) ((FI) && UDFIsAStreamDir((FI)->ParentFile))
1002 //
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);
1006 //
1007 OSSTATUS UDFModifyVAT(IN PVCB Vcb,
1008 IN uint32 Lba,
1009 IN uint32 Length);
1010 //
1011 OSSTATUS UDFUpdateVAT(IN void* _Vcb,
1012 IN uint32 Lba,
1013 IN uint32* RelocTab,
1014 IN uint32 BCount);
1015 //
1016 OSSTATUS
1017 __fastcall UDFUnPackMapping(IN PVCB Vcb,
1018 IN PEXTENT_INFO ExtInfo); // Extent array
1019 //
1020 OSSTATUS UDFConvertFEToNonInICB(IN PVCB Vcb,
1021 IN PUDF_FILE_INFO FileInfo,
1022 IN uint8 NewAllocMode);
1023 //
1024 OSSTATUS UDFConvertFEToExtended(IN PVCB Vcb,
1025 IN PUDF_FILE_INFO FileInfo);
1026 //
1027 #define UDFGetPartNumByPartNdx(Vcb, pi) (Vcb->Partitions[pi].PartitionNum)
1028 //
1029 uint32
1030 __fastcall UDFPartLen(PVCB Vcb,
1031 uint32 PartNum);
1032 //
1033 OSSTATUS UDFPretendFileDeleted__(IN PVCB Vcb,
1034 IN PUDF_FILE_INFO FileInfo);
1035
1036 #define UDFStreamsSupported(Vcb) \
1037 (Vcb->maxUDFWriteRev >= 0x0200)
1038
1039 #define UDFNtAclSupported(Vcb) \
1040 (Vcb->maxUDFWriteRev >= 0x0200)
1041
1042 #define UDFReferenceFile__(fi) \
1043 { \
1044 UDFInterlockedIncrement((PLONG)&((fi)->RefCount)); \
1045 UDFInterlockedIncrement((PLONG)&((fi)->Dloc->LinkRefCount)); \
1046 if((fi)->ParentFile) { \
1047 UDFInterlockedIncrement((PLONG)&((fi)->ParentFile->OpenCount)); \
1048 } \
1049 }
1050
1051 #define UDFReferenceFileEx__(fi,i) \
1052 { \
1053 UDFInterlockedExchangeAdd((PLONG)&((fi)->RefCount),i); \
1054 UDFInterlockedExchangeAdd((PLONG)&((fi)->Dloc->LinkRefCount),i); \
1055 if((fi)->ParentFile) { \
1056 UDFInterlockedExchangeAdd((PLONG)&((fi)->ParentFile->OpenCount),i); \
1057 } \
1058 }
1059
1060 #define UDFDereferenceFile__(fi) \
1061 { \
1062 UDFInterlockedDecrement((PLONG)&((fi)->RefCount)); \
1063 UDFInterlockedDecrement((PLONG)&((fi)->Dloc->LinkRefCount)); \
1064 if((fi)->ParentFile) { \
1065 UDFInterlockedDecrement((PLONG)&((fi)->ParentFile->OpenCount)); \
1066 } \
1067 }
1068
1069 #define UDFIsDirEmpty__(fi) UDFIsDirEmpty((fi)->Dloc->DirIndex)
1070 #define UDFIsDirOpened__(fi) (fi->OpenCount)
1071
1072 #define UDFSetFileAllocMode__(fi, mode) \
1073 { \
1074 (fi)->Dloc->DataLoc.Flags = \
1075 ((fi)->Dloc->DataLoc.Flags & ~EXTENT_FLAG_ALLOC_MASK) | (mode & EXTENT_FLAG_ALLOC_MASK); \
1076 }
1077
1078 #define UDFGetFileAllocMode__(fi) ((fi)->Dloc->DataLoc.Flags & EXTENT_FLAG_ALLOC_MASK)
1079
1080 #define UDFGetFileICBAllocMode__(fi) (((PFILE_ENTRY)((fi)->Dloc->FileEntry))->icbTag.flags & ICB_FLAG_ALLOC_MASK)
1081
1082 #ifndef UDF_LIMIT_DIR_SIZE // release
1083 #define UDF_DIR_INDEX_FRAME_SH 9
1084 #else // demo
1085 #define UDF_DIR_INDEX_FRAME_SH 7
1086 #endif
1087
1088 #define UDF_DIR_INDEX_FRAME ((uint_di)(1 << UDF_DIR_INDEX_FRAME_SH))
1089
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))
1093
1094 #if defined _X86_ && !defined UDF_LIMIT_DIR_SIZE
1095
1096 PDIR_INDEX_ITEM
1097 __fastcall
1098 UDFDirIndex(
1099 IN PDIR_INDEX_HDR hDirNdx,
1100 IN uint32 i
1101 );
1102
1103 #else // NO X86 optimization , use generic C/C++
1104 __inline PDIR_INDEX_ITEM UDFDirIndex(IN PDIR_INDEX_HDR hDirNdx,
1105 IN uint_di i)
1106 {
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
1111 uint_di j, k;
1112 if( hDirNdx &&
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
1117 return NULL;
1118 }
1119 #endif // _X86_
1120
1121 #define UDFDirIndexGetLastIndex(di) ((((di)->FrameCount - 1) << UDF_DIR_INDEX_FRAME_SH) + (di)->LastFrameCount)
1122
1123 // arr - bit array, bit - number of bit
1124 #ifdef _X86_
1125
1126 #ifdef _CONSOLE
1127 #define CheckAddr(addr) {ASSERT((uint32)(addr) > 0x1000);}
1128 #else
1129 #define CheckAddr(addr) {ASSERT((uint32)(addr) & 0x80000000);}
1130 #endif
1131
1132 #define UDFGetBit(arr, bit) UDFGetBit__((uint32*)(arr), bit)
1133
1134 BOOLEAN
1135 __fastcall
1136 UDFGetBit__(
1137 IN uint32* arr,
1138 IN uint32 bit
1139 );
1140
1141 #define UDFSetBit(arr, bit) UDFSetBit__((uint32*)(arr), bit)
1142
1143 void
1144 __fastcall
1145 UDFSetBit__(
1146 IN uint32* arr,
1147 IN uint32 bit
1148 );
1149
1150 #define UDFSetBits(arr, bit, bc) UDFSetBits__((uint32*)(arr), bit, bc)
1151
1152 void
1153 UDFSetBits__(
1154 IN uint32* arr,
1155 IN uint32 bit,
1156 IN uint32 bc
1157 );
1158
1159 #define UDFClrBit(arr, bit) UDFClrBit__((uint32*)(arr), bit)
1160
1161 void
1162 __fastcall
1163 UDFClrBit__(
1164 IN uint32* arr,
1165 IN uint32 bit
1166 );
1167
1168 #define UDFClrBits(arr, bit, bc) UDFClrBits__((uint32*)(arr), bit, bc)
1169
1170 void
1171 UDFClrBits__(
1172 IN uint32* arr,
1173 IN uint32 bit,
1174 IN uint32 bc
1175 );
1176
1177 #else // NO X86 optimization , use generic C/C++
1178
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))) )
1182
1183 #define UDFSetBits(arr, bit, bc) \
1184 {uint32 j; \
1185 for(j=0;j<bc;j++) { \
1186 UDFSetBit(arr, bit+j); \
1187 }}
1188
1189 #define UDFClrBits(arr, bit, bc) \
1190 {uint32 j; \
1191 for(j=0;j<bc;j++) { \
1192 UDFClrBit(arr, bit+j); \
1193 }}
1194
1195 #endif // _X86_
1196
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)
1203
1204 #define UDFGetBadBit(arr,bit) UDFGetBit(arr,bit)
1205
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)
1211
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); \
1221 } else { \
1222 ASSERT((Vcb)->FSBM_Bitmap_owners[i] != 0); \
1223 (Vcb)->FSBM_Bitmap_owners[i] = o; \
1224 } \
1225 }
1226 #define UDFCheckFreeBitOwner(Vcb, i) ASSERT((Vcb)->FSBM_Bitmap_owners[i] == 0);
1227 #else
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
1233 #else
1234 #define UDFSetFreeBitOwner(Vcb, i)
1235 #define UDFSetUsedBitOwner(Vcb, i, o)
1236 #define UDFCheckUsedBitOwner(Vcb, i, o)
1237 #define UDFCheckFreeBitOwner(Vcb, i)
1238 #endif //UDF_DBG
1239
1240 #ifdef UDF_TRACK_FS_STRUCTURES
1241 extern
1242 VOID
1243 UDFRegisterFsStructure(
1244 PVCB Vcb,
1245 uint32 Lba,
1246 uint32 Length // sectors
1247 );
1248 #else //UDF_TRACK_FS_STRUCTURES
1249 #define UDFRegisterFsStructure(Vcb, Lba, Length) {NOTHING;}
1250 #endif //UDF_TRACK_FS_STRUCTURES
1251
1252 extern const char hexChar[];
1253
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)
1258
1259 OSSTATUS
1260 UDFVInit(
1261 IN PVCB Vcb
1262 );
1263
1264 VOID
1265 UDFVRelease(
1266 IN PVCB Vcb
1267 );
1268
1269 #define PH_FORGET_VERIFIED 0x00800000
1270 #define PH_READ_VERIFY_CACHE 0x00400000
1271 #define PH_KEEP_VERIFY_CACHE 0x00200000
1272
1273 OSSTATUS
1274 UDFVWrite(
1275 IN PVCB Vcb,
1276 IN void* Buffer, // Target buffer
1277 IN uint32 BCount,
1278 IN uint32 LBA,
1279 // OUT uint32* WrittenBytes,
1280 IN uint32 Flags
1281 );
1282
1283 OSSTATUS
1284 UDFVRead(
1285 IN PVCB Vcb,
1286 IN void* Buffer, // Target buffer
1287 IN uint32 BCount,
1288 IN uint32 LBA,
1289 // OUT uint32* ReadBytes,
1290 IN uint32 Flags
1291 );
1292
1293 OSSTATUS
1294 UDFVForget(
1295 IN PVCB Vcb,
1296 IN uint32 BCount,
1297 IN uint32 LBA,
1298 IN uint32 Flags
1299 );
1300
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
1305
1306 VOID
1307 UDFVVerify(
1308 IN PVCB Vcb,
1309 IN ULONG Flags
1310 );
1311
1312 VOID
1313 UDFVFlush(
1314 IN PVCB Vcb
1315 );
1316
1317 __inline
1318 BOOLEAN
1319 __fastcall UDFVIsStored(
1320 IN PVCB Vcb,
1321 IN lba_t lba
1322 )
1323 {
1324 if(!Vcb->VerifyCtx.VInited)
1325 return FALSE;
1326 return UDFGetBit(Vcb->VerifyCtx.StoredBitMap, lba);
1327 } // end UDFVIsStored()
1328
1329 BOOLEAN
1330 __fastcall
1331 UDFCheckArea(
1332 IN PVCB Vcb,
1333 IN lba_t LBA,
1334 IN uint32 BCount
1335 );
1336
1337 #endif // __UDF_STRUCT_SUPPORT_H__