1 /*
2  * PROJECT:         ReactOS kernel-mode tests
3  * LICENSE:         LGPLv2+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Kernel-Mode Test Suite FsRtl Test
5  * PROGRAMMER:      Pierre Schweitzer <pierre.schweitzer@reactos.org>
6  */
7 
8 #include <kmt_test.h>
9 
10 #define NDEBUG
11 #include <debug.h>
12 
13 static VOID FsRtlMcbTest()
14 {
15 }
16 
17 static VOID DumpAllRuns(PLARGE_MCB Mcb)
18 {
19     ULONG i;
20     LONGLONG Vbn, Lbn, Count;
21 
22     trace("MCB %p:\n", Mcb);
23 
24     for (i = 0; FsRtlGetNextLargeMcbEntry(Mcb, i, &Vbn, &Lbn, &Count); i++)
25     {
26         // print out vbn, lbn, and count
27         trace("\t[%I64d,%I64d,%I64d]\n", Vbn, Lbn, Count);
28     }
29     trace("\n");
30 }
31 
32 static VOID FsRtlLargeMcbTest()
33 {
34     LARGE_MCB LargeMcb;
35     ULONG NbRuns, Index;
36     LONGLONG Vbn, Lbn, SectorCount, StartingLbn, CountFromStartingLbn;
37 
38     FsRtlInitializeLargeMcb(&LargeMcb, PagedPool);
39 
40     ok(FsRtlLookupLastLargeMcbEntry(&LargeMcb, &Vbn, &Lbn) == FALSE, "expected FALSE, got TRUE\n");
41     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == FALSE, "expected FALSE, got TRUE\n");
42 
43     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 1, 1, 1024) == TRUE, "expected TRUE, got FALSE\n");
44     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
45     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
46     DumpAllRuns(&LargeMcb); // [0,-1,1][1,1,1024]          [vbn,lbn,sc]
47     ok(FsRtlLookupLastLargeMcbEntry(&LargeMcb, &Vbn, &Lbn) == TRUE, "expected TRUE, got FALSE\n");
48     ok(Vbn == 1024, "Expected Vbn 1024, got: %I64d\n", Vbn);
49     ok(Lbn == 1024, "Expected Lbn 1024, got: %I64d\n", Lbn);
50     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
51     ok(Vbn == 1024, "Expected Vbn 1024, got: %I64d\n", Vbn);
52     ok(Lbn == 1024, "Expected Lbn 1024, got: %I64d\n", Lbn);
53     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
54 
55     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 2048, 2, 1024) == TRUE, "expected TRUE, got FALSE\n");
56     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
57     ok(NbRuns == 4, "Expected 4 runs, got: %lu\n", NbRuns);
58     DumpAllRuns(&LargeMcb); // [0,-1,1][1,1,1024][1025,-1,1023][2048,2,1024]  ======= [(0,1) hole] [(1,1025)=>(1,1025)] [(1025, 2048) hole] [(2048,3072)=>(2,1026)]
59     ok(FsRtlLookupLastLargeMcbEntry(&LargeMcb, &Vbn, &Lbn) == TRUE, "expected TRUE, got FALSE\n");
60     ok(Vbn == 3071, "Expected Vbn 3071, got: %I64d\n", Vbn);
61     ok(Lbn == 1025, "Expected Lbn 1025, got: %I64d\n", Lbn);
62     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
63     ok(Vbn == 3071, "Expected Vbn 3071, got: %I64d\n", Vbn);
64     ok(Lbn == 1025, "Expected Lbn 1025, got: %I64d\n", Lbn);
65     ok(Index == 3, "Expected Index 3, got: %lu\n", Index);
66 
67     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
68     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
69     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
70     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
71 
72     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
73     ok(Vbn == 1, "Expected Vbn 1, got: %I64d\n", Vbn);
74     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
75     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
76 
77     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 2, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
78     ok(Vbn == 1025, "Expected Vbn 1025, got: %I64d\n", Vbn);
79     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
80     ok(SectorCount == 1023, "Expected SectorCount 1023, got: %I64d\n", SectorCount);
81 
82     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 3, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
83     ok(Vbn == 2048, "Expected Vbn 2048, got: %I64d\n", Vbn);
84     ok(Lbn == 2, "Expected Lbn 2, got: %I64d\n", Lbn);
85     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
86 
87     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 4, &Vbn, &Lbn, &SectorCount) == FALSE, "expected FALSE, got TRUE\n");
88 
89     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 1, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
90     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
91     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
92     ok(StartingLbn == 1, "Expected StartingLbn 1, got: %I64d\n", StartingLbn);
93     ok(CountFromStartingLbn == 1024, "Expected CountFromStartingLbn 1024, got: %I64d\n", CountFromStartingLbn);
94     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
95 
96     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 2048, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
97     ok(Lbn == 2, "Expected Lbn 2, got: %I64d\n", Lbn);
98     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
99     ok(StartingLbn == 2, "Expected StartingLbn 2, got: %I64d\n", StartingLbn);
100     ok(CountFromStartingLbn == 1024, "Expected CountFromStartingLbn 1024, got: %I64d\n", CountFromStartingLbn);
101     ok(Index == 3, "Expected Index 3, got: %lu\n", Index);
102 
103     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 3073, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == FALSE, "expected FALSE, got TRUE\n");
104 
105     FsRtlRemoveLargeMcbEntry(&LargeMcb, 1, 1024);
106     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
107     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
108     DumpAllRuns(&LargeMcb);  // [0,-1,2048][2048,2,1024]
109     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 512, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
110     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
111     ok(SectorCount == 1536, "Expected SectorCount 1536, got: %I64d\n", SectorCount);
112     ok(StartingLbn == -1, "Expected StartingLbn -1, got: %I64d\n", StartingLbn);
113     ok(CountFromStartingLbn == 2048, "Expected CountFromStartingLbn 2048, got: %I64d\n", CountFromStartingLbn);
114     ok(Index == 0, "Expected Index 0, got: %lu\n", Index);
115     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
116     ok(Vbn == 3071, "Expected Vbn 3071, got: %I64d\n", Vbn);
117     ok(Lbn == 1025, "Expected Lbn 1025, got: %I64d\n", Lbn);
118     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
119 
120     ok(FsRtlSplitLargeMcb(&LargeMcb, 2048, 1024) == TRUE, "expected TRUE, got FALSE\n");
121     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
122     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
123     DumpAllRuns(&LargeMcb);  // [0,-1,3072][3072,2,1024]
124     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
125     ok(Vbn == 4095, "Expected Vbn 4095, got: %I64d\n", Vbn);
126     ok(Lbn == 1025, "Expected Lbn 1025, got: %I64d\n", Lbn);
127     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
128     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 2048, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
129     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
130     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
131     ok(StartingLbn == -1, "Expected StartingLbn -1, got: %I64d\n", StartingLbn);
132     ok(CountFromStartingLbn == 3072, "Expected CountFromStartingLbn 3072, got: %I64d\n", CountFromStartingLbn);
133     ok(Index == 0, "Expected Index 0, got: %lu\n", Index);
134     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 3072, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
135     ok(Lbn == 2, "Expected Lbn 2, got: %I64d\n", Lbn);
136     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
137     ok(StartingLbn == 2, "Expected StartingLbn 2, got: %I64d\n", StartingLbn);
138     ok(CountFromStartingLbn == 1024, "Expected CountFromStartingLbn 1024, got: %I64d\n", CountFromStartingLbn);
139     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
140 
141     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 3584, 3, 1024) == FALSE, "expected FALSE, got TRUE\n");
142 
143     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 4095, 1025, 1024) == TRUE, "expected TRUE, got FALSE\n");
144     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
145     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
146     DumpAllRuns(&LargeMcb); // [0,-1,3072][3072,2,2047]
147     ok(FsRtlLookupLastLargeMcbEntry(&LargeMcb, &Vbn, &Lbn) == TRUE, "expected TRUE, got FALSE\n");
148     ok(Vbn == 5118, "Expected Vbn 5118, got: %I64d\n", Vbn);
149     ok(Lbn == 2048, "Expected Lbn 2048, got: %I64d\n", Lbn);
150     ok(FsRtlLookupLastLargeMcbEntryAndIndex(&LargeMcb, &Vbn, &Lbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
151     ok(Vbn == 5118, "Expected Vbn 5118, got: %I64d\n", Vbn);
152     ok(Lbn == 2048, "Expected Lbn 2048, got: %I64d\n", Lbn);
153     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
154 
155     FsRtlTruncateLargeMcb(&LargeMcb, 4607);
156     DumpAllRuns(&LargeMcb); // [0,-1,3072][3072,2,1535]
157     ok(FsRtlLookupLargeMcbEntry(&LargeMcb, 4095, &Lbn, &SectorCount, &StartingLbn, &CountFromStartingLbn, &Index) == TRUE, "expected TRUE, got FALSE\n");
158     ok(Lbn == 1025, "Expected Lbn 1025, got: %I64d\n", Lbn);
159     ok(SectorCount == 512, "Expected SectorCount 512, got: %I64d\n", SectorCount);
160     ok(StartingLbn == 2, "Expected StartingLbn 2, got: %I64d\n", StartingLbn);
161     ok(CountFromStartingLbn == 1535, "Expected CountFromStartingLbn 1535, got: %I64d\n", CountFromStartingLbn);
162     ok(Index == 1, "Expected Index 1, got: %lu\n", Index);
163 
164     FsRtlUninitializeLargeMcb(&LargeMcb);
165 
166     FsRtlInitializeLargeMcb(&LargeMcb, PagedPool);
167     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
168     ok(NbRuns == 0, "Expected 0 runs, got: %lu\n", NbRuns);
169 
170     /* Create a mapping with three holes between each mapping
171      * It looks like that:
172      * ----//////-----/////-----///////
173      */
174     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 1024, 1025, 1024) == TRUE, "expected TRUE, got FALSE\n");
175     DumpAllRuns(&LargeMcb); // [0,-1,1024][1024,1024,1024]
176     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 3072, 3072, 1024) == TRUE, "expected TRUE, got FALSE\n");
177     DumpAllRuns(&LargeMcb); // [0,-1,1024][1024,1024,1024][2048,-1,1024][3072,3072,1024]
178     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 5120, 5120, 1024) == TRUE, "expected TRUE, got FALSE\n");
179     DumpAllRuns(&LargeMcb); // [0,-1,1024][1024,1024,1024][2048,-1,1024][3072,3072,1024][4096,-1,1024][5120,5120,1024]
180 
181     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
182     ok(NbRuns == 6, "Expected 6 runs, got: %lu\n", NbRuns);
183 
184     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
185     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
186     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
187     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
188 
189     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
190     ok(Vbn == 1024, "Expected Vbn 1024, got: %I64d\n", Vbn);
191     ok(Lbn == 1025, "Expected Lbn 1024, got: %I64d\n", Lbn);
192     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
193 
194     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 2, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
195     ok(Vbn == 2048, "Expected Vbn 2048, got: %I64d\n", Vbn);
196     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
197     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
198 
199     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 3, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
200     ok(Vbn == 3072, "Expected Vbn 3072, got: %I64d\n", Vbn);
201     ok(Lbn == 3072, "Expected Lbn 3072, got: %I64d\n", Lbn);
202     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
203 
204     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 4, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
205     ok(Vbn == 4096, "Expected Vbn 4096, got: %I64d\n", Vbn);
206     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
207     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
208 
209     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 5, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
210     ok(Vbn == 5120, "Expected Vbn 5120, got: %I64d\n", Vbn);
211     ok(Lbn == 5120, "Expected Lbn 5120, got: %I64d\n", Lbn);
212     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
213 
214     /* Fill first hole */
215     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 0, 1, 1024) == TRUE, "expected TRUE, got FALSE\n");
216     DumpAllRuns(&LargeMcb); // [0,1,2048][2048,-1,1024][3072,3072,1024][4096,-1,1024][5120,5120,1024]
217 
218     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
219     ok(NbRuns == 5, "Expected 5 runs, got: %lu\n", NbRuns);
220 
221     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
222     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
223     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
224     ok(SectorCount == 2048, "Expected SectorCount 2048, got: %I64d\n", SectorCount);
225 
226     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
227     ok(Vbn == 2048, "Expected Vbn 2048, got: %I64d\n", Vbn);
228     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
229     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
230 
231     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 2, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
232     ok(Vbn == 3072, "Expected Vbn 3072, got: %I64d\n", Vbn);
233     ok(Lbn == 3072, "Expected Lbn 3072, got: %I64d\n", Lbn);
234     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
235 
236     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 3, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
237     ok(Vbn == 4096, "Expected Vbn 4096, got: %I64d\n", Vbn);
238     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
239     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
240 
241     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 4, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
242     ok(Vbn == 5120, "Expected Vbn 5120, got: %I64d\n", Vbn);
243     ok(Lbn == 5120, "Expected Lbn 5120, got: %I64d\n", Lbn);
244     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
245 
246     /* Fill half of the last hole and overlap */
247     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 4608, 4608, 1024) == TRUE, "expected TRUE, got FALSE\n");
248     DumpAllRuns(&LargeMcb); // [0,1,2048][2048,-1,1024][3072,3072,1024][4096,-1,512][4608,4608,1536]
249 
250     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
251     ok(NbRuns == 5, "Expected 5 runs, got: %lu\n", NbRuns);
252 
253     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
254     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
255     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
256     ok(SectorCount == 2048, "Expected SectorCount 2048, got: %I64d\n", SectorCount);
257 
258     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
259     ok(Vbn == 2048, "Expected Vbn 2048, got: %I64d\n", Vbn);
260     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
261     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
262 
263     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 2, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
264     ok(Vbn == 3072, "Expected Vbn 3072, got: %I64d\n", Vbn);
265     ok(Lbn == 3072, "Expected Lbn 3072, got: %I64d\n", Lbn);
266     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
267 
268     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 3, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
269     ok(Vbn == 4096, "Expected Vbn 4096, got: %I64d\n", Vbn);
270     ok(Lbn == -1, "Expected Lbn -1, got: %I64d\n", Lbn);
271     ok(SectorCount == 512, "Expected SectorCount 512, got: %I64d\n", SectorCount);
272 
273     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 4, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
274     ok(Vbn == 4608, "Expected Vbn 4608, got: %I64d\n", Vbn);
275     ok(Lbn == 4608, "Expected Lbn 4608, got: %I64d\n", Lbn);
276     ok(SectorCount == 1536, "Expected SectorCount 1536, got: %I64d\n", SectorCount);
277 
278     FsRtlUninitializeLargeMcb(&LargeMcb);
279 
280     FsRtlInitializeLargeMcb(&LargeMcb, PagedPool);
281     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
282     ok(NbRuns == 0, "Expected 0 runs, got: %lu\n", NbRuns);
283 
284     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 0, 1, 1024) == TRUE, "expected TRUE, got FALSE\n");
285     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
286     ok(NbRuns == 1, "Expected 1 runs, got: %lu\n", NbRuns);
287     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
288     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
289     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
290     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
291     DumpAllRuns(&LargeMcb);
292 
293     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 0, 2, 1024) == FALSE, "expected FALSE, got TRUE\n");
294     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
295     ok(NbRuns == 1, "Expected 1 runs, got: %lu\n", NbRuns);
296     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
297     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
298     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
299     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
300     DumpAllRuns(&LargeMcb);
301 
302     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 0, 0, 1024) == FALSE, "expected FALSE, got TRUE\n");
303     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
304     ok(NbRuns == 1, "Expected 1 runs, got: %lu\n", NbRuns);
305     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
306     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
307     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
308     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
309     DumpAllRuns(&LargeMcb);
310 
311     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 1, 2, 1023) == TRUE, "expected TRUE, got FALSE\n");
312     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
313     ok(NbRuns == 1, "Expected 1 runs, got: %lu\n", NbRuns);
314     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
315     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
316     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
317     ok(SectorCount == 1024, "Expected SectorCount 1024, got: %I64d\n", SectorCount);
318     DumpAllRuns(&LargeMcb);
319 
320     FsRtlUninitializeLargeMcb(&LargeMcb);
321 
322     FsRtlInitializeLargeMcb(&LargeMcb, PagedPool);
323     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
324     ok(NbRuns == 0, "Expected 0 runs, got: %lu\n", NbRuns);
325 
326     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 0, 1, 1) == TRUE, "expected TRUE, got FALSE\n");
327     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
328     ok(NbRuns == 1, "Expected 1 runs, got: %lu\n", NbRuns);
329     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
330     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
331     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
332     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
333     DumpAllRuns(&LargeMcb);
334 
335 
336     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 1, 10, 1) == TRUE, "expected TRUE, got FALSE\n");
337     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
338     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
339     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
340     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
341     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
342     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
343     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
344     ok(Vbn == 1, "Expected Vbn 1, got: %I64d\n", Vbn);
345     ok(Lbn == 10, "Expected Lbn 10, got: %I64d\n", Lbn);
346     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
347     DumpAllRuns(&LargeMcb);
348 
349     ok(FsRtlAddLargeMcbEntry(&LargeMcb, 2, 20, 1) == TRUE, "expected TRUE, got FALSE\n");
350     NbRuns = FsRtlNumberOfRunsInLargeMcb(&LargeMcb);
351     ok(NbRuns == 3, "Expected 3 runs, got: %lu\n", NbRuns);
352     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 0, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
353     ok(Vbn == 0, "Expected Vbn 0, got: %I64d\n", Vbn);
354     ok(Lbn == 1, "Expected Lbn 1, got: %I64d\n", Lbn);
355     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
356     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 1, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
357     ok(Vbn == 1, "Expected Vbn 1, got: %I64d\n", Vbn);
358     ok(Lbn == 10, "Expected Lbn 10, got: %I64d\n", Lbn);
359     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
360     ok(FsRtlGetNextLargeMcbEntry(&LargeMcb, 2, &Vbn, &Lbn, &SectorCount) == TRUE, "expected TRUE, got FALSE\n");
361     ok(Vbn == 2, "Expected Vbn 2, got: %I64d\n", Vbn);
362     ok(Lbn == 20, "Expected Lbn 20, got: %I64d\n", Lbn);
363     ok(SectorCount == 1, "Expected SectorCount 1, got: %I64d\n", SectorCount);
364     DumpAllRuns(&LargeMcb);
365 
366     FsRtlUninitializeLargeMcb(&LargeMcb);
367 }
368 
369 static VOID FsRtlLargeMcbTestsExt2()
370 {
371     LARGE_MCB FirstMcb, SecondMcb;
372     LONGLONG Lbn, SectorCountFromLbn, StartingLbn, SectorCountFromStartingLbn, Vbn, SectorCount;
373     ULONG Index, NbRuns;
374     BOOLEAN Result;
375 
376     FsRtlInitializeLargeMcb(&FirstMcb, PagedPool);
377     FsRtlInitializeLargeMcb(&SecondMcb, PagedPool);
378 
379     FsRtlTruncateLargeMcb(&FirstMcb, 0);
380     FsRtlTruncateLargeMcb(&SecondMcb, 0);
381 
382     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 1, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
383     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
384 
385     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 1, 198657, 1);
386     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
387 
388     DumpAllRuns(&FirstMcb);
389 
390     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
391     ok(NbRuns == 2, "Expected 2 runs, got: %lu\n", NbRuns);
392 
393     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 1, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
394     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
395     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
396     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 1, got: %I64d\n", SectorCountFromLbn);
397     ok(StartingLbn == 198657LL, "Expected StartingLbn 198657, got: %I64d\n", StartingLbn);
398     ok(SectorCountFromStartingLbn == 1LL, "Expected SectorCountFromStartingLbn 1, got: %I64d\n", SectorCountFromStartingLbn);
399     ok(Index == 1, "Expected Index 1, got: %d\n", Index);
400 
401     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 2, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
402     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
403 
404     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 2, 199169, 11);
405     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
406 
407     DumpAllRuns(&FirstMcb);
408 
409     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
410     ok(NbRuns == 3, "Expected 3 runs, got: %lu\n", NbRuns);
411 
412     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 2, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
413     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
414     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
415     ok(SectorCountFromLbn == 11LL, "Expected SectorCountFromLbn 11, got: %I64d\n", SectorCountFromLbn);
416     ok(StartingLbn == 199169LL, "Expected StartingLbn 199169, got: %I64d\n", StartingLbn);
417     ok(SectorCountFromStartingLbn == 11LL, "Expected SectorCountFromStartingLbn 11, got: %I64d\n", SectorCountFromStartingLbn);
418     ok(Index == 2, "Expected Index 2, got: %d\n", Index);
419 
420     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 0, &Vbn, &Lbn, &SectorCount);
421     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
422     ok(Vbn == 0LL, "Expected Vbn 0, got: %I64d\n", Vbn);
423     ok(Lbn == -1LL, "Expected Lbn -1, got: %I64d\n", Lbn);
424     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
425 
426     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 1, &Vbn, &Lbn, &SectorCount);
427     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
428     ok(Vbn == 1LL, "Expected Vbn 1, got: %I64d\n", Vbn);
429     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
430     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
431 
432     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 2, &Vbn, &Lbn, &SectorCount);
433     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
434     ok(Vbn == 2LL, "Expected Vbn 2, got: %I64d\n", Vbn);
435     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
436     ok(SectorCount == 11LL, "Expected SectorCount 11, got: %I64d\n", SectorCount);
437 
438     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 3, &Vbn, &Lbn, &SectorCount);
439     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
440 
441     Result = FsRtlAddLargeMcbEntry(&SecondMcb, 197128, 197128, 1);
442     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
443 
444     Result = FsRtlLookupLargeMcbEntry(&SecondMcb, 197128, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
445     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
446     ok(Lbn == 197128LL, "Expected Lbn 197128, got: %I64d\n", Lbn);
447     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 1, got: %I64d\n", SectorCountFromLbn);
448     ok(StartingLbn == 197128LL, "Expected StartingLbn 197128, got: %I64d\n", StartingLbn);
449     ok(SectorCountFromStartingLbn == 1LL, "Expected SectorCountFromStartingLbn 1, got: %I64d\n", SectorCountFromStartingLbn);
450     ok(Index == 1, "Expected Index 1, got: %d\n", Index);
451 
452     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 13, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
453     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
454 
455     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 13, 199180, 4);
456     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
457 
458     DumpAllRuns(&FirstMcb);
459 
460     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
461     ok(NbRuns == 3, "Expected 3 runs, got: %lu\n", NbRuns);
462 
463     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 13, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
464     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
465     ok(Lbn == 199180LL, "Expected Lbn 199180, got: %I64d\n", Lbn);
466     ok(SectorCountFromLbn == 4LL, "Expected SectorCountFromLbn 4, got: %I64d\n", SectorCountFromLbn);
467     ok(StartingLbn == 199169LL, "Expected StartingLbn 199169, got: %I64d\n", StartingLbn);
468     ok(SectorCountFromStartingLbn == 15LL, "Expected SectorCountFromStartingLbn 15, got: %I64d\n", SectorCountFromStartingLbn);
469     ok(Index == 2, "Expected Index 2, got: %d\n", Index);
470 
471     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 0, &Vbn, &Lbn, &SectorCount);
472     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
473     ok(Vbn == 0LL, "Expected Vbn 0, got: %I64d\n", Vbn);
474     ok(Lbn == -1LL, "Expected Lbn -1, got: %I64d\n", Lbn);
475     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
476 
477     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 1, &Vbn, &Lbn, &SectorCount);
478     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
479     ok(Vbn == 1LL, "Expected Vbn 1, got: %I64d\n", Vbn);
480     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
481     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
482 
483     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 2, &Vbn, &Lbn, &SectorCount);
484     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
485     ok(Vbn == 2LL, "Expected Vbn 2, got: %I64d\n", Vbn);
486     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
487     ok(SectorCount == 15LL, "Expected SectorCount 15, got: %I64d\n", SectorCount);
488 
489     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 3, &Vbn, &Lbn, &SectorCount);
490     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
491 
492     Result = FsRtlAddLargeMcbEntry(&SecondMcb, 197128, 197128, 1);
493     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
494 
495     Result = FsRtlLookupLargeMcbEntry(&SecondMcb, 197128, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
496     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
497     ok(Lbn == 197128LL, "Expected Lbn 197128, got: %I64d\n", Lbn);
498     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 1, got: %I64d\n", SectorCountFromLbn);
499     ok(StartingLbn == 197128LL, "Expected StartingLbn 197128, got: %I64d\n", StartingLbn);
500     ok(SectorCountFromStartingLbn == 1LL, "Expected SectorCountFromStartingLbn 1, got: %I64d\n", SectorCountFromStartingLbn);
501     ok(Index == 1, "Expected Index 1, got: %d\n", Index);
502 
503     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 17, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
504     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
505 
506     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 17, 1105, 16);
507     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
508 
509     DumpAllRuns(&FirstMcb);
510 
511     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
512     ok(NbRuns == 4, "Expected 4 runs, got: %lu\n", NbRuns);
513 
514     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 17, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
515     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
516     ok(Lbn == 1105LL, "Expected Lbn 1105, got: %I64d\n", Lbn);
517     ok(SectorCountFromLbn == 16LL, "Expected SectorCountFromLbn 16, got: %I64d\n", SectorCountFromLbn);
518     ok(StartingLbn == 1105LL, "Expected StartingLbn 1105, got: %I64d\n", StartingLbn);
519     ok(SectorCountFromStartingLbn == 16LL, "Expected SectorCountFromStartingLbn 16, got: %I64d\n", SectorCountFromStartingLbn);
520     ok(Index == 3, "Expected Index 3, got: %d\n", Index);
521 
522     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 0, &Vbn, &Lbn, &SectorCount);
523     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
524     ok(Vbn == 0LL, "Expected Vbn 0, got: %I64d\n", Vbn);
525     ok(Lbn == -1LL, "Expected Lbn -1, got: %I64d\n", Lbn);
526     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
527 
528     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 1, &Vbn, &Lbn, &SectorCount);
529     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
530     ok(Vbn == 1LL, "Expected Vbn 1, got: %I64d\n", Vbn);
531     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
532     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
533 
534     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 2, &Vbn, &Lbn, &SectorCount);
535     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
536     ok(Vbn == 2LL, "Expected Vbn 2, got: %I64d\n", Vbn);
537     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
538     ok(SectorCount == 15LL, "Expected SectorCount 15, got: %I64d\n", SectorCount);
539 
540     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 3, &Vbn, &Lbn, &SectorCount);
541     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
542     ok(Vbn == 17LL, "Expected Vbn 17, got: %I64d\n", Vbn);
543     ok(Lbn == 1105LL, "Expected Lbn 1105, got: %I64d\n", Lbn);
544     ok(SectorCount == 16LL, "Expected SectorCount 16, got: %I64d\n", SectorCount);
545 
546     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 4, &Vbn, &Lbn, &SectorCount);
547     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
548 
549     Result = FsRtlAddLargeMcbEntry(&SecondMcb, 197128, 197128, 1);
550     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
551 
552     Result = FsRtlLookupLargeMcbEntry(&SecondMcb, 197128, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
553     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
554     ok(Lbn == 197128LL, "Expected Lbn 197128, got: %I64d\n", Lbn);
555     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 1, got: %I64d\n", SectorCountFromLbn);
556     ok(StartingLbn == 197128LL, "Expected StartingLbn 197128, got: %I64d\n", StartingLbn);
557     ok(SectorCountFromStartingLbn == 1LL, "Expected SectorCountFromStartingLbn 1, got: %I64d\n", SectorCountFromStartingLbn);
558     ok(Index == 1, "Expected Index 1, got: %d\n", Index);
559 
560     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 33, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
561     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
562 
563     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 33, 1185, 32);
564     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
565 
566     DumpAllRuns(&FirstMcb);
567 
568     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
569     ok(NbRuns == 5, "Expected 5 runs, got: %lu\n", NbRuns);
570 
571     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 33, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
572     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
573     ok(Lbn == 1185LL, "Expected Lbn 1185, got: %I64d\n", Lbn);
574     ok(SectorCountFromLbn == 32LL, "Expected SectorCountFromLbn 32, got: %I64d\n", SectorCountFromLbn);
575     ok(StartingLbn == 1185LL, "Expected StartingLbn 1185, got: %I64d\n", StartingLbn);
576     ok(SectorCountFromStartingLbn == 32LL, "Expected SectorCountFromStartingLbn 32, got: %I64d\n", SectorCountFromStartingLbn);
577     ok(Index == 4, "Expected Index 4, got: %d\n", Index);
578 
579     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 0, &Vbn, &Lbn, &SectorCount);
580     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
581     ok(Vbn == 0LL, "Expected Vbn 0, got: %I64d\n", Vbn);
582     ok(Lbn == -1LL, "Expected Lbn -1, got: %I64d\n", Lbn);
583     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
584 
585     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 1, &Vbn, &Lbn, &SectorCount);
586     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
587     ok(Vbn == 1LL, "Expected Vbn 1, got: %I64d\n", Vbn);
588     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
589     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
590 
591     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 2, &Vbn, &Lbn, &SectorCount);
592     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
593     ok(Vbn == 2LL, "Expected Vbn 2, got: %I64d\n", Vbn);
594     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
595     ok(SectorCount == 15LL, "Expected SectorCount 15, got: %I64d\n", SectorCount);
596 
597     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 3, &Vbn, &Lbn, &SectorCount);
598     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
599     ok(Vbn == 17LL, "Expected Vbn 17, got: %I64d\n", Vbn);
600     ok(Lbn == 1105LL, "Expected Lbn 1105, got: %I64d\n", Lbn);
601     ok(SectorCount == 16LL, "Expected SectorCount 16, got: %I64d\n", SectorCount);
602 
603     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 4, &Vbn, &Lbn, &SectorCount);
604     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
605     ok(Vbn == 33LL, "Expected Vbn 33, got: %I64d\n", Vbn);
606     ok(Lbn == 1185LL, "Expected Lbn 1185, got: %I64d\n", Lbn);
607     ok(SectorCount == 32LL, "Expected SectorCount 32, got: %I64d\n", SectorCount);
608 
609     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 5, &Vbn, &Lbn, &SectorCount);
610     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
611 
612     Result = FsRtlAddLargeMcbEntry(&SecondMcb, 197128, 197128, 1);
613     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
614 
615     Result = FsRtlLookupLargeMcbEntry(&SecondMcb, 197128, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
616     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
617     ok(Lbn == 197128LL, "Expected Lbn 197128, got: %I64d\n", Lbn);
618     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 1, got: %I64d\n", SectorCountFromLbn);
619     ok(StartingLbn == 197128LL, "Expected StartingLbn 197128, got: %I64d\n", StartingLbn);
620     ok(SectorCountFromStartingLbn == 1LL, "Expected SectorCountFromStartingLbn 1, got: %I64d\n", SectorCountFromStartingLbn);
621     ok(Index == 1, "Expected Index 1, got: %d\n", Index);
622 
623     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 65, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
624     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
625 
626     Result = FsRtlAddLargeMcbEntry(&FirstMcb, 65, 1249, 44);
627     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
628 
629     DumpAllRuns(&FirstMcb);
630 
631     NbRuns = FsRtlNumberOfRunsInLargeMcb(&FirstMcb);
632     ok(NbRuns == 6, "Expected 6 runs, got: %lu\n", NbRuns);
633 
634     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 65, &Lbn, &SectorCountFromLbn, &StartingLbn, &SectorCountFromStartingLbn, &Index);
635     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
636     ok(Lbn == 1249LL, "Expected Lbn 1249, got: %I64d\n", Lbn);
637     ok(SectorCountFromLbn == 44LL, "Expected SectorCountFromLbn 44, got: %I64d\n", SectorCountFromLbn);
638     ok(StartingLbn == 1249LL, "Expected StartingLbn 1249, got: %I64d\n", StartingLbn);
639     ok(SectorCountFromStartingLbn == 44LL, "Expected SectorCountFromStartingLbn 44, got: %I64d\n", SectorCountFromStartingLbn);
640     ok(Index == 5, "Expected Index 1, got: %d\n", Index);
641 
642     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 0, &Vbn, &Lbn, &SectorCount);
643     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
644     ok(Vbn == 0LL, "Expected Vbn 0, got: %I64d\n", Vbn);
645     ok(Lbn == -1LL, "Expected Lbn -1, got: %I64d\n", Lbn);
646     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
647 
648     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 1, &Vbn, &Lbn, &SectorCount);
649     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
650     ok(Vbn == 1LL, "Expected Vbn 1, got: %I64d\n", Vbn);
651     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
652     ok(SectorCount == 1LL, "Expected SectorCount 1, got: %I64d\n", SectorCount);
653 
654     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 2, &Vbn, &Lbn, &SectorCount);
655     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
656     ok(Vbn == 2LL, "Expected Vbn 2, got: %I64d\n", Vbn);
657     ok(Lbn == 199169LL, "Expected Lbn 199169, got: %I64d\n", Lbn);
658     ok(SectorCount == 15LL, "Expected SectorCount 15, got: %I64d\n", SectorCount);
659 
660     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 3, &Vbn, &Lbn, &SectorCount);
661     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
662     ok(Vbn == 17LL, "Expected Vbn 17, got: %I64d\n", Vbn);
663     ok(Lbn == 1105LL, "Expected Lbn 1105, got: %I64d\n", Lbn);
664     ok(SectorCount == 16LL, "Expected SectorCount 16, got: %I64d\n", SectorCount);
665 
666     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 4, &Vbn, &Lbn, &SectorCount);
667     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
668     ok(Vbn == 33LL, "Expected Vbn 33, got: %I64d\n", Vbn);
669     ok(Lbn == 1185LL, "Expected Lbn 1185, got: %I64d\n", Lbn);
670     ok(SectorCount == 32LL, "Expected SectorCount 32, got: %I64d\n", SectorCount);
671 
672     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 5, &Vbn, &Lbn, &SectorCount);
673     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
674     ok(Vbn == 65LL, "Expected Vbn 65, got: %I64d\n", Vbn);
675     ok(Lbn == 1249LL, "Expected Lbn 1249, got: %I64d\n", Lbn);
676     ok(SectorCount == 44LL, "Expected SectorCount 44, got: %I64d\n", SectorCount);
677 
678     Result = FsRtlGetNextLargeMcbEntry(&FirstMcb, 6, &Vbn, &Lbn, &SectorCount);
679     ok(Result == FALSE, "Expected FALSE, got TRUE\n");
680 
681     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 1, &Lbn, &SectorCountFromLbn, NULL, NULL, NULL);
682     ok(Result == TRUE, "Expected TRUE, got FALSE\n");
683     ok(Lbn == 198657LL, "Expected Lbn 198657, got: %I64d\n", Lbn);
684     ok(SectorCountFromLbn == 1LL, "Expected SectorCountFromLbn 108, got: %I64d\n", SectorCountFromLbn);
685 
686     FsRtlUninitializeLargeMcb(&SecondMcb);
687     FsRtlUninitializeLargeMcb(&FirstMcb);
688 }
689 
690 static VOID FsRtlLargeMcbTestsFastFat()
691 {
692     LARGE_MCB FirstMcb;
693     LONGLONG Lbn, Vbn, SectorCount;
694     ULONG Index;
695     BOOLEAN Result;
696 
697     FsRtlInitializeLargeMcb(&FirstMcb, PagedPool);
698 
699     Lbn = -1;
700     SectorCount = -1;
701     Result = FsRtlLookupLargeMcbEntry(&FirstMcb, 8388607LL, &Lbn, &SectorCount, NULL, NULL, NULL);
702     ok_bool_false(Result, "FsRtlLookupLargeMcbEntry returned");
703     ok_eq_longlong(Lbn, -1);
704     ok_eq_longlong(SectorCount, -1);
705 
706     Vbn = -1;
707     Lbn = -1;
708     Index = (ULONG) -1;
709     Result = FsRtlLookupLastLargeMcbEntryAndIndex(&FirstMcb, &Vbn, &Lbn, &Index);
710     ok_bool_false(Result, "FsRtlLookupLastLargeMcbEntryAndIndex returned");
711     ok_eq_longlong(Vbn, -1);
712     ok_eq_longlong(Lbn, -1);
713     ok_eq_ulong(Index, (ULONG) -1);
714 
715     FsRtlUninitializeLargeMcb(&FirstMcb);
716 }
717 
718 START_TEST(FsRtlMcb)
719 {
720     FsRtlMcbTest();
721     FsRtlLargeMcbTest();
722     FsRtlLargeMcbTestsExt2();
723     FsRtlLargeMcbTestsFastFat();
724 }
725