209 lines
5.5 KiB
C
209 lines
5.5 KiB
C
//+----------------------------------------------------------------------------
|
||
//
|
||
// Copyright (C) 1992, Microsoft Corporation
|
||
//
|
||
// File: lvolinit.c
|
||
//
|
||
// Contents: Routines to initialize Local volumes
|
||
//
|
||
// Classes:
|
||
//
|
||
// Functions:
|
||
//
|
||
// History: April 27, 1994 Milans Created
|
||
//
|
||
//-----------------------------------------------------------------------------
|
||
|
||
|
||
#include "dfsprocs.h"
|
||
#include "regkeys.h"
|
||
#include "registry.h"
|
||
#include "lvolinit.h"
|
||
|
||
|
||
#define Dbg DEBUG_TRACE_INIT
|
||
|
||
NTSTATUS
|
||
GetRegVolumes(
|
||
OUT PULONG pcLocalVols,
|
||
OUT APWSTR *pawstr
|
||
);
|
||
|
||
|
||
//+----------------------------------------------------------------------------
|
||
//
|
||
// Function: DfsInitLocalPartitions
|
||
//
|
||
// Synopsis: Initializes the local volumes that are shared in the Dfs
|
||
// name space by reading the list of shared folders from the
|
||
// registry and creating the appropriate Pkt Entries for them.
|
||
//
|
||
// Arguments: None
|
||
//
|
||
// Returns: Nothing
|
||
//
|
||
//-----------------------------------------------------------------------------
|
||
|
||
VOID
|
||
DfsInitLocalPartitions()
|
||
{
|
||
NTSTATUS status = STATUS_SUCCESS;
|
||
ULONG cLocalVols;
|
||
APWSTR awstrLocalVols = NULL;
|
||
PDFS_PKT pkt;
|
||
ULONG i;
|
||
BOOLEAN fErrorsFound = FALSE;
|
||
|
||
DebugTrace(+1, Dbg, "DfsInitLocalPartitions: Entered\n", 0);
|
||
|
||
//
|
||
// Initializing the local volumes might cause some of the underlying
|
||
// storage volumes to get mounted. We need to set the LvState to
|
||
// prevent a deadlock in DfsReattachToMountedVolume. It is important
|
||
// that we set the LvState before we acquire the Pkt and after we
|
||
// release it.
|
||
//
|
||
|
||
ExAcquireResourceExclusiveLite( &DfsData.Resource, TRUE );
|
||
|
||
DfsData.LvState = LV_INITINPROGRESS;
|
||
|
||
ExReleaseResourceLite( &DfsData.Resource );
|
||
|
||
pkt = _GetPkt();
|
||
|
||
status = GetRegVolumes(&cLocalVols, &awstrLocalVols);
|
||
|
||
if (!NT_SUCCESS(status)) {
|
||
DebugTrace(-1, Dbg, "DfsInitLocalPartitions: Unable to get volume list %08lx\n", ULongToPtr( status ));
|
||
return;
|
||
}
|
||
|
||
DebugTrace(0, Dbg, "Retrieved %d local volumes\n", ULongToPtr( cLocalVols ));
|
||
|
||
if (cLocalVols == 0) {
|
||
DebugTrace(-1, Dbg, "DfsInitLocalPartitions: No local volumes!\n", 0);
|
||
DfsData.LvState = LV_INITIALIZED;
|
||
if (awstrLocalVols != NULL) {
|
||
KRegFreeArray(cLocalVols, (APBYTE) awstrLocalVols);
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
//
|
||
// Now we acquire the Pkt and for every volume attempt to initialize
|
||
// any partitions we may find.
|
||
//
|
||
|
||
PktAcquireExclusive(pkt, TRUE);
|
||
|
||
for (i = 0; i < cLocalVols; i++) {
|
||
|
||
DFS_LOCAL_VOLUME_CONFIG ConfigInfo;
|
||
UNICODE_STRING ustrStorageId;
|
||
|
||
DebugTrace(0, Dbg, "Reading info for [%ws]\n", awstrLocalVols[i]);
|
||
RtlZeroMemory(&ConfigInfo, sizeof(DFS_LOCAL_VOLUME_CONFIG));
|
||
RtlZeroMemory(&ustrStorageId, sizeof(UNICODE_STRING));
|
||
|
||
//
|
||
// Retrieve the local volume config info from the registry.
|
||
//
|
||
|
||
status = DfsGetLvolInfo(awstrLocalVols[i], &ConfigInfo, &ustrStorageId);
|
||
|
||
if (!NT_SUCCESS(status)) {
|
||
DebugTrace(0, Dbg, "Error %08lx getting info from registry!\n", ULongToPtr( status ));
|
||
continue;
|
||
}
|
||
|
||
//
|
||
// Ok, we have a valid local volume config structure so we need to go
|
||
// and ask the Pkt to initialize the local partition.
|
||
//
|
||
|
||
status = PktInitializeLocalPartition(pkt, &ustrStorageId, &ConfigInfo);
|
||
|
||
fErrorsFound = (BOOLEAN) (!NT_SUCCESS(status)) || fErrorsFound;
|
||
|
||
DebugTrace(0, Dbg, "PktInitializeLocalPartition status %08lx\n", ULongToPtr( status ));
|
||
|
||
//
|
||
// Get rid of the memory used by the ConfigInfo structures.
|
||
//
|
||
|
||
if (ustrStorageId.Buffer != NULL)
|
||
ExFreePool(ustrStorageId.Buffer);
|
||
if (ConfigInfo.StgId.Buffer != NULL)
|
||
ExFreePool(ConfigInfo.StgId.Buffer);
|
||
if (ConfigInfo.Share.Buffer != NULL)
|
||
ExFreePool(ConfigInfo.Share.Buffer);
|
||
PktRelationInfoDestroy(&ConfigInfo.RelationInfo, FALSE );
|
||
|
||
}
|
||
|
||
//
|
||
// Done. Release locks, cleanup, and vamoose.
|
||
//
|
||
|
||
if (awstrLocalVols != NULL) {
|
||
KRegFreeArray(cLocalVols, (APBYTE) awstrLocalVols);
|
||
}
|
||
|
||
PktRelease(pkt);
|
||
|
||
ExAcquireResourceExclusiveLite( &DfsData.Resource, TRUE );
|
||
|
||
DfsData.LvState = (fErrorsFound ? LV_UNINITIALIZED : LV_INITIALIZED);
|
||
|
||
ExReleaseResourceLite( &DfsData.Resource );
|
||
|
||
DebugTrace(-1, Dbg, "DfsInitLocalPartitions: Exited %08lx\n", ULongToPtr( status ));
|
||
}
|
||
|
||
|
||
//+----------------------------------------------------------------------------
|
||
//
|
||
// Function: GetRegVolumes
|
||
//
|
||
// Synopsis: Read the local volume list from the
|
||
// Registry\Machine\System\CurrentControlSet\Dfs\Localvolumes
|
||
// section of the registry.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: STATUS_SUCCESS or reason for failure.
|
||
//
|
||
//-----------------------------------------------------------------------------
|
||
|
||
NTSTATUS
|
||
GetRegVolumes(
|
||
OUT PULONG pcLocalVols,
|
||
OUT APWSTR *pawstr
|
||
)
|
||
{
|
||
NTSTATUS Status;
|
||
PWSTR wszMachineRoot = NULL;
|
||
|
||
Status = KRegSetRoot( wszLocalVolumesSection );
|
||
if (!NT_SUCCESS(Status)) {
|
||
DebugTrace(0, Dbg, "GetRegVolumes: Error opening registry %08lx\n", ULongToPtr( Status ));
|
||
return(Status);
|
||
}
|
||
|
||
Status = KRegEnumSubKeySet(
|
||
L"",
|
||
pcLocalVols,
|
||
pawstr);
|
||
|
||
|
||
KRegCloseRoot();
|
||
|
||
DebugTrace(0, Dbg, "GetRegVolumes: Returning %08lx\n", ULongToPtr( Status ));
|
||
|
||
return(Status);
|
||
|
||
}
|
||
|