-; $Id: ntdll.edf,v 1.69 2001/11/03 16:48:06 chorns Exp $
+; $Id: ntdll.edf,v 1.70 2001/11/21 22:31:18 ekohl Exp $
;
; ReactOS Operating System
;
RtlImageNtHeader=RtlImageNtHeader@4
RtlImageRvaToSection=RtlImageRvaToSection@12
RtlImageRvaToVa=RtlImageRvaToVa@16
-;RtlImpersonateSelf
+RtlImpersonateSelf=RtlImpersonateSelf@4
RtlInitAnsiString=RtlInitAnsiString@8
;RtlInitCodePageTable
;RtlInitNlsTables
-# $Id: makefile,v 1.67 2001/11/03 16:48:05 chorns Exp $
+# $Id: makefile,v 1.68 2001/11/21 22:30:57 ekohl Exp $
PATH_TO_TOP = ../..
rtl/access.o rtl/apc.o rtl/callback.o rtl/luid.o rtl/misc.o \
rtl/registry.o rtl/exception.o rtl/intrlck.o rtl/resource.o \
rtl/handle.o rtl/atom.o rtl/message.o rtl/timezone.o \
- rtl/propvar.o
+ rtl/propvar.o rtl/security.o
STDIO_OBJECTS = stdio/sprintf.o stdio/swprintf.o
--- /dev/null
+/* $Id: security.c,v 1.4 2001/11/21 22:30:45 ekohl Exp $
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: lib/ntdll/rtl/security.c
+ * PURPOSE: Miscellaneous securitiy related functions
+ * PROGRAMMER: Eric Kohl
+ * UPDATE HISTORY:
+ * 21/11/2001 Created
+ */
+
+#include <ddk/ntddk.h>
+#include <ntdll/rtl.h>
+
+
+NTSTATUS STDCALL
+RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ SECURITY_QUALITY_OF_SERVICE SecQos;
+ HANDLE ProcessToken;
+ HANDLE ImpersonationToken;
+ NTSTATUS Status;
+
+ Status = NtOpenProcessToken(NtCurrentProcess(),
+ TOKEN_DUPLICATE,
+ &ProcessToken);
+ if (!NT_SUCCESS(Status))
+ return(Status);
+
+ SecQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
+ SecQos.ImpersonationLevel = ImpersonationLevel;
+ SecQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
+ SecQos.EffectiveOnly = FALSE;
+
+ ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
+ ObjectAttributes.RootDirectory = 0;
+ ObjectAttributes.ObjectName = NULL;
+ ObjectAttributes.Attributes = 0;
+ ObjectAttributes.SecurityDescriptor = NULL;
+ ObjectAttributes.SecurityQualityOfService = &SecQos;
+
+ Status = NtDuplicateToken(ProcessToken,
+ TOKEN_IMPERSONATE,
+ &ObjectAttributes,
+ NULL,
+ TokenImpersonation,
+ &ImpersonationToken);
+ if (!NT_SUCCESS(Status))
+ {
+ NtClose(ProcessToken);
+ return(Status);
+ }
+
+ Status = NtSetInformationThread(NtCurrentThread(),
+ ThreadImpersonationToken,
+ &ImpersonationToken,
+ sizeof(HANDLE));
+ NtClose(ImpersonationToken);
+ NtClose(ProcessToken);
+
+ return(Status);
+}
+
+/* EOF */