1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6 /*************************************************************************
7 *
8 * File: protos.h
9 *
10 * Module: UDF File System Driver (Kernel mode execution only)
11 *
12 * Description:
13 * Contains the prototypes for functions in UDF FSD.
14 *
15 *************************************************************************/
16
17 #ifndef _UDF_PROTOS_H_
18 #define _UDF_PROTOS_H_
19
20 #include "mem.h"
21
22 /*************************************************************************
23 * Prototypes for the file create.cpp
24 *************************************************************************/
25 extern NTSTATUS NTAPI UDFCreate(
26 IN PDEVICE_OBJECT DeviceObject, // the logical volume device object
27 IN PIRP Irp); // I/O Request Packet
28
29 extern NTSTATUS UDFCommonCreate(
30 IN PtrUDFIrpContext PtrIrpContext,
31 IN PIRP Irp);
32
33 extern NTSTATUS UDFFirstOpenFile(
34 IN PVCB Vcb, // volume control block
35 IN PFILE_OBJECT PtrNewFileObject, // I/O Mgr. created file object
36 OUT PtrUDFFCB* PtrNewFcb,
37 IN PUDF_FILE_INFO RelatedFileInfo,
38 IN PUDF_FILE_INFO NewFileInfo,
39 IN PUNICODE_STRING LocalPath,
40 IN PUNICODE_STRING CurName);
41
42 extern NTSTATUS UDFOpenFile(
43 IN PVCB Vcb, // volume control block
44 IN PFILE_OBJECT PtrNewFileObject, // I/O Mgr. created file object
45 IN PtrUDFFCB PtrNewFcb);
46
47 extern NTSTATUS UDFInitializeFCB(
48 IN PtrUDFFCB PtrNewFcb, // FCB structure to be initialized
49 IN PVCB Vcb, // logical volume (VCB) pointer
50 IN PtrUDFObjectName PtrObjectName, // name of the object
51 IN ULONG Flags, // is this a file/directory, etc.
52 IN PFILE_OBJECT FileObject); // optional file object to be initialized
53
54 /*************************************************************************
55 * Prototypes for the file cleanup.cpp
56 *************************************************************************/
57 extern NTSTATUS NTAPI UDFCleanup(
58 PDEVICE_OBJECT DeviceObject, // the logical volume device object
59 PIRP Irp); // I/O Request Packet
60
61 extern NTSTATUS UDFCommonCleanup(
62 PtrUDFIrpContext PtrIrpContext,
63 PIRP Irp);
64
65 extern NTSTATUS UDFCloseFileInfoChain(IN PVCB Vcb,
66 IN PUDF_FILE_INFO fi,
67 IN ULONG TreeLength,
68 IN BOOLEAN VcbAcquired);
69 /*************************************************************************
70 * Prototypes for the file close.cpp
71 *************************************************************************/
72 extern NTSTATUS NTAPI UDFClose(
73 PDEVICE_OBJECT DeviceObject, // the logical volume device object
74 PIRP Irp); // I/O Request Packet
75
76 extern NTSTATUS UDFCommonClose(
77 PtrUDFIrpContext PtrIrpContext,
78 PIRP Irp);
79
80 #define UDF_CLOSE_NTREQFCB_DELETED 0x01
81 #define UDF_CLOSE_FCB_DELETED 0x02
82
83 extern ULONG UDFCleanUpFcbChain(IN PVCB Vcb,
84 IN PUDF_FILE_INFO fi,
85 IN ULONG TreeLength,
86 IN BOOLEAN VcbAcquired);
87
88 extern VOID UDFCloseAllDelayed(PVCB Vcb);
89
90 extern VOID NTAPI UDFDelayedClose(PVOID unused = NULL);
91
92 extern NTSTATUS UDFCloseAllXXXDelayedInDir(IN PVCB Vcb,
93 IN PUDF_FILE_INFO FileInfo,
94 IN BOOLEAN System);
95
96 #define UDFCloseAllDelayedInDir(Vcb,FI) \
97 UDFCloseAllXXXDelayedInDir(Vcb,FI,FALSE);
98
99 #define UDFCloseAllSystemDelayedInDir(Vcb,FI) \
100 UDFCloseAllXXXDelayedInDir(Vcb,FI,TRUE);
101
102 extern NTSTATUS UDFQueueDelayedClose(PtrUDFIrpContext IrpContext,
103 PtrUDFFCB Fcb);
104
105 //extern VOID UDFRemoveFromDelayedQueue(PtrUDFFCB Fcb);
106 #define UDFRemoveFromDelayedQueue(Fcb) \
107 UDFCloseAllDelayedInDir((Fcb)->Vcb, (Fcb)->FileInfo)
108
109 #define UDFRemoveFromSystemDelayedQueue(Fcb) \
110 UDFCloseAllSystemDelayedInDir((Fcb)->Vcb, (Fcb)->FileInfo)
111
112 /*************************************************************************
113 * Prototypes for the file dircntrl.cpp
114 *************************************************************************/
115 extern NTSTATUS NTAPI UDFDirControl(
116 PDEVICE_OBJECT DeviceObject, // the logical volume device object
117 PIRP Irp); // I/O Request Packet
118
119 extern NTSTATUS NTAPI UDFCommonDirControl(
120 PtrUDFIrpContext PtrIrpContext,
121 PIRP Irp);
122
123 extern NTSTATUS NTAPI UDFQueryDirectory(
124 PtrUDFIrpContext PtrIrpContext,
125 PIRP Irp,
126 PIO_STACK_LOCATION IrpSp,
127 PFILE_OBJECT FileObject,
128 PtrUDFFCB Fcb,
129 PtrUDFCCB Ccb);
130
131 extern NTSTATUS NTAPI UDFNotifyChangeDirectory(
132 PtrUDFIrpContext PtrIrpContext,
133 PIRP Irp,
134 PIO_STACK_LOCATION IrpSp,
135 PFILE_OBJECT FileObject,
136 PtrUDFFCB Fcb,
137 PtrUDFCCB Ccb);
138
139 /*************************************************************************
140 * Prototypes for the file devcntrl.cpp
141 *************************************************************************/
142 extern NTSTATUS NTAPI UDFDeviceControl(
143 PDEVICE_OBJECT DeviceObject, // the logical volume device object
144 PIRP Irp); // I/O Request Packet
145
146 extern NTSTATUS NTAPI UDFCommonDeviceControl(
147 PtrUDFIrpContext PtrIrpContext,
148 PIRP Irp);
149
150 extern NTSTATUS NTAPI UDFDevIoctlCompletion(
151 PDEVICE_OBJECT PtrDeviceObject,
152 PIRP Irp,
153 PVOID Context);
154
155 extern NTSTATUS NTAPI UDFHandleQueryPath(
156 PVOID BufferPointer);
157
158 /*************************************************************************
159 * Prototypes for the file fastio.cpp
160 *************************************************************************/
161 extern BOOLEAN NTAPI UDFFastIoCheckIfPossible(
162 IN PFILE_OBJECT FileObject,
163 IN PLARGE_INTEGER FileOffset,
164 IN ULONG Length,
165 IN BOOLEAN Wait,
166 IN ULONG LockKey,
167 IN BOOLEAN CheckForReadOperation,
168 OUT PIO_STATUS_BLOCK IoStatus,
169 IN PDEVICE_OBJECT DeviceObject);
170
171 extern FAST_IO_POSSIBLE NTAPI UDFIsFastIoPossible(
172 IN PtrUDFFCB Fcb);
173
174 extern BOOLEAN NTAPI UDFFastIoQueryBasicInfo(
175 IN PFILE_OBJECT FileObject,
176 IN BOOLEAN Wait,
177 OUT PFILE_BASIC_INFORMATION Buffer,
178 OUT PIO_STATUS_BLOCK IoStatus,
179 IN PDEVICE_OBJECT DeviceObject);
180
181 extern BOOLEAN NTAPI UDFFastIoQueryStdInfo(
182 IN PFILE_OBJECT FileObject,
183 IN BOOLEAN Wait,
184 OUT PFILE_STANDARD_INFORMATION Buffer,
185 OUT PIO_STATUS_BLOCK IoStatus,
186 IN PDEVICE_OBJECT DeviceObject);
187
188 extern VOID NTAPI UDFFastIoAcqCreateSec(
189 IN PFILE_OBJECT FileObject);
190
191 extern VOID NTAPI UDFFastIoRelCreateSec(
192 IN PFILE_OBJECT FileObject);
193
194 extern BOOLEAN NTAPI UDFAcqLazyWrite(
195 IN PVOID Context,
196 IN BOOLEAN Wait);
197
198 extern VOID NTAPI UDFRelLazyWrite(
199 IN PVOID Context);
200
201 extern BOOLEAN NTAPI UDFAcqReadAhead(
202 IN PVOID Context,
203 IN BOOLEAN Wait);
204
205 extern VOID NTAPI UDFRelReadAhead(
206 IN PVOID Context);
207
208 VOID NTAPI UDFDriverUnload(
209 IN PDRIVER_OBJECT DriverObject);
210
211 // the remaining are only valid under NT Version 4.0 and later
212 #if(_WIN32_WINNT >= 0x0400)
213
214 extern BOOLEAN NTAPI UDFFastIoQueryNetInfo(
215 IN PFILE_OBJECT FileObject,
216 IN BOOLEAN Wait,
217 OUT struct _FILE_NETWORK_OPEN_INFORMATION* Buffer,
218 OUT PIO_STATUS_BLOCK IoStatus,
219 IN PDEVICE_OBJECT DeviceObject);
220
221 extern BOOLEAN NTAPI UDFFastIoMdlRead(
222 IN PFILE_OBJECT FileObject,
223 IN PLARGE_INTEGER FileOffset,
224 IN ULONG Length,
225 IN ULONG LockKey,
226 OUT PMDL* MdlChain,
227 OUT PIO_STATUS_BLOCK IoStatus,
228 IN PDEVICE_OBJECT DeviceObject);
229
230 extern BOOLEAN UDFFastIoMdlReadComplete(
231 IN PFILE_OBJECT FileObject,
232 OUT PMDL MdlChain,
233 IN PDEVICE_OBJECT DeviceObject);
234
235 extern BOOLEAN NTAPI UDFFastIoPrepareMdlWrite(
236 IN PFILE_OBJECT FileObject,
237 IN PLARGE_INTEGER FileOffset,
238 IN ULONG Length,
239 IN ULONG LockKey,
240 OUT PMDL* MdlChain,
241 OUT PIO_STATUS_BLOCK IoStatus,
242 IN PDEVICE_OBJECT DeviceObject);
243
244 extern BOOLEAN NTAPI UDFFastIoMdlWriteComplete(
245 IN PFILE_OBJECT FileObject,
246 IN PLARGE_INTEGER FileOffset,
247 OUT PMDL MdlChain,
248 IN PDEVICE_OBJECT DeviceObject);
249
250 extern NTSTATUS NTAPI UDFFastIoAcqModWrite(
251 IN PFILE_OBJECT FileObject,
252 IN PLARGE_INTEGER EndingOffset,
253 OUT PERESOURCE* ResourceToRelease,
254 IN PDEVICE_OBJECT DeviceObject);
255
256 extern NTSTATUS NTAPI UDFFastIoRelModWrite(
257 IN PFILE_OBJECT FileObject,
258 IN PERESOURCE ResourceToRelease,
259 IN PDEVICE_OBJECT DeviceObject);
260
261 extern NTSTATUS NTAPI UDFFastIoAcqCcFlush(
262 IN PFILE_OBJECT FileObject,
263 IN PDEVICE_OBJECT DeviceObject);
264
265 extern NTSTATUS NTAPI UDFFastIoRelCcFlush(
266 IN PFILE_OBJECT FileObject,
267 IN PDEVICE_OBJECT DeviceObject);
268
269 extern BOOLEAN NTAPI UDFFastIoDeviceControl (
270 IN PFILE_OBJECT FileObject,
271 IN BOOLEAN Wait,
272 IN PVOID InputBuffer OPTIONAL,
273 IN ULONG InputBufferLength,
274 OUT PVOID OutputBuffer OPTIONAL,
275 IN ULONG OutputBufferLength,
276 IN ULONG IoControlCode,
277 OUT PIO_STATUS_BLOCK IoStatus,
278 IN PDEVICE_OBJECT DeviceObject);
279
280 extern BOOLEAN
281 NTAPI
282 UDFFastIoCopyWrite (
283 IN PFILE_OBJECT FileObject,
284 IN PLARGE_INTEGER FileOffset,
285 IN ULONG Length,
286 IN BOOLEAN Wait,
287 IN ULONG LockKey,
288 IN PVOID Buffer,
289 OUT PIO_STATUS_BLOCK IoStatus,
290 IN PDEVICE_OBJECT DeviceObject
291 );
292
293 #endif // (_WIN32_WINNT >= 0x0400)
294
295 /*************************************************************************
296 * Prototypes for the file fileinfo.cpp
297 *************************************************************************/
298 extern NTSTATUS NTAPI UDFFileInfo(
299 PDEVICE_OBJECT DeviceObject, // the logical volume device object
300 PIRP Irp); // I/O Request Packet
301
302 extern NTSTATUS UDFCommonFileInfo(
303 PtrUDFIrpContext PtrIrpContext,
304 PIRP Irp);
305
306 extern NTSTATUS UDFGetBasicInformation(
307 IN PFILE_OBJECT FileObject,
308 IN PtrUDFFCB Fcb,
309 IN PFILE_BASIC_INFORMATION PtrBuffer,
310 IN OUT LONG* PtrReturnedLength);
311
312 extern NTSTATUS UDFGetNetworkInformation(
313 IN PtrUDFFCB Fcb,
314 IN PFILE_NETWORK_OPEN_INFORMATION PtrBuffer,
315 IN OUT PLONG PtrReturnedLength);
316
317 extern NTSTATUS UDFGetStandardInformation(
318 IN PtrUDFFCB Fcb,
319 IN PFILE_STANDARD_INFORMATION PtrBuffer,
320 IN OUT PLONG PtrReturnedLength);
321
322 extern NTSTATUS UDFGetInternalInformation(
323 PtrUDFIrpContext PtrIrpContext,
324 IN PtrUDFFCB Fcb,
325 IN PtrUDFCCB Ccb,
326 IN PFILE_INTERNAL_INFORMATION PtrBuffer,
327 IN OUT PLONG PtrReturnedLength);
328
329 extern NTSTATUS UDFGetEaInformation(
330 PtrUDFIrpContext PtrIrpContext,
331 IN PtrUDFFCB Fcb,
332 IN PFILE_EA_INFORMATION PtrBuffer,
333 IN OUT PLONG PtrReturnedLength);
334
335 extern NTSTATUS UDFGetFullNameInformation(
336 IN PFILE_OBJECT FileObject,
337 IN PFILE_NAME_INFORMATION PtrBuffer,
338 IN OUT PLONG PtrReturnedLength);
339
340 extern NTSTATUS UDFGetAltNameInformation(
341 IN PtrUDFFCB Fcb,
342 IN PFILE_NAME_INFORMATION PtrBuffer,
343 IN OUT PLONG PtrReturnedLength);
344
345 extern NTSTATUS UDFGetPositionInformation(
346 IN PFILE_OBJECT FileObject,
347 IN PFILE_POSITION_INFORMATION PtrBuffer,
348 IN OUT PLONG PtrReturnedLength);
349
350 extern NTSTATUS UDFGetFileStreamInformation(
351 IN PtrUDFFCB Fcb,
352 IN PFILE_STREAM_INFORMATION PtrBuffer,
353 IN OUT PLONG PtrReturnedLength);
354
355 extern NTSTATUS UDFSetBasicInformation(
356 IN PtrUDFFCB Fcb,
357 IN PtrUDFCCB Ccb,
358 IN PFILE_OBJECT FileObject,
359 IN PFILE_BASIC_INFORMATION PtrBuffer);
360
361 extern NTSTATUS UDFMarkStreamsForDeletion(
362 IN PVCB Vcb,
363 IN PtrUDFFCB Fcb,
364 IN BOOLEAN ForDel);
365
366 extern NTSTATUS UDFSetDispositionInformation(
367 IN PtrUDFFCB Fcb,
368 IN PtrUDFCCB Ccb,
369 IN PVCB Vcb,
370 IN PFILE_OBJECT FileObject,
371 IN BOOLEAN Delete);
372
373 extern NTSTATUS UDFSetAllocationInformation(
374 IN PtrUDFFCB Fcb,
375 IN PtrUDFCCB Ccb,
376 IN PVCB Vcb,
377 IN PFILE_OBJECT FileObject,
378 IN PtrUDFIrpContext PtrIrpContext,
379 IN PIRP Irp,
380 IN PFILE_ALLOCATION_INFORMATION PtrBuffer);
381
382 extern NTSTATUS UDFSetEOF(
383 IN PIO_STACK_LOCATION PtrSp,
384 IN PtrUDFFCB Fcb,
385 IN PtrUDFCCB Ccb,
386 IN PVCB Vcb,
387 IN PFILE_OBJECT FileObject,
388 IN PIRP Irp,
389 IN PFILE_END_OF_FILE_INFORMATION PtrBuffer);
390
391 extern NTSTATUS UDFRename(IN PIO_STACK_LOCATION IrpSp,
392 IN PtrUDFFCB Fcb,
393 IN PtrUDFCCB Ccb,
394 IN PFILE_OBJECT FileObject,
395 IN PFILE_RENAME_INFORMATION PtrBuffer);
396
397 extern NTSTATUS UDFStoreFileId(
398 IN PVCB Vcb,
399 IN PtrUDFCCB Ccb,
400 IN PUDF_FILE_INFO fi,
401 IN LONGLONG Id);
402
403 extern NTSTATUS UDFRemoveFileId(
404 IN PVCB Vcb,
405 IN LONGLONG Id);
406
407 #define UDFRemoveFileId__(Vcb, fi) \
408 UDFRemoveFileId(Vcb, UDFGetNTFileId(Vcb, fi, &(fi->Fcb->FCBName->ObjectName)));
409
410 extern VOID UDFReleaseFileIdCache(
411 IN PVCB Vcb);
412
413 extern NTSTATUS UDFGetOpenParamsByFileId(
414 IN PVCB Vcb,
415 IN LONGLONG Id,
416 OUT PUNICODE_STRING* FName,
417 OUT BOOLEAN* CaseSens);
418
419 extern NTSTATUS UDFHardLink(
420 IN PIO_STACK_LOCATION PtrSp,
421 IN PtrUDFFCB Fcb1,
422 IN PtrUDFCCB Ccb1,
423 IN PFILE_OBJECT FileObject1, // Source File
424 IN PFILE_LINK_INFORMATION PtrBuffer);
425 /*************************************************************************
426 * Prototypes for the file flush.cpp
427 *************************************************************************/
428 extern NTSTATUS NTAPI UDFFlush(
429 PDEVICE_OBJECT DeviceObject, // the logical volume device object
430 PIRP Irp); // I/O Request Packet
431
432 extern NTSTATUS UDFCommonFlush(
433 PtrUDFIrpContext PtrIrpContext,
434 PIRP Irp);
435
436 extern ULONG UDFFlushAFile(
437 PtrUDFFCB Fcb,
438 PtrUDFCCB Ccb,
439 PIO_STATUS_BLOCK PtrIoStatus,
440 IN ULONG FlushFlags = 0);
441
442 extern ULONG UDFFlushADirectory(
443 IN PVCB Vcb,
444 IN PUDF_FILE_INFO FI,
445 OUT PIO_STATUS_BLOCK PtrIoStatus,
446 ULONG FlushFlags = 0);
447
448 extern ULONG UDFFlushLogicalVolume(
449 PtrUDFIrpContext PtrIrpContext,
450 PIRP Irp,
451 PVCB Vcb,
452 ULONG FlushFlags = 0);
453
454 extern NTSTATUS NTAPI UDFFlushCompletion(
455 PDEVICE_OBJECT PtrDeviceObject,
456 PIRP Irp,
457 PVOID Context);
458
459 extern BOOLEAN UDFFlushIsBreaking(
460 IN PVCB Vcb,
461 IN ULONG FlushFlags = 0);
462
463 extern VOID UDFFlushTryBreak(
464 IN PVCB Vcb);
465
466 /*************************************************************************
467 * Prototypes for the file fscntrl.cpp
468 *************************************************************************/
469
470 extern NTSTATUS NTAPI UDFFSControl(
471 PDEVICE_OBJECT DeviceObject,
472 PIRP Irp);
473
474 extern NTSTATUS NTAPI UDFCommonFSControl(
475 PtrUDFIrpContext PtrIrpContext,
476 PIRP Irp); // I/O Request Packet
477
478 extern NTSTATUS NTAPI UDFUserFsCtrlRequest(
479 PtrUDFIrpContext PtrIrpContext,
480 PIRP Irp);
481
482 extern NTSTATUS NTAPI UDFMountVolume(
483 PtrUDFIrpContext PtrIrpContext,
484 PIRP Irp);
485
486 extern NTSTATUS UDFStartEjectWaiter(IN PVCB Vcb);
487
488 extern VOID UDFScanForDismountedVcb (IN PtrUDFIrpContext IrpContext);
489
490 extern NTSTATUS UDFCompleteMount(IN PVCB Vcb);
491
492 extern VOID UDFCloseResidual(IN PVCB Vcb);
493
494 extern VOID UDFCleanupVCB(IN PVCB Vcb);
495
496 extern NTSTATUS UDFIsVolumeMounted(IN PtrUDFIrpContext IrpContext,
497 IN PIRP Irp);
498
499 extern NTSTATUS UDFIsVolumeDirty(IN PtrUDFIrpContext IrpContext,
500 IN PIRP Irp);
501
502 extern NTSTATUS UDFGetStatistics(IN PtrUDFIrpContext IrpContext,
503 IN PIRP Irp);
504
505 extern NTSTATUS UDFLockVolume (IN PtrUDFIrpContext IrpContext,
506 IN PIRP Irp,
507 IN ULONG PID = -1);
508
509 extern NTSTATUS UDFUnlockVolume (IN PtrUDFIrpContext IrpContext,
510 IN PIRP Irp,
511 IN ULONG PID = -1);
512
513 extern NTSTATUS UDFIsPathnameValid(IN PtrUDFIrpContext IrpContext,
514 IN PIRP Irp);
515
516 extern NTSTATUS UDFDismountVolume(IN PtrUDFIrpContext IrpContext,
517 IN PIRP Irp);
518
519 extern NTSTATUS UDFGetVolumeBitmap(IN PtrUDFIrpContext IrpContext,
520 IN PIRP Irp);
521
522 extern NTSTATUS UDFGetRetrievalPointers(IN PtrUDFIrpContext IrpContext,
523 IN PIRP Irp,
524 IN ULONG Special);
525
526 extern NTSTATUS UDFInvalidateVolumes(IN PtrUDFIrpContext IrpContext,
527 IN PIRP Irp);
528
529 /*************************************************************************
530 * Prototypes for the file LockCtrl.cpp
531 *************************************************************************/
532
533 extern NTSTATUS NTAPI UDFLockControl(
534 IN PDEVICE_OBJECT DeviceObject, // the logical volume device object
535 IN PIRP Irp); // I/O Request Packet
536
537 extern NTSTATUS NTAPI UDFCommonLockControl(
538 IN PtrUDFIrpContext PtrIrpContext,
539 IN PIRP Irp);
540
541 extern BOOLEAN NTAPI UDFFastLock(
542 IN PFILE_OBJECT FileObject,
543 IN PLARGE_INTEGER FileOffset,
544 IN PLARGE_INTEGER Length,
545 PEPROCESS ProcessId,
546 ULONG Key,
547 BOOLEAN FailImmediately,
548 BOOLEAN ExclusiveLock,
549 OUT PIO_STATUS_BLOCK IoStatus,
550 IN PDEVICE_OBJECT DeviceObject);
551
552 extern BOOLEAN NTAPI UDFFastUnlockSingle(
553 IN PFILE_OBJECT FileObject,
554 IN PLARGE_INTEGER FileOffset,
555 IN PLARGE_INTEGER Length,
556 PEPROCESS ProcessId,
557 ULONG Key,
558 OUT PIO_STATUS_BLOCK IoStatus,
559 IN PDEVICE_OBJECT DeviceObject);
560
561 extern BOOLEAN NTAPI UDFFastUnlockAll(
562 IN PFILE_OBJECT FileObject,
563 PEPROCESS ProcessId,
564 OUT PIO_STATUS_BLOCK IoStatus,
565 IN PDEVICE_OBJECT DeviceObject);
566
567 extern BOOLEAN NTAPI UDFFastUnlockAllByKey(
568 IN PFILE_OBJECT FileObject,
569 PEPROCESS ProcessId,
570 ULONG Key,
571 OUT PIO_STATUS_BLOCK IoStatus,
572 IN PDEVICE_OBJECT DeviceObject);
573
574 /*************************************************************************
575 * Prototypes for the file misc.cpp
576 *************************************************************************/
577 extern NTSTATUS UDFInitializeZones(
578 VOID);
579
580 extern VOID UDFDestroyZones(
581 VOID);
582
583 extern BOOLEAN __fastcall UDFIsIrpTopLevel(
584 PIRP Irp); // the IRP sent to our dispatch routine
585
586 extern long UDFExceptionFilter(
587 PtrUDFIrpContext PtrIrpContext,
588 PEXCEPTION_POINTERS PtrExceptionPointers);
589
590 extern NTSTATUS UDFExceptionHandler(
591 PtrUDFIrpContext PtrIrpContext,
592 PIRP Irp);
593
594 extern VOID UDFLogEvent(
595 NTSTATUS UDFEventLogId, // the UDF private message id
596 NTSTATUS RC); // any NT error code we wish to log ...
597
598 extern PtrUDFObjectName UDFAllocateObjectName(
599 VOID);
600
601 extern VOID __fastcall UDFReleaseObjectName(
602 PtrUDFObjectName PtrObjectName);
603
604 extern PtrUDFCCB UDFAllocateCCB(
605 VOID);
606
607 extern VOID __fastcall UDFReleaseCCB(
608 PtrUDFCCB Ccb);
609
610 extern VOID __fastcall UDFCleanUpCCB(
611 PtrUDFCCB Ccb);
612
613 extern PtrUDFFCB UDFAllocateFCB(
614 VOID);
615
616 /*extern VOID __fastcall UDFReleaseFCB(
617 PtrUDFFCB Fcb);*/
618 __inline
619 VOID
UDFReleaseFCB(PtrUDFFCB Fcb)620 UDFReleaseFCB(
621 PtrUDFFCB Fcb
622 )
623 {
624 ASSERT(Fcb);
625
626 MyFreePool__(Fcb);
627
628 return;
629 }
630
631 extern VOID __fastcall UDFCleanUpFCB(
632 PtrUDFFCB Fcb) ;
633
634 extern PtrUDFIrpContext UDFAllocateIrpContext(
635 PIRP Irp,
636 PDEVICE_OBJECT PtrTargetDeviceObject);
637
638 extern VOID UDFReleaseIrpContext(
639 PtrUDFIrpContext PtrIrpContext);
640
641 extern NTSTATUS UDFPostRequest(
642 PtrUDFIrpContext PtrIrpContext,
643 PIRP Irp);
644
645 extern VOID NTAPI UDFCommonDispatch(
646 VOID *Context); // actually an IRPContext structure
647
648 extern NTSTATUS UDFInitializeVCB(
649 PDEVICE_OBJECT PtrVolumeDeviceObject,
650 PDEVICE_OBJECT PtrTargetDeviceObject,
651 PVPB PtrVPB);
652
653 extern VOID
654 UDFReadRegKeys(
655 PVCB Vcb,
656 BOOLEAN Update,
657 BOOLEAN UseCfg);
658
659 extern ULONG UDFGetRegParameter(
660 IN PVCB Vcb,
661 IN PCWSTR Name,
662 IN ULONG DefValue = 0);
663
664 extern ULONG
665 UDFGetCfgParameter(
666 IN PVCB Vcb,
667 IN PCWSTR Name,
668 IN ULONG DefValue
669 );
670
671 extern VOID UDFReleaseVCB(
672 PVCB Vcb);
673
674 extern ULONG UDFRegCheckParameterValue(
675 IN PUNICODE_STRING RegistryPath,
676 IN PCWSTR Name,
677 IN PUNICODE_STRING PtrVolumePath,
678 IN PCWSTR DefaultPath,
679 IN ULONG DefValue = 0);
680
681 extern VOID UDFInitializeIrpContextFromLite (
682 OUT PtrUDFIrpContext *IrpContext,
683 IN PtrUDFIrpContextLite IrpContextLite);
684
685 extern NTSTATUS UDFInitializeIrpContextLite (
686 OUT PtrUDFIrpContextLite *IrpContextLite,
687 IN PtrUDFIrpContext IrpContext,
688 IN PtrUDFFCB Fcb);
689
690
691 extern NTSTATUS NTAPI UDFQuerySetEA(
692 PDEVICE_OBJECT DeviceObject, // the logical volume device object
693 PIRP Irp // I/O Request Packet
694 );
695
696 extern ULONG
697 UDFIsResourceAcquired(
698 IN PERESOURCE Resource
699 );
700
701 extern BOOLEAN UDFAcquireResourceExclusiveWithCheck(
702 IN PERESOURCE Resource
703 );
704
705 extern BOOLEAN UDFAcquireResourceSharedWithCheck(
706 IN PERESOURCE Resource
707 );
708
709 extern NTSTATUS UDFWCacheErrorHandler(
710 IN PVOID Context,
711 IN PWCACHE_ERROR_CONTEXT ErrorInfo
712 );
713
714 /*************************************************************************
715 * Prototypes for the file NameSup.cpp
716 *************************************************************************/
717
718 #include "namesup.h"
719
720 /*************************************************************************
721 * Prototypes for the file Udf_info\physical.cpp
722 *************************************************************************/
723 #if 0
724
725 extern OSSTATUS UDFTRead(PVOID _Vcb,
726 PVOID Buffer, // Target buffer
727 ULONG Length,
728 ULONG LBA,
729 PULONG ReadBytes,
730 ULONG Flags = 0);
731
732 extern OSSTATUS UDFTWrite(IN PVOID _Vcb,
733 IN PVOID Buffer, // Target buffer
734 IN ULONG Length,
735 IN ULONG LBA,
736 OUT PULONG WrittenBytes,
737 IN ULONG Flags = 0);
738
739 extern OSSTATUS UDFPrepareForWriteOperation(
740 IN PVCB Vcb,
741 IN ULONG Lba,
742 IN ULONG BCount);
743
744 extern OSSTATUS UDFReadDiscTrackInfo(PDEVICE_OBJECT DeviceObject, // the target device object
745 PVCB Vcb); // Volume Control Block for ^ DevObj
746
747 extern OSSTATUS UDFReadAndProcessFullToc(PDEVICE_OBJECT DeviceObject, // the target device object
748 PVCB Vcb);
749
750 extern OSSTATUS UDFUseStandard(PDEVICE_OBJECT DeviceObject, // the target device object
751 PVCB Vcb); // Volume control block fro this DevObj
752
753 extern OSSTATUS UDFGetBlockSize(PDEVICE_OBJECT DeviceObject, // the target device object
754 PVCB Vcb); // Volume control block fro this DevObj
755
756 extern OSSTATUS UDFGetDiskInfo(IN PDEVICE_OBJECT DeviceObject, // the target device object
757 IN PVCB Vcb); // Volume control block from this DevObj
758
759 extern VOID NTAPI UDFEjectReqWaiter(IN PVOID Context);
760
761 extern VOID UDFStopEjectWaiter(PVCB Vcb);
762
763 //extern OSSTATUS UDFPrepareForReadOperation(IN PVCB Vcb,
764 // IN ULONG Lba);
765 //#define UDFPrepareForReadOperation(a,b) (STATUS_SUCCESS)
766
767 extern VOID UDFUpdateNWA(PVCB Vcb,
768 ULONG LBA,
769 ULONG BCount,
770 OSSTATUS RC);
771
772 extern OSSTATUS UDFDoDismountSequence(IN PVCB Vcb,
773 IN PPREVENT_MEDIA_REMOVAL_USER_IN Buf,
774 IN BOOLEAN Eject);
775
776 // read physical sectors
777 /*OSSTATUS UDFReadSectors(IN PVCB Vcb,
778 IN BOOLEAN Translate,// Translate Logical to Physical
779 IN ULONG Lba,
780 IN ULONG BCount,
781 IN BOOLEAN Direct,
782 OUT PCHAR Buffer,
783 OUT PULONG ReadBytes);*/
784 #define UDFReadSectors(Vcb, Translate, Lba, BCount, Direct, Buffer, ReadBytes) \
785 (( WCacheIsInitialized__(&((Vcb)->FastCache)) && (KeGetCurrentIrql() < DISPATCH_LEVEL)) ? \
786 (WCacheReadBlocks__(&((Vcb)->FastCache), Vcb, Buffer, Lba, BCount, ReadBytes, Direct)) : \
787 (UDFTRead(Vcb, Buffer, ((SIZE_T)(BCount))<<((Vcb)->BlockSizeBits), Lba, ReadBytes, 0)))
788
789
790 // read data inside physical sector
791 extern OSSTATUS UDFReadInSector(IN PVCB Vcb,
792 IN BOOLEAN Translate, // Translate Logical to Physical
793 IN ULONG Lba,
794 IN ULONG i, // offset in sector
795 IN ULONG l, // transfer length
796 IN BOOLEAN Direct,
797 OUT PCHAR Buffer,
798 OUT PULONG ReadBytes);
799 // read unaligned data
800 extern OSSTATUS UDFReadData(IN PVCB Vcb,
801 IN BOOLEAN Translate, // Translate Logical to Physical
802 IN LONGLONG Offset,
803 IN ULONG Length,
804 IN BOOLEAN Direct,
805 OUT PCHAR Buffer,
806 OUT PULONG ReadBytes);
807
808 // write physical sectors
809 OSSTATUS UDFWriteSectors(IN PVCB Vcb,
810 IN BOOLEAN Translate, // Translate Logical to Physical
811 IN ULONG Lba,
812 IN ULONG WBCount,
813 IN BOOLEAN Direct, // setting this flag delays flushing of given
814 // data to indefinite term
815 IN PCHAR Buffer,
816 OUT PULONG WrittenBytes);
817 // write directly to cached sector
818 OSSTATUS UDFWriteInSector(IN PVCB Vcb,
819 IN BOOLEAN Translate, // Translate Logical to Physical
820 IN ULONG Lba,
821 IN ULONG i, // offset in sector
822 IN ULONG l, // transfer length
823 IN BOOLEAN Direct,
824 OUT PCHAR Buffer,
825 OUT PULONG WrittenBytes);
826 // write data at unaligned offset & length
827 OSSTATUS UDFWriteData(IN PVCB Vcb,
828 IN BOOLEAN Translate, // Translate Logical to Physical
829 IN LONGLONG Offset,
830 IN ULONG Length,
831 IN BOOLEAN Direct, // setting this flag delays flushing of given
832 // data to indefinite term
833 IN PCHAR Buffer,
834 OUT PULONG WrittenBytes);
835
836 OSSTATUS UDFResetDeviceDriver(IN PVCB Vcb.
837 IN PDEVICE_OBJECT TargetDeviceObject,
838 IN BOOLEAN Unlock);
839 #endif
840 /*************************************************************************
841 * Prototypes for the file Pnp.cpp
842 *************************************************************************/
843 NTSTATUS
844 UDFPnp (
845 IN PDEVICE_OBJECT DeviceObject,
846 IN PIRP Irp
847 );
848
849 /*************************************************************************
850 * Prototypes for the file read.cpp
851 *************************************************************************/
852 extern OSSTATUS NTAPI UDFRead(
853 PDEVICE_OBJECT DeviceObject, // the logical volume device object
854 PIRP Irp); // I/O Request Packet
855
856 extern NTSTATUS UDFPostStackOverflowRead(
857 IN PtrUDFIrpContext PtrIrpContext,
858 IN PIRP Irp,
859 IN PtrUDFFCB Fcb);
860
861 extern VOID NTAPI UDFStackOverflowRead(
862 IN PVOID Context,
863 IN PKEVENT Event);
864
865 extern NTSTATUS UDFCommonRead(
866 PtrUDFIrpContext PtrIrpContext,
867 PIRP Irp);
868
869 extern PVOID UDFGetCallersBuffer(
870 PtrUDFIrpContext PtrIrpContext,
871 PIRP Irp);
872
873 extern NTSTATUS UDFLockCallersBuffer(
874 PtrUDFIrpContext PtrIrpContext,
875 PIRP Irp,
876 BOOLEAN IsReadOperation,
877 uint32 Length);
878
879 extern NTSTATUS UDFUnlockCallersBuffer(
880 PtrUDFIrpContext PtrIrpContext,
881 PIRP Irp,
882 PVOID SystemBuffer);
883
884 extern VOID UDFMdlComplete(
885 PtrUDFIrpContext PtrIrpContext,
886 PIRP Irp,
887 PIO_STACK_LOCATION IrpSp,
888 BOOLEAN ReadCompletion);
889
890 /*************************************************************************
891 * Prototypes for the file SecurSup.cpp
892 *************************************************************************/
893 extern NTSTATUS UDFGetSecurity(
894 PDEVICE_OBJECT DeviceObject, // the logical volume device object
895 PIRP Irp); // I/O Request Packet
896
897 extern NTSTATUS UDFSetSecurity(
898 PDEVICE_OBJECT DeviceObject, // the logical volume device object
899 PIRP Irp); // I/O Request Packet
900
901 extern NTSTATUS UDFCommonGetSecurity(
902 PtrUDFIrpContext PtrIrpContext,
903 PIRP Irp);
904
905 extern NTSTATUS UDFCommonSetSecurity(
906 PtrUDFIrpContext PtrIrpContext,
907 PIRP Irp);
908
909 extern NTSTATUS
910 UDFReadSecurity(
911 IN PVCB Vcb,
912 IN PtrUDFFCB Fcb,
913 IN PSECURITY_DESCRIPTOR* SecurityDesc);
914
915 extern NTSTATUS
916 UDFAssignAcl(
917 IN PVCB Vcb,
918 IN PFILE_OBJECT FileObject, // OPTIONAL
919 IN PtrUDFFCB Fcb,
920 IN PtrUDFNTRequiredFCB NtReqFcb);
921
922 extern VOID
923 UDFDeassignAcl(
924 IN PtrUDFNTRequiredFCB NtReqFcb,
925 IN BOOLEAN AutoInherited);
926
927 extern NTSTATUS
928 UDFWriteSecurity(
929 IN PVCB Vcb,
930 IN PtrUDFFCB Fcb,
931 IN PSECURITY_DESCRIPTOR* SecurityDesc);
932
933 extern NTSTATUS
934 UDFCheckAccessRights(
935 PFILE_OBJECT FileObject,
936 PACCESS_STATE AccessState,
937 PtrUDFFCB Fcb,
938 PtrUDFCCB Ccb,
939 ACCESS_MASK DesiredAccess,
940 USHORT ShareAccess);
941
942 extern NTSTATUS
943 UDFSetAccessRights(
944 PFILE_OBJECT FileObject,
945 PACCESS_STATE AccessState,
946 PtrUDFFCB Fcb,
947 PtrUDFCCB Ccb,
948 ACCESS_MASK DesiredAccess,
949 USHORT ShareAccess);
950
951 /*************************************************************************
952 * Prototypes for the file Shutdown.cpp
953 *************************************************************************/
954 extern NTSTATUS NTAPI UDFShutdown(
955 PDEVICE_OBJECT DeviceObject, // the logical volume device object
956 PIRP Irp); // I/O Request Packet
957
958 extern NTSTATUS UDFCommonShutdown(
959 PtrUDFIrpContext PtrIrpContext,
960 PIRP Irp);
961
962 /*************************************************************************
963 * Prototypes for the file Udf_dbg.cpp
964 *************************************************************************/
965 extern BOOLEAN
966 UDFDebugAcquireResourceSharedLite(
967 IN PERESOURCE Resource,
968 IN BOOLEAN Wait,
969 ULONG BugCheckId,
970 ULONG Line);
971
972 extern BOOLEAN
973 UDFDebugAcquireSharedStarveExclusive(
974 IN PERESOURCE Resource,
975 IN BOOLEAN Wait,
976 ULONG BugCheckId,
977 ULONG Line);
978
979 extern BOOLEAN
980 UDFDebugAcquireResourceExclusiveLite(
981 IN PERESOURCE Resource,
982 IN BOOLEAN Wait,
983 ULONG BugCheckId,
984 ULONG Line);
985
986 extern VOID
987 UDFDebugReleaseResourceForThreadLite(
988 IN PERESOURCE Resource,
989 IN ERESOURCE_THREAD ResourceThreadId,
990 ULONG BugCheckId,
991 ULONG Line);
992
993 extern VOID
994 UDFDebugDeleteResource(
995 IN PERESOURCE Resource,
996 IN ERESOURCE_THREAD ResourceThreadId,
997 ULONG BugCheckId,
998 ULONG Line);
999
1000 extern NTSTATUS
1001 UDFDebugInitializeResourceLite(
1002 IN PERESOURCE Resource,
1003 IN ERESOURCE_THREAD ResourceThreadId,
1004 ULONG BugCheckId,
1005 ULONG Line);
1006
1007 extern VOID
1008 UDFDebugConvertExclusiveToSharedLite(
1009 IN PERESOURCE Resource,
1010 IN ERESOURCE_THREAD ResourceThreadId,
1011 ULONG BugCheckId,
1012 ULONG Line);
1013
1014 extern BOOLEAN
1015 UDFDebugAcquireSharedWaitForExclusive(
1016 IN PERESOURCE Resource,
1017 IN BOOLEAN Wait,
1018 ULONG BugCheckId,
1019 ULONG Line);
1020
1021 extern LONG
1022 UDFDebugInterlockedIncrement(
1023 IN PLONG addr,
1024 ULONG BugCheckId,
1025 ULONG Line);
1026
1027 extern LONG
1028 UDFDebugInterlockedDecrement(
1029 IN PLONG addr,
1030 ULONG BugCheckId,
1031 ULONG Line);
1032
1033 extern LONG
1034 UDFDebugInterlockedExchangeAdd(
1035 IN PLONG addr,
1036 IN LONG i,
1037 ULONG BugCheckId,
1038 ULONG Line);
1039
1040 /*************************************************************************
1041 * Prototypes for the file UDFinit.cpp
1042 *************************************************************************/
1043 extern "C" NTSTATUS NTAPI DriverEntry(
1044 PDRIVER_OBJECT DriverObject, // created by the I/O sub-system
1045 PUNICODE_STRING RegistryPath); // path to the registry key
1046
1047 extern VOID NTAPI UDFInitializeFunctionPointers(
1048 PDRIVER_OBJECT DriverObject); // created by the I/O sub-system
1049
1050 extern VOID NTAPI
1051 UDFFsNotification(IN PDEVICE_OBJECT DeviceObject,
1052 IN BOOLEAN FsActive);
1053
1054 #ifndef WIN64
1055 //extern ptrFsRtlNotifyVolumeEvent FsRtlNotifyVolumeEvent;
1056 #endif //WIN64
1057
1058 extern BOOLEAN
1059 UDFGetInstallVersion(PULONG iVer);
1060
1061 extern BOOLEAN
1062 UDFGetInstallTime(PULONG iTime);
1063
1064 extern BOOLEAN
1065 UDFGetTrialEnd(PULONG iTrial);
1066
1067 /*************************************************************************
1068 * Prototypes for the file verify.cpp
1069 *************************************************************************/
1070
1071 extern NTSTATUS UDFVerifyVcb (
1072 IN PtrUDFIrpContext IrpContext,
1073 IN PVCB Vcb
1074 );
1075
1076 extern NTSTATUS UDFVerifyVolume (
1077 IN PIRP Irp);
1078
1079 extern NTSTATUS UDFPerformVerify (
1080 IN PtrUDFIrpContext IrpContext,
1081 IN PIRP Irp,
1082 IN PDEVICE_OBJECT DeviceToVerify
1083 );
1084
1085 extern BOOLEAN UDFCheckForDismount (
1086 IN PtrUDFIrpContext IrpContext,
1087 IN PVCB Vcb,
1088 IN BOOLEAN VcbAcquired
1089 );
1090
1091 extern BOOLEAN UDFDismountVcb (
1092 IN PVCB Vcb,
1093 IN BOOLEAN VcbAcquired);
1094
1095 extern NTSTATUS UDFCompareVcb(IN PVCB OldVcb,
1096 IN PVCB NewVcb,
1097 IN BOOLEAN PhysicalOnly);
1098
1099 /*************************************************************************
1100 * Prototypes for the file VolInfo.cpp
1101 *************************************************************************/
1102 extern NTSTATUS NTAPI UDFQueryVolInfo(PDEVICE_OBJECT DeviceObject,
1103 PIRP Irp);
1104
1105 extern NTSTATUS UDFCommonQueryVolInfo (PtrUDFIrpContext PtrIrpContext,
1106 PIRP Irp);
1107
1108 extern NTSTATUS NTAPI UDFSetVolInfo(PDEVICE_OBJECT DeviceObject, // the logical volume device object
1109 PIRP Irp); // I/O Request Packet
1110
1111 extern NTSTATUS UDFCommonSetVolInfo(PtrUDFIrpContext PtrIrpContext,
1112 PIRP Irp);
1113
1114 /*************************************************************************
1115 * Prototypes for the file write.cpp
1116 *************************************************************************/
1117 extern NTSTATUS NTAPI UDFWrite(
1118 PDEVICE_OBJECT DeviceObject, // the logical volume device object
1119 PIRP Irp); // I/O Request Packet
1120
1121 extern NTSTATUS UDFCommonWrite(
1122 PtrUDFIrpContext PtrIrpContext,
1123 PIRP Irp);
1124
1125 extern VOID NTAPI UDFDeferredWriteCallBack (
1126 VOID *Context1, // Should be PtrIrpContext
1127 VOID *Context2); // Should be Irp
1128
1129 extern VOID UDFPurgeCacheEx_(
1130 PtrUDFNTRequiredFCB NtReqFcb,
1131 LONGLONG Offset,
1132 LONGLONG Length,
1133 //#ifndef ALLOW_SPARSE
1134 BOOLEAN CanWait,
1135 //#endif ALLOW_SPARSE
1136 PVCB Vcb,
1137 PFILE_OBJECT FileObject
1138 );
1139
1140 /*#ifdef ALLOW_SPARSE
1141 #define UDFZeroDataEx(NtReqFcb, Offset, Length, CanWait) \
1142 UDFPurgeCacheEx_(NtReqFcb, Offset, Length)
1143 #define UDFPurgeCacheEx(NtReqFcb, Offset, Length, CanWait) \
1144 UDFPurgeCacheEx_(NtReqFcb, Offset, Length)
1145 #else // ALLOW_SPARSE*/
1146 #define UDFZeroDataEx(NtReqFcb, Offset, Length, CanWait, Vcb, FileObject) \
1147 UDFPurgeCacheEx_(NtReqFcb, Offset, Length, CanWait, Vcb, FileObject)
1148 #define UDFPurgeCacheEx(NtReqFcb, Offset, Length, CanWait, Vcb, FileObject) \
1149 UDFPurgeCacheEx_(NtReqFcb, Offset, Length, CanWait, Vcb, FileObject)
1150 //#endif //ALLOW_SPARSE
1151
1152
1153
1154 #endif // _UDF_PROTOS_H_
1155