SPI基础服务提示都问题,在线等!!! 小弟刚学SPI做过滤程序,使用基础服务提供都,程序运行一切正常,不知道为什么在2003系统下机器重启后就不能上网(感觉DNS不能被解析,直接IP访问又正常),XP系统下又一切正常。请高手赐教!!!附上附件源代码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 安装部分:#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;} 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;} http://d.download.csdn.net/fd3/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duMS8yMDA4MDQyMy8yMzE3NTI1NTUwNS5yYXI=!427590 http://d.download.csdn.net/down/427590/uccel55CSDN的链接真麻烦,这个可用请高手看看原因!! 好像是这个问题,win7直接无法打开浏览器,vista输入网址是说输入的网址无效………… VC++6.0,用了manifest后,显示win7效果按钮边缘不好看,如图 创建非模态对话框问题 上地有哪家食堂饭菜好吃的?我们这个楼的食堂饭菜太难吃了! 类内和类外有同名的结构,在类内用类外的结构怎么用??老提示元素不是此结构的成员?? 请高手回答。 c++大学教程(第二版)(电子工业出版社)怎么样?有谁看过。 急,求一个进程中2个线程调用ocx的互斥实现方法 图挂了,重发,这是什么控件? VC中有没有函数能将文件中的文件转换为整数啊 初学者问题:什么是类型安全? 调用opengl中的glColorTable非法操作,怎么回事啊? tmPitchAndFamily的值是多少
#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;
}
#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;
}
…………