windows-nt/Source/XPSP1/NT/base/fs/dfs/driver/reset.c
2020-09-26 16:20:57 +08:00

230 lines
6.1 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+----------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation
//
// File: reset.c
//
// Contents: Module to reset PKT to just-inited state
//
// History: 12 Feb 1998 JHarper created.
//
//-----------------------------------------------------------------------------
#include "dfsprocs.h"
#include "fsctrl.h"
#define Dbg DEBUG_TRACE_RESET
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, DfsFsctrlResetPkt )
#pragma alloc_text( PAGE, DfsFsctrlStopDfs )
#endif // ALLOC_PRAGMA
//+----------------------------------------------------------------------------
//
// Function: DfsFsctrlResetPkt
//
// Synopsis: Walks the Pkt, getting it back to 'just boot' state
// Used for 'unjoin' or teardown of a Dfs/FtDfs
//
// Arguments: [Irp] --
//
// Returns: STATUS_SUCCESS
//
//-----------------------------------------------------------------------------
NTSTATUS
DfsFsctrlResetPkt(
IN PIRP Irp)
{
PDFS_PKT Pkt;
NTSTATUS status;
PDFS_PKT_ENTRY curEntry;
PDFS_PKT_ENTRY nextEntry;
STD_FSCTRL_PROLOGUE("DfsFsctrlResetPkt", FALSE, FALSE);
DebugTrace(+1, Dbg, "DfsFsctrlResetPkt()\n", 0);
Pkt = _GetPkt();
PktAcquireExclusive(Pkt, TRUE);
curEntry = PktFirstEntry(Pkt);
while (curEntry != NULL) {
nextEntry = PktNextEntry(Pkt, curEntry);
PktEntryDestroy(curEntry, Pkt, (BOOLEAN) TRUE);
curEntry = nextEntry;
}
DfsFreePrefixTable(&Pkt->LocalVolTable);
DfsFreePrefixTable(&Pkt->PrefixTable);
DfsFreePrefixTable(&Pkt->ShortPrefixTable);
DfsInitializeUnicodePrefix(&Pkt->LocalVolTable);
DfsInitializeUnicodePrefix(&Pkt->PrefixTable);
DfsInitializeUnicodePrefix(&Pkt->ShortPrefixTable);
Pkt->DomainPktEntry = NULL;
status = STATUS_SUCCESS;
PktRelease(Pkt);
DebugTrace(-1, Dbg, "DfsFsctrlResetPkt - returning %08lx\n", ULongToPtr( status ));
DfsCompleteRequest(Irp, status);
return( status );
}
//+----------------------------------------------------------------------------
//
// Function: DfsFsctrlStopDfs
//
// Synopsis: Sets the state of the Dfs driver so that it will stop handling
// referral requests
//
// Arguments: [Irp] --
//
// Returns: [STATUS_SUCCESS] -- Successfully set the state to started.
//
// [STATUS_UNSUCCESSFUL] -- An error occured trying to set the
// state of Dfs to stopped.
//
//-----------------------------------------------------------------------------
NTSTATUS
DfsFsctrlStopDfs(
IN PIRP Irp)
{
NTSTATUS status;
STD_FSCTRL_PROLOGUE("DfsFsctrlStopDfs", FALSE, FALSE);
DebugTrace(-1, Dbg, "DfsFsctrlStopDfs()\n", 0);
DfsData.OperationalState = DFS_STATE_STOPPED;
DfsData.MachineState = DFS_UNKNOWN;
status = STATUS_SUCCESS;
DebugTrace(-1, Dbg, "DfsFsctrlStartDfs - returning %08lx\n", ULongToPtr( status ));
DfsCompleteRequest(Irp, status);
return( status );
}
//+----------------------------------------------------------------------------
//
// Function: DfsFsctrlMarkStalePktEntries
//
// Synopsis: Walks the Pkt, marking all entries stale
//
// Arguments: [Irp] --
//
// Returns: STATUS_SUCCESS
//
//-----------------------------------------------------------------------------
NTSTATUS
DfsFsctrlMarkStalePktEntries(
IN PIRP Irp)
{
PDFS_PKT Pkt;
NTSTATUS status;
PDFS_PKT_ENTRY curEntry;
PDFS_PKT_ENTRY nextEntry;
STD_FSCTRL_PROLOGUE("DfsFsctrlMarkStalePktEntries", FALSE, FALSE);
DebugTrace(+1, Dbg, "DfsFsctrlMarkStalePktEntries()\n", 0);
Pkt = _GetPkt();
PktAcquireExclusive(Pkt, TRUE);
curEntry = PktFirstEntry(Pkt);
while (curEntry != NULL) {
nextEntry = PktNextEntry(Pkt, curEntry);
if (curEntry->Type & PKT_ENTRY_TYPE_LOCAL_XPOINT)
curEntry->Type |= PKT_ENTRY_TYPE_STALE;
curEntry = nextEntry;
}
status = STATUS_SUCCESS;
PktRelease(Pkt);
DebugTrace(-1, Dbg, "DfsFsctrlMarkStalePktEntries - returning %08lx\n", ULongToPtr( status ));
DfsCompleteRequest(Irp, status);
return( status );
}
//+----------------------------------------------------------------------------
//
// Function: DfsFsctrlFlushStalePktEntries
//
// Synopsis: Walks the Pkt, removing all stale entries
//
// Arguments: [Irp] --
//
// Returns: STATUS_SUCCESS
//
//-----------------------------------------------------------------------------
NTSTATUS
DfsFsctrlFlushStalePktEntries(
IN PIRP Irp)
{
PDFS_PKT Pkt;
NTSTATUS status;
PDFS_PKT_ENTRY curEntry;
PDFS_PKT_ENTRY nextEntry;
DFS_PKT_ENTRY_ID Id;
STD_FSCTRL_PROLOGUE("DfsFsctrlFlushStalePktEntries", FALSE, FALSE);
DebugTrace(+1, Dbg, "DfsFsctrlFlushStalePktEntries()\n", 0);
Pkt = _GetPkt();
PktAcquireExclusive(Pkt, TRUE);
curEntry = PktFirstEntry(Pkt);
while (curEntry != NULL) {
nextEntry = PktNextEntry(Pkt, curEntry);
if (curEntry->Type & PKT_ENTRY_TYPE_STALE) {
Id = curEntry->Id;
Id.Prefix.Buffer = ExAllocatePoolWithTag(
PagedPool,
Id.Prefix.MaximumLength + Id.ShortPrefix.MaximumLength,
' sfD');
if (Id.Prefix.Buffer != NULL) {
Id.ShortPrefix.Buffer = &Id.Prefix.Buffer[Id.Prefix.MaximumLength/sizeof(WCHAR)];
RtlCopyMemory(
Id.Prefix.Buffer,
curEntry->Id.Prefix.Buffer,
Id.Prefix.MaximumLength);
RtlCopyMemory(
Id.ShortPrefix.Buffer,
curEntry->Id.ShortPrefix.Buffer,
Id.ShortPrefix.MaximumLength);
DfsInternalDeleteExitPoint(&Id, PKT_ENTRY_TYPE_CAIRO);
ExFreePool(Id.Prefix.Buffer);
}
}
curEntry = nextEntry;
}
status = STATUS_SUCCESS;
PktRelease(Pkt);
DebugTrace(-1, Dbg, "DfsFsctrlFlushStalePktEntries - returning %08lx\n", ULongToPtr( status ));
DfsCompleteRequest(Irp, status);
return( status );
}