Hello
Have wrote a test program for IoCheckEaBufferValidity that i used to investigate the function. I attached the file and patch with comments and the right coding style (i hope). Perhaps there is a better place to put it but i don't see a special mailing list to put this contents (new function). More information on this function on http://msdn2.microsoft.com/en-us/library/ms795740.aspx The only different to the Win-version is when the parameter PULONG ErrorOffset = NULL and the result is not STATUS_OK Win will bug check. I think this i not really good.
Thank Daniel Zimmermann
-----Original Message----- From: aleksey@reactos.org To: ros-dev@reactos.org Sent: Tue, 21 Aug 2007 9:47 AM Subject: Re: [ros-dev] IoCheckEaBufferValidity
Hello, please provide your real name (this is a must for every commit), and also how to test it under Windows (maybe you wrote some test app for this - it would be useful too).
WBR, Aleksey Bragin.
On Aug 21, 2007, at 3:39 AM, netzimme@aim.com wrote:
Hallo
Have a patch that implemented the function IoCheckEaBufferValidity in ntoskrnl\io\iomgr\util.c. Tested with Windows 2000 and Vista Ultimate 64 Bit. Perhaps some one can comit it for me.
Thanks dz
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev
________________________________________________________________________ Check Out the new free AIM(R) Mail -- 2 GB of storage and industry-leading spam and email virus protection.
=================================================================== --- file.c (revision 28447) +++ file.c (working copy) @@ -1632,6 +1632,7 @@ IN ULONG Options) { KPROCESSOR_MODE AccessMode; + ULONG EaErrorOffset; HANDLE LocalHandle = 0; LARGE_INTEGER SafeAllocationSize; PVOID SystemEaBuffer = NULL; @@ -1732,10 +1733,10 @@ /* Validate the buffer */ Status = IoCheckEaBufferValidity(SystemEaBuffer, EaLength, - NULL); + &EaErrorOffset); if (!NT_SUCCESS(Status)) { - /* FIXME: Fail once function is implemented */ + DPRINT1("FIXME: IoCheckEaBufferValidity failed with Status: %lx\n",Status); } } } Index: util.c =================================================================== --- util.c (revision 28447) +++ util.c (working copy) @@ -129,19 +129,80 @@ return STATUS_SUCCESS; }
+ /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI -IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer, - IN ULONG EaLength, - OUT PULONG ErrorOffset) +IoCheckEaBufferValidityROS(IN PFILE_FULL_EA_INFORMATION EaBuffer, + IN ULONG EaLength, + OUT PULONG ErrorOffset) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + 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; }
+ /* * @unimplemented */