mirror of https://github.com/lianthony/NT4.0
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.
925 lines
20 KiB
925 lines
20 KiB
/*++
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
rpcsupp.cxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the server side RPC admin APIs
|
|
|
|
|
|
Author:
|
|
|
|
John Ludeman (johnl) 02-Dec-1994
|
|
|
|
Project:
|
|
|
|
Internet Servers Common Server DLL
|
|
|
|
Revisions:
|
|
MuraliK 2-June-1995 Added support for Atq related stats + admin
|
|
MuraliK 17-Jul-1995 Log Configuration admin supported
|
|
MuraliK 31-Jul-1995 Mods to accomodate Internet gateway service
|
|
(catapult) in admin apis and model
|
|
SophiaC 28-Aug-1995 Added support for DomainFilter admin
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include Headers
|
|
//
|
|
|
|
#include <tcpdllp.hxx>
|
|
#include <tsunami.hxx>
|
|
|
|
extern "C" {
|
|
#include <info_srv.h>
|
|
};
|
|
|
|
#include <atq.h>
|
|
# include "inetreg.h"
|
|
|
|
//
|
|
// Private constants
|
|
//
|
|
|
|
|
|
//
|
|
// The version of the common services dll
|
|
//
|
|
|
|
#define TSVC_MAJOR_VER 3
|
|
#define TSVC_MINOR_VER 0
|
|
|
|
//
|
|
// number of flag DWORDS
|
|
//
|
|
|
|
#define NUM_CAPABILITIES_FLAGS 1
|
|
|
|
//
|
|
// Private prototypes
|
|
//
|
|
|
|
BOOL
|
|
INetAAuxSetInfo( IN ISVC_INFO * pTsvcInfo,
|
|
INETA_CONFIG_INFO * pConfig );
|
|
|
|
BOOL
|
|
INetAAuxGetInfo( IN ISVC_INFO * pTsvcInfo,
|
|
INETA_CONFIG_INFO * * pConfig );
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoGetVersion(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwReserved,
|
|
OUT DWORD * pdwVersion
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Returns the version of the TCP server package. Primarily intended to
|
|
detect downlevel servers for future versions of the admin tool.
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwReserved - unused (may eventually indicate an individual server)
|
|
pdwVersion - Receives the major version in the hi-word and the minor
|
|
version in the low word
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
*pdwVersion = MAKELONG( TSVC_MAJOR_VER, TSVC_MINOR_VER );
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoGetServerCapabilities(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwReserved,
|
|
OUT LPINET_INFO_CAPABILITIES_STRUCT *ppCap
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Returns the information about the server and its capabilities.
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwReserved - unused (may eventually indicate an individual server)
|
|
ppCap - Receives the INET_INFO_CAPABILITIES structure
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD err = NO_ERROR;
|
|
LPINET_INFO_CAPABILITIES_STRUCT pCap;
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" Entering R_InetInfoGetServerCapabilities()\n" ));
|
|
}
|
|
|
|
if ( ( err = TsApiAccessCheck( TCP_QUERY_ADMIN_INFORMATION)) != NO_ERROR) {
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" TsApiAccessCheck() Failed. Error = %u\n", err));
|
|
}
|
|
|
|
} else {
|
|
|
|
OSVERSIONINFO verInfo;
|
|
DWORD bufSize =
|
|
sizeof(INET_INFO_CAPABILITIES_STRUCT) +
|
|
NUM_CAPABILITIES_FLAGS * sizeof(INET_INFO_CAP_FLAGS);
|
|
|
|
pCap = (LPINET_INFO_CAPABILITIES_STRUCT) MIDL_user_allocate( bufSize );
|
|
*ppCap = pCap;
|
|
|
|
if ( pCap == NULL ) {
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
ZeroMemory(pCap, bufSize);
|
|
pCap->CapFlags = (LPINET_INFO_CAP_FLAGS)
|
|
((PCHAR)pCap + sizeof(INET_INFO_CAPABILITIES));
|
|
|
|
//
|
|
// Fill in the version and product type
|
|
//
|
|
|
|
pCap->CapVersion = 1;
|
|
switch (TsGetPlatformType()) {
|
|
case PtNtServer:
|
|
pCap->ProductType = INET_INFO_PRODUCT_NTSERVER;
|
|
break;
|
|
case PtNtWorkstation:
|
|
pCap->ProductType = INET_INFO_PRODUCT_NTWKSTA;
|
|
break;
|
|
case PtWindows95:
|
|
pCap->ProductType = INET_INFO_PRODUCT_WINDOWS95;
|
|
break;
|
|
default:
|
|
pCap->ProductType = INET_INFO_PRODUCT_UNKNOWN;
|
|
}
|
|
|
|
//
|
|
// Fill in GetVersionEx information
|
|
//
|
|
|
|
verInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
if ( GetVersionEx( &verInfo ) ) {
|
|
pCap->BuildNumber = verInfo.dwBuildNumber;
|
|
} else {
|
|
pCap->BuildNumber = 0;
|
|
}
|
|
|
|
pCap->MajorVersion = TSVC_MAJOR_VER;
|
|
pCap->MinorVersion = TSVC_MINOR_VER;
|
|
|
|
//
|
|
// Fill in the capabilities
|
|
//
|
|
|
|
pCap->NumCapFlags = NUM_CAPABILITIES_FLAGS;
|
|
|
|
pCap->CapFlags[0].Mask = IIS_CAP1_ALL;
|
|
|
|
if ( pCap->ProductType == INET_INFO_PRODUCT_NTSERVER ) {
|
|
|
|
pCap->CapFlags[0].Flag = IIS_CAP1_NTS;
|
|
|
|
} else {
|
|
|
|
pCap->CapFlags[0].Flag =
|
|
IIS_CAP1_FILE_LOGGING |
|
|
IIS_CAP1_MAX_CONNECTIONS |
|
|
IIS_CAP1_10_CONNECTION_LIMIT;
|
|
}
|
|
|
|
}
|
|
|
|
return ( err );
|
|
|
|
} // R_InetInfoGetServerCapabilities
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoSetGlobalAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwReserved,
|
|
IN INETA_GLOBAL_CONFIG_INFO * pConfig
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Sets the global service admin information
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwReserved
|
|
pConfig - Admin information to set
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
DWORD err;
|
|
HKEY hkey = NULL;
|
|
HKEY CacheKey = NULL;
|
|
HKEY FilterKey = NULL;
|
|
DWORD dwDummy;
|
|
|
|
if ( ( err = TsApiAccessCheck( TCP_SET_ADMIN_INFORMATION)) != NO_ERROR) {
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" TsApiAccessCheck() Failed. Error = %u\n", err));
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Create the key if it doesn't exist already
|
|
//
|
|
|
|
err = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
|
|
INET_INFO_PARAMETERS_KEY,
|
|
0,
|
|
NULL,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&hkey,
|
|
&dwDummy );
|
|
|
|
if ( err )
|
|
{
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
" RegOpenKeyEx returned error %d\n",
|
|
err ));
|
|
return err;
|
|
}
|
|
|
|
|
|
if ( IsFieldSet( pConfig->FieldControl, FC_GINET_INFO_MEMORY_CACHE_SIZE ))
|
|
{
|
|
err = WriteRegistryDword( hkey,
|
|
INETA_MEMORY_CACHE_SIZE,
|
|
pConfig->cbMemoryCacheSize );
|
|
TsCacheSetSize( pConfig->cbMemoryCacheSize );
|
|
}
|
|
|
|
|
|
if (!err &&
|
|
IsFieldSet( pConfig->FieldControl, FC_GINET_INFO_BANDWIDTH_LEVEL ))
|
|
{
|
|
err = WriteRegistryDword( hkey,
|
|
INETA_BANDWIDTH_LEVEL,
|
|
pConfig->BandwidthLevel );
|
|
AtqSetInfo( AtqBandwidthThrottle, pConfig->BandwidthLevel );
|
|
}
|
|
|
|
if ( hkey )
|
|
RegCloseKey( hkey );
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoGetGlobalAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwReserved,
|
|
OUT LPINETA_GLOBAL_CONFIG_INFO * ppConfig
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Gets the global service admin information
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwReserved
|
|
ppConfig - Receives current operating values of the server
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
DWORD err = NO_ERROR;
|
|
INETA_GLOBAL_CONFIG_INFO * pConfig;
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" Entering R_InetInfoGetGlobalAdminInformation()\n" ));
|
|
}
|
|
|
|
if ( ( err = TsApiAccessCheck( TCP_QUERY_ADMIN_INFORMATION)) != NO_ERROR) {
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" TsApiAccessCheck() Failed. Error = %u\n", err));
|
|
}
|
|
|
|
} else {
|
|
|
|
*ppConfig = (INETA_GLOBAL_CONFIG_INFO *) MIDL_user_allocate(
|
|
sizeof( INET_INFO_GLOBAL_CONFIG_INFO ));
|
|
|
|
if ( !*ppConfig )
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
pConfig = *ppConfig;
|
|
|
|
memset( pConfig, 0, sizeof( *pConfig ));
|
|
|
|
pConfig->FieldControl = FC_GINET_INFO_ALL;
|
|
|
|
pConfig->cbMemoryCacheSize = TsCacheQuerySize();
|
|
pConfig->BandwidthLevel = AtqGetInfo( AtqBandwidthThrottle);
|
|
|
|
if( err != NO_ERROR ) {
|
|
|
|
//
|
|
// clean up the allocated memory
|
|
//
|
|
|
|
MIDL_user_free( pConfig );
|
|
}
|
|
else {
|
|
|
|
*ppConfig = pConfig;
|
|
|
|
}
|
|
}
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"R_InetInfoGetGlobalAdminInformation() returns Error = %u \n",
|
|
err ));
|
|
}
|
|
|
|
return ( err );
|
|
|
|
} // R_InetInfoGetGlobalAdminInformation()
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoSetAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwServerMask,
|
|
IN INETA_CONFIG_INFO * pConfig
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Sets the common service admin information for the servers specified
|
|
in dwServerMask.
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwServerMask - Bitfield of servers to set the information for
|
|
pConfig - Admin information to set
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
DWORD err = NO_ERROR;
|
|
|
|
//
|
|
// Loop through the servers and set the information for each one
|
|
//
|
|
|
|
if ( !ISVC_INFO::EnumerateServiceInfo( (TS_PFN_SVC_ENUM) INetAAuxSetInfo,
|
|
pConfig,
|
|
dwServerMask ))
|
|
{
|
|
err = GetLastError();
|
|
}
|
|
|
|
return ( err);
|
|
}
|
|
|
|
|
|
BOOL
|
|
INetAAuxSetInfo( IN ISVC_INFO * pIsvcInfo,
|
|
IN INETA_CONFIG_INFO * pConfig )
|
|
/*++
|
|
|
|
Description
|
|
|
|
Simple worker function for setting the admin information for
|
|
each server
|
|
|
|
Arguments:
|
|
|
|
pIsvcInfo - info structure to set the information for
|
|
pConfig - Admin information to set
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
DWORD dwError;
|
|
|
|
if ( (dwError = TsApiAccessCheck( TCP_SET_ADMIN_INFORMATION ))
|
|
!= NO_ERROR) {
|
|
|
|
SetLastError( dwError);
|
|
|
|
} else {
|
|
|
|
if ( !pIsvcInfo->SetConfiguration( pConfig ) ||
|
|
!pIsvcInfo->ReadParamsFromRegistry( pConfig->FieldControl )
|
|
) {
|
|
|
|
dwError = GetLastError();
|
|
|
|
IF_DEBUG( ERROR) {
|
|
|
|
DBGPRINTF(( DBG_CONTEXT,
|
|
"[INetAAuxSetInfo] Returning error %d\n",
|
|
dwError));
|
|
|
|
SetLastError(dwError);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return (dwError == NO_ERROR);
|
|
} // INetAAuxSetInfo()
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoGetAdminInformation(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwServerMask,
|
|
OUT LPINETA_CONFIG_INFO * ppConfig
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Gets the common service admin information for the specified
|
|
server in dwServerMask.
|
|
|
|
Arguments:
|
|
|
|
pszServer - unused
|
|
dwServerMask - Bitfield of server to get the information for
|
|
pConfig - Receives current operating values of the server
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
DWORD err = NO_ERROR;
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" Entering R_InetInfoGetAdminInformation() for Services %x\n",
|
|
dwServerMask));
|
|
}
|
|
|
|
if ( ( err = TsApiAccessCheck( TCP_QUERY_ADMIN_INFORMATION)) != NO_ERROR) {
|
|
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
" TsApiAccessCheck() Failed. Error = %u\n", err));
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( !ISVC_INFO::EnumerateServiceInfo(
|
|
(TS_PFN_SVC_ENUM) INetAAuxGetInfo,
|
|
ppConfig,
|
|
dwServerMask )) {
|
|
|
|
err = GetLastError();
|
|
IF_DEBUG( DLL_RPC) {
|
|
|
|
DBGPRINTF( ( DBG_CONTEXT,
|
|
"EnumerateServiceInfo failed. Error = %u\n",
|
|
err));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ( err);
|
|
|
|
} // R_InetInfoGetAdminInformation()
|
|
|
|
|
|
|
|
BOOL
|
|
INetAAuxGetInfo( IN ISVC_INFO * pIsvcInfo,
|
|
OUT INETA_CONFIG_INFO ** ppConfig )
|
|
/*++
|
|
|
|
Description
|
|
|
|
Simple worker function for getting the admin information for
|
|
each server
|
|
|
|
Arguments:
|
|
|
|
pTsvcInfo - info structure to get the information from
|
|
pConfig - Admin information to get
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
BOOL fReturn = FALSE;
|
|
|
|
*ppConfig = ( (INETA_CONFIG_INFO *)
|
|
MIDL_user_allocate(sizeof( INETA_CONFIG_INFO ))
|
|
);
|
|
|
|
if ( *ppConfig) {
|
|
|
|
INETA_CONFIG_INFO * pConfig;
|
|
|
|
pConfig = *ppConfig;
|
|
|
|
memset( pConfig, 0, sizeof( *pConfig ));
|
|
|
|
// Get the configuration for the given service info object.
|
|
|
|
if ( ! (fReturn = pIsvcInfo->GetConfiguration( pConfig))) {
|
|
|
|
MIDL_user_free(pConfig);
|
|
*ppConfig = NULL;
|
|
}
|
|
|
|
} else {
|
|
|
|
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
|
}
|
|
|
|
return ( fReturn);
|
|
} // INetAAuxGetInfo()
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoQueryStatistics(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD Level,
|
|
IN DWORD dwServerMask,
|
|
LPINET_INFO_STATISTICS_INFO StatsInfo
|
|
)
|
|
{
|
|
DWORD err;
|
|
|
|
err = TsApiAccessCheck( TCP_QUERY_STATISTICS );
|
|
|
|
if ( err )
|
|
return err;
|
|
|
|
switch ( Level )
|
|
{
|
|
case 0:
|
|
{
|
|
INET_INFO_STATISTICS_0 * pstats0;
|
|
ATQ_STATISTICS atqStats;
|
|
|
|
pstats0 = (INET_INFO_STATISTICS_0 *) MIDL_user_allocate(
|
|
sizeof( INET_INFO_STATISTICS_0 ));
|
|
|
|
if ( !pstats0 )
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
#ifndef NO_AUX_PERF
|
|
// init count of counters that are valid
|
|
pstats0->nAuxCounters = 0;
|
|
|
|
//
|
|
// IF THERE ARE VALID UNNAMED COUNTERS THAT WE WISH TO TRACK
|
|
// WE SHOULD DO SO HERE........
|
|
// For Future Additions, this comment is added.
|
|
// MuraliK 20-Sept-1995
|
|
//
|
|
|
|
#endif // NO_AUX_PERF
|
|
|
|
if ( !TsCacheQueryStatistics( Level,
|
|
dwServerMask,
|
|
&pstats0->CacheCtrs ) ||
|
|
!AtqGetStatistics( &atqStats))
|
|
{
|
|
MIDL_user_free( pstats0 );
|
|
err = GetLastError();
|
|
} else {
|
|
|
|
// copy Atq Statistics to stats
|
|
INET_COM_ATQ_STATISTICS * pAtqStats = &pstats0->AtqCtrs;
|
|
pAtqStats->TotalBlockedRequests = atqStats.cBlockedRequests;
|
|
pAtqStats->TotalAllowedRequests = atqStats.cAllowedRequests;
|
|
pAtqStats->TotalRejectedRequests = atqStats.cRejectedRequests;
|
|
pAtqStats->CurrentBlockedRequests=
|
|
atqStats.cCurrentBlockedRequests;
|
|
pAtqStats->MeasuredBandwidth = atqStats.MeasuredBandwidth;
|
|
|
|
StatsInfo->InetStats0 = pstats0;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
err = ERROR_INVALID_LEVEL;
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoClearStatistics(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwServerMask
|
|
)
|
|
{
|
|
DWORD err;
|
|
|
|
err = TsApiAccessCheck( TCP_SET_ADMIN_INFORMATION );
|
|
|
|
if ( err == NO_ERROR) {
|
|
if (!TsCacheClearStatistics( dwServerMask ) ||
|
|
!AtqClearStatistics()) {
|
|
|
|
err = GetLastError();
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
NET_API_FUNCTION
|
|
R_InetInfoFlushMemoryCache(
|
|
IN LPWSTR pszServer OPTIONAL,
|
|
IN DWORD dwServerMask
|
|
)
|
|
{
|
|
DWORD err;
|
|
|
|
err = TsApiAccessCheck( TCP_SET_ADMIN_INFORMATION );
|
|
|
|
if ( err )
|
|
return err;
|
|
|
|
if ( !TsCacheFlush( dwServerMask ))
|
|
return GetLastError();
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
ReadRegString(
|
|
HKEY hkey,
|
|
CHAR * * ppchstr,
|
|
CHAR * pchValue,
|
|
CHAR * pchDefault
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Gets the specified string from the registry. If *ppchstr is not NULL,
|
|
then the value is freed. If the registry call fails, *ppchstr is
|
|
restored to its previous value.
|
|
|
|
Arguments:
|
|
|
|
hkey - Handle to open key
|
|
ppchstr - Receives pointer of allocated memory of the new value of the
|
|
string
|
|
pchValue - Which registry value to retrieve
|
|
pchDefault - Default string if value isn't found
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
CHAR * pch = *ppchstr;
|
|
|
|
*ppchstr = ReadRegistryString( hkey,
|
|
pchValue,
|
|
pchDefault,
|
|
TRUE );
|
|
|
|
if ( !*ppchstr )
|
|
{
|
|
*ppchstr = pch;
|
|
return FALSE;
|
|
}
|
|
|
|
if ( pch )
|
|
TCP_FREE( pch );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
ConvertStringToRpc(
|
|
WCHAR * * ppwch,
|
|
LPCSTR pch
|
|
)
|
|
/*++
|
|
|
|
Description
|
|
|
|
Allocates, copies and converts pch to *ppwch
|
|
|
|
Arguments:
|
|
|
|
ppwch - Receives allocated destination string
|
|
pch - ANSI string to copy from
|
|
|
|
Note:
|
|
|
|
--*/
|
|
{
|
|
int cch;
|
|
int iRet;
|
|
|
|
if ( !pch )
|
|
{
|
|
*ppwch = NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
cch = strlen( pch );
|
|
|
|
if ( !(*ppwch = (WCHAR *) MIDL_user_allocate( (cch + 1) * sizeof(WCHAR))) )
|
|
{
|
|
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
|
return FALSE;
|
|
}
|
|
|
|
iRet = MultiByteToWideChar( CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
pch,
|
|
cch + 1,
|
|
*ppwch,
|
|
cch + 1 );
|
|
|
|
if ( !iRet )
|
|
{
|
|
MIDL_user_free( *ppwch );
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
FreeRpcString(
|
|
WCHAR * pwch
|
|
)
|
|
{
|
|
if ( pwch )
|
|
MIDL_user_free( pwch );
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
InitGlobalConfigFromReg(VOID)
|
|
/*++
|
|
Loads the global configuration parameters from registry.
|
|
Should be called after Atq Module is initialized.
|
|
|
|
Returns:
|
|
Win32 error code. NO_ERROR on success
|
|
|
|
History:
|
|
MuraliK 06-June-1995 Created.
|
|
--*/
|
|
{
|
|
DWORD dwError;
|
|
HKEY hkey = NULL;
|
|
DWORD dwVal;
|
|
|
|
dwError = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
INET_INFO_PARAMETERS_KEY,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hkey);
|
|
|
|
if ( dwError == NO_ERROR) {
|
|
|
|
// Read all necessary common parameters from registry
|
|
|
|
dwVal = ReadRegistryDword( hkey,
|
|
INETA_BANDWIDTH_LEVEL,
|
|
INETA_DEF_BANDWIDTH_LEVEL);
|
|
}
|
|
else {
|
|
dwVal = INETA_DEF_BANDWIDTH_LEVEL;
|
|
}
|
|
|
|
AtqSetInfo( AtqBandwidthThrottle, dwVal);
|
|
|
|
if ( dwError == NO_ERROR) {
|
|
|
|
DWORD defaultThreadTimeout;
|
|
DWORD defaultPPAtqThreads;
|
|
|
|
if ( TsIsNtServer() ) {
|
|
defaultPPAtqThreads = INETA_DEF_PER_PROCESSOR_ATQ_THREADS;
|
|
defaultThreadTimeout = INETA_DEF_THREAD_TIMEOUT;
|
|
} else {
|
|
defaultPPAtqThreads = INETA_DEF_PER_PROCESSOR_ATQ_THREADS_PWS;
|
|
defaultThreadTimeout = INETA_DEF_THREAD_TIMEOUT_PWS;
|
|
}
|
|
|
|
//
|
|
// Read all necessary common parameters from registry
|
|
// related to ATQ setup
|
|
//
|
|
|
|
dwVal = ReadRegistryDword( hkey,
|
|
INETA_PER_PROCESSOR_ATQ_THREADS,
|
|
defaultPPAtqThreads
|
|
);
|
|
|
|
if ( dwVal != 0 ) {
|
|
AtqSetInfo( AtqMaxPoolThreads, dwVal);
|
|
}
|
|
|
|
dwVal = ReadRegistryDword( hkey,
|
|
INETA_THREAD_TIMEOUT,
|
|
defaultThreadTimeout
|
|
);
|
|
|
|
AtqSetInfo( AtqThreadTimeout, dwVal);
|
|
|
|
dwVal = ReadRegistryDword( hkey,
|
|
INETA_MIN_KB_SEC,
|
|
INETA_DEF_MIN_KB_SEC );
|
|
|
|
AtqSetInfo( AtqMinKbSec, dwVal);
|
|
}
|
|
|
|
if ( hkey )
|
|
RegCloseKey( hkey );
|
|
|
|
return NO_ERROR;
|
|
|
|
} // InitGlobalConfigFromReg()
|
|
|
|
|
|
|