wineboot: Basic RunOnceEx support
Dmitry Timoshkov
dmitry at codeweavers.com
Wed Sep 3 22:29:06 CDT 2008
"Johan Dahlin" <jdahlin at gmail.com> wrote:
> +typedef HRESULT (*DLLREGISTER) (void);
> +typedef HRESULT (*DLLINSTALL) (BOOL,LPCWSTR);
Wrong calling convention.
> +static int RunDllRegisterServer(WCHAR* strDll)
> +{
> + DLLREGISTER pfRegister = NULL;
> + HRESULT hr;
> + HMODULE DllHandle = NULL;
> +
> + pfRegister = LoadProc(strDll, "DllRegisterServer", &DllHandle);
> +
> + if (!pfRegister)
> + return -1;
If you've decided to return an HRESULT then use something more appropriate
here instead of -1.
> + hr = pfRegister();
> +
> + if(DllHandle)
> + FreeLibrary(DllHandle);
'if(DllHandle)' check above is redundant.
> +
> + return hr;
> +}
If you are returning an HRESULT then use an appropriate return type for
the function.
> +static HRESULT RunDllInstall(WCHAR *strDll, BOOL install, WCHAR *command_line)
> +{
> + DLLINSTALL pfInstall = NULL;
> + HRESULT hr;
> + HMODULE DllHandle = NULL;
> +
> + pfInstall = LoadProc(strDll, "DllInstall", &DllHandle);
> +
> + if (!pfInstall)
> + return -1;
Same as above.
> + hr = pfInstall(install, command_line);
> +
> + if(DllHandle)
> + FreeLibrary(DllHandle);
Same as above.
> +static BOOL ProcessRunOnceExKey(HKEY hkRunEntry)
> +{
> + DWORD i;
> + DWORD res;
> + DWORD nMaxCmdLine=0, nMaxValue=0;
> + WCHAR *szCmdLine=NULL;
> + WCHAR *szValue=NULL;
> + static const WCHAR KEY_DLLREGISTERSERVER[]={
> + 'D','l','l','R','e','g','i','s','t','e','r','S','e','r','v','e','r',0};
> + static const WCHAR KEY_DLLINSTALL[]={
> + 'D','l','l','I','n','s','t','a','l','l',0};
> +
> + if( (res=RegQueryInfoKeyW( hkRunEntry, NULL, NULL, NULL, NULL, NULL, NULL, &i, &nMaxValue,
> + &nMaxCmdLine, NULL, NULL ))!=ERROR_SUCCESS )
> + goto end;
Why not 'return' isntead of 'goto'?
> + if( (szCmdLine=HeapAlloc(GetProcessHeap(),0,nMaxCmdLine))==NULL )
> + {
> + WINE_ERR("Couldn't allocate memory for the commands to be executed\n");
> +
> + res=ERROR_NOT_ENOUGH_MEMORY;
> + goto end;
> + }
Same here.
> + if( (szValue=HeapAlloc(GetProcessHeap(),0,(++nMaxValue)*sizeof(*szValue)))==NULL )
> + {
> + WINE_ERR("Couldn't allocate memory for the value names\n");
> +
> + res=ERROR_NOT_ENOUGH_MEMORY;
> + goto end;
> + }
> +
> + while( i>0 )
> + {
> + DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine;
> + DWORD type;
> + WCHAR *first, *second, *third; /* | separated parts of the entry */
> + WCHAR pipe[] = {'|',0};
> + i--;
> +
> + if( (res=RegEnumValueW( hkRunEntry, i, szValue, &nValLength, 0, &type,
> + (LPBYTE)szCmdLine, &nDataLength ))!=ERROR_SUCCESS )
> + {
> + WINE_ERR("Couldn't read in value %d - %d\n", i, res );
> + break;
> + }
> +
> + if (strlenW(szValue) == 0)
> + {
> + WINE_TRACE("Processing %s entries\n", wine_dbgstr_w( szCmdLine ));
> + continue;
> + }
> +
> + if( type!=REG_SZ )
> + {
> + WINE_ERR("Incorrect type of value #%d (%d)\n", i, type );
> + continue;
> + }
> +
> + if( (res=RegDeleteValueW( hkRunEntry, szValue ))!=ERROR_SUCCESS )
> + {
> + WINE_ERR("Couldn't delete value - %d, %d. Running command anyways.\n", i, res );
> + }
> +
> + if ((first = strstrW(szCmdLine, pipe)) != NULL)
> + {
> + WCHAR *value = first + strlenW(pipe);
> + HRESULT retval;
> + if (strncmpW(value, KEY_DLLREGISTERSERVER,
> + strlenW(KEY_DLLREGISTERSERVER)) == 0)
> + {
> + DWORD len;
> + WCHAR *cmd;
> + len = strlenW(szCmdLine) - strlenW(first) + strlenW(pipe);
> + cmd = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * len);
> + if (cmd == NULL)
> + goto end;
> +
> + if (lstrcpynW(cmd, szCmdLine, len))
> + {
> + WINE_TRACE("DllRegisterServer %s\n", wine_dbgstr_w(cmd));
> + retval = RunDllRegisterServer(cmd);
> + WINE_TRACE("DllRegisterServer returned %d\n", retval);
> + }
> + HeapFree(GetProcessHeap(), 0, cmd);
> + }
> + else if (strncmpW(value, KEY_DLLINSTALL,
> + strlenW(KEY_DLLINSTALL)) == 0)
> + {
> + WCHAR *filename, *arg = NULL;
> + WCHAR install = FALSE;
> + HRESULT retval;
> + DWORD filenameLength, argLength;
> +
> + /* filename|DllInstall
> + * filename|DllInstall|i,arg
> + * filename|DllInstall|I,arg
> + * FIXME: is i=FALSE,I=TRUE or the reverse?
> + */
> + second = strstrW(first + strlenW(pipe), pipe);
> + if (second == NULL)
> + filenameLength = strlenW(szCmdLine) - strlenW(first) + strlenW(pipe);
> + else if ((third = strstrW(second, pipe)) != NULL)
> + {
> + filenameLength = strlenW(szCmdLine) - strlenW(first) + strlenW(pipe);
> + install = *(second + strlenW(pipe));
> +
> + argLength = strlenW(third) - strlenW(pipe) - 1;
> + filename = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * argLength);
> + lstrcpynW(arg, third + strlenW(pipe) + 2, argLength);
> + }
> +
> + filename = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * filenameLength);
> + lstrcpynW(filename, szCmdLine, filenameLength);
> +
> + WINE_TRACE("DllInstall (%s, %d, %s)\n",
> + wine_dbgstr_w(filename),
> + install == 'i',
> + wine_dbgstr_w(arg));
> + retval = RunDllInstall(filename, install == 'i', arg);
> + WINE_TRACE("DllInstall returned %d\n", retval);
> + HeapFree( GetProcessHeap(), 0, filename );
> + if (arg)
> + HeapFree( GetProcessHeap(), 0, arg );
> + }
> + } else {
> + if( (res=runCmd(szCmdLine, NULL, TRUE, FALSE ))==INVALID_RUNCMD_RETURN )
> + {
> + WINE_ERR("Error running cmd #%d (%d)\n", i, GetLastError() );
> + }
> + }
> + }
> + end:
> + HeapFree( GetProcessHeap(), 0, szValue );
> + HeapFree( GetProcessHeap(), 0, szCmdLine );
> +
> + return res;
> +}
You are returning 'res' while using 'retval' in some code paths.
--
Dmitry.
More information about the wine-devel
mailing list