[ros-diffs] [fireball] 28506: Daniel Zimmerman <netzimme at aim.com>: - Implement IoCheckEaBufferValidity()

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Aug 24 09:55:15 CEST 2007


Author: fireball
Date: Fri Aug 24 11:55:14 2007
New Revision: 28506

URL: http://svn.reactos.org/svn/reactos?rev=28506&view=rev
Log:
Daniel Zimmerman <netzimme at aim.com>:
- Implement IoCheckEaBufferValidity()

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/file.c
    trunk/reactos/ntoskrnl/io/iomgr/util.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/file.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/file.c?rev=28506&r1=28505&r2=28506&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/file.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/file.c Fri Aug 24 11:55:14 2007
@@ -1637,6 +1637,8 @@
     PVOID SystemEaBuffer = NULL;
     NTSTATUS Status = STATUS_SUCCESS;
     OPEN_PACKET OpenPacket;
+    ULONG EaErrorOffset;
+
     PAGED_CODE();
     IOTRACE(IO_FILE_DEBUG, "FileName: %wZ\n", ObjectAttributes->ObjectName);
 
@@ -1732,10 +1734,11 @@
             /* 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);
             }
         }
     }

Modified: trunk/reactos/ntoskrnl/io/iomgr/util.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/util.c?rev=28506&r1=28505&r2=28506&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/util.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/util.c Fri Aug 24 11:55:14 2007
@@ -130,7 +130,7 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
@@ -138,8 +138,77 @@
                         IN ULONG EaLength,
                         OUT PULONG ErrorOffset)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PFILE_FULL_EA_INFORMATION EaBufferEnd;
+    ULONG NextEaBufferOffset, IntEaLength;
+
+    /* Lenght of the rest. Inital equal to EaLength */
+    IntEaLength = EaLength;
+
+    /* Inital EaBuffer equal to EaBuffer */
+    EaBufferEnd = EaBuffer;
+
+    /* The rest length of the buffer */
+    while (IntEaLength >= FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName[0]))
+    {
+        /* rest of buffer must greater then the
+           sizeof(FILE_FULL_EA_INFORMATION) + buffer */
+        NextEaBufferOffset =
+            EaBufferEnd->EaNameLength + EaBufferEnd->EaValueLength +
+            FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName[0]) + 1;
+
+        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) & ~3);
+                    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 */
+        *ErrorOffset = (ULONG)((ULONG_PTR)EaBufferEnd - (ULONG_PTR)EaBuffer);
+    }
+
+    return STATUS_EA_LIST_INCONSISTENT;
 }
 
 /*




More information about the Ros-diffs mailing list