256 lines
5 KiB
C
256 lines
5 KiB
C
|
/*++
|
|||
|
|
|||
|
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);
|
|||
|
}
|