/* 初始化全局变量 */ unsigned WINAPI init_global_env(void * pParam) { BOOL diff = read_appint(L"General", L"Nocompatete") > 0; if ( read_appkey(L"General",L"PortableDataPath",appdata_path,sizeof(appdata_path)) ) { /* 如果ini文件里的appdata设置路径为相对路径 */ if (appdata_path[1] != L':') { PathToCombineW(appdata_path,VALUE_LEN); } /* 处理localdata变量 */ if ( !read_appkey(L"Env",L"TmpDataPath",localdata_path,sizeof(appdata_path)) ) { wcsncpy(localdata_path,appdata_path,VALUE_LEN); } /* 修正相对路径问题 */ if (localdata_path[1] != L':') { PathToCombineW(localdata_path,VALUE_LEN); } /* 为appdata建立目录 */ charTochar(appdata_path); wcsncat(appdata_path,L"\\AppData",VALUE_LEN); SHCreateDirectoryExW(NULL,appdata_path,NULL); /* 为localdata建立目录 */ charTochar(localdata_path); wcsncat(localdata_path,L"\\LocalAppData\\Temp\\Fx",VALUE_LEN); SHCreateDirectoryExW(NULL,localdata_path,NULL); if ( diff ) { WaitWriteFile(appdata_path); } } return (unsigned)diff; }
BOOL PathToCombineW(LPWSTR lpfile, size_t str_len) { if ( dll_module && lpfile[1] != L':' ) { wchar_t buf_modname[VALUE_LEN+1] = {0}; charTochar(lpfile); if ( GetModuleFileNameW( dll_module, buf_modname, VALUE_LEN) > 0) { wchar_t tmp_path[MAX_PATH] = {0}; PathRemoveFileSpecW(buf_modname); if ( PathCombineW(tmp_path,buf_modname,lpfile) ) { int n = _snwprintf(lpfile,str_len,L"%ls",tmp_path); lpfile[n] = L'\0'; } } } return TRUE; }
BOOL PathToCombineW(LPWSTR lpfile, size_t str_len) { size_t n = 1; if ( lpfile[0] == L'%' ) { WCHAR buf_env[VALUE_LEN+1] = {0}; while ( lpfile[n] != L'\0' ) { if ( lpfile[n] == L'%' ) { break; } ++n; } if ( n < str_len ) { _snwprintf(buf_env, n+1 ,L"%ls", lpfile); } if ( wcslen(buf_env) > 1 && ExpandEnvironmentStringsW(buf_env,buf_env,VALUE_LEN) > 0 ) { WCHAR tmp_env[VALUE_LEN+1] = {0}; _snwprintf(tmp_env, str_len ,L"%ls%ls", buf_env, &lpfile[n+1]); n = _snwprintf(lpfile, str_len ,L"%ls", tmp_env); } } if ( lpfile[1] != L':' ) { WCHAR buf_modname[VALUE_LEN+1] = {0}; charTochar(lpfile); if ( GetModuleFileNameW( dll_module, buf_modname, VALUE_LEN) > 0) { WCHAR tmp_path[MAX_PATH] = {0}; PathRemoveFileSpecW(buf_modname); if ( PathCombineW(tmp_path,buf_modname,lpfile) ) { n = _snwprintf(lpfile,str_len,L"%ls",tmp_path); } } } return (n>0); }
/* 必须使用进程依赖crt的wputenv函数追加环境变量 */ unsigned WINAPI SetPluginPath(void * pParam) { typedef int (__cdecl *_pwrite_env)(LPCWSTR envstring); int ret = 0; HMODULE hCrt =NULL; _pwrite_env write_env = NULL; char msvc_crt[CRT_LEN+1] = {0}; LPWSTR lpstring; if ( !find_msvcrt(msvc_crt,CRT_LEN) ) { return (0); } if ( (hCrt = GetModuleHandleA(msvc_crt)) == NULL ) { return (0); } if ( profile_path[1] != L':' ) { if (!ini_ready(profile_path,MAX_PATH)) { return (0); } } write_env = (_pwrite_env)GetProcAddress(hCrt,"_wputenv"); if ( write_env == NULL ) { return (0); } if ( (lpstring = (LPWSTR)SYS_MALLOC(MAX_ENV_SIZE)) == NULL ) { return (0); } if ( (ret = GetPrivateProfileSectionW(L"Env", lpstring, MAX_ENV_SIZE-1, profile_path)) > 0 ) { LPWSTR strKey = lpstring; while(*strKey != L'\0') { if ( stristrW(strKey, L"NpluginPath") ) { WCHAR lpfile[VALUE_LEN+1]; if ( read_appkey(L"Env",L"NpluginPath",lpfile,sizeof(lpfile)) ) { WCHAR env_string[VALUE_LEN+1] = {0}; PathToCombineW(lpfile, VALUE_LEN); if ( _snwprintf(env_string,VALUE_LEN,L"%ls%ls",L"MOZ_PLUGIN_PATH=",lpfile) > 0) { ret = write_env( (LPCWSTR)env_string ); } } } else if ( stristrW(strKey, L"VimpPentaHome") ) { WCHAR lpfile[VALUE_LEN+1]; if ( read_appkey(L"Env",L"VimpPentaHome",lpfile,sizeof(lpfile)) ) { WCHAR env_string[VALUE_LEN+1] = {0}; if (lpfile[1] != L':') { WCHAR vimp_path[VALUE_LEN+1] = {0}; charTochar(lpfile); if ( PathCombineW(vimp_path,portable_data_path,lpfile) ) { int n = _snwprintf(lpfile,VALUE_LEN,L"%ls",vimp_path); lpfile[n] = L'\0'; } } if ( _snwprintf(env_string,VALUE_LEN,L"%ls%ls",L"HOME=",lpfile) > 0) { ret = write_env( (LPCWSTR)env_string ); } } } else if (stristrW(strKey, L"MOZ_GMP_PATH")) { WCHAR lpfile[VALUE_LEN+1]; if ( read_appkey(L"Env",L"MOZ_GMP_PATH",lpfile,sizeof(lpfile)) ) { WCHAR env_string[VALUE_LEN+1] = {0}; PathToCombineW(lpfile, VALUE_LEN); if ( _snwprintf(env_string,VALUE_LEN,L"%ls%ls",L"MOZ_GMP_PATH=",lpfile) > 0) { ret = write_env( (LPCWSTR)env_string ); } } } else if (stristrW(strKey, L"TmpDataPath")) { /* the PATH environment variable does not exist */ } else { ret = write_env( (LPCWSTR)strKey ); } strKey += wcslen(strKey)+1; } } SYS_FREE(lpstring); return (1); }