windows-nt/Source/XPSP1/NT/net/nwlink/nb/event.c

127 lines
2.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1989-1993 Microsoft Corporation
Module Name:
event.c
Abstract:
This module contains code which performs the following TDI services:
o TdiSetEventHandler
Environment:
Kernel mode
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
PVOID TdiDefaultHandlers[6] = {
TdiDefaultConnectHandler,
TdiDefaultDisconnectHandler,
TdiDefaultErrorHandler,
TdiDefaultReceiveHandler,
TdiDefaultRcvDatagramHandler,
TdiDefaultRcvExpeditedHandler
};
NTSTATUS
NbiTdiSetEventHandler(
IN PDEVICE Device,
IN PREQUEST Request
)
/*++
Routine Description:
This routine performs the TdiSetEventHandler request for the
transport provider. The caller (request dispatcher) verifies
that this routine will not be executed on behalf of a user-mode
client, as this request enables direct callouts at DISPATCH_LEVEL.
Arguments:
Device - The netbios device object.
Request - Pointer to the request.
Return Value:
NTSTATUS - status of operation.
--*/
{
NTSTATUS Status;
CTELockHandle LockHandle;
PTDI_REQUEST_KERNEL_SET_EVENT Parameters;
PADDRESS_FILE AddressFile;
UINT EventType;
UNREFERENCED_PARAMETER (Device);
//
// Check that the file type is valid
//
if (REQUEST_OPEN_TYPE(Request) != (PVOID)TDI_TRANSPORT_ADDRESS_FILE)
{
CTEAssert(FALSE);
return (STATUS_INVALID_ADDRESS_COMPONENT);
}
//
// Get the Address this is associated with; if there is none, get out.
//
AddressFile = REQUEST_OPEN_CONTEXT(Request);
#if defined(_PNP_POWER)
Status = NbiVerifyAddressFile (AddressFile, CONFLICT_IS_OK);
#else
Status = NbiVerifyAddressFile (AddressFile);
#endif _PNP_POWER
if (!NT_SUCCESS (Status)) {
return Status;
}
NB_GET_LOCK (&AddressFile->Address->Lock, &LockHandle);
Parameters = (PTDI_REQUEST_KERNEL_SET_EVENT)REQUEST_PARAMETERS(Request);
EventType = (UINT)(Parameters->EventType);
if (Parameters->EventType > TDI_EVENT_RECEIVE_EXPEDITED) {
Status = STATUS_INVALID_PARAMETER;
} else {
if (Parameters->EventHandler == NULL) {
AddressFile->RegisteredHandler[EventType] = FALSE;
AddressFile->Handlers[EventType] = TdiDefaultHandlers[EventType];
AddressFile->HandlerContexts[EventType] = NULL;
} else {
AddressFile->Handlers[EventType] = Parameters->EventHandler;
AddressFile->HandlerContexts[EventType] = Parameters->EventContext;
AddressFile->RegisteredHandler[EventType] = TRUE;
}
}
NB_FREE_LOCK (&AddressFile->Address->Lock, LockHandle);
NbiDereferenceAddressFile (AddressFile, AFREF_VERIFY);
return Status;
} /* NbiTdiSetEventHandler */