Author: pschweitzer
Date: Sat Feb  4 22:01:12 2012
New Revision: 55422

URL: http://svn.reactos.org/svn/reactos?rev=55422&view=rev
Log:
[MOUNTMGR]
Implement DeleteRemoteDatabaseEntry

Modified:
    branches/usb-bringup-trunk/drivers/filters/mountmgr/database.c
    branches/usb-bringup-trunk/drivers/filters/mountmgr/mountmgr.c

Modified: branches/usb-bringup-trunk/drivers/filters/mountmgr/database.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/filters/mountmgr/database.c?rev=55422&r1=55421&r2=55422&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/filters/mountmgr/database.c [iso-8859-1] 
(original)
+++ branches/usb-bringup-trunk/drivers/filters/mountmgr/database.c [iso-8859-1] 
Sat Feb  4 22:01:12 2012
@@ -194,11 +194,92 @@
     return Entry;
 }
 
+/*
+ * @implemented
+ */
 NTSTATUS
 DeleteRemoteDatabaseEntry(IN HANDLE Database,
                           IN LONG StartingOffset)
 {
-    return STATUS_NOT_IMPLEMENTED;
+    LONG EndSize;
+    PVOID TmpBuffer;
+    NTSTATUS Status;
+    LONG DatabaseSize;
+    PDATABASE_ENTRY Entry;
+    IO_STATUS_BLOCK IoStatusBlock;
+    LARGE_INTEGER EndEntriesOffset;
+
+    /* First, get database size */
+    DatabaseSize = GetRemoteDatabaseSize(Database);
+    if (!DatabaseSize)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Then, get the entry to remove */
+    Entry = GetRemoteDatabaseEntry(Database, StartingOffset);
+    if (!Entry)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Validate parameters: ensure we won't get negative size */
+    if (Entry->EntrySize + StartingOffset > DatabaseSize)
+    {
+        /* If we get invalid parameters, truncate the whole database
+         * starting the wrong entry. We can't rely on the rest
+         */
+        FreePool(Entry);
+        return TruncateRemoteDatabase(Database, StartingOffset);
+    }
+
+    /* Now, get the size of the remaining entries (those after the one to 
remove) */
+    EndSize = DatabaseSize - Entry->EntrySize - StartingOffset;
+    /* Allocate a buffer big enough to hold them */
+    TmpBuffer = AllocatePool(EndSize);
+    if (!TmpBuffer)
+    {
+        FreePool(Entry);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* Get the offset of the entry right after the one to delete */
+    EndEntriesOffset.QuadPart = Entry->EntrySize + StartingOffset;
+    /* We don't need the entry any more */
+    FreePool(Entry);
+
+    /* Read the ending entries */
+    Status = ZwReadFile(Database, NULL, NULL, NULL, &IoStatusBlock,
+                        TmpBuffer, EndSize, &EndEntriesOffset, NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        FreePool(TmpBuffer);
+        return Status;
+    }
+
+    /* Ensure nothing went wrong - we don't want to corrupt the DB */
+    if (IoStatusBlock.Information != EndSize)
+    {
+        FreePool(TmpBuffer);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Remove the entry */
+    Status = TruncateRemoteDatabase(Database, StartingOffset + EndSize);
+    if (!NT_SUCCESS(Status))
+    {
+        FreePool(TmpBuffer);
+        return Status;
+    }
+
+    /* Now, shift the ending entries to erase the entry */
+    EndEntriesOffset.QuadPart = StartingOffset;
+    Status = ZwWriteFile(Database, NULL, NULL, NULL, &IoStatusBlock,
+                         TmpBuffer, EndSize, &EndEntriesOffset, NULL);
+
+    FreePool(TmpBuffer);
+
+    return Status;
 }
 
 /*

Modified: branches/usb-bringup-trunk/drivers/filters/mountmgr/mountmgr.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/filters/mountmgr/mountmgr.c?rev=55422&r1=55421&r2=55422&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/filters/mountmgr/mountmgr.c [iso-8859-1] 
(original)
+++ branches/usb-bringup-trunk/drivers/filters/mountmgr/mountmgr.c [iso-8859-1] 
Sat Feb  4 22:01:12 2012
@@ -41,7 +41,6 @@
 
 /*
  * TODO:
- * - DeleteRemoteDatabaseEntry
  * - MountMgrQueryDosVolumePath
  * - MountMgrQueryDosVolumePaths
  * - MountMgrQueryVolumePaths


Reply via email to