/* 初始化全局变量 */ 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; }
void set_hotkey(LPWNDINFO pInfo) { WCHAR lpstr[VALUE_LEN+1]; const WCHAR delim[] = L"+"; WCHAR tmp_stor[3][16] = { {0,0} }; pInfo->key_mod = 0x06; /* CONTROL+SHIFT 键 */ pInfo->key_vk = 0xc0; /* ~键 */ if ( read_appkey(L"attach",L"Hotkey",lpstr,sizeof(lpstr)) ) { int i = 0; LPWSTR p = lpstr; int tmp[3] = {0}; int num; LPWSTR strtmp = StrStrW(lpstr, delim); while( strtmp != NULL && i < 3 ) { strtmp[0]=L'\0'; wcsncpy(tmp_stor[i++],p,15); p = strtmp + wcslen(delim); strtmp = StrStrW( p, delim); if (!strtmp) { wcsncpy(tmp_stor[i],p,15); } } for ( num = 0 ; num <= i ; num++ ) { tmp[num] = StrToIntW(tmp_stor[num]); } if ( is_modkey(tmp[0]) ) { if ( (i==2) && is_modkey(tmp[1]) && !is_modkey(tmp[2]) ) { pInfo->key_mod = tmp[0]|tmp[1]; pInfo->key_vk = tmp[2]; } else if ( i==1 && tmp[1]>0x2f ) { pInfo->key_mod = tmp[0]; pInfo->key_vk = tmp[1]; } } } }
int WINAPI get_parameters(LPWSTR wdir, LPWSTR lpstrCmd, DWORD len) { int ret = -1; LPWSTR lp = NULL; WCHAR temp[VALUE_LEN+1] = {0}; WCHAR m_para[VALUE_LEN+1] = {0}; if ( read_appkey(L"attach",L"ExPath",temp,sizeof(temp)) ) { wdir[0] = L'\0'; lp = StrChrW(temp,L','); if (isdigit(temp[wcslen(temp)-1])&&lp) { ret = temp[wcslen(temp)-1] - L'0'; temp[lp-temp] = L'\0'; lp = StrChrW(temp,L' '); /* 如果第三方进程存在参数,工作目录设为浏览器主进程所在目录 */ if ( lp ) { temp[lp-temp] = L'\0'; _snwprintf(m_para,VALUE_LEN,L" "L"%ls",lp+1); if ( !GetCurrentWorkDir(wdir,len) ) { wdir[0] = L'\0'; } } _snwprintf(lpstrCmd,len,L"%ls",temp); if ( lpstrCmd[0] == L'.' || lpstrCmd[0] == L'%' ) { PathToCombineW(lpstrCmd,VALUE_LEN); } wcsncat(lpstrCmd,m_para,len); if ( wcslen(wdir) == 0 ) { _snwprintf(wdir,len,L"%ls",lpstrCmd); if ( !PathRemoveFileSpecW(wdir) ) { wdir[0] = L'\0'; } } } } return ret; }
/* 必须使用进程依赖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); }
/* 必须使用进程依赖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 ((unsigned)ret); } if ( (hCrt = GetModuleHandleA(msvc_crt)) == NULL ) { return ((unsigned)ret); } if ( profile_path[1] != L':' ) { if (!ini_ready(profile_path,MAX_PATH)) { return ((unsigned)ret); } } write_env = (_pwrite_env)GetProcAddress(hCrt,"_wputenv"); if ( write_env ) { if ( (lpstring = (LPWSTR)SYS_MALLOC(MAX_ENV_SIZE)) != NULL ) { 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"TmpDataPath")) { ; } else { ret = write_env( (LPCWSTR)strKey ); } strKey += wcslen(strKey)+1; } } SYS_FREE(lpstring); } } return ( (unsigned)ret ); }