Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
security.c
Abstract:
This code handles impersonating and reverting for the user mode reflector library. This implements UMReflectorImpersonate and UMReflectorRevert.
Author:
Andy Herron (andyhe) 20-Apr-1999
Environment:
User Mode - Win32
Revision History:
--*/ #include "precomp.h"
#pragma hdrstop
ULONG UMReflectorImpersonate( PUMRX_USERMODE_WORKITEM_HEADER IncomingWorkItem, HANDLE ImpersonationToken ) /*++
Routine Description:
This routine impersonates the calling thread.
Arguments:
IncomingWorkItem - The workitem being handled by the thread. ImpersonationToken - The handle used to impersonate.
Return Value:
ERROR_SUCCESS or the appropriate error value.
--*/ { PUMRX_USERMODE_WORKITEM_ADDON workItem = NULL; ULONG rc = STATUS_SUCCESS; BOOL ReturnVal;
if (IncomingWorkItem == NULL || ImpersonationToken == NULL) { rc = ERROR_INVALID_PARAMETER; return rc; }
//
// We get back to our item by subtracting off of the item passed to us.
// This is safe because we fully control allocation.
//
workItem = (PUMRX_USERMODE_WORKITEM_ADDON)(PCHAR)((PCHAR) IncomingWorkItem - FIELD_OFFSET(UMRX_USERMODE_WORKITEM_ADDON, Header));
ASSERT(workItem->WorkItemState != WorkItemStateFree); ASSERT(workItem->WorkItemState != WorkItemStateAvailable);
ReturnVal = ImpersonateLoggedOnUser(ImpersonationToken); if (!ReturnVal) { rc = GetLastError(); RlDavDbgPrint(("%ld: ERROR: UMReflectorImpersonate/ImpersonateLoggedOnUser: " "WStatus = %08lx.\n", GetCurrentThreadId(), rc)); }
return rc; }
ULONG UMReflectorRevert( PUMRX_USERMODE_WORKITEM_HEADER IncomingWorkItem ) /*++
Routine Description:
This routine reverts the calling thread which was impersonated earlier.
Arguments:
IncomingWorkItem - The workitem being handled by the thread. Return Value:
ERROR_SUCCESS or the appropriate error value.
--*/ { PUMRX_USERMODE_WORKITEM_ADDON workItem = NULL; ULONG rc = STATUS_SUCCESS; BOOL ReturnVal;
if (IncomingWorkItem == NULL) { rc = ERROR_INVALID_PARAMETER; return rc; }
//
// We get back to our item by subtracting off of the item passed to us.
// This is safe because we fully control allocation.
//
workItem = (PUMRX_USERMODE_WORKITEM_ADDON)(PCHAR)((PCHAR) IncomingWorkItem - FIELD_OFFSET(UMRX_USERMODE_WORKITEM_ADDON, Header));
ReturnVal = RevertToSelf(); if (!ReturnVal) { rc = GetLastError(); RlDavDbgPrint(("%ld: ERROR: UMReflectorRevert/RevertToSelf: " "WStatus = %08lx.\n", GetCurrentThreadId(), rc)); }
return rc; }
// security.c eof.
|