@@ -44,7 +44,7 @@ Module Name:
44
44
45
45
--*/
46
46
47
- #include "cdprocs .h"
47
+ #include "CdProcs .h"
48
48
49
49
//
50
50
// The Bug check file id for this module
@@ -58,18 +58,18 @@ Module Name:
58
58
59
59
ULONG
60
60
CdFindMcbEntry (
61
- IN PIRP_CONTEXT IrpContext ,
62
- IN PFCB Fcb ,
63
- IN LONGLONG FileOffset
61
+ _In_ PIRP_CONTEXT IrpContext ,
62
+ _In_ PFCB Fcb ,
63
+ _In_ LONGLONG FileOffset
64
64
);
65
65
66
66
VOID
67
67
CdDiskOffsetFromMcbEntry (
68
- IN PIRP_CONTEXT IrpContext ,
69
- IN PCD_MCB_ENTRY McbEntry ,
70
- IN LONGLONG FileOffset ,
71
- IN PLONGLONG DiskOffset ,
72
- IN PULONG ByteCount
68
+ _In_ PIRP_CONTEXT IrpContext ,
69
+ _In_ PCD_MCB_ENTRY McbEntry ,
70
+ _In_ LONGLONG FileOffset ,
71
+ _Out_ PLONGLONG DiskOffset ,
72
+ _Out_ PULONG ByteCount
73
73
);
74
74
75
75
#ifdef ALLOC_PRAGMA
@@ -84,13 +84,16 @@ CdDiskOffsetFromMcbEntry (
84
84
#endif
85
85
86
86
87
+ _Requires_lock_held_ (_Global_critical_region_ )
87
88
VOID
89
+ // PREFast currently has no way to express the Fcb==Fcb->Vcb->VolumeDasdFcb early return
90
+ #pragma warning(suppress: 6001 6101)
88
91
CdLookupAllocation (
89
- IN PIRP_CONTEXT IrpContext ,
90
- IN PFCB Fcb ,
91
- IN LONGLONG FileOffset ,
92
- OUT PLONGLONG DiskOffset ,
93
- OUT PULONG ByteCount
92
+ _In_ PIRP_CONTEXT IrpContext ,
93
+ _In_ PFCB Fcb ,
94
+ _In_ LONGLONG FileOffset ,
95
+ _Out_ PLONGLONG DiskOffset ,
96
+ _Out_ PULONG ByteCount
94
97
)
95
98
96
99
/*++
@@ -128,7 +131,7 @@ Return Value:
128
131
{
129
132
BOOLEAN FirstPass = TRUE;
130
133
ULONG McbEntryOffset ;
131
- PFCB ParentFcb = NULL ; /* ReactOS Change: GCC uninitialized variable bug */
134
+ PFCB ParentFcb = NULL ;
132
135
BOOLEAN CleanupParent = FALSE;
133
136
134
137
BOOLEAN UnlockFcb = FALSE;
@@ -137,19 +140,31 @@ Return Value:
137
140
ULONG CurrentMcbOffset ;
138
141
PCD_MCB_ENTRY CurrentMcbEntry ;
139
142
140
- DIRENT_ENUM_CONTEXT DirContext ;
141
- DIRENT Dirent ;
143
+ DIRENT_ENUM_CONTEXT DirContext = { 0 } ;
144
+ DIRENT Dirent = { 0 } ;
142
145
143
146
PAGED_CODE ();
144
147
145
148
ASSERT_IRP_CONTEXT ( IrpContext );
146
149
ASSERT_FCB ( Fcb );
147
150
151
+ //
152
+ // For DASD IO we already have clamped the read to the volume limits.
153
+ // We'll allow reading beyond those limits for extended DASD IO, so
154
+ // no MCB lookup here.
155
+ //
156
+
157
+ if (Fcb == Fcb -> Vcb -> VolumeDasdFcb ) {
158
+
159
+ * DiskOffset = FileOffset ;
160
+ return ;
161
+ }
162
+
148
163
//
149
164
// Use a try finally to facilitate cleanup.
150
165
//
151
166
152
- _SEH2_TRY {
167
+ try {
153
168
154
169
//
155
170
// We use a loop to perform the lookup. If we don't find the mapping in the
@@ -215,10 +230,7 @@ Return Value:
215
230
// Do an unsafe test to see if we need to create a file object.
216
231
//
217
232
218
- if (ParentFcb -> FileObject == NULL ) {
219
-
220
- CdCreateInternalStream ( IrpContext , ParentFcb -> Vcb , ParentFcb );
221
- }
233
+ CdVerifyOrCreateDirStreamFile ( IrpContext , ParentFcb );
222
234
223
235
//
224
236
// Initialize the local variables to indicate the first dirent
@@ -296,7 +308,7 @@ Return Value:
296
308
FirstPass = FALSE;
297
309
}
298
310
299
- } _SEH2_FINALLY {
311
+ } finally {
300
312
301
313
if (CleanupParent ) {
302
314
@@ -311,19 +323,19 @@ Return Value:
311
323
}
312
324
313
325
if (UnlockFcb ) { CdUnlockFcb ( IrpContext , Fcb ); }
314
- } _SEH2_END ;
326
+ }
315
327
316
328
return ;
317
329
}
318
330
319
331
320
332
VOID
321
333
CdAddAllocationFromDirent (
322
- IN PIRP_CONTEXT IrpContext ,
323
- IN PFCB Fcb ,
324
- IN ULONG McbEntryOffset ,
325
- IN LONGLONG StartingFileOffset ,
326
- IN PDIRENT Dirent
334
+ _In_ PIRP_CONTEXT IrpContext ,
335
+ _Inout_ PFCB Fcb ,
336
+ _In_ ULONG McbEntryOffset ,
337
+ _In_ LONGLONG StartingFileOffset ,
338
+ _In_ PDIRENT Dirent
327
339
)
328
340
329
341
/*++
@@ -358,6 +370,8 @@ Return Value:
358
370
359
371
PAGED_CODE ();
360
372
373
+ UNREFERENCED_PARAMETER ( IrpContext );
374
+
361
375
ASSERT_IRP_CONTEXT ( IrpContext );
362
376
ASSERT_FCB ( Fcb );
363
377
ASSERT_LOCKED_FCB ( Fcb );
@@ -466,10 +480,10 @@ Return Value:
466
480
467
481
VOID
468
482
CdAddInitialAllocation (
469
- IN PIRP_CONTEXT IrpContext ,
470
- IN PFCB Fcb ,
471
- IN ULONG StartingBlock ,
472
- IN LONGLONG DataLength
483
+ _In_ PIRP_CONTEXT IrpContext ,
484
+ _Inout_ PFCB Fcb ,
485
+ _In_ ULONG StartingBlock ,
486
+ _In_ LONGLONG DataLength
473
487
)
474
488
475
489
/*++
@@ -505,11 +519,13 @@ Return Value:
505
519
506
520
PAGED_CODE ();
507
521
522
+ UNREFERENCED_PARAMETER ( IrpContext );
523
+
508
524
ASSERT_IRP_CONTEXT ( IrpContext );
509
525
ASSERT_FCB ( Fcb );
510
526
ASSERT_LOCKED_FCB ( Fcb );
511
- ASSERT ( 0 == Fcb -> Mcb .CurrentEntryCount );
512
- ASSERT ( CDFS_NTC_FCB_DATA != Fcb -> NodeTypeCode );
527
+ NT_ASSERT ( 0 == Fcb -> Mcb .CurrentEntryCount );
528
+ NT_ASSERT ( CDFS_NTC_FCB_DATA != Fcb -> NodeTypeCode );
513
529
514
530
//
515
531
// Update the new entry with the input data.
@@ -555,9 +571,9 @@ Return Value:
555
571
556
572
VOID
557
573
CdTruncateAllocation (
558
- IN PIRP_CONTEXT IrpContext ,
559
- IN PFCB Fcb ,
560
- IN LONGLONG StartingFileOffset
574
+ _In_ PIRP_CONTEXT IrpContext ,
575
+ _Inout_ PFCB Fcb ,
576
+ _In_ LONGLONG StartingFileOffset
561
577
)
562
578
563
579
/*++
@@ -591,7 +607,7 @@ Return Value:
591
607
ASSERT_LOCKED_FCB ( Fcb );
592
608
593
609
//
594
- // Find the entry containing this starting offset.
610
+ // Find the entry containg this starting offset.
595
611
//
596
612
597
613
McbEntryOffset = CdFindMcbEntry ( IrpContext , Fcb , StartingFileOffset );
@@ -606,10 +622,11 @@ Return Value:
606
622
}
607
623
608
624
625
+ _At_ (Fcb -> NodeByteSize , _In_range_ (>=, FIELD_OFFSET ( FCB , FcbType )))
609
626
VOID
610
627
CdInitializeMcb (
611
- IN PIRP_CONTEXT IrpContext ,
612
- IN PFCB Fcb
628
+ _In_ PIRP_CONTEXT IrpContext ,
629
+ _Inout_updates_bytes_ ( Fcb -> NodeByteSize ) PFCB Fcb
613
630
)
614
631
615
632
/*++
@@ -635,6 +652,8 @@ Return Value:
635
652
{
636
653
PAGED_CODE ();
637
654
655
+ UNREFERENCED_PARAMETER ( IrpContext );
656
+
638
657
ASSERT_IRP_CONTEXT ( IrpContext );
639
658
ASSERT_FCB ( Fcb );
640
659
@@ -652,10 +671,14 @@ Return Value:
652
671
}
653
672
654
673
674
+ _At_ (Fcb -> NodeByteSize , _In_range_ (>=, FIELD_OFFSET ( FCB , FcbType )))
675
+ _When_ (Fcb -> NodeTypeCode == CDFS_NTC_FCB_PATH_TABLE , _At_ (Fcb -> NodeByteSize , _In_range_ (== , SIZEOF_FCB_INDEX )))
676
+ _When_ (Fcb -> NodeTypeCode == CDFS_NTC_FCB_INDEX , _At_ (Fcb -> NodeByteSize , _In_range_ (== , SIZEOF_FCB_INDEX )))
677
+ _When_ (Fcb -> NodeTypeCode == CDFS_NTC_FCB_DATA , _At_ (Fcb -> NodeByteSize , _In_range_ (== , SIZEOF_FCB_DATA )))
655
678
VOID
656
679
CdUninitializeMcb (
657
- IN PIRP_CONTEXT IrpContext ,
658
- IN PFCB Fcb
680
+ _In_ PIRP_CONTEXT IrpContext ,
681
+ _Inout_updates_bytes_ ( Fcb -> NodeByteSize ) PFCB Fcb
659
682
)
660
683
661
684
/*++
@@ -681,6 +704,8 @@ Return Value:
681
704
{
682
705
PAGED_CODE ();
683
706
707
+ UNREFERENCED_PARAMETER ( IrpContext );
708
+
684
709
ASSERT_IRP_CONTEXT ( IrpContext );
685
710
ASSERT_FCB ( Fcb );
686
711
@@ -698,14 +723,14 @@ Return Value:
698
723
699
724
700
725
//
701
- // Local support routine
726
+ // Local suupport routine
702
727
//
703
728
704
729
ULONG
705
730
CdFindMcbEntry (
706
- IN PIRP_CONTEXT IrpContext ,
707
- IN PFCB Fcb ,
708
- IN LONGLONG FileOffset
731
+ _In_ PIRP_CONTEXT IrpContext ,
732
+ _In_ PFCB Fcb ,
733
+ _In_ LONGLONG FileOffset
709
734
)
710
735
711
736
/*++
@@ -736,6 +761,8 @@ Return Value:
736
761
737
762
PAGED_CODE ();
738
763
764
+ UNREFERENCED_PARAMETER ( IrpContext );
765
+
739
766
ASSERT_IRP_CONTEXT ( IrpContext );
740
767
ASSERT_FCB ( Fcb );
741
768
ASSERT_LOCKED_FCB ( Fcb );
@@ -781,11 +808,11 @@ Return Value:
781
808
782
809
VOID
783
810
CdDiskOffsetFromMcbEntry (
784
- IN PIRP_CONTEXT IrpContext ,
785
- IN PCD_MCB_ENTRY McbEntry ,
786
- IN LONGLONG FileOffset ,
787
- IN PLONGLONG DiskOffset ,
788
- IN PULONG ByteCount
811
+ _In_ PIRP_CONTEXT IrpContext ,
812
+ _In_ PCD_MCB_ENTRY McbEntry ,
813
+ _In_ LONGLONG FileOffset ,
814
+ _Out_ PLONGLONG DiskOffset ,
815
+ _Out_ PULONG ByteCount
789
816
)
790
817
791
818
/*++
@@ -827,6 +854,9 @@ Return Value:
827
854
LONGLONG LocalByteCount ;
828
855
829
856
PAGED_CODE ();
857
+
858
+ UNREFERENCED_PARAMETER ( IrpContext );
859
+
830
860
ASSERT_IRP_CONTEXT ( IrpContext );
831
861
832
862
//
0 commit comments