windows-nt/Source/XPSP1/NT/base/fs/rdr2/bowser/fsddisp.c

256 lines
5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
fsddisp.c
Abstract:
This module implements the FSD dispatching routines for the NT datagram
browser (the Bowser).
Author:
Larry Osterman (larryo) 6-May-1991
Revision History:
6-May-1991 larryo
Created
--*/
#include "precomp.h"
#pragma hdrstop
//KSPIN_LOCK
//BowserRefcountInterlock = {0};
NTSTATUS
BowserStopBrowser(
IN PTRANSPORT Transport,
IN PVOID Context
);
NTSTATUS
BowserCancelRequestsOnTransport(
IN PTRANSPORT Transport,
IN PVOID Context
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, BowserFsdCreate)
#pragma alloc_text(PAGE, BowserFsdClose)
#pragma alloc_text(PAGE, BowserFsdCleanup)
#pragma alloc_text(PAGE, BowserCancelRequestsOnTransport)
#pragma alloc_text(PAGE, BowserStopBrowser)
#pragma alloc_text(INIT, BowserInitializeFsd)
#endif
NTSTATUS
BowserFsdCreate (
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This routine processes an NtCreateFile of the NT Bowser device driver.
Arguments:
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject - Supplies a device object for the request.
IN PIRP Irp - Supplies an IRP for the create request.
Return Value:
NTSTATUS - Final Status of operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE();
InterlockedIncrement(&BowserNumberOfOpenFiles);
BowserCompleteRequest(Irp, Status);
return Status;
UNREFERENCED_PARAMETER(DeviceObject);
}
NTSTATUS
BowserFsdClose (
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This routine is called when the last reference to a handle to the NT Bowser
device driver is removed.
Arguments:
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject - Supplies a device object for the request.
IN PIRP Irp - Supplies an IRP for the create request.
Return Value:
NTSTATUS - Final Status of operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE();
BowserCompleteRequest(Irp, Status);
return Status;
UNREFERENCED_PARAMETER(DeviceObject);
}
NTSTATUS
BowserFsdCleanup (
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This routine is called when the last handle to the NT Bowser device
driver is closed.
Arguments:
IN PBOWSER_FS_DEVICE_OBJECT DeviceObject - Supplies a device object for the request.
IN PIRP Irp - Supplies an IRP for the create request.
Return Value:
NTSTATUS - Final Status of operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE();
FsRtlEnterFileSystem();
BowserForEachTransport(BowserCancelRequestsOnTransport, Irp->Tail.Overlay.OriginalFileObject);
if (InterlockedDecrement(&BowserNumberOfOpenFiles) == 0) {
//
// There are no longer any handles open to the browser.
//
// Make sure we aren't a browser on any of our networks now.
//
BowserForEachTransport(BowserStopBrowser, NULL);
}
FsRtlExitFileSystem();
BowserCompleteRequest(Irp, Status);
return Status;
UNREFERENCED_PARAMETER(DeviceObject);
}
NTSTATUS
BowserCancelRequestsOnTransport(
IN PTRANSPORT Transport,
IN PVOID Context
)
{
PFILE_OBJECT FileObject = Context;
PAGED_CODE();
BowserCancelQueuedIoForFile(&Transport->BecomeBackupQueue, FileObject);
BowserCancelQueuedIoForFile(&Transport->BecomeMasterQueue, FileObject);
BowserCancelQueuedIoForFile(&Transport->FindMasterQueue, FileObject);
BowserCancelQueuedIoForFile(&Transport->WaitForMasterAnnounceQueue, FileObject);
BowserCancelQueuedIoForFile(&Transport->ChangeRoleQueue, FileObject);
BowserCancelQueuedIoForFile(&Transport->WaitForNewMasterNameQueue, FileObject);
return STATUS_SUCCESS;
}
NTSTATUS
BowserStopBrowser(
IN PTRANSPORT Transport,
IN PVOID Context
)
{
PPAGED_TRANSPORT PagedTransport = Transport->PagedTransport;
PAGED_CODE();
LOCK_TRANSPORT(Transport);
//
// Make sure that we cannot possibly participate in an election.
//
PagedTransport->Role = None;
PagedTransport->ServiceStatus &= ~(SV_TYPE_BACKUP_BROWSER | SV_TYPE_MASTER_BROWSER | SV_TYPE_POTENTIAL_BROWSER);
BowserForEachTransportName(Transport, BowserStopProcessingAnnouncements, NULL);
BowserStopTimer(&Transport->ElectionTimer);
BowserStopTimer(&Transport->FindMasterTimer);
UNLOCK_TRANSPORT(Transport);
//
// Delete the names associated with being a browser.
//
BowserDeleteTransportNameByName(Transport,
NULL,
MasterBrowser);
BowserDeleteTransportNameByName(Transport,
NULL,
DomainAnnouncement);
BowserDeleteTransportNameByName(Transport,
NULL,
BrowserElection);
return(STATUS_SUCCESS);
}
VOID
BowserInitializeFsd(
VOID
)
{
// KeInitializeSpinLock(&BowserRefcountInterlock);
}