windows-nt/Source/XPSP1/NT/base/fs/dfs/driver/provider.c

168 lines
4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+----------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation
//
// File: provider.c
//
// Contents: Module to initialize DFS driver providers.
//
// Classes:
//
// Functions: ProviderInit()
//
// History: 12 Sep 1992 Milans created.
// 05 Apr 1993 Milans moved into driver.
//
//-----------------------------------------------------------------------------
#include "dfsprocs.h"
#include "registry.h"
#include "regkeys.h"
#include "provider.h"
#define MAX_ENTRY_PATH 80 // Max. length of entry path
#define Dbg DEBUG_TRACE_INIT
#define prov_debug_out(x, y) DebugTrace(0, Dbg, x, y)
#ifdef ALLOC_PRAGMA
#pragma alloc_text( INIT, ProviderInit )
#endif // ALLOC_PRAGMA
//+----------------------------------------------------------------------------
//
// Function: ProviderInit
//
// Synopsis: Initializes the provider list with
// - Local File service provider
// - Standard remote Cairo provider
// - Downlevel LanMan provider.
//
// Arguments: None
//
// Returns: STATUS_SUCCESS
//
//-----------------------------------------------------------------------------
NTSTATUS
ProviderInit(void)
{
NTSTATUS Status;
ULONG i, cProviders;
APWSTR awszProviders; // array of provider names
PBYTE pData;
ULONG ProviderId, Capabilities;
UNICODE_STRING ustrProviderName;
Status = KRegSetRoot(wszRegRootDFS);
if (!NT_SUCCESS(Status)) {
prov_debug_out("ProviderInit: Error %08lx opening Registry!\n", Status);
return(Status);
}
//
// Get all the Provider subkeys.
//
Status = KRegEnumSubKeySet(wszProviderKey, &cProviders, &awszProviders);
if (!NT_SUCCESS(Status)) {
prov_debug_out("ProviderInit: Error %08lx reading Providers!\n", Status);
KRegCloseRoot();
return(Status);
}
//
// Get the parameters for each provider and define the provider
//
for (i = 0; i < cProviders; i++) {
//
// Get the Provider ID
//
Status = KRegGetValue(awszProviders[i], wszProviderId, &pData);
if (NT_SUCCESS(Status)) {
ProviderId = *((ULONG *)pData);
DfsFree(pData);
} else {
prov_debug_out( "Error reading Provider Id for %ws\n", awszProviders[i]);
continue;
}
//
// Get the Provider Caps
//
Status = KRegGetValue(awszProviders[i], wszCapabilities, &pData);
if (NT_SUCCESS(Status)) {
Capabilities = *((ULONG *)pData);
DfsFree(pData);
} else {
prov_debug_out("Error reading Capabilities for %ws\n", awszProviders[i]);
continue;
}
//
// Get the DeviceName
//
Status = KRegGetValue(awszProviders[i], wszDeviceName, &pData);
if (NT_SUCCESS(Status)) {
RtlInitUnicodeString(&ustrProviderName, (PWSTR) pData);
prov_debug_out("Defining %ws provider.\n", awszProviders[i]);
prov_debug_out("\tTarget = %wZ\n", &ustrProviderName);
Status = DfsInsertProvider(
&ustrProviderName,
Capabilities,
ProviderId);
if (!NT_SUCCESS(Status)) {
DfsFree(pData);
}
} else {
//
// Device name is "optional"
//
prov_debug_out("Defining %ws provider.\n", awszProviders[i]);
prov_debug_out("\tNo Target\n", 0);
RtlInitUnicodeString(&ustrProviderName, NULL);
Status = DfsInsertProvider(
&ustrProviderName,
Capabilities,
ProviderId);
}
//
// See if provider definition went ok
//
if (!NT_SUCCESS(Status)) {
prov_debug_out("Definition of %ws provider failed!\n", awszProviders[i]);
prov_debug_out("Error = %08lx\n", Status);
}
}
KRegCloseRoot();
KRegFreeArray(cProviders, (APBYTE) awszProviders);
return(STATUS_SUCCESS);
}