Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508// IoEaTest.cpp : Defines the entry point for the console application.//
#include "stdafx.h"
#include <stdio.h>#include <windows.h>
typedef struct _FILE_FULL_EA_INFORMATION { ULONG NextEntryOffset; UCHAR Flags; UCHAR EaNameLength; USHORT EaValueLength; CHAR EaName[1];} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
#define ULONG_PTR unsigned char*
#define NTSTATUS unsigned int
#define STATUS_EA_LIST_INCONSISTENT 0x80000014L#define STATUS_SUCCESS 0x00000000L
/* * @implemented */NTSTATUSNTAPIIoCheckEaBufferValidityROS(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset){ PFILE_FULL_EA_INFORMATION EaBufferEnd; ULONG NextEaBufferOffset; UINT IntEaLength;
/* Length of the rest. Initialize it to EaLength */ IntEaLength = EaLength; /* Initialize EaBuffer to EaBuffer */ EaBufferEnd = EaBuffer;
/* The rest length of the buffer */ /* 8 = sizeof(ULONG) + sizeof(UCHAR) + sizeof(UCHAR) + sizeof(USHORT) */ while (IntEaLength >= 8) { /* The rest of the buffer must be greater than sizeof(FILE_FULL_EA_INFORMATION) + buffer */ NextEaBufferOffset = EaBufferEnd->EaNameLength+EaBufferEnd->EaValueLength + 9; if (IntEaLength >= NextEaBufferOffset) { /* is the EaBufferName terminated with zero? */ if (EaBufferEnd->EaName[EaBufferEnd->EaNameLength]==0) { /* more EaBuffers ahead */ if (EaBufferEnd->NextEntryOffset == 0) { /* test the rest buffersize */ IntEaLength = IntEaLength - NextEaBufferOffset; if (IntEaLength>=0) { return STATUS_SUCCESS; } } else { /* From MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx (DEAD_LINK)). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary. */ NextEaBufferOffset = ((NextEaBufferOffset + 3) & 0xFFFFFFFC); if ((EaBufferEnd->NextEntryOffset == NextEaBufferOffset) && (EaBufferEnd->NextEntryOffset>0)) { /* The rest of the buffer must be greater than the next offset */ IntEaLength = IntEaLength - EaBufferEnd->NextEntryOffset; if (IntEaLength>=0) { EaBufferEnd = (PFILE_FULL_EA_INFORMATION)((ULONG_PTR)EaBufferEnd + EaBufferEnd->NextEntryOffset); continue; } } } } } break; }
if (ErrorOffset != NULL) { /* calculate the error offset. */ *ErrorOffset = (ULONG)((ULONG_PTR)EaBufferEnd - (ULONG_PTR)EaBuffer); }
return STATUS_EA_LIST_INCONSISTENT;}
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){ printf("Subtest:%i Status:%x EaErrorOffset:%x TestEaLength:%i passed - ",iTestCount,WinStatus,WinErrorOffset,TestEaLength); if (memcmp(WinEaBuffer,ROSEaBuffer,iBufferLength)==0) { if (WinStatus == ROSStatus) { if (WinErrorOffset == ROSErrorOffset) { printf("okay\n"); return; } } } printf("*failed*\n");}
typedef NTSTATUS (*NTAPI pIoCheckEaBufferValidity) (IN PFILE_FULL_EA_INFORMATION EaBuffer,IN ULONG EaLength,OUT PULONG ErrorOffset);
typedef PVOID (*NTAPI pMmPageEntireDriver) (IN PVOID AddressWithinSection);
#define RANDOM_INIT_ERROR 0xDEADBAD0#define TEST_BUFFER_LEN 256
int _tmain(int argc, _TCHAR* argv[]){ void *pFunction; pIoCheckEaBufferValidity IoCheckEaBufferValidity;
HMODULE hKrnlMod = LoadLibrary(L"ntoskrnl.exe"); if (hKrnlMod) { pFunction = GetProcAddress(hKrnlMod,"IoCheckEaBufferValidity"); IoCheckEaBufferValidity = (pIoCheckEaBufferValidity)pFunction; if (IoCheckEaBufferValidity!=NULL) { /* Check tes Windows Function */ ULONG ulWinError; ULONG ulROSError; NTSTATUS WinStatus; NTSTATUS ROSStatus; PFILE_FULL_EA_INFORMATION WinEaBuffer; PFILE_FULL_EA_INFORMATION ROSEaBuffer; char szTest[100] = "FltMgr"; int iTestCount,i; ULONG TestEaLength; UCHAR TestEaBufferFlags;
// Test the flag TestEaBufferFlags = 0;
iTestCount = 1; WinEaBuffer = (PFILE_FULL_EA_INFORMATION)malloc(TEST_BUFFER_LEN); ROSEaBuffer = (PFILE_FULL_EA_INFORMATION)malloc(TEST_BUFFER_LEN);
printf("1.) Test : *********************\n");
/* Check EaLength calculation */ /* Here all zero : only i>9 pass the test with STATUS_SUCCESS */
for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("2.) Test : *********************\n");
/* Here all zero but EaBuffer::EaName is set : will always end in STATUS_EA_LIST_INCONSISTENT */ /* There must a link to EaBuffer::EaName */ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ulROSError = RANDOM_INIT_ERROR; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("3.) Test : *********************\n");
/* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is count up. EaLength is maxbuffer: STATUS_SUCCESS when EaBuffer::EaNameLength>strlen(EaBuffer::EaName) */ TestEaLength = TEST_BUFFER_LEN; for (i=0;i<TEST_BUFFER_LEN;i++) {
// Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = i; ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = i; ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("4.) Test : *********************\n");
/* Here EaBuffer::EaName is set and EaBuffer::EaNameLength is strlen(EaBuffer::EaName). EaLength is count: STATUS_SUCCESS when EaLength>=17 (EaBuffer::EaNameLength+9) */ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName); ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("5.) Test : *********************\n");
/* 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) */ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName); WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName)+1; ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName); ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName)+1; ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("6.) Test : *********************\n");
/* The same test like 5.) but more data in the buffer*/ /* 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) */
for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName); WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName)+1; ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName); ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName)+1; ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("7.) Test : *********************\n");
/* The same test like 6.) but wrong strlen */ /* 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 */ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = i; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName)-1; WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName)+2; ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName)-1; ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName)+2; ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("8.) Test : *********************\n");
/* 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 */ /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx (DEAD_LINK)). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = TEST_BUFFER_LEN; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName); WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinEaBuffer->NextEntryOffset = i; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x%x%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR,RANDOM_INIT_ERROR); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR); ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName); ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName); ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSEaBuffer->NextEntryOffset = i; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
printf("%i-",ROSEaBuffer->NextEntryOffset); CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("9.) Test : *********************\n");
/* Here WinEaBuffer->NextEntryOffset test wrong strlen: STATUS_SUCCESS NextEntryOffset=0 & NextEntryOffset = 28 = 8+8+9 ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC */ /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx (DEAD_LINK)). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = TEST_BUFFER_LEN; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR);
WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName)-1; WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinEaBuffer->NextEntryOffset = i; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR);
ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName)-1; ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName); ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSEaBuffer->NextEntryOffset = i; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
printf("%i-",ROSEaBuffer->NextEntryOffset); CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("10.) Test : *********************\n");
/* Here WinEaBuffer->NextEntryOffset test wrong strlen: STATUS_SUCCESS NextEntryOffset=0 & NextEntryOffset = 28 = 8+8+9 ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC */ /* From the MSDN (http://msdn2.microsoft.com/en-us/library/ms795740.aspx (DEAD_LINK)). For all entries except the last, the value of NextEntryOffset must be greater than zero and must fall on a ULONG boundary.*/ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = TEST_BUFFER_LEN; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR);
WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName)+1; WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName)+1; ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinEaBuffer->NextEntryOffset = i; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR);
ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName)+1; ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName)+1; ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSEaBuffer->NextEntryOffset = i; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
printf("%i-",ROSEaBuffer->NextEntryOffset); CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
printf("11.) Test : *********************\n");
/* Here WinEaBuffer->NextEntryOffset : */ for (i=0;i<TEST_BUFFER_LEN;i++) { TestEaLength = TEST_BUFFER_LEN; // Windows memset(WinEaBuffer,0,TEST_BUFFER_LEN); sprintf(WinEaBuffer->EaName,"%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR);
WinEaBuffer->EaNameLength = (UCHAR)strlen(WinEaBuffer->EaName); WinEaBuffer->EaValueLength = (UCHAR)strlen(WinEaBuffer->EaName); ulWinError = RANDOM_INIT_ERROR; WinEaBuffer->Flags = TestEaBufferFlags; WinEaBuffer->NextEntryOffset = ((WinEaBuffer->EaNameLength+WinEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC; WinStatus = IoCheckEaBufferValidity(WinEaBuffer,TestEaLength,&ulWinError);
// ROS memset(ROSEaBuffer,0,TEST_BUFFER_LEN); sprintf(ROSEaBuffer->EaName,"%x",RANDOM_INIT_ERROR,RANDOM_INIT_ERROR);
ROSEaBuffer->EaNameLength = (UCHAR)strlen(ROSEaBuffer->EaName); ROSEaBuffer->EaValueLength = (UCHAR)strlen(ROSEaBuffer->EaName); ulROSError = RANDOM_INIT_ERROR; ROSEaBuffer->Flags = TestEaBufferFlags; ROSEaBuffer->NextEntryOffset = ((ROSEaBuffer->EaNameLength+ROSEaBuffer->EaNameLength+9)+3)&0xFFFFFFFC; ROSStatus = IoCheckEaBufferValidityROS(ROSEaBuffer,TestEaLength,&ulROSError);
printf("%i-",ROSEaBuffer->NextEntryOffset); CheckROSAgainstWinAndPrintResult(WinEaBuffer,ROSEaBuffer,WinStatus,ROSStatus,ulWinError,ulWinError,TEST_BUFFER_LEN,iTestCount,TestEaLength); iTestCount++; }
free(WinEaBuffer); free(ROSEaBuffer); }
FreeLibrary(hKrnlMod); } else { DWORD dwLastError = GetLastError(); switch (dwLastError) { case ERROR_MOD_NOT_FOUND: printf("ERROR_MOD_NOT_FOUND\n"); break; case ERROR_BAD_EXE_FORMAT: printf("ERROR_BAD_EXE_FORMAT\n"); break; } } return 0;}