1 // IoEaTest.cpp : Defines the entry point for the console application.
9 typedef struct _FILE_FULL_EA_INFORMATION
{
10 ULONG NextEntryOffset
;
15 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
17 #define ULONG_PTR unsigned char*
19 #define NTSTATUS unsigned int
21 #define STATUS_EA_LIST_INCONSISTENT 0x80000014L
22 #define STATUS_SUCCESS 0x00000000L
29 IoCheckEaBufferValidityROS(IN PFILE_FULL_EA_INFORMATION EaBuffer
,
31 OUT PULONG ErrorOffset
)
33 PFILE_FULL_EA_INFORMATION EaBufferEnd
;
34 ULONG NextEaBufferOffset
;
37 /* Length of the rest. Initialize it to EaLength */
38 IntEaLength
= EaLength
;
39 /* Initialize EaBuffer to EaBuffer */
40 EaBufferEnd
= EaBuffer
;
42 /* The rest length of the buffer */
43 /* 8 = sizeof(ULONG) + sizeof(UCHAR) + sizeof(UCHAR) + sizeof(USHORT) */
44 while (IntEaLength
>= 8)
46 /* The rest of the buffer must be greater than sizeof(FILE_FULL_EA_INFORMATION) + buffer */
47 NextEaBufferOffset
= EaBufferEnd
->EaNameLength
+EaBufferEnd
->EaValueLength
+ 9;
48 if (IntEaLength
>= NextEaBufferOffset
)
50 /* is the EaBufferName terminated with zero? */
51 if (EaBufferEnd
->EaName
[EaBufferEnd
->EaNameLength
]==0)
53 /* more EaBuffers ahead */
54 if (EaBufferEnd
->NextEntryOffset
== 0)
56 /* test the rest buffersize */
57 IntEaLength
= IntEaLength
- NextEaBufferOffset
;
60 return STATUS_SUCCESS
;
66 From MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx).
67 For all entries except the last, the value of NextEntryOffset must be greater
68 than zero and must fall on a ULONG boundary.
70 NextEaBufferOffset
= ((NextEaBufferOffset
+ 3) & 0xFFFFFFFC);
71 if ((EaBufferEnd
->NextEntryOffset
== NextEaBufferOffset
) && (EaBufferEnd
->NextEntryOffset
>0))
73 /* The rest of the buffer must be greater than the next offset */
74 IntEaLength
= IntEaLength
- EaBufferEnd
->NextEntryOffset
;
77 EaBufferEnd
= (PFILE_FULL_EA_INFORMATION
)((ULONG_PTR
)EaBufferEnd
+ EaBufferEnd
->NextEntryOffset
);
87 if (ErrorOffset
!= NULL
)
89 /* calculate the error offset. */
90 *ErrorOffset
= (ULONG
)((ULONG_PTR
)EaBufferEnd
- (ULONG_PTR
)EaBuffer
);
93 return STATUS_EA_LIST_INCONSISTENT
;
100 void CheckROSAgainstWinAndPrintResult(PFILE_FULL_EA_INFORMATION WinEaBuffer
,PFILE_FULL_EA_INFORMATION ROSEaBuffer
,NTSTATUS WinStatus
,NTSTATUS ROSStatus
,ULONG WinErrorOffset
,ULONG ROSErrorOffset
,int iBufferLength
,int iTestCount
,ULONG TestEaLength
)
102 printf("Subtest:%i Status:%x EaErrorOffset:%x TestEaLength:%i passed - ",iTestCount
,WinStatus
,WinErrorOffset
,TestEaLength
);
103 if (memcmp(WinEaBuffer
,ROSEaBuffer
,iBufferLength
)==0)
105 if (WinStatus
== ROSStatus
)
107 if (WinErrorOffset
== ROSErrorOffset
)
114 printf("*failed*\n");
117 typedef NTSTATUS (*NTAPI pIoCheckEaBufferValidity
) (IN PFILE_FULL_EA_INFORMATION EaBuffer
,IN ULONG EaLength
,OUT PULONG ErrorOffset
);
119 typedef PVOID (*NTAPI pMmPageEntireDriver
) (IN PVOID AddressWithinSection
);
121 #define RANDOM_INIT_ERROR 0xDEADBAD0
122 #define TEST_BUFFER_LEN 256
124 int _tmain(int argc
, _TCHAR
* argv
[])
127 pIoCheckEaBufferValidity IoCheckEaBufferValidity
;
129 HMODULE hKrnlMod
= LoadLibrary(L
"ntoskrnl.exe");
132 pFunction
= GetProcAddress(hKrnlMod
,"IoCheckEaBufferValidity");
133 IoCheckEaBufferValidity
= (pIoCheckEaBufferValidity
)pFunction
;
134 if (IoCheckEaBufferValidity
!=NULL
)
136 /* Check tes Windows Function */
141 PFILE_FULL_EA_INFORMATION WinEaBuffer
;
142 PFILE_FULL_EA_INFORMATION ROSEaBuffer
;
143 char szTest
[100] = "FltMgr";
146 UCHAR TestEaBufferFlags
;
149 TestEaBufferFlags
= 0;
152 WinEaBuffer
= (PFILE_FULL_EA_INFORMATION
)malloc(TEST_BUFFER_LEN
);
153 ROSEaBuffer
= (PFILE_FULL_EA_INFORMATION
)malloc(TEST_BUFFER_LEN
);
156 printf("1.) Test : *********************\n");
158 /* Check EaLength calculation */
159 /* Here all zero : only i>9 pass the test with STATUS_SUCCESS */
161 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
165 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
166 ulWinError
= RANDOM_INIT_ERROR
;
167 WinEaBuffer
->Flags
= TestEaBufferFlags
;
168 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
171 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
172 ulROSError
= RANDOM_INIT_ERROR
;
173 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
174 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
176 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
180 printf("2.) Test : *********************\n");
182 /* Here all zero but EaBuffer::EaName is set : will always end in STATUS_EA_LIST_INCONSISTENT */
183 /* There must a link to EaBuffer::EaName */
184 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
188 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
189 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
190 ulWinError
= RANDOM_INIT_ERROR
;
191 WinEaBuffer
->Flags
= TestEaBufferFlags
;
192 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
195 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
196 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
197 ulROSError
= RANDOM_INIT_ERROR
;
198 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
200 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
204 printf("3.) Test : *********************\n");
206 /* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is count up. EaLength is maxbuffer: STATUS_SUCCESS when EaBuffer::EaNameLength>strlen(EaBuffer::EaName) */
207 TestEaLength
= TEST_BUFFER_LEN
;
208 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
212 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
213 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
214 WinEaBuffer
->EaNameLength
= i
;
215 ulWinError
= RANDOM_INIT_ERROR
;
216 WinEaBuffer
->Flags
= TestEaBufferFlags
;
217 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
220 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
221 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
222 ROSEaBuffer
->EaNameLength
= i
;
223 ulROSError
= RANDOM_INIT_ERROR
;
224 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
225 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
227 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
231 printf("4.) Test : *********************\n");
233 /* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is strlen(EaBuffer::EaName). EaLength is count: STATUS_SUCCESS when EaLength>=17 (EaBuffer::EaNameLength+9) */
234 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
238 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
239 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
240 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
241 ulWinError
= RANDOM_INIT_ERROR
;
242 WinEaBuffer
->Flags
= TestEaBufferFlags
;
243 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
246 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
247 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
248 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
249 ulROSError
= RANDOM_INIT_ERROR
;
250 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
251 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
253 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
257 printf("5.) Test : *********************\n");
259 /* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is strlen(EaBuffer::EaName) EaBuffer::EaValueLength is strlen(EaBuffer::EaName)+1. EaLength is count: STATUS_SUCCESS when EaLength>=26 (EaBuffer::EaNameLength+EaBuffer::EaValueLength+9) */
260 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
264 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
265 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
266 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
267 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)+1;
268 ulWinError
= RANDOM_INIT_ERROR
;
269 WinEaBuffer
->Flags
= TestEaBufferFlags
;
270 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
273 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
274 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
275 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
276 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)+1;
277 ulROSError
= RANDOM_INIT_ERROR
;
278 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
279 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
281 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
286 printf("6.) Test : *********************\n");
288 /* The same test like 5.) but more data in the buffer*/
289 /* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is strlen(EaBuffer::EaName) EaBuffer::EaValueLength is strlen(EaBuffer::EaName)+1. EaLength is count: STATUS_SUCCESS when EaLength>=26 (EaBuffer::EaNameLength+EaBuffer::EaValueLength+9) */
291 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
295 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
296 sprintf(WinEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
297 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
298 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
299 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)+1;
300 ulWinError
= RANDOM_INIT_ERROR
;
301 WinEaBuffer
->Flags
= TestEaBufferFlags
;
302 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
305 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
306 sprintf(ROSEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
307 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
308 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
309 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)+1;
310 ulROSError
= RANDOM_INIT_ERROR
;
311 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
312 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
314 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
318 printf("7.) Test : *********************\n");
320 /* The same test like 6.) but wrong strlen */
321 /* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is strlen(EaBuffer::EaName) EaBuffer::EaValueLength is strlen(EaBuffer::EaName)+1. EaLength is count: will always end in STATUS_EA_LIST_INCONSISTENT */
322 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
326 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
327 sprintf(WinEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
328 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
329 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)-1;
330 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)+2;
331 ulWinError
= RANDOM_INIT_ERROR
;
332 WinEaBuffer
->Flags
= TestEaBufferFlags
;
333 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
336 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
337 sprintf(ROSEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
338 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
339 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)-1;
340 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)+2;
341 ulROSError
= RANDOM_INIT_ERROR
;
342 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
343 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
345 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
350 printf("8.) Test : *********************\n");
352 /* Here WinEaBuffer->NextEntryOffset test : STATUS_SUCCESS when NextEntryOffset=0 else STATUS_EA_LIST_INCONSISTENT when NextEntryOffset = 28 = 8+8+9 ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC then ErrorOffset 28 */
353 /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/
354 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
356 TestEaLength
= TEST_BUFFER_LEN
;
358 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
359 sprintf(WinEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
360 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
361 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
362 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
363 ulWinError
= RANDOM_INIT_ERROR
;
364 WinEaBuffer
->Flags
= TestEaBufferFlags
;
365 WinEaBuffer
->NextEntryOffset
= i
;
366 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
369 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
370 sprintf(ROSEaBuffer
->EaName
,"%x%x%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
371 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
372 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
373 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
374 ulROSError
= RANDOM_INIT_ERROR
;
375 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
376 ROSEaBuffer
->NextEntryOffset
= i
;
377 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
379 printf("%i-",ROSEaBuffer
->NextEntryOffset
);
380 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
384 printf("9.) Test : *********************\n");
386 /* Here WinEaBuffer->NextEntryOffset test wrong strlen: STATUS_SUCCESS NextEntryOffset=0 & NextEntryOffset = 28 = 8+8+9 ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC */
387 /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/
388 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
390 TestEaLength
= TEST_BUFFER_LEN
;
392 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
393 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
395 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)-1;
396 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
397 ulWinError
= RANDOM_INIT_ERROR
;
398 WinEaBuffer
->Flags
= TestEaBufferFlags
;
399 WinEaBuffer
->NextEntryOffset
= i
;
400 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
403 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
404 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
406 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)-1;
407 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
408 ulROSError
= RANDOM_INIT_ERROR
;
409 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
410 ROSEaBuffer
->NextEntryOffset
= i
;
411 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
413 printf("%i-",ROSEaBuffer
->NextEntryOffset
);
414 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
418 printf("10.) Test : *********************\n");
420 /* Here WinEaBuffer->NextEntryOffset test wrong strlen: STATUS_SUCCESS NextEntryOffset=0 & NextEntryOffset = 28 = 8+8+9 ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC */
421 /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/
422 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
424 TestEaLength
= TEST_BUFFER_LEN
;
426 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
427 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
429 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)+1;
430 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
)+1;
431 ulWinError
= RANDOM_INIT_ERROR
;
432 WinEaBuffer
->Flags
= TestEaBufferFlags
;
433 WinEaBuffer
->NextEntryOffset
= i
;
434 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
437 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
438 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
);
440 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)+1;
441 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
)+1;
442 ulROSError
= RANDOM_INIT_ERROR
;
443 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
444 ROSEaBuffer
->NextEntryOffset
= i
;
445 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
447 printf("%i-",ROSEaBuffer
->NextEntryOffset
);
448 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
452 printf("11.) Test : *********************\n");
454 /* Here WinEaBuffer->NextEntryOffset : */
455 for (i
=0;i
<TEST_BUFFER_LEN
;i
++)
457 TestEaLength
= TEST_BUFFER_LEN
;
459 memset(WinEaBuffer
,0,TEST_BUFFER_LEN
);
460 sprintf(WinEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
462 WinEaBuffer
->EaNameLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
463 WinEaBuffer
->EaValueLength
= (UCHAR
)strlen(WinEaBuffer
->EaName
);
464 ulWinError
= RANDOM_INIT_ERROR
;
465 WinEaBuffer
->Flags
= TestEaBufferFlags
;
466 WinEaBuffer
->NextEntryOffset
= ((WinEaBuffer
->EaNameLength
+WinEaBuffer
->EaNameLength
+9)+3)&0xFFFFFFFC;
467 WinStatus
= IoCheckEaBufferValidity(WinEaBuffer
,TestEaLength
,&ulWinError
);
470 memset(ROSEaBuffer
,0,TEST_BUFFER_LEN
);
471 sprintf(ROSEaBuffer
->EaName
,"%x",RANDOM_INIT_ERROR
,RANDOM_INIT_ERROR
);
473 ROSEaBuffer
->EaNameLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
474 ROSEaBuffer
->EaValueLength
= (UCHAR
)strlen(ROSEaBuffer
->EaName
);
475 ulROSError
= RANDOM_INIT_ERROR
;
476 ROSEaBuffer
->Flags
= TestEaBufferFlags
;
477 ROSEaBuffer
->NextEntryOffset
= ((ROSEaBuffer
->EaNameLength
+ROSEaBuffer
->EaNameLength
+9)+3)&0xFFFFFFFC;
478 ROSStatus
= IoCheckEaBufferValidityROS(ROSEaBuffer
,TestEaLength
,&ulROSError
);
480 printf("%i-",ROSEaBuffer
->NextEntryOffset
);
481 CheckROSAgainstWinAndPrintResult(WinEaBuffer
,ROSEaBuffer
,WinStatus
,ROSStatus
,ulWinError
,ulWinError
,TEST_BUFFER_LEN
,iTestCount
,TestEaLength
);
490 FreeLibrary(hKrnlMod
);
494 DWORD dwLastError
= GetLastError();
497 case ERROR_MOD_NOT_FOUND
:
498 printf("ERROR_MOD_NOT_FOUND\n");
500 case ERROR_BAD_EXE_FORMAT
:
501 printf("ERROR_BAD_EXE_FORMAT\n");