windows-nt/Source/XPSP1/NT/net/winnet/resinfo.cxx
2020-09-26 16:20:57 +08:00

295 lines
6.4 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
resinfo.cxx
Abstract:
Contains the entry points for the WinNet Resource Info API supported
by the Multi-Provider Router. The following functions are in this file:
WNetGetResourceInformationW
WNetGetResourceParentW
Author:
Anirudh Sahni (anirudhs) 27-Apr-1995
Environment:
User Mode -Win32
Notes:
Revision History:
27-Apr-1995 anirudhs
Created
16-Oct-1995 anirudhs
Converted to use MPR base classes
05-May-1999 jschwart
Make provider addition/removal dynamic
--*/
//
// INCLUDES
//
#include "precomp.hxx"
//===================================================================
// WNetGetResourceInformationW
//===================================================================
class CGetResourceInformation : public CRoutedOperation
{
public:
CGetResourceInformation(
LPNETRESOURCEW lpNetResource,
LPVOID lpBuffer,
LPDWORD lpBufferSize,
LPWSTR *lplpSystem
) :
CRoutedOperation(DBGPARM("GetResourceInformation")
PROVIDERFUNC(GetResourceInformation)),
_lpNetResource(lpNetResource),
_lpBuffer (lpBuffer),
_lpBufferSize (lpBufferSize),
_lplpSystem (lplpSystem)
{ }
private:
LPNETRESOURCEW _lpNetResource;
LPVOID _lpBuffer;
LPDWORD _lpBufferSize;
LPWSTR * _lplpSystem;
DECLARE_CROUTED
};
DWORD
CGetResourceInformation::ValidateRoutedParameters(
LPCWSTR * ppProviderName,
LPCWSTR * ppRemoteName,
LPCWSTR * ppLocalName
)
{
if (!(ARGUMENT_PRESENT(_lpNetResource) &&
ARGUMENT_PRESENT(_lpBufferSize) &&
ARGUMENT_PRESENT(_lplpSystem)))
{
return WN_BAD_POINTER;
}
if (_lpNetResource->lpRemoteName == NULL)
{
return WN_BAD_NETNAME;
}
//
// If there is an output buffer, probe it.
//
if (IS_BAD_BYTE_BUFFER(_lpBuffer, _lpBufferSize))
{
return WN_BAD_POINTER;
}
*_lplpSystem = NULL;
//
// Set parameters used by base class.
//
*ppProviderName = _lpNetResource->lpProvider;
*ppRemoteName = _lpNetResource->lpRemoteName;
*ppLocalName = NULL;
return WN_SUCCESS;
}
DWORD
CGetResourceInformation::TestProvider(
const PROVIDER * pProvider
)
{
ASSERT_INITIALIZED(NETWORK);
return ( pProvider->GetResourceInformation(
_lpNetResource,
_lpBuffer,
_lpBufferSize,
_lplpSystem) );
}
DWORD
WNetGetResourceInformationW(
LPNETRESOURCEW lpNetResource,
LPVOID lpBuffer,
LPDWORD lpBufferSize,
LPWSTR *lplpSystem
)
/*++
Routine Description:
This API is used to find enumeration information for a resource (whose
name is typically typed in by the user).
Arguments:
lpNetResource -
lpBuffer -
lpBufferSize -
lplpSystem -
Return Value:
WN_SUCCESS - Indicates the operation was successful.
Other errors -
--*/
{
CGetResourceInformation GetResInfo(lpNetResource,
lpBuffer,
lpBufferSize,
lplpSystem);
return (GetResInfo.Perform(TRUE));
}
//===================================================================
// WNetGetResourceParentW
//===================================================================
class CGetResourceParent : public CRoutedOperation
{
public:
CGetResourceParent(
LPNETRESOURCEW lpNetResource,
LPVOID lpBuffer,
LPDWORD lpBufferSize
) :
CRoutedOperation(DBGPARM("GetResourceParent")
PROVIDERFUNC(GetResourceParent)),
_lpNetResource(lpNetResource),
_lpBuffer (lpBuffer),
_lpBufferSize (lpBufferSize)
{ }
private:
LPNETRESOURCEW _lpNetResource;
LPVOID _lpBuffer;
LPDWORD _lpBufferSize;
DECLARE_CROUTED
};
DWORD
CGetResourceParent::ValidateRoutedParameters(
LPCWSTR * ppProviderName,
LPCWSTR * ppRemoteName,
LPCWSTR * ppLocalName
)
{
if (!(ARGUMENT_PRESENT(_lpNetResource) &&
ARGUMENT_PRESENT(_lpBufferSize)))
{
return WN_BAD_POINTER;
}
if (_lpNetResource->lpRemoteName == NULL)
{
return WN_BAD_NETNAME;
}
//
// Unlike Win95, we require a provider name. This allows our providers
// to make several simplifying assumptions.
//
if (IS_EMPTY_STRING(_lpNetResource->lpProvider))
{
return WN_BAD_PROVIDER;
}
//
// If there is an output buffer, probe it.
//
if (IS_BAD_BYTE_BUFFER(_lpBuffer, _lpBufferSize))
{
return WN_BAD_POINTER;
}
//
// Set parameters used by base class.
//
*ppProviderName = _lpNetResource->lpProvider;
*ppRemoteName = _lpNetResource->lpRemoteName;
*ppLocalName = NULL;
return WN_SUCCESS;
}
DWORD
CGetResourceParent::TestProvider(
const PROVIDER * pProvider
)
{
ASSERT_INITIALIZED(NETWORK);
return ( pProvider->GetResourceParent(
_lpNetResource,
_lpBuffer,
_lpBufferSize) );
}
DWORD
WNetGetResourceParentW(
LPNETRESOURCEW lpNetResource,
LPVOID lpBuffer,
LPDWORD lpBufferSize
)
/*++
Routine Description:
This API is used to find enumeration information for a resource (whose
name is typically typed in by the user).
Arguments:
lpNetResource -
lpBuffer -
lpBufferSize -
Return Value:
WN_SUCCESS - Indicates the operation was successful.
Other errors -
--*/
{
CGetResourceParent GetResParent(lpNetResource, lpBuffer, lpBufferSize);
return (GetResParent.Perform(TRUE));
}