windows-nt/Source/XPSP1/NT/shell/osshell/regwiz/regwizpost/atk_inet.cpp
2020-09-26 16:20:57 +08:00

228 lines
4.8 KiB
C++

// File : ATK_INET.CPP
// Author : Suresh Krishnan
// Date : 08/05/97
// Wrapper for INetCFG.DLL exported functions
// related function declarations
//
//
#include <windows.h>
#include <tchar.h>
#include <winnt.h>
#include <wininet.h>
#include <stdio.h>
#include "rw_common.h"
typedef HRESULT (WINAPI *INETGETPROXY)(LPBOOL lpfEnable, LPSTR lpszServer, DWORD cbServer, LPSTR lpszOverride, DWORD cbOverride);
typedef HRESULT (WINAPI *INETCONFIGSYSTEM) ( HWND hWndParent, DWORD dwfOptions, LPBOOL lpfNeedsRestart);
typedef HRESULT (WINAPI *INETGETAUTODIAL) (LPBOOL lpEnable, LPSTR lpszEntryName, DWORD cbEntryName);
typedef HRESULT (WINAPI *INETSETAUTODIAL) (BOOL fEnable, LPCSTR lpszEntryName);
#define ERROR_IN_SET -1
#define INET_DLL_FAILURE -1
static HINSTANCE hINetCfg= NULL;
static INETGETPROXY fpGetProxy=NULL;
static INETCONFIGSYSTEM fpGetConfigSystem=NULL;
static INETGETAUTODIAL fpGetAutoDial=NULL;
static INETSETAUTODIAL fpSetAutoDial=NULL;
static INETCONFIGSYSTEM fpInetConfig =NULL;
typedef struct {
char szActiveConnection[256];
BOOL fStatus;
enum ISPStateFlag {NotValidState,ValidState } iState ;
} ISPState;
static ISPState gIspState = { "",
0,
ISPState::NotValidState};
int INetCfgSetup()
{
if(hINetCfg) {
return 1;
}
hINetCfg = LoadLibrary( _T("INETCFG.DLL") ); // Load INetCfg.DLL and store globally
if( !hINetCfg )
{
// return if the DLL can not loaded
//
return 0;
}
fpGetProxy = (INETGETPROXY) GetProcAddress(hINetCfg,"InetGetProxy");
fpGetAutoDial = ( INETGETAUTODIAL) GetProcAddress(hINetCfg, "InetGetAutodial");
fpSetAutoDial = ( INETSETAUTODIAL) GetProcAddress(hINetCfg, "InetSetAutodial");
fpInetConfig = (INETCONFIGSYSTEM) GetProcAddress(hINetCfg, "InetConfigSystem");
return 1;
}
HRESULT ATK_InetGetAutoDial(LPBOOL lpEnable, LPSTR lpszEntryName, DWORD cbEntryName)
{
if(INetCfgSetup()) {
return (*fpGetAutoDial)(lpEnable, lpszEntryName, cbEntryName);
}else {
return INET_DLL_FAILURE;
}
}
HRESULT ATK_InetSetAutoDial(BOOL fEnable, LPCSTR lpszEntryName)
{
if(INetCfgSetup()) {
return (*fpSetAutoDial)(fEnable, lpszEntryName);
}else{
return INET_DLL_FAILURE;
}
}
HRESULT ATK_InetConfigSystem( HWND hwndParent,
DWORD dwfOptions,
LPBOOL lpfNeedsRestart)
{
if(INetCfgSetup()) {
return (*fpInetConfig)( hwndParent,dwfOptions,
lpfNeedsRestart);
}else{
return INET_DLL_FAILURE;
}
}
HRESULT ATK_InetGetProxy( LPBOOL lpfEnable,
LPSTR lpszServer,
DWORD cbServer,
LPSTR lpszOverride,
DWORD cbOverride)
{
if(INetCfgSetup()) {
return (*fpGetProxy)( lpfEnable,
lpszServer,
cbServer,
lpszOverride,
cbOverride);
}else{
return INET_DLL_FAILURE;
}
}
void GetAutoDialConfiguration()
{
DWORD dwError;
DWORD dwSz=256;
HRESULT hr;
ISPState *pS= &gIspState;
hr = ATK_InetGetAutoDial(&pS->fStatus,
pS->szActiveConnection,
dwSz);
if(hr) {
dwError = GetLastError();
RW_DEBUG << "\nGet AutoDial :***Error " <<hr << ":"<< dwError << flush;
pS->iState = ISPState::NotValidState;
}else {
pS->iState = ISPState::ValidState;
}
}
DWORD SetAutoDialStateThread(void *vp)
{
ISPState *pState;
pState = (ISPState *) vp;
ATK_InetSetAutoDial(pState->fStatus,
pState->szActiveConnection);
RW_DEBUG <<"\nSet Auto Dial Configuration" << pState->szActiveConnection << " =>" << pState->fStatus << flush;
ExitThread(0);
return 0;
}
//
// This function calls the ICW function InetSetAutoDial()
// this function waits for the above function to be over by 10 seconds
// if it does not complete then it calls terminate thread and abondens the operation
int ChangeInterNetAutoDial(ISPState *pStatus )
{
int iReturn;
DWORD dwTimeOut = 10*1000;
DWORD dwCreationFlags=0; // Start without CREATE_SUSPENDED
DWORD ThreadId;
iReturn = NO_ERROR;
HANDLE hParent = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE) SetAutoDialStateThread,
(void *) pStatus,
dwCreationFlags,
&ThreadId );
iReturn = NO_ERROR;
DWORD dwRet = WaitForSingleObject(hParent,
dwTimeOut);
switch(dwRet) {
case WAIT_ABANDONED :
break;
case WAIT_OBJECT_0 :
CloseHandle(hParent);
break;
case WAIT_TIMEOUT :
//TerminateThread(hParent,0);
iReturn = ERROR_IN_SET;
break;
default:
break;
}
return iReturn;
}
int ResetAutoDialConfiguration()
{
int iRet;
iRet = NO_ERROR;
if(gIspState.iState == ISPState::NotValidState ){
//
// Not alid So No need to Reset
return iRet;
}
return ChangeInterNetAutoDial(&gIspState);
}
int DisableAutoDial()
{
ISPState IspState = { "",
0,
ISPState::NotValidState};
return ChangeInterNetAutoDial(&IspState);
}
void UnLoadInetCfgLib()
{
if(hINetCfg){
FreeLibrary(hINetCfg); // Load INetCfg.DLL and store globally
hINetCfg = NULL;
}
}