// The following is the installation class
/*Inspkgcls.h*//
#include
#define my_dll_name _t ("spidll.dll") # Define my_dll_path _t ("// spidl.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
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 (HKEY, DWINDEX, SSUBKKEY, 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); (! RegSetValueEx (hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize) = ERROR_SUCCESS) if 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 && DewType == 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, SSUBKKEY) == Error_Success) Return True; Else Return False;} HKEY HSUBKEY;
IF (RegopenKeyex (HKEY, SSUBKEY, 0, Key_all_access, & hsubkey! = error_success) Return False;
__Try {if (HsubkeyValue (Hsubkey, Sitem) == Error_Success) Return True;} __finally {regclosekey (hsubkey);
Return false;} // -------------------------------------------------------------------------------------------------------- --------------------------------
// ________________________________________ ////
// The following is the installation code
/*Main.cpp*//
#include
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 , "Install Successful", "Tips", MB_OK;} else {m_install.uninstall (); deletefile (sysdir);} return 0;}