mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.1 KiB
229 lines
6.1 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// 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 );
|
|
|
|
}
|