679 lines
15 KiB
C++
679 lines
15 KiB
C++
|
/*++
|
|||
|
|
|||
|
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 ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|