NT4/private/newsam/server/rundown.c

151 lines
3.6 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
rundown.c
Abstract:
This file contains context handle rundown services
related to the SAM server RPC interface package..
Author:
Jim Kelly (JimK) 4-July-1991
Environment:
User Mode - Win32
Revision History:
--*/
///////////////////////////////////////////////////////////////////////////////
// //
// Includes //
// //
///////////////////////////////////////////////////////////////////////////////
#include <samsrvp.h>
///////////////////////////////////////////////////////////////////////////////
// //
// private service prototypes //
// //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// Routines //
// //
///////////////////////////////////////////////////////////////////////////////
void
SAMPR_HANDLE_rundown(
IN SAMPR_HANDLE SamHandle
)
/*++
Routine Description:
This service is called if a binding breaks when a context_handle is
still active.
Note that the RPC runtime will eliminate any race condition caused
by an outstanding call to the server with this context handle that
might cause the handle to become invalid before the rundown routine
is called.
Arguments:
SamHandle - The context handle value whose context must be rundown.
Note that as far as RPC is concerned, this handle is no longer
valid at the time the rundown call is made.
Return Value:
None.
--*/
{
NTSTATUS NtStatus;
PSAMP_OBJECT Context;
SAMP_OBJECT_TYPE FoundType;
Context = (PSAMP_OBJECT)(SamHandle);
SampAcquireReadLock();
//
// Lookup the context block
//
NtStatus = SampLookupContext(
Context, // Context
0L, // DesiredAccess
SampUnknownObjectType, // ExpectedType
&FoundType // FoundType
);
if (NT_SUCCESS(NtStatus)) {
// TEMPORARY
//DbgPrint("Rundown of ");
//if (FoundType == SampServerObjectType) DbgPrint("Server ");
//if (FoundType == SampDomainObjectType) DbgPrint("Domain ");
//if (FoundType == SampGroupObjectType) DbgPrint("Group ");
//if (FoundType == SampUserObjectType) DbgPrint("User ");
//DbgPrint("context.\n");
//DbgPrint(" Handle Value is: 0x%lx\n", Context );
//if (Context->ReferenceCount != 2) {
//DbgPrint(" REFERENCE COUNT is: 0x%lx\n", Context->ReferenceCount);
//}
// TEMPORARY
//
// Delete this context...
//
SampDeleteContext( Context );
//
// And drop our reference from the lookup operation
//
SampDeReferenceContext( Context, FALSE);
}
SampReleaseReadLock();
return;
}