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.
 
 
 
 
 
 

129 lines
2.9 KiB

/*++
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.