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/filter... ============================================================================== --- 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/filter... ============================================================================== --- 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