168 lines
4 KiB
C
168 lines
4 KiB
C
//+----------------------------------------------------------------------------
|
||
//
|
||
// 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);
|
||
}
|
||
|
||
|
||
|