From 75a38acd5c2a1e0abd08d3458d36a452dfd0879a Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 31 Aug 2016 12:06:15 +0000 Subject: memory allocation problem git-svn-id: http://svn.miranda-ng.org/main/trunk@17225 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/AssocMgr/src/assoclist.cpp | 9 +- plugins/AssocMgr/src/reg.cpp | 1176 ++++++++++++++++++------------------ plugins/AssocMgr/src/reg.h | 11 +- 3 files changed, 598 insertions(+), 598 deletions(-) (limited to 'plugins') diff --git a/plugins/AssocMgr/src/assoclist.cpp b/plugins/AssocMgr/src/assoclist.cpp index d50b40b464..698b13d6fa 100644 --- a/plugins/AssocMgr/src/assoclist.cpp +++ b/plugins/AssocMgr/src/assoclist.cpp @@ -1,4 +1,4 @@ -/* +1027/* 'File Association Manager'-Plugin for Miranda IM @@ -1025,15 +1025,14 @@ void UninitAssocList(void) // unregister open-with app if (fOnlyWhileRunning) { - wchar_t *pszAppFileName; // miranda32.exe - pszAppFileName = MakeAppFileName(TRUE); + ptrW pszAppFileName(MakeAppFileName(TRUE)); if (pszAppFileName != NULL) RemoveRegOpenWith(pszAppFileName); - pszAppFileName = MakeAppFileName(FALSE); + // assocmgr.dll + pszAppFileName = MakeAppFileName(FALSE); if (pszAppFileName != NULL) RemoveRegOpenWith(pszAppFileName); - mir_free(pszAppFileName); // does NULL check } } diff --git a/plugins/AssocMgr/src/reg.cpp b/plugins/AssocMgr/src/reg.cpp index 84d1705f63..2c7789bb60 100644 --- a/plugins/AssocMgr/src/reg.cpp +++ b/plugins/AssocMgr/src/reg.cpp @@ -24,19 +24,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern HINSTANCE hInst; #ifdef _DEBUG -/* Debug: Ensure all registry calls do succeed and have valid parameters. - * Shows a details message box otherwise. */ +// Debug: Ensure all registry calls do succeed and have valid parameters. +// Shows a details message box otherwise. static __inline LONG regchk(LONG res, const char *pszFunc, const void *pszInfo, BOOL fInfoUnicode, const char *pszFile, unsigned int nLine) { if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND && res != ERROR_NO_MORE_ITEMS) { wchar_t szMsg[1024], *pszInfo2; char *pszErr; pszErr = GetWinErrorDescription(res); - pszInfo2 = s2t(pszInfo, fInfoUnicode, FALSE); /* does NULL check */ + pszInfo2 = s2t(pszInfo, fInfoUnicode, FALSE); // does NULL check mir_snwprintf(szMsg, TranslateT("Access failed:\n%.64hs(%.128s)\n%.250hs(%u)\n%.256hs (%u)"), pszFunc, pszInfo2, pszFile, nLine, pszErr, res); MessageBox(NULL, szMsg, TranslateT("Registry warning"), MB_OK | MB_ICONINFORMATION | MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL); if (pszErr != NULL) LocalFree(pszErr); - mir_free(pszInfo2); /* does NULL check */ + mir_free(pszInfo2); // does NULL check } return res; } @@ -96,62 +96,62 @@ static __inline LONG regchk(LONG res, const char *pszFunc, const void *pszInfo, /************************* Strings ********************************/ // mir_free() the return value -char *MakeFileClassName(const char *pszFileExt) +char* MakeFileClassName(const char *pszFileExt) { - size_t cbLen = mir_strlen(pszFileExt)+12; + size_t cbLen = mir_strlen(pszFileExt) + 12; char *pszClass = (char*)mir_alloc(cbLen); if (pszClass != NULL) - /* using correctly formated PROGID */ - mir_snprintf(pszClass, cbLen, "miranda%sfile", pszFileExt); /* includes dot, buffer safe */ + // using correctly formated PROGID + mir_snprintf(pszClass, cbLen, "miranda%sfile", pszFileExt); // includes dot, buffer safe return pszClass; } // mir_free() the return value -char *MakeUrlClassName(const char *pszUrl) +char* MakeUrlClassName(const char *pszUrl) { char *pszClass = mir_strdup(pszUrl); if (pszClass != NULL) - /* remove trailing : */ - pszClass[mir_strlen(pszClass)-1]=0; + // remove trailing : + pszClass[mir_strlen(pszClass) - 1] = 0; return pszClass; } static BOOL IsFileClassName(char *pszClassName, char **ppszFileExt) { - *ppszFileExt = strchr(pszClassName,'.'); - return *ppszFileExt!=NULL; + *ppszFileExt = strchr(pszClassName, '.'); + return *ppszFileExt != NULL; } // mir_free() the return value -wchar_t *MakeRunCommand(BOOL fMirExe,BOOL fFixedDbProfile) +wchar_t* MakeRunCommand(BOOL fMirExe, BOOL fFixedDbProfile) { wchar_t szDbFile[MAX_PATH], szExe[MAX_PATH], *pszFmt; if (fFixedDbProfile) { - if ( CallService(MS_DB_GETPROFILENAMEW, _countof(szDbFile), (LPARAM)szDbFile)) + if (CallService(MS_DB_GETPROFILENAMEW, _countof(szDbFile), (LPARAM)szDbFile)) return NULL; wchar_t *p = wcsrchr(szDbFile, '.'); if (p) *p = 0; } - else mir_wstrcpy(szDbFile, L"%1"); /* buffer safe */ + else mir_wstrcpy(szDbFile, L"%1"); // buffer safe - if ( !GetModuleFileName(fMirExe ? NULL : hInst, szExe, _countof(szExe))) + if (!GetModuleFileName(fMirExe ? NULL : hInst, szExe, _countof(szExe))) return NULL; if (fMirExe) - /* run command for miranda32.exe */ - pszFmt = L"\"%s\" \"/profile:%s\""; + // run command for miranda32.exe + pszFmt = L"\"%s\" \"/profile:%s\""; else { - /* run command for rundll32.exe calling WaitForDDE */ + // run command for rundll32.exe calling WaitForDDE pszFmt = L"rundll32.exe %s,WaitForDDE \"/profile:%s\""; - /* ensure the command line is not too long */ + // ensure the command line is not too long GetShortPathName(szExe, szExe, _countof(szExe)); - /* surround by quotes if failed */ + // surround by quotes if failed size_t len = mir_wstrlen(szExe); - if ( wcschr(szExe,' ') != NULL && (len+2) < _countof(szExe)) { - memmove(szExe, szExe+1, (len+1)*sizeof(wchar_t)); - szExe[len+2] = szExe[0] = '\"'; - szExe[len+3] = 0; + if (wcschr(szExe, ' ') != NULL && (len + 2) < _countof(szExe)) { + memmove(szExe, szExe + 1, (len + 1) * sizeof(wchar_t)); + szExe[len + 2] = szExe[0] = '\"'; + szExe[len + 3] = 0; } } @@ -162,60 +162,62 @@ wchar_t *MakeRunCommand(BOOL fMirExe,BOOL fFixedDbProfile) static BOOL IsValidRunCommand(const wchar_t *pszRunCmd) { - wchar_t *buf,*pexe,*pargs; - wchar_t szFullExe[MAX_PATH],*pszFilePart; - buf=mir_wstrcpy((wchar_t*)_alloca((mir_wstrlen(pszRunCmd)+1)*sizeof(wchar_t)),pszRunCmd); - /* split into executable path and arguments */ - if (buf[0]=='\"') { - pargs=wcschr(&buf[1],'\"'); - if (pargs!=NULL) *(pargs++)=0; - pexe=&buf[1]; - if (*pargs==' ') ++pargs; - } else { - pargs=wcschr(buf,' '); - if (pargs!=NULL) *pargs=0; - pexe=buf; + wchar_t *pexe, *pargs; + wchar_t szFullExe[MAX_PATH], *pszFilePart; + wchar_t *buf = mir_wstrcpy((wchar_t*)_alloca((mir_wstrlen(pszRunCmd) + 1) * sizeof(wchar_t)), pszRunCmd); + // split into executable path and arguments + if (buf[0] == '\"') { + pargs = wcschr(&buf[1], '\"'); + if (pargs != NULL) *(pargs++) = 0; + pexe = &buf[1]; + if (*pargs == ' ') ++pargs; } - if (SearchPath(NULL,pexe,L".exe",_countof(szFullExe),szFullExe,&pszFilePart)) { - if (pszFilePart!=NULL) - if (!mir_wstrcmpi(pszFilePart,L"rundll32.exe") || !mir_wstrcmpi(pszFilePart,L"rundll.exe")) { - /* split into dll path and arguments */ - if (pargs[0]=='\"') { + else { + pargs = wcschr(buf, ' '); + if (pargs != NULL) *pargs = 0; + pexe = buf; + } + if (SearchPath(NULL, pexe, L".exe", _countof(szFullExe), szFullExe, &pszFilePart)) { + if (pszFilePart != NULL) + if (!mir_wstrcmpi(pszFilePart, L"rundll32.exe") || !mir_wstrcmpi(pszFilePart, L"rundll.exe")) { + // split into dll path and arguments + if (pargs[0] == '\"') { ++pargs; - pexe=wcschr(&pargs[1],'\"'); - if (pexe!=NULL) *pexe=0; - } else { - pexe=wcschr(pargs,','); - if (pexe!=NULL) *pexe=0; + pexe = wcschr(&pargs[1], '\"'); + if (pexe != NULL) *pexe = 0; + } + else { + pexe = wcschr(pargs, ','); + if (pexe != NULL) *pexe = 0; } - return SearchPath(NULL,pargs,L".dll",0,NULL,NULL)!=0; + return SearchPath(NULL, pargs, L".dll", 0, NULL, NULL) != 0; } - return TRUE; + return TRUE; } return FALSE; } // mir_free() the return value -wchar_t *MakeIconLocation(HMODULE hModule,WORD nIconResID) +wchar_t* MakeIconLocation(HMODULE hModule, WORD nIconResID) { - wchar_t szModule[MAX_PATH],*pszIconLoc=NULL; + wchar_t szModule[MAX_PATH], *pszIconLoc = NULL; int cch; - if ((cch=GetModuleFileName(hModule,szModule,_countof(szModule))) != 0) { - pszIconLoc=(wchar_t*)mir_alloc((cch+=8)*sizeof(wchar_t)); - if (pszIconLoc!=NULL) - mir_snwprintf(pszIconLoc, cch, L"%s,%i", szModule, -(int)nIconResID); /* id may be 0, buffer safe */ + if ((cch = GetModuleFileName(hModule, szModule, _countof(szModule))) != 0) { + pszIconLoc = (wchar_t*)mir_alloc((cch += 8) * sizeof(wchar_t)); + if (pszIconLoc != NULL) + mir_snwprintf(pszIconLoc, cch, L"%s,%i", szModule, -(int)nIconResID); // id may be 0, buffer safe } return pszIconLoc; } // mir_free() the return value -wchar_t *MakeAppFileName(BOOL fMirExe) +wchar_t* MakeAppFileName(BOOL fMirExe) { - wchar_t szExe[MAX_PATH],*psz; - if (GetModuleFileName(fMirExe?NULL:hInst,szExe,_countof(szExe))) { - psz=wcsrchr(szExe,'\\'); - if (psz!=NULL) ++psz; - else psz=szExe; + wchar_t szExe[MAX_PATH], *psz; + if (GetModuleFileName(fMirExe ? NULL : hInst, szExe, _countof(szExe))) { + psz = wcsrchr(szExe, '\\'); + if (psz != NULL) ++psz; + else psz = szExe; return mir_wstrdup(psz); } return NULL; @@ -223,73 +225,73 @@ wchar_t *MakeAppFileName(BOOL fMirExe) /************************* Helpers ********************************/ -static LONG DeleteRegSubTree(HKEY hKey,const wchar_t *pszSubKey) +static LONG DeleteRegSubTree(HKEY hKey, const wchar_t *pszSubKey) { LONG res; - DWORD nMaxSubKeyLen,cchSubKey; + DWORD nMaxSubKeyLen, cchSubKey; wchar_t *pszSubKeyBuf; HKEY hSubKey; - if ((res=RegOpenKeyEx(hKey,pszSubKey,0,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS|DELETE,&hSubKey))==ERROR_SUCCESS) { - if ((res=RegQueryInfoKey(hSubKey,NULL,NULL,NULL,NULL,&nMaxSubKeyLen,NULL,NULL,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) { - pszSubKeyBuf=(wchar_t*)mir_alloc((nMaxSubKeyLen+1)*sizeof(wchar_t)); - if (pszSubKeyBuf==NULL) res=ERROR_NOT_ENOUGH_MEMORY; - while(!res) { - cchSubKey=nMaxSubKeyLen+1; - if ((res=RegEnumKeyEx(hSubKey,0,pszSubKeyBuf,&cchSubKey,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) - res=DeleteRegSubTree(hSubKey,pszSubKeyBuf); /* recursion */ + if ((res = RegOpenKeyEx(hKey, pszSubKey, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | DELETE, &hSubKey)) == ERROR_SUCCESS) { + if ((res = RegQueryInfoKey(hSubKey, NULL, NULL, NULL, NULL, &nMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS) { + pszSubKeyBuf = (wchar_t*)mir_alloc((nMaxSubKeyLen + 1) * sizeof(wchar_t)); + if (pszSubKeyBuf == NULL) res = ERROR_NOT_ENOUGH_MEMORY; + while (!res) { + cchSubKey = nMaxSubKeyLen + 1; + if ((res = RegEnumKeyEx(hSubKey, 0, pszSubKeyBuf, &cchSubKey, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS) + res = DeleteRegSubTree(hSubKey, pszSubKeyBuf); // recursion } - mir_free(pszSubKeyBuf); /* does NULL check */ - if (res==ERROR_NO_MORE_ITEMS) res=ERROR_SUCCESS; + mir_free(pszSubKeyBuf); // does NULL check + if (res == ERROR_NO_MORE_ITEMS) res = ERROR_SUCCESS; } RegCloseKey(hSubKey); } - if (!res) res=RegDeleteKey(hKey,pszSubKey); + if (!res) res = RegDeleteKey(hKey, pszSubKey); return res; } // hMainKey must have been opened with KEY_CREATE_SUB_KEY access right -static LONG SetRegSubKeyStrDefValue(HKEY hMainKey,const wchar_t *pszSubKey,const wchar_t *pszVal) +static LONG SetRegSubKeyStrDefValue(HKEY hMainKey, const wchar_t *pszSubKey, const wchar_t *pszVal) { HKEY hSubKey; - LONG res=RegCreateKeyEx(hMainKey,pszSubKey,0,NULL,0,KEY_SET_VALUE|KEY_QUERY_VALUE,NULL,&hSubKey,NULL); + LONG res = RegCreateKeyEx(hMainKey, pszSubKey, 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE, NULL, &hSubKey, NULL); if (!res) { - res=RegSetValueEx(hSubKey,NULL,0,REG_SZ,(BYTE*)pszVal,(int)(mir_wstrlen(pszVal)+1)*sizeof(wchar_t)); + res = RegSetValueEx(hSubKey, NULL, 0, REG_SZ, (BYTE*)pszVal, (int)(mir_wstrlen(pszVal) + 1) * sizeof(wchar_t)); RegCloseKey(hSubKey); } return res; } // hKey must have been opened with KEY_SET_VALUE access right -static void SetRegStrPrefixValue(HKEY hKey,const wchar_t *pszValPrefix,const wchar_t *pszVal) +static void SetRegStrPrefixValue(HKEY hKey, const wchar_t *pszValPrefix, const wchar_t *pszVal) { - size_t dwSize = (mir_wstrlen(pszVal)+mir_wstrlen(pszValPrefix)+1)*sizeof(wchar_t); + size_t dwSize = (mir_wstrlen(pszVal) + mir_wstrlen(pszValPrefix) + 1) * sizeof(wchar_t); wchar_t *pszStr = (wchar_t*)_alloca(dwSize); - mir_wstrcat(mir_wstrcpy(pszStr, pszValPrefix), pszVal); /* buffer safe */ + mir_wstrcat(mir_wstrcpy(pszStr, pszValPrefix), pszVal); // buffer safe RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)pszStr, (int)dwSize); } // hKey must have been opened with KEY_QUERY_VALUE access right // mir_free() the return value -static wchar_t *GetRegStrValue(HKEY hKey,const wchar_t *pszValName) +static wchar_t* GetRegStrValue(HKEY hKey, const wchar_t *pszValName) { - wchar_t *pszVal,*pszVal2; - DWORD dwSize,dwType; - /* get size */ - if (!RegQueryValueEx(hKey,pszValName,NULL,NULL,NULL,&dwSize) && dwSize>sizeof(wchar_t)) { - pszVal=(wchar_t*)mir_alloc(dwSize+sizeof(wchar_t)); - if (pszVal!=NULL) { - /* get value */ - if (!RegQueryValueEx(hKey,pszValName,NULL,&dwType,(BYTE*)pszVal,&dwSize)) { - pszVal[dwSize/sizeof(wchar_t)]=0; - if (dwType==REG_EXPAND_SZ) { - dwSize=MAX_PATH; - pszVal2=(wchar_t*)mir_alloc(dwSize*sizeof(wchar_t)); - if (ExpandEnvironmentStrings(pszVal,pszVal2,dwSize)) { + // get size + DWORD dwSize, dwType; + if (!RegQueryValueEx(hKey, pszValName, NULL, NULL, NULL, &dwSize) && dwSize > sizeof(wchar_t)) { + wchar_t *pszVal = (wchar_t*)mir_alloc(dwSize + sizeof(wchar_t)); + if (pszVal != NULL) { + // get value + if (!RegQueryValueEx(hKey, pszValName, NULL, &dwType, (BYTE*)pszVal, &dwSize)) { + pszVal[dwSize / sizeof(wchar_t)] = 0; + if (dwType == REG_EXPAND_SZ) { + dwSize = MAX_PATH; + wchar_t *pszVal2 = (wchar_t*)mir_alloc(dwSize * sizeof(wchar_t)); + if (ExpandEnvironmentStrings(pszVal, pszVal2, dwSize)) { mir_free(pszVal); return pszVal2; } mir_free(pszVal2); - } else if (dwType==REG_SZ) + } + else if (dwType == REG_SZ) return pszVal; } mir_free(pszVal); @@ -299,28 +301,28 @@ static wchar_t *GetRegStrValue(HKEY hKey,const wchar_t *pszValName) } // hKey must have been opened with KEY_QUERY_VALUE access right -static BOOL IsRegStrValue(HKEY hKey,const wchar_t *pszValName,const wchar_t *pszCmpVal) +static BOOL IsRegStrValue(HKEY hKey, const wchar_t *pszValName, const wchar_t *pszCmpVal) { - BOOL fSame=FALSE; - wchar_t *pszVal=GetRegStrValue(hKey,pszValName); - if (pszVal!=NULL) { - fSame=!mir_wstrcmp(pszVal,pszCmpVal); + BOOL fSame = FALSE; + wchar_t *pszVal = GetRegStrValue(hKey, pszValName); + if (pszVal != NULL) { + fSame = !mir_wstrcmp(pszVal, pszCmpVal); mir_free(pszVal); } return fSame; } // hKey must have been opened with KEY_QUERY_VALUE access right -static BOOL IsRegStrValueA(HKEY hKey,const wchar_t *pszValName,const char *pszCmpVal) +static BOOL IsRegStrValueA(HKEY hKey, const wchar_t *pszValName, const char *pszCmpVal) { - BOOL fSame=FALSE; + BOOL fSame = FALSE; char *pszValA; - wchar_t *pszVal=GetRegStrValue(hKey,pszValName); - if (pszVal!=NULL) { - pszValA=t2a(pszVal); - if (pszValA!=NULL) - fSame=!mir_strcmp(pszValA,pszCmpVal); - mir_free(pszValA); /* does NULL check */ + wchar_t *pszVal = GetRegStrValue(hKey, pszValName); + if (pszVal != NULL) { + pszValA = t2a(pszVal); + if (pszValA != NULL) + fSame = !mir_strcmp(pszValA, pszCmpVal); + mir_free(pszValA); // does NULL check mir_free(pszVal); } return fSame; @@ -328,31 +330,31 @@ static BOOL IsRegStrValueA(HKEY hKey,const wchar_t *pszValName,const char *pszCm /************************* Backup to DB ***************************/ -#define REGF_ANSI 0x80000000 /* this bit is set in dwType for ANSI registry data */ +#define REGF_ANSI 0x80000000 // this bit is set in dwType for ANSI registry data // pData must always be Unicode data, registry supports Unicode even on Win95 -static void WriteDbBackupData(const char *pszSetting,DWORD dwType,BYTE *pData,DWORD cbData) +static void WriteDbBackupData(const char *pszSetting, DWORD dwType, BYTE *pData, DWORD cbData) { size_t cbLen = cbData + sizeof(DWORD); PBYTE buf = (PBYTE)mir_alloc(cbLen); if (buf) { *(DWORD*)buf = dwType; - memcpy(buf+sizeof(DWORD), pData, cbData); + memcpy(buf + sizeof(DWORD), pData, cbData); db_set_blob(NULL, "AssocMgr", pszSetting, buf, (unsigned)cbLen); mir_free(buf); } } // mir_free() the value returned in ppData -static BOOL ReadDbBackupData(const char *pszSetting,DWORD *pdwType,BYTE **ppData,DWORD *pcbData) +static BOOL ReadDbBackupData(const char *pszSetting, DWORD *pdwType, BYTE **ppData, DWORD *pcbData) { DBVARIANT dbv; if (!db_get(0, "AssocMgr", pszSetting, &dbv)) { - if (dbv.type==DBVT_BLOB && dbv.cpbVal>=sizeof(DWORD)) { - *pdwType=*(DWORD*)dbv.pbVal; - *ppData=dbv.pbVal; - *pcbData=dbv.cpbVal-sizeof(DWORD); - memmove(*ppData,*ppData+sizeof(DWORD),*pcbData); + if (dbv.type == DBVT_BLOB && dbv.cpbVal >= sizeof(DWORD)) { + *pdwType = *(DWORD*)dbv.pbVal; + *ppData = dbv.pbVal; + *pcbData = dbv.cpbVal - sizeof(DWORD); + memmove(*ppData, *ppData + sizeof(DWORD), *pcbData); return TRUE; } db_free(&dbv); @@ -360,74 +362,69 @@ static BOOL ReadDbBackupData(const char *pszSetting,DWORD *pdwType,BYTE **ppData return FALSE; } -struct BackupRegTreeParam { +struct BackupRegTreeParam +{ char **ppszDbPrefix; DWORD *pdwDbPrefixSize; int level; }; -static void BackupRegTree_Worker(HKEY hKey,const char *pszSubKey,struct BackupRegTreeParam *param) +static void BackupRegTree_Worker(HKEY hKey, const char *pszSubKey, struct BackupRegTreeParam *param) { LONG res; - DWORD nMaxSubKeyLen,nMaxValNameLen,nMaxValSize; - DWORD index,cchName,dwType,cbData; - BYTE *pData; + DWORD nMaxSubKeyLen, nMaxValNameLen, nMaxValSize; + DWORD cchName, dwType, cbData; char *pszName; - register wchar_t *ptszName; DWORD nDbPrefixLen; - if ((res=RegOpenKeyExA(hKey,pszSubKey,0,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS,&hKey))==ERROR_SUCCESS) { - if ((res=RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,&nMaxSubKeyLen,NULL,NULL,&nMaxValNameLen,&nMaxValSize,NULL,NULL))==ERROR_SUCCESS) { - if (nMaxSubKeyLen>nMaxValNameLen) nMaxValNameLen=nMaxSubKeyLen; - /* prepare buffer */ + if ((res = RegOpenKeyExA(hKey, pszSubKey, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hKey)) == ERROR_SUCCESS) { + if ((res = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &nMaxSubKeyLen, NULL, NULL, &nMaxValNameLen, &nMaxValSize, NULL, NULL)) == ERROR_SUCCESS) { + if (nMaxSubKeyLen > nMaxValNameLen) nMaxValNameLen = nMaxSubKeyLen; + // prepare buffer nDbPrefixLen = (DWORD)(mir_strlen(*param->ppszDbPrefix) + mir_strlen(pszSubKey) + 1); cchName = nDbPrefixLen + nMaxValNameLen + 3; - if (cchName>*param->pdwDbPrefixSize) { - pszName=(char*)mir_realloc(*param->ppszDbPrefix,cchName); - if (pszName==NULL) return; - *param->ppszDbPrefix=pszName; - *param->pdwDbPrefixSize=cchName; + if (cchName > *param->pdwDbPrefixSize) { + pszName = (char*)mir_realloc(*param->ppszDbPrefix, cchName); + if (pszName == NULL) return; + *param->ppszDbPrefix = pszName; + *param->pdwDbPrefixSize = cchName; } - mir_strcat(mir_strcat(*param->ppszDbPrefix,pszSubKey),"\\"); /* buffer safe */ - /* enum values */ - pszName=(char*)mir_alloc(nMaxValNameLen+1); - if (nMaxValSize==0) nMaxValSize=1; - pData=(BYTE*)mir_alloc(nMaxValSize); - if (pszName!=NULL && pData!=NULL) { - index=0; - while(!res) { - cchName=nMaxValNameLen+1; - cbData=nMaxValSize; - if ((res=RegEnumValueA(hKey,index++,pszName,&cchName,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) { - (*param->ppszDbPrefix)[nDbPrefixLen]=0; - mir_strcat(*param->ppszDbPrefix,pszName); /* buffer safe */ - ptszName=a2t(pszName); - if (ptszName!=NULL) { - if (!RegQueryValueEx(hKey,ptszName,NULL,&dwType,pData,&cbData)) { - - WriteDbBackupData(*param->ppszDbPrefix,dwType,pData,cbData); - - } - mir_free(ptszName); - } + mir_strcat(mir_strcat(*param->ppszDbPrefix, pszSubKey), "\\"); // buffer safe + // enum values + pszName = (char*)mir_alloc(nMaxValNameLen + 1); + if (nMaxValSize == 0) nMaxValSize = 1; + BYTE *pData = (BYTE*)mir_alloc(nMaxValSize); + if (pszName != NULL && pData != NULL) { + DWORD index = 0; + while (!res) { + cchName = nMaxValNameLen + 1; + cbData = nMaxValSize; + if ((res = RegEnumValueA(hKey, index++, pszName, &cchName, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS) { + (*param->ppszDbPrefix)[nDbPrefixLen] = 0; + mir_strcat(*param->ppszDbPrefix, pszName); // buffer safe + ptrW ptszName(a2t(pszName)); + if (ptszName != NULL) + if (!RegQueryValueEx(hKey, ptszName, NULL, &dwType, pData, &cbData)) + WriteDbBackupData(*param->ppszDbPrefix, dwType, pData, cbData); } } - if (res==ERROR_NO_MORE_ITEMS) res=ERROR_SUCCESS; + if (res == ERROR_NO_MORE_ITEMS) + res = ERROR_SUCCESS; } - mir_free(pData); /* does NULL check */ - /* enum subkeys */ - if (param->level<32 && pszName!=NULL) { - ++param->level; /* can be max 32 levels deep (after prefix), restriction of RegCreateKeyEx() */ - index=0; - while(!res) { - cchName=nMaxSubKeyLen+1; - if ((res=RegEnumKeyExA(hKey,index++,pszName,&cchName,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) { - (*param->ppszDbPrefix)[nDbPrefixLen]=0; - BackupRegTree_Worker(hKey,pszName,param); /* recursion */ + mir_free(pData); // does NULL check + // enum subkeys + if (param->level < 32 && pszName != NULL) { + ++param->level; // can be max 32 levels deep (after prefix), restriction of RegCreateKeyEx() + DWORD index = 0; + while (!res) { + cchName = nMaxSubKeyLen + 1; + if ((res = RegEnumKeyExA(hKey, index++, pszName, &cchName, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS) { + (*param->ppszDbPrefix)[nDbPrefixLen] = 0; + BackupRegTree_Worker(hKey, pszName, param); // recursion } } } - if (res==ERROR_NO_MORE_ITEMS) res=ERROR_SUCCESS; - mir_free(pszName); /* does NULL check */ + if (res == ERROR_NO_MORE_ITEMS) res = ERROR_SUCCESS; + mir_free(pszName); // does NULL check } RegCloseKey(hKey); } @@ -446,55 +443,53 @@ static void BackupRegTree(HKEY hKey, const char *pszSubKey, const char *pszDbPre mir_free(prefix); } -static LONG RestoreRegTree(HKEY hKey,const char *pszSubKey,const char *pszDbPrefix) +static LONG RestoreRegTree(HKEY hKey, const char *pszSubKey, const char *pszDbPrefix) { - char **ppszSettings,*pszSuffix; - int nSettingsCount,i; - char *pslash=NULL,*pnext,*pkeys; - char *pszValName; - WCHAR *pwszValName; - HKEY hSubKey; - DWORD dwType,cbData; - BYTE *pData; - int nDbPrefixLen = (int)mir_strlen(pszDbPrefix); int nPrefixWithSubKeyLen = nDbPrefixLen + (int)mir_strlen(pszSubKey) + 1; - char *pszPrefixWithSubKey = (char*)mir_alloc(nPrefixWithSubKeyLen+1); + char *pszPrefixWithSubKey = (char*)mir_alloc(nPrefixWithSubKeyLen + 1); if (pszPrefixWithSubKey == NULL) return ERROR_OUTOFMEMORY; - - mir_strcat(mir_strcat(mir_strcpy(pszPrefixWithSubKey,pszDbPrefix),pszSubKey),"\\"); /* buffer safe */ - LONG res=ERROR_NO_MORE_ITEMS; - if (pszPrefixWithSubKey!=NULL) { - if (EnumDbPrefixSettings("AssocMgr",pszPrefixWithSubKey,&ppszSettings,&nSettingsCount)) { - for(i=0;i