You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
693 lines
16 KiB
693 lines
16 KiB
/*++
|
|
|
|
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 ;
|
|
|
|
//
|
|
// Construct a full path to the library. It should be in the System32
|
|
// directory.
|
|
//
|
|
TCHAR szFullPathBuffer[MAX_PATH + 1]; // +1 to allow for NULL terminator according to GetSystemDirectory
|
|
UINT uiPathLength = 0;
|
|
if ((uiPathLength = GetSystemDirectory(szFullPathBuffer, MAX_PATH + 1)) == 0)
|
|
return FALSE;
|
|
|
|
if ((uiPathLength + 1 + _tcslen(FPNW_DLL_NAME)) > MAX_PATH) // +1 is for slash
|
|
return FALSE;
|
|
|
|
_tcscat(szFullPathBuffer, _T("\\"));
|
|
_tcscat(szFullPathBuffer, FPNW_DLL_NAME);
|
|
|
|
// load the library. if it fails, it would have done a SetLastError.
|
|
if (!(handle = LoadLibrary(szFullPathBuffer)))
|
|
return FALSE ;
|
|
|
|
// we are cool.
|
|
vhFpnwDll = handle ;
|
|
return TRUE ;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|