小弟刚学SPI做过滤程序,使用基础服务提供都,程序运行一切正常,不知道为什么在2003系统下机器重启后就不能上网(感觉DNS不能被解析,直接IP访问又正常),XP系统下又一切正常。请高手赐教!!!附上附件源代码

解决方案 »

  1.   

    安装部分:#include "stdafx.h"
    #include "XInstall.h"BOOL CXInstall::IsWinsock2()
    {
    WORD wVersionRequested = MAKEWORD(2, 0);
    WSADATA wsaData;

    if(WSAStartup(wVersionRequested, &wsaData) != 0)
    return FALSE;
     
    if (LOBYTE(wsaData.wVersion) != 2)
    {
    WSACleanup();
    return FALSE; 
    } return TRUE;
    }BOOL CXInstall::IsInstalled(TCHAR *sPathName)
    {
    TCHAR tsPathName[MAX_PATH]; if( ReadReg(REG_INSTALL_PATH_ITEM, 
    (BYTE*)tsPathName, 
    MAX_PATH, 
    HKEY_LOCAL_MACHINE, 
    REG_INSTALL_KEY, REG_SZ
    )
    )
    {
    if(sPathName != NULL)
    _tcscpy(sPathName, tsPathName);
    return TRUE;
    } return FALSE;
    }int CXInstall::InstallProvider(TCHAR *sPathName)
    {
    if(IsInstalled())
    return XERR_PROVIDER_ALREADY_INSTALL; _tcscpy(m_sPathName, sPathName); int iRet;
    if((iRet = EnumHookKey()) != XERR_SUCCESS)
    return iRet; if(!SaveReg(
    REG_INSTALL_PATH_ITEM, 
    (BYTE*)sPathName, 
    _tcslen(sPathName),
    HKEY_LOCAL_MACHINE, 
    REG_INSTALL_KEY, 
    REG_SZ
    )
    )
    return XERR_PROVIDER_SAVE_PATH_FAILED; return XERR_SUCCESS;
    }BOOL CXInstall::RemoveProvider()
    {
    int iRet = XERR_SUCCESS; if(!IsInstalled())
    return XERR_PROVIDER_NOT_INSTALL; if(iRet = EnumHookKey(TRUE) != XERR_SUCCESS)
    return iRet; if(!DeleteReg())
    return XERR_PROVIDER_REG_DELETE_FAILED; return XERR_SUCCESS;
    }//=============================================================================================
    // 私有安装函数
    //int CXInstall::EnumHookKey(BOOL IsRemove)
    {
    HKEY hkey = NULL; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PROTOCOL_CATALOG_KEY, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
    return XERR_PROVIDER_OPEN_REG_FAILED; __try
    {
    TCHAR sSubKey[MAX_PATH];
    DWORD dwIndex = 0;
    int   iRet = 0; while(RegEnumKey(hkey, dwIndex, sSubKey, MAX_PATH) == ERROR_SUCCESS)
    {
    if((iRet = SaveHookKey(hkey, sSubKey, IsRemove)) != XERR_SUCCESS)
    return iRet; dwIndex ++;
    }
    }
    __finally
    {
    RegCloseKey(hkey);
    } return XERR_SUCCESS;
    }int CXInstall::SaveHookKey(HKEY hkey, LPCTSTR sSubKey, BOOL IsRemove)
    {
    HKEY hSubKey = NULL;
    BYTE ItemValue   [MAX_PROTOCOL_CATALOG_LENTH];
    DWORD ItemSize = MAX_PROTOCOL_CATALOG_LENTH; if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
    return XERR_PROVIDER_OPEN_REG_FAILED; __try
    {
    if(RegQueryValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, NULL, ItemValue, &ItemSize) != ERROR_SUCCESS
    || (ItemSize != MAX_PROTOCOL_CATALOG_LENTH))
    return XERR_PROVIDER_READ_VALUE_FAILED; WSAPROTOCOL_INFOW *mProtocolInfo = (WSAPROTOCOL_INFOW*)(ItemValue + MAX_PATH);

    if(mProtocolInfo->ProtocolChain.ChainLen == 1)
    {
    TCHAR sItem[21];
    _stprintf(sItem, _T("%u"), mProtocolInfo->dwCatalogEntryId);
    if(!IsRemove)
    {
    if(!SaveReg(
    sItem, 
    ItemValue,
    _tcslen((TCHAR*)ItemValue), 
    HKEY_LOCAL_MACHINE, 
    REG_INSTALL_KEY, 
    REG_SZ
    )
    )
    return XERR_PROVIDER_CREATE_ITEM_FAILED; _tcscpy((TCHAR*)ItemValue, m_sPathName); if(RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize) != ERROR_SUCCESS)
    return XERR_PROVIDER_SET_VALUE_FAILED;
    }
    else
    {
    TCHAR sProvider[MAX_PATH];

    int iRet = ReadReg(
    sItem, 
    (BYTE*)sProvider, 
    MAX_PATH, 
    HKEY_LOCAL_MACHINE, 
    REG_INSTALL_KEY, REG_SZ
    );
    _tcscpy((TCHAR*)ItemValue, sProvider);
    iRet = RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize);
    }
    }
    }
    __finally
    {
    RegCloseKey(hSubKey);
    } return XERR_SUCCESS;
    }//=============================================================================================
    // 注册表操作函数
    //BOOL CXInstall::ReadReg(
    TCHAR *sKey, 
    BYTE *pBuffer,
    DWORD dwBufSize,
    HKEY hkey, 
    TCHAR *sSubKey, 
    DWORD ulType
    )
    {
    HKEY hSubkey; if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS)
    return FALSE; __try
    {
    DWORD dwType; if (RegQueryValueEx(hSubkey, sKey, 0, &dwType, pBuffer, &dwBufSize) == ERROR_SUCCESS
    && dwType == ulType)
    return TRUE;
    }
    __finally
    {
    RegCloseKey(hSubkey);
    } return FALSE;
    }BOOL CXInstall::SaveReg(
    TCHAR *sKey, 
    BYTE *pBuffer,
    DWORD dwBufSize,
    HKEY hkey, 
    TCHAR *sSubKey, 
    DWORD ulType
    )
    {
    HKEY hSubkey;
    DWORD dwDisposition; if (RegCreateKeyEx(hkey, sSubKey, 0, NULL, REG_OPTION_NON_VOLATILE
    , KEY_ALL_ACCESS, NULL, &hSubkey, &dwDisposition) != ERROR_SUCCESS)
    return FALSE; if (RegSetValueEx(hSubkey, sKey, 0, ulType, pBuffer, dwBufSize) != ERROR_SUCCESS)
    {
    RegCloseKey(hSubkey);
    return FALSE;
    } RegCloseKey(hSubkey); return TRUE;
    }BOOL CXInstall::DeleteReg(
    HKEY hkey,
    TCHAR *sSubKey, 
    TCHAR *sItem
    )
    {
    if(hkey == NULL || sSubKey == NULL)
    return FALSE; if(sItem == NULL)
    {
    if(RegDeleteKey(hkey,sSubKey) == ERROR_SUCCESS)
    return TRUE;
    else
    return FALSE;
    } HKEY hSubKey; if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
    return FALSE; __try
    {
    if(RegDeleteValue(hSubKey, sItem) == ERROR_SUCCESS)
    return TRUE;
    }
    __finally
    {
    RegCloseKey(hSubKey);
    } return FALSE;
    }
      

  2.   

    DLL部分:
    #include <afxwin.h>
    #include <ws2spi.h>
    #include <io.h> //
    // 用来保存系统服务提供者路径信息的自定义注册表键值
    //
    #define REG_INSTALL_KEY \
    _T("SYSTEM\\CurrentControlSet\\Services\\WinSock2\\Xstudio_Min_Winsock_Spi")//
    // 全局变量,用来保存系统服务提供者30个服务函数指针
    //
    WSPPROC_TABLE NextProcTable   ;void GetRightEntryIdItem(
    IN WSAPROTOCOL_INFOW *pProtocolInfo, 
    OUT TCHAR *sItem
    )
    {
    if(pProtocolInfo->ProtocolChain.ChainLen <= 1)
    {
    _stprintf(sItem, _T("%u"), pProtocolInfo->dwCatalogEntryId);
    }
    else
    {
    _stprintf(sItem, _T("%u"), pProtocolInfo->ProtocolChain
    .ChainEntries[pProtocolInfo->ProtocolChain.ChainLen - 1]);
    }
    }BOOL GetHookProvider(
    IN WSAPROTOCOL_INFOW *pProtocolInfo, 
    OUT TCHAR *sPathName
    )
    {
    TCHAR sItem[21];
    GetRightEntryIdItem(pProtocolInfo, sItem); HKEY hSubkey;
    DWORD ulDateLenth = MAX_PATH;
    TCHAR sTemp[MAX_PATH]; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
    , REG_INSTALL_KEY, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS)
    return FALSE;
    if (RegQueryValueEx(hSubkey, sItem, 0, NULL, (BYTE*)sTemp, &ulDateLenth)
    || ExpandEnvironmentStrings(sTemp, sPathName, ulDateLenth) == 0)
    return FALSE;
    if(sPathName[0] == '\0' && sTemp[0] != '\0')
    _tcscpy(sPathName, sTemp);
    RegCloseKey(hSubkey); return TRUE;
    }SOCKET WSPAPI WSPSocket(
    int af,                               
    int type,                             
    int protocol,                         
    LPWSAPROTOCOL_INFOW lpProtocolInfo,   
    GROUP g,                              
    DWORD dwFlags,                        
    LPINT lpErrno
    )
    {
    OutputDebugString(_T("MinWinsockSpi.dll: WSPSocket ...\n")); return NextProcTable.lpWSPSocket(
    af, type, protocol, lpProtocolInfo, g, dwFlags, lpErrno);
    }BOOL WINAPI DllMain(
    HINSTANCE hModule, 
        DWORD ul_reason_for_call, 
        LPVOID lpReserved
    )
    {
    return TRUE;
    }int WSPAPI WSPStartup(
    WORD wVersionRequested,
    LPWSPDATA lpWSPData,
    LPWSAPROTOCOL_INFOW lpProtocolInfo,
    WSPUPCALLTABLE upcallTable,
    LPWSPPROC_TABLE lpProcTable
    )
    {
    OutputDebugString(_T("MinWinsockSpi.dll: WSPStartup...\n")); TCHAR sLibraryPath[512];
        LPWSPSTARTUP        WSPStartupFunc      = NULL;
    HMODULE hLibraryHandle = NULL;
        INT                 ErrorCode           = 0;  if (!GetHookProvider(lpProtocolInfo, sLibraryPath)
    || (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL
    || (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(
    hLibraryHandle, "WSPStartup")) == NULL
    )
    return WSAEPROVIDERFAILEDINIT; if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData
    , lpProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS)
    return ErrorCode;

    NextProcTable = *lpProcTable; lpProcTable->lpWSPSocket = WSPSocket; return 0;
    }
      

  3.   

    http://d.download.csdn.net/fd3/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duMS8yMDA4MDQyMy8yMzE3NTI1NTUwNS5yYXI=!427590
      

  4.   

    http://d.download.csdn.net/down/427590/uccel55CSDN的链接真麻烦,这个可用请高手看看原因!!
      

  5.   

    好像是这个问题,win7直接无法打开浏览器,vista输入网址是说输入的网址无效
    …………