[RTL]
[reactos.git] / reactos / lib / rtl / priv.c
index 286b2b2..2b4cadd 100644 (file)
@@ -112,7 +112,6 @@ RtlAcquirePrivilege(IN PULONG Privilege,
                     IN ULONG Flags,
                     OUT PVOID *ReturnedState)
 {
-#if 0
     PRTL_ACQUIRE_STATE State;
     NTSTATUS Status, IntStatus;
     ULONG ReturnLength, i, OldSize;
@@ -138,7 +137,7 @@ RtlAcquirePrivilege(IN PULONG Privilege,
      *                                 new privileges (big enough, after old privileges memory area)
      */
     State = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(RTL_ACQUIRE_STATE) + sizeof(TOKEN_PRIVILEGES) +
-                                                    NumPriv * sizeof(LUID_AND_ATTRIBUTES));
+                                                    (NumPriv - ANYSIZE_ARRAY) * sizeof(LUID_AND_ATTRIBUTES));
     if (!State)
     {
         return STATUS_NO_MEMORY;
@@ -247,8 +246,9 @@ RtlAcquirePrivilege(IN PULONG Privilege,
                 goto Cleanup;
             }
 
-            /* Save said token */
+            /* Save said token and the fact we have impersonated */
             State->Token = ImpersonationToken;
+            State->Flags |= RTL_ACQUIRE_PRIVILEGE_IMPERSONATE;
 
             ZwClose(ProcessToken);
         }
@@ -260,7 +260,7 @@ RtlAcquirePrivilege(IN PULONG Privilege,
      * There's NO overflow risks (OldPrivileges is always used with its size)
      */
     State->OldPrivileges = (PTOKEN_PRIVILEGES)State->OldPrivBuffer;
-    State->NewPrivileges = (PTOKEN_PRIVILEGES)(State->OldPrivBuffer + 1024);
+    State->NewPrivileges = (PTOKEN_PRIVILEGES)(State->OldPrivBuffer + (sizeof(State->OldPrivBuffer) / sizeof(State->OldPrivBuffer[0])));
 
     /* Assign all the privileges to be acquired */
     State->NewPrivileges->PrivilegeCount = NumPriv;
@@ -314,8 +314,9 @@ RtlAcquirePrivilege(IN PULONG Privilege,
         else
         {
             *ReturnedState = State;
+            break;
         }
-    } while (FALSE);
+    } while (TRUE);
 
     DPRINT("RtlAcquirePrivilege succeed!\n");
 
@@ -352,10 +353,6 @@ Cleanup:
     DPRINT("RtlAcquirePrivilege() failed with status: %lx\n", Status);
 
     return Status;
-#else
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-#endif
 }
 
 /*
@@ -365,13 +362,14 @@ VOID
 NTAPI
 RtlReleasePrivilege(IN PVOID ReturnedState)
 {
-#if 0
     NTSTATUS Status;
     PRTL_ACQUIRE_STATE State = (PRTL_ACQUIRE_STATE)ReturnedState;
 
     DPRINT("RtlReleasePrivilege(%p)\n", ReturnedState);
 
-    /* If we had an active impersonation before we acquired privileges */
+    /* If we had an active impersonation before we acquired privileges
+     * Or if we have impersonated, quit it
+     */
     if (State->Flags & RTL_ACQUIRE_PRIVILEGE_IMPERSONATE)
     {
         /* Restore it for the current thread */
@@ -404,9 +402,6 @@ RtlReleasePrivilege(IN PVOID ReturnedState)
     /* Release token and free state */
     ZwClose(State->Token);
     RtlFreeHeap(RtlGetProcessHeap(), 0, State);
-#else
-    UNIMPLEMENTED;
-#endif
 }
 
 /*