Author: ekohl Date: Sun Nov 25 19:47:54 2012 New Revision: 57769
URL: http://svn.reactos.org/svn/reactos?rev=57769&view=rev Log: [LSASRV] - Implement LsarDeleteObject. - Store the object name in the database object in order to be able to delete the objects key later.
Modified: trunk/reactos/dll/win32/lsasrv/database.c trunk/reactos/dll/win32/lsasrv/lsarpc.c trunk/reactos/dll/win32/lsasrv/lsasrv.h
Modified: trunk/reactos/dll/win32/lsasrv/database.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/database.c... ============================================================================== --- trunk/reactos/dll/win32/lsasrv/database.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/lsasrv/database.c [iso-8859-1] Sun Nov 25 19:47:54 2012 @@ -796,7 +796,7 @@
NewObject = RtlAllocateHeap(RtlGetProcessHeap(), 0, - sizeof(LSA_DB_OBJECT)); + sizeof(LSA_DB_OBJECT) + wcslen(ObjectName) + sizeof(WCHAR)); if (NewObject == NULL) { NtClose(ObjectKeyHandle); @@ -809,6 +809,7 @@ NewObject->Access = DesiredAccess; NewObject->KeyHandle = ObjectKeyHandle; NewObject->ParentObject = ParentObject; + wcscpy(NewObject->Name, ObjectName);
if (ParentObject != NULL) ParentObject->RefCount++; @@ -880,6 +881,69 @@
if (DbObject->ParentObject != NULL) ParentObject = DbObject->ParentObject; + + RtlFreeHeap(RtlGetProcessHeap(), 0, DbObject); + + if (ParentObject != NULL) + { + ParentObject->RefCount--; + + if (ParentObject->RefCount == 0) + Status = LsapCloseDbObject(ParentObject); + } + + return Status; +} + + +NTSTATUS +LsapDeleteDbObject(IN PLSA_DB_OBJECT DbObject) +{ + PLSA_DB_OBJECT ParentObject = NULL; + WCHAR KeyName[64]; + ULONG EnumIndex; + + NTSTATUS Status = STATUS_SUCCESS; + + DbObject->RefCount--; + + if (DbObject->RefCount > 0) + return STATUS_SUCCESS; + + if (DbObject->KeyHandle != NULL) + { + EnumIndex = 0; + + while (TRUE) + { + Status = LsapRegEnumerateSubKey(DbObject->KeyHandle, + EnumIndex, + 64 * sizeof(WCHAR), + KeyName); + if (!NT_SUCCESS(Status)) + break; + + TRACE("EnumIndex: %lu\n", EnumIndex); + TRACE("Key name: %S\n", KeyName); + + Status = LsapRegDeleteKey(DbObject->KeyHandle, + KeyName); + if (!NT_SUCCESS(Status)) + break; + +// EnumIndex++; + } + + NtClose(DbObject->KeyHandle); + } + + if (DbObject->ParentObject != NULL) + { + ParentObject = DbObject->ParentObject; + + LsapRegDeleteKey(ParentObject->KeyHandle, + DbObject->Name); + }
RtlFreeHeap(RtlGetProcessHeap(), 0, DbObject);
Modified: trunk/reactos/dll/win32/lsasrv/lsarpc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/lsarpc.c?r... ============================================================================== --- trunk/reactos/dll/win32/lsasrv/lsarpc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/lsasrv/lsarpc.c [iso-8859-1] Sun Nov 25 19:47:54 2012 @@ -1968,8 +1968,41 @@ NTSTATUS WINAPI LsarDeleteObject( LSAPR_HANDLE *ObjectHandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PLSA_DB_OBJECT DbObject; + NTSTATUS Status; + + TRACE("(%p)\n", ObjectHandle); + + if (ObjectHandle == NULL) + return STATUS_INVALID_PARAMETER; + + /* Validate the ObjectHandle */ + Status = LsapValidateDbObject(*ObjectHandle, + LsaDbIgnoreObject, + DELETE, + &DbObject); + if (!NT_SUCCESS(Status)) + { + ERR("LsapValidateDbObject returned 0x%08lx\n", Status); + return Status; + } + + /* You cannot delete the policy object */ + if (DbObject->ObjectType == LsaDbPolicyObject) + return STATUS_INVALID_PARAMETER; + + /* Delete the database object */ + Status = LsapDeleteDbObject(DbObject); + if (!NT_SUCCESS(Status)) + { + ERR("LsapDeleteDbObject returned 0x%08lx\n", Status); + return Status; + } + + /* Invalidate the object handle */ + *ObjectHandle = NULL; + + return STATUS_SUCCESS; }
Modified: trunk/reactos/dll/win32/lsasrv/lsasrv.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/lsasrv/lsasrv.h?r... ============================================================================== --- trunk/reactos/dll/win32/lsasrv/lsasrv.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/lsasrv/lsasrv.h [iso-8859-1] Sun Nov 25 19:47:54 2012 @@ -48,6 +48,7 @@ ACCESS_MASK Access; HANDLE KeyHandle; struct _LSA_DB_OBJECT *ParentObject; + WCHAR Name[0]; } LSA_DB_OBJECT, *PLSA_DB_OBJECT;
#define LSAP_DB_SIGNATURE 0x12345678 @@ -105,6 +106,9 @@
NTSTATUS LsapCloseDbObject(IN PLSA_DB_OBJECT DbObject); + +NTSTATUS +LsapDeleteDbObject(IN PLSA_DB_OBJECT DbObject);
NTSTATUS LsapGetObjectAttribute(PLSA_DB_OBJECT DbObject,