windows-nt/Source/XPSP1/NT/ds/adsi/winnt/fpnwutil.cxx
2020-09-26 16:20:57 +08:00

679 lines
15 KiB
C++
Raw 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) 1996 Microsoft Corporation
Module Name:
fpnwutil.cxx
Abstract:
Contains functions that are used by all ADS FPNW APIs
Author:
Ram Viswanathan (ramv) 14-May-1996
Environment:
User Mode -Win32
Notes:
Much of it cloned off private\windows\mpr
Revision History:
--*/
#include "winnt.hxx"
#pragma hdrstop
#define INITGUID
//
// global defines
//
#define FPNW_DLL_NAME TEXT("fpnwclnt.dll")
HMODULE vhFpnwDll = NULL;
extern HANDLE FpnwLoadLibSemaphore;
PF_NwApiBufferFree pfNwApiBufferFree = NULL;
PF_NwServerGetInfo pfNwServerGetInfo = NULL;
PF_NwServerSetInfo pfNwServerSetInfo = NULL;
PF_NwVolumeAdd pfNwVolumeAdd = NULL;
PF_NwVolumeDel pfNwVolumeDel = NULL;
PF_NwVolumeEnum pfNwVolumeEnum = NULL;
PF_NwVolumeGetInfo pfNwVolumeGetInfo = NULL;
PF_NwVolumeSetInfo pfNwVolumeSetInfo = NULL;
PF_NwConnectionEnum pfNwConnectionEnum = NULL;
PF_NwConnectionDel pfNwConnectionDel = NULL;
PF_NwFileEnum pfNwFileEnum = NULL;
//
// global functions
//
BOOL MakeSureFpnwDllIsLoaded (VOID);
DWORD FpnwEnterLoadLibCritSect (VOID);
DWORD FpnwLeaveLoadLibCritSect (VOID);
DWORD ADsNwApiBufferFree (
LPVOID pBuffer
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwApiBufferFree == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwApiBufferFree = (PF_NwApiBufferFree)
GetProcAddress(vhFpnwDll, "NwApiBufferFree");
}
// if cannot get address, return error
if (pfNwApiBufferFree == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwApiBufferFree)(pBuffer);
}
DWORD ADsNwServerGetInfo (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
OUT PNWSERVERINFO *ppServerInfo
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwServerGetInfo == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwServerGetInfo = (PF_NwServerGetInfo)
GetProcAddress(vhFpnwDll, "NwServerGetInfo");
}
// if cannot get address, return error
if (pfNwServerGetInfo == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwServerGetInfo)(pServerName,
dwLevel,
ppServerInfo);
}
DWORD ADsNwServerSetInfo (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
IN PNWSERVERINFO pServerInfo
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwServerSetInfo == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwServerSetInfo = (PF_NwServerSetInfo)
GetProcAddress(vhFpnwDll, "NwServerSetInfo");
}
// if cannot get address, return error
if (pfNwServerSetInfo == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwServerSetInfo)(pServerName,
dwLevel,
pServerInfo);
}
DWORD ADsNwVolumeAdd (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
IN PNWVOLUMEINFO pVolumeInfo
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwVolumeAdd == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwVolumeAdd = (PF_NwVolumeAdd)
GetProcAddress(vhFpnwDll, "NwVolumeAdd");
}
// if cannot get address, return error
if (pfNwVolumeAdd == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwVolumeAdd)(pServerName,
dwLevel,
pVolumeInfo);
}
DWORD ADsNwVolumeDel (
IN LPWSTR pServerName OPTIONAL,
IN LPWSTR pVolumeName
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwVolumeDel == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwVolumeDel = (PF_NwVolumeDel)
GetProcAddress(vhFpnwDll, "NwVolumeDel");
}
// if cannot get address, return error
if (pfNwVolumeDel == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwVolumeDel)(pServerName,
pVolumeName);
}
DWORD ADsNwVolumeEnum (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
OUT PNWVOLUMEINFO *ppVolumeInfo,
OUT PDWORD pEntriesRead,
IN OUT PDWORD resumeHandle OPTIONAL
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwVolumeEnum == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwVolumeEnum = (PF_NwVolumeEnum)
GetProcAddress(vhFpnwDll, "NwVolumeEnum");
}
// if cannot get address, return error
if (pfNwVolumeEnum == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwVolumeEnum)(pServerName ,
dwLevel,
ppVolumeInfo,
pEntriesRead,
resumeHandle );
}
DWORD ADsNwVolumeGetInfo (
IN LPWSTR pServerName OPTIONAL,
IN LPWSTR pVolumeName,
IN DWORD dwLevel,
OUT PNWVOLUMEINFO *ppVolumeInfo
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwVolumeGetInfo == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwVolumeGetInfo = (PF_NwVolumeGetInfo)
GetProcAddress(vhFpnwDll, "NwVolumeGetInfo");
}
// if cannot get address, return error
if (pfNwVolumeGetInfo == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwVolumeGetInfo)(pServerName ,
pVolumeName,
dwLevel,
ppVolumeInfo );
}
DWORD ADsNwVolumeSetInfo (
IN LPWSTR pServerName OPTIONAL,
IN LPWSTR pVolumeName,
IN DWORD dwLevel,
IN PNWVOLUMEINFO pVolumeInfo
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwVolumeSetInfo == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwVolumeSetInfo = (PF_NwVolumeSetInfo)
GetProcAddress(vhFpnwDll, "NwVolumeSetInfo");
}
// if cannot get address, return error
if (pfNwVolumeSetInfo == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwVolumeSetInfo)(pServerName ,
pVolumeName,
dwLevel,
pVolumeInfo );
}
DWORD ADsNwConnectionEnum (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
OUT PNWCONNECTIONINFO *ppConnectionInfo,
OUT PDWORD pEntriesRead,
IN OUT PDWORD resumeHandle OPTIONAL
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwConnectionEnum == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwConnectionEnum = (PF_NwConnectionEnum)
GetProcAddress(vhFpnwDll, "NwConnectionEnum");
}
// if cannot get address, return error
if (pfNwConnectionEnum == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwConnectionEnum)(pServerName ,
dwLevel,
ppConnectionInfo,
pEntriesRead,
resumeHandle );
}
DWORD ADsNwConnectionDel (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwConnectionId
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwConnectionDel == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwConnectionDel = (PF_NwConnectionDel)
GetProcAddress(vhFpnwDll, "NwConnectionDel");
}
// if cannot get address, return error
if (pfNwConnectionDel == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwConnectionDel)(pServerName,
dwConnectionId);
}
DWORD ADsNwFileEnum (
IN LPWSTR pServerName OPTIONAL,
IN DWORD dwLevel,
IN LPWSTR pPathName OPTIONAL,
OUT PNWFILEINFO *ppFileInfo,
OUT PDWORD pEntriesRead,
IN OUT PDWORD resumeHandle OPTIONAL
)
{
DWORD err ;
// enter critical section to for global data
err = FpnwEnterLoadLibCritSect();
if (0 != err)
{
return err;
}
// if function has not been used before, get its address.
if (pfNwFileEnum == NULL)
{
// make sure DLL Is loaded
if (!MakeSureFpnwDllIsLoaded())
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
pfNwFileEnum = (PF_NwFileEnum)
GetProcAddress(vhFpnwDll, "NwFileEnum");
}
// if cannot get address, return error
if (pfNwFileEnum == NULL)
{
(void) FpnwLeaveLoadLibCritSect() ;
return(GetLastError()) ;
}
// else call it
(void) FpnwLeaveLoadLibCritSect() ;
return (*pfNwFileEnum)(pServerName ,
dwLevel,
pPathName,
ppFileInfo,
pEntriesRead,
resumeHandle );
}
DWORD
FpnwEnterLoadLibCritSect (
VOID
)
/*++
Routine Description:
This function enters the critical section defined by
FpnwLoadLibrarySemaphore.
Arguments:
none
Return Value:
0 - The operation was successful.
error code otherwise.
--*/
#define LOADLIBRARY_TIMEOUT 10000L
{
switch( WaitForSingleObject( FpnwLoadLibSemaphore, LOADLIBRARY_TIMEOUT ))
{
case 0:
return 0 ;
case WAIT_TIMEOUT:
return WN_FUNCTION_BUSY ;
case 0xFFFFFFFF:
return (GetLastError()) ;
default:
return WN_WINDOWS_ERROR ;
}
}
DWORD
FpnwLeaveLoadLibCritSect (
VOID
)
/*++
Routine Description:
This function leaves the critical section defined by
FpnwLoadLibrarySemaphore.
Arguments:
none
Return Value:
0 - The operation was successful.
error code otherwise.
--*/
{
if (!ReleaseSemaphore( FpnwLoadLibSemaphore, 1, NULL ))
return (GetLastError()) ;
return 0 ;
}
/*******************************************************************
NAME: MakeSureFpnwDllIsLoaded
SYNOPSIS: loads the FPNWClnt dll if need.
EXIT: returns TRUE if dll already loaded, or loads
successfully. Returns false otherwise. Caller
should call GetLastError() to determine error.
NOTES: it is up to the caller to call FpnwEnterLoadLibCritSect
before he calls this.
HISTORY:
chuckc 29-Jul-1992 Created
ramv 14-May-1996 Cloned off windows\mpr\mprui.cxx
********************************************************************/
BOOL MakeSureFpnwDllIsLoaded(void)
{
HMODULE handle ;
// if already load, just return TRUE
if (vhFpnwDll != NULL)
return TRUE ;
// load the library. if it fails, it would have done a SetLastError.
if (!(handle = LoadLibrary(FPNW_DLL_NAME)))
return FALSE ;
// we are cool.
vhFpnwDll = handle ;
return TRUE ;
}