|
|
//+----------------------------------------------------------------------------
//
// 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 );
}
|