mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
Daniel Zimmerman <netzimme@aim.com>:
- Test app for IoCheckEaBufferValidity() implementation (not included into the build system yet). svn path=/trunk/; revision=28507
This commit is contained in:
parent
262a6322c1
commit
e1bf65e84c
1 changed files with 507 additions and 0 deletions
507
rostests/drivers/ntoskrnl/IoEaTest.cpp
Normal file
507
rostests/drivers/ntoskrnl/IoEaTest.cpp
Normal file
|
@ -0,0 +1,507 @@
|
|||
// 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
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IoCheckEaBufferValidityROS(IN PFILE_FULL_EA_INFORMATION EaBuffer,
|
||||
IN ULONG EaLength,
|
||||
OUT PULONG ErrorOffset)
|
||||
{
|
||||
PFILE_FULL_EA_INFORMATION EaBufferEnd;
|
||||
ULONG NextEaBufferOffset;
|
||||
UINT IntEaLength;
|
||||
|
||||
/* Lenght of the rest. Inital equal to EaLength */
|
||||
IntEaLength = EaLength;
|
||||
/* Inital EaBuffer equal to EaBuffer */
|
||||
EaBufferEnd = EaBuffer;
|
||||
|
||||
/* The rest length of the buffer */
|
||||
/* 8 = sizeof(ULONG) + sizeof(UCHAR) + sizeof(UCHAR) + sizeof(USHORT) */
|
||||
while (IntEaLength >= 8)
|
||||
{
|
||||
/* rest of buffer must greater then the 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 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.
|
||||
*/
|
||||
NextEaBufferOffset = ((NextEaBufferOffset + 3) & 0xFFFFFFFC);
|
||||
if ((EaBufferEnd->NextEntryOffset == NextEaBufferOffset) && (EaBufferEnd->NextEntryOffset>0))
|
||||
{
|
||||
/* rest of buffer must be greater then 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. Or in */
|
||||
*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 allways 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 allways 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). 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). 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). 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;
|
||||
}
|
||||
|
Loading…
Reference in a new issue