00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "system.h"
00008 #include <windows.h>
00009 #include <shellapi.h>
00010 #include <shlwapi.h>
00011
00012 DWORD _dwOsMajorVersion = 0;
00013
00014 typedef DWORD (WINAPI*fntRasGetStat) (HRASCONN hRasConn, RAS_STATS* pStatistics);
00015 typedef DWORD (WINAPI*fntRasHangUp)(HRASCONN);
00016 typedef DWORD (WINAPI*fntRasGetErrorString)(UINT, LPTSTR, DWORD);
00017 typedef DWORD (WINAPI*fntRasDial)(LPRASDIALEXTENSIONS, LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN);
00018 typedef DWORD (WINAPI*fntRasGetEntryDialParams)(LPCTSTR, LPRASDIALPARAMS, LPBOOL);
00019 typedef DWORD (WINAPI*fntRasEnumEntries)(LPCTSTR, LPCTSTR, LPRASENTRYNAME, LPDWORD, LPDWORD);
00020 typedef DWORD (WINAPI*fntRasEnumConnections)(LPRASCONN, LPDWORD, LPDWORD);
00021 fntRasGetStat _pfnRasGetStat = NULL;
00022 fntRasHangUp _pfnRasHangUp = NULL;
00023 fntRasGetErrorString _pfnRasGetErrorString = NULL;
00024 fntRasDial _pfnRasDial = NULL;
00025 fntRasGetEntryDialParams _pfnRasGetEntryDialParams = NULL;
00026 fntRasEnumEntries _pfnRasEnumEntries = NULL;
00027 fntRasEnumConnections _pfnRasEnumConnections = NULL;
00028
00029 typedef BOOL (WINAPI*fntSetLayeredWndAttr) (HWND, COLORREF, BYTE, DWORD);
00030 fntSetLayeredWndAttr _pfnSetLWA = NULL;
00031
00032 BOOL fsSetLayeredWindowAttributes (HWND hWnd, COLORREF clrKey, BYTE bAlpha, DWORD dwFlags)
00033 {
00034 if (fsSysGetOsMajorVersion () < 5)
00035 return FALSE;
00036
00037 if (_pfnSetLWA == NULL)
00038 {
00039 HMODULE hDll = LoadLibrary (_T ("User32.Dll"));
00040
00041 if (hDll)
00042 _pfnSetLWA = (fntSetLayeredWndAttr) GetProcAddress (hDll, _T ("SetLayeredWindowAttributes"));
00043
00044 if (_pfnSetLWA == NULL)
00045 return FALSE;
00046 }
00047
00048 return _pfnSetLWA (hWnd, clrKey, bAlpha, dwFlags);
00049 }
00050
00051 void fsInitRAS ()
00052 {
00053 static BOOL bRasWasInit = FALSE;
00054
00055 if (bRasWasInit)
00056 return;
00057 else
00058 bRasWasInit = TRUE;
00059
00060 HMODULE hDll = LoadLibrary (_T ("RasApi32.Dll"));
00061
00062 if (hDll)
00063 {
00064
00065 _pfnRasGetStat = (fntRasGetStat) GetProcAddress (hDll, _T ("RasGetConnectionStatistics"));
00066
00067
00068 _pfnRasHangUp = (fntRasHangUp) GetProcAddress (hDll, _T ("RasHangUpA"));
00069 if (_pfnRasHangUp == NULL)
00070 _pfnRasHangUp = (fntRasHangUp) GetProcAddress (hDll, _T ("RasHangUp"));
00071
00072
00073 _pfnRasGetErrorString = (fntRasGetErrorString) GetProcAddress (hDll, "RasGetErrorStringA");
00074 if (_pfnRasGetErrorString == NULL)
00075 _pfnRasGetErrorString = (fntRasGetErrorString) GetProcAddress (hDll, "RasGetErrorString");
00076
00077
00078 _pfnRasDial = (fntRasDial) GetProcAddress (hDll, "RasDialA");
00079 if (_pfnRasDial == NULL)
00080 _pfnRasDial = (fntRasDial) GetProcAddress (hDll, "RasDial");
00081
00082
00083 _pfnRasGetEntryDialParams = (fntRasGetEntryDialParams) GetProcAddress (hDll, "RasGetEntryDialParamsA");
00084 if (_pfnRasGetEntryDialParams == NULL)
00085 _pfnRasGetEntryDialParams = (fntRasGetEntryDialParams) GetProcAddress (hDll, "RasGetEntryDialParams");
00086
00087
00088 _pfnRasEnumEntries = (fntRasEnumEntries) GetProcAddress (hDll, "RasEnumEntriesA");
00089 if (_pfnRasEnumEntries == NULL)
00090 _pfnRasEnumEntries = (fntRasEnumEntries) GetProcAddress (hDll, "RasEnumEntries");
00091
00092
00093 _pfnRasEnumConnections = (fntRasEnumConnections) GetProcAddress (hDll, "RasEnumConnectionsA");
00094 if (_pfnRasEnumConnections == NULL)
00095 _pfnRasEnumConnections = (fntRasEnumConnections) GetProcAddress (hDll, "RasEnumConnections");
00096
00097 if (_pfnRasGetStat == NULL && _pfnRasHangUp == NULL &&
00098 _pfnRasGetErrorString == NULL && _pfnRasDial == NULL &&
00099 _pfnRasGetEntryDialParams == NULL && _pfnRasEnumEntries == NULL &&
00100 _pfnRasEnumConnections == NULL)
00101 {
00102 FreeLibrary (hDll);
00103 }
00104 }
00105 }
00106
00107 void fsSysGetConnectionStatistics (HRASCONN hRasConn, RAS_STATS* pStatistics)
00108 {
00109 if (fsSysGetOsMajorVersion () < 5)
00110 return;
00111
00112 if (_pfnRasGetStat == NULL)
00113 {
00114 fsInitRAS ();
00115 if (_pfnRasGetStat == NULL)
00116 return;
00117 }
00118
00119 _pfnRasGetStat (hRasConn, pStatistics);
00120 }
00121
00122 DWORD fsRasHangUp (HRASCONN hRasConn)
00123 {
00124 if (_pfnRasHangUp == NULL)
00125 {
00126 fsInitRAS ();
00127 if (_pfnRasHangUp == NULL)
00128 return ERROR_INVALID_HANDLE;
00129 }
00130
00131 return _pfnRasHangUp (hRasConn);
00132 }
00133
00134 DWORD fsRasEnumEntries (LPCTSTR p1, LPCTSTR p2, LPRASENTRYNAME p3, LPDWORD p4, LPDWORD p5)
00135 {
00136 if (_pfnRasEnumEntries == NULL)
00137 {
00138 fsInitRAS ();
00139 if (_pfnRasEnumEntries == NULL)
00140 return ERROR_INVALID_HANDLE;
00141 }
00142
00143 return _pfnRasEnumEntries (p1, p2, p3, p4, p5);
00144 }
00145
00146 DWORD fsRasEnumConnections (LPRASCONN p1, LPDWORD p2, LPDWORD p3)
00147 {
00148 if (_pfnRasEnumConnections == NULL)
00149 {
00150 fsInitRAS ();
00151 if (_pfnRasEnumConnections == NULL)
00152 return ERROR_INVALID_HANDLE;
00153 }
00154
00155 return _pfnRasEnumConnections (p1, p2, p3);
00156 }
00157
00158 DWORD fsRasGetErrorString (UINT p1, LPTSTR p2, DWORD p3)
00159 {
00160 if (_pfnRasGetErrorString == NULL)
00161 {
00162 fsInitRAS ();
00163 if (_pfnRasGetErrorString == NULL)
00164 return ERROR_INVALID_HANDLE;
00165 }
00166
00167 return _pfnRasGetErrorString (p1, p2, p3);
00168 }
00169
00170 DWORD fsRasDial (LPRASDIALEXTENSIONS p1, LPCTSTR p2, LPRASDIALPARAMS p3, DWORD p4, LPVOID p5, LPHRASCONN p6)
00171 {
00172 if (_pfnRasDial == NULL)
00173 {
00174 fsInitRAS ();
00175 if (_pfnRasDial == NULL)
00176 return ERROR_INVALID_HANDLE;
00177 }
00178
00179 return _pfnRasDial (p1, p2, p3, p4, p5, p6);
00180 }
00181
00182 DWORD fsRasGetEntryDialParams (LPCTSTR p1, LPRASDIALPARAMS p2, LPBOOL p3)
00183 {
00184 if (_pfnRasGetEntryDialParams == NULL)
00185 {
00186 fsInitRAS ();
00187 if (_pfnRasGetEntryDialParams == NULL)
00188 return ERROR_INVALID_HANDLE;
00189 }
00190
00191 return _pfnRasGetEntryDialParams (p1, p2, p3);
00192 }
00193
00194 DWORD fsSysGetOsMajorVersion ()
00195 {
00196 if (_dwOsMajorVersion == 0)
00197 {
00198 OSVERSIONINFO ver;
00199 ver.dwOSVersionInfoSize = sizeof (ver);
00200 GetVersionEx (&ver);
00201 _dwOsMajorVersion = ver.dwMajorVersion;
00202 }
00203
00204 return _dwOsMajorVersion;
00205 }
00206
00207 void fsSetForegroundWindow (HWND hWnd)
00208 {
00209 HWND hFor = GetForegroundWindow ();
00210 int iMyTID = GetCurrentThreadId ();
00211 int iCurrTID = GetWindowThreadProcessId (hFor, NULL);
00212
00213 AttachThreadInput (iMyTID, iCurrTID, TRUE);
00214
00215 SetForegroundWindow (hWnd);
00216
00217 AttachThreadInput (iMyTID, iCurrTID, FALSE);
00218 }
00219
00220 void fsOpenUrlInBrowser (LPCSTR pszUrl)
00221 {
00222 char szReg [100];
00223 char szBrowser [MY_MAX_PATH];
00224 DWORD dwBrowserLen = MY_MAX_PATH;
00225
00226
00227
00228 if (strnicmp (pszUrl, "http", 4) == 0)
00229 strcpy (szReg, "http");
00230 else if (strnicmp (pszUrl, "https", 5) == 0)
00231 strcpy (szReg, "https");
00232 else
00233 strcpy (szReg, "ftp");
00234
00235 strcat (szReg, "\\shell\\open\\command");
00236
00237 HKEY hReg;
00238
00239 if (ERROR_SUCCESS != RegOpenKeyEx (HKEY_CLASSES_ROOT, szReg, 0, KEY_QUERY_VALUE, &hReg))
00240 goto _lErr;
00241
00242 if (ERROR_SUCCESS != RegQueryValueEx (hReg, NULL, NULL, NULL, (LPBYTE) szBrowser, &dwBrowserLen))
00243 {
00244 RegCloseKey (hReg);
00245 goto _lErr;
00246 }
00247
00248 RegCloseKey (hReg);
00249
00250 strlwr (szBrowser);
00251 LPSTR pszExe;
00252 pszExe = strstr (szBrowser, ".exe");
00253
00254 if (pszExe == NULL)
00255 goto _lErr;
00256
00257 pszExe [4] = 0;
00258
00259 if (32 >= (int)ShellExecute (HWND_DESKTOP, "open", szBrowser [0] == '"' ? szBrowser+1 : szBrowser, pszUrl, NULL, SW_SHOW))
00260 goto _lErr;
00261
00262 return;
00263
00264 _lErr:
00265 if (32 >= (int) ShellExecute (HWND_DESKTOP, "open", pszUrl, NULL, NULL, SW_SHOW))
00266 MessageBox (NULL, pszUrl, LS (L_ERROPENURL), MB_ICONERROR);
00267 }
00268
00269 int fsStrCmpNC (LPCSTR psz1, LPCSTR psz2)
00270 {
00271 int ret = CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE, psz1, -1, psz2, -1);
00272 switch (ret)
00273 {
00274 case CSTR_LESS_THAN:
00275 return -1;
00276
00277 case CSTR_EQUAL:
00278 return 0;
00279
00280 default:
00281 return 1;
00282 }
00283 }
00284
00285 int fsStrNCmpNC (LPCSTR psz1, LPCSTR psz2, int nCount)
00286 {
00287 int ret = CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE, psz1, nCount, psz2, nCount);
00288 switch (ret)
00289 {
00290 case CSTR_LESS_THAN:
00291 return -1;
00292
00293 case CSTR_EQUAL:
00294 return 0;
00295
00296 default:
00297 return 1;
00298 }
00299 }
00300
00301 void fsOnMemoryError ()
00302 {
00303 #ifndef FDM_DLDR__RAWCODEONLY
00304 if (IDCANCEL == MessageBox (NULL, "Out of memory! Please close some applications and press Retry or Cancel to exit without saving any data", "Out of memory", MB_ICONEXCLAMATION|MB_RETRYCANCEL))
00305 {
00306 _TrayMgr.Remove ();
00307 ExitProcess (0);
00308 }
00309 #endif
00310 }
00311
00312 BOOL GetIEVersion(DWORD *pMajor, DWORD *pMinor, DWORD *pBuild, DWORD *pSubBuild)
00313 {
00314 #ifndef FDM_DLDR__RAWCODEONLY
00315 CRegKey rk;
00316 LONG lRet = rk.Open(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Internet Explorer"), KEY_READ);
00317 if(lRet == 0)
00318 {
00319 TCHAR szBuff[256];
00320 DWORD dwCount = sizeof(szBuff);
00321 lRet = rk.QueryValue(szBuff, _T("Version"), &dwCount);
00322 if(lRet == 0)
00323 {
00324 sscanf(szBuff, "%u.%u.%u.%u", pMajor, pMinor, pBuild, pSubBuild);
00325 return TRUE;
00326 }
00327 }
00328 #endif
00329
00330 return FALSE;
00331 }
00332
00333 typedef HRESULT (CALLBACK *fntDllGetVersion) (DLLVERSIONINFO*);
00334
00335 DWORD GetShell32Version ()
00336 {
00337 static dwVer = 0;
00338
00339 if (dwVer == 0)
00340 {
00341 HMODULE hLib = LoadLibrary ("shell32.dll");
00342 if (hLib == NULL)
00343 return 0;
00344
00345 fntDllGetVersion pfn = (fntDllGetVersion) GetProcAddress (hLib, "DllGetVersion");
00346
00347 if (pfn == NULL)
00348 {
00349 FreeLibrary (hLib);
00350 return 0;
00351 }
00352
00353 DLLVERSIONINFO info;
00354 info.cbSize = sizeof (info);
00355 pfn (&info);
00356
00357 FreeLibrary (hLib);
00358
00359 return dwVer = info.dwMajorVersion;
00360 }
00361
00362 return dwVer;
00363 }
00364
00365 BOOL fsSetFilePointer (HANDLE hFile, UINT64 uPosition, DWORD dwMethod)
00366 {
00367 LONG lOffsetHi = 0;
00368 UINT64 uOffset = uPosition;
00369
00370 while (uOffset > DWORD (-1))
00371 {
00372 SetFilePointer (hFile, -1, &lOffsetHi, dwMethod);
00373 if (GetLastError ())
00374 return FALSE;
00375 uOffset -= DWORD (-1);
00376 dwMethod = FILE_CURRENT;
00377 lOffsetHi = 0;
00378 }
00379 SetFilePointer (hFile, DWORD (uOffset), &lOffsetHi, dwMethod);
00380 return TRUE;
00381 }
00382
00383 UINT64 fsGetFileSize (HANDLE hFile)
00384 {
00385 DWORD dw1, dw2;
00386 dw1 = GetFileSize (hFile, &dw2);
00387
00388 return dw1 | UINT64 (dw2) << 32;
00389 }
00390
00391 int fsGetFTimeDaysDelta (FILETIME t1, FILETIME t2)
00392 {
00393 UINT64 u1, u2;
00394
00395 u1 = UINT64 (t1.dwHighDateTime) << 32 | t1.dwLowDateTime;
00396 u2 = UINT64 (t2.dwHighDateTime) << 32 | t2.dwLowDateTime;
00397
00398 return int ((u1 - u2) / 10000000 / 60 / 60 / 24);
00399 }
00400
00401 BOOL fsIsSystemInFullScreenMode ()
00402 {
00403 #ifndef FDM_DLDR__RAWCODEONLY
00404
00405 CWnd* pwnd = CWnd::FromHandle (GetForegroundWindow ());
00406 if (pwnd != NULL && pwnd->m_hWnd != GetDesktopWindow ())
00407 {
00408 CRect rc; pwnd->GetWindowRect (&rc);
00409 if (rc.Width () == GetSystemMetrics (SM_CXSCREEN) &&
00410 rc.Height () == GetSystemMetrics (SM_CYSCREEN))
00411 {
00412 CString str;
00413 pwnd->GetWindowText (str);
00414 char sz [1000];
00415 GetClassName (pwnd->m_hWnd, sz, 1000);
00416 str = sz;
00417 if (str.CompareNoCase ("progman"))
00418 return TRUE;
00419 }
00420 }
00421
00422 #endif
00423
00424 return FALSE;
00425 }
00426
00427 BOOL vmsSetSuspendState (BOOL bHibernate, BOOL bForce, BOOL bDisableWakeEvent)
00428 {
00429 typedef BOOLEAN (WINAPI *fntSetSuspendState)(BOOL, BOOL, BOOL);
00430 static fntSetSuspendState _pfnSSS = NULL;
00431
00432 if (_pfnSSS == NULL)
00433 {
00434 HMODULE hDll = LoadLibrary ("powrprof.dll");
00435 if (hDll)
00436 _pfnSSS = (fntSetSuspendState) GetProcAddress (hDll, "SetSuspendState");
00437 }
00438
00439 if (_pfnSSS == NULL)
00440 return FALSE;
00441
00442 return _pfnSSS (bHibernate, bForce, bDisableWakeEvent);
00443 }
00444
00445 LONG fsCopyKey(HKEY hSrcParent, HKEY hTargParent, LPCTSTR szSrcKey, LPCTSTR szTargKey)
00446 {
00447 LONG nRes = ERROR_SUCCESS;
00448 TCHAR *szSubKeyName = NULL;
00449 TCHAR *szValueName = NULL;
00450 BYTE *pData = NULL;
00451 HKEY hSrcKey = NULL, hTargKey = NULL;
00452
00453 __try
00454 {
00455 nRes = RegCreateKey(hTargParent, szTargKey, &hTargKey);
00456 if(nRes != ERROR_SUCCESS)
00457 __leave;
00458
00459 nRes = RegOpenKeyEx(hSrcParent, szSrcKey, 0, KEY_ENUMERATE_SUB_KEYS | KEY_READ, &hSrcKey);
00460 if(nRes != ERROR_SUCCESS)
00461 __leave;
00462
00463 DWORD nMaxKeyNameLen, nMaxValueNameLen, nMaxValueLen;
00464 RegQueryInfoKey(
00465 hSrcKey, NULL, NULL, NULL, NULL,
00466 &nMaxKeyNameLen, NULL, NULL,
00467 &nMaxValueNameLen, &nMaxValueLen, NULL, NULL);
00468
00469 nMaxKeyNameLen++;
00470 nMaxValueNameLen++;
00471
00472 szSubKeyName = new TCHAR[nMaxKeyNameLen];
00473 DWORD nIndex = 0, nSize = nMaxKeyNameLen;
00474 FILETIME tTime;
00475
00476 while(RegEnumKeyEx(
00477 hSrcKey, nIndex++, szSubKeyName, &nSize, 0, NULL, NULL, &tTime) == ERROR_SUCCESS)
00478 {
00479 LONG nRes = fsCopyKey(hSrcKey, hTargKey, szSubKeyName, szSubKeyName);
00480 if(nRes != ERROR_SUCCESS)
00481 __leave;
00482
00483 nSize = nMaxKeyNameLen;
00484 }
00485
00486 szValueName = new TCHAR[nMaxValueNameLen];
00487 pData = new BYTE[nMaxValueLen];
00488 DWORD nType, nDataSize;
00489
00490 nIndex = 0;
00491 nSize = nMaxValueNameLen;
00492 nDataSize = nMaxValueLen;
00493
00494 while(RegEnumValue(
00495 hSrcKey, nIndex++, szValueName, &nSize,
00496 NULL, NULL, pData, &nDataSize) == ERROR_SUCCESS)
00497 {
00498 nRes = RegQueryValueEx(hSrcKey, szValueName, NULL, &nType, pData, &nDataSize);
00499 if(nRes != ERROR_SUCCESS)
00500 __leave;
00501
00502 nRes = RegSetValueEx(hTargKey, szValueName, NULL, nType, pData, nDataSize);
00503 if(nRes != ERROR_SUCCESS)
00504 __leave;
00505
00506 nSize = nMaxValueNameLen;
00507 nDataSize = nMaxValueLen;
00508 }
00509
00510 nRes = ERROR_SUCCESS;
00511 }
00512 __finally
00513 {
00514 if(szSubKeyName != NULL)
00515 delete [] szSubKeyName;
00516
00517 if(szValueName != NULL)
00518 delete [] szValueName;
00519
00520 if(pData != NULL)
00521 delete [] pData;
00522
00523 if(hSrcKey != NULL)
00524 RegCloseKey(hSrcKey);
00525
00526 if(hTargKey != NULL)
00527 RegCloseKey(hTargKey);
00528
00529 return nRes;
00530 }
00531 }
00532
00533 DWORD vmsSHCopyKey (HKEY hkeySrc, LPCSTR pszSubKey, HKEY hkeyDst)
00534 {
00535 typedef DWORD (WINAPI *fntSHCopyKey)(HKEY, LPCSTR, HKEY, DWORD);
00536 static fntSHCopyKey _pfnCK = NULL;
00537
00538 if (_pfnCK == NULL)
00539 {
00540 HMODULE hDll = LoadLibrary ("shlwapi.dll");
00541 if (hDll)
00542 _pfnCK = (fntSHCopyKey) GetProcAddress (hDll, "SHCopyKeyA");
00543 }
00544
00545 if (_pfnCK == NULL)
00546 return FALSE;
00547
00548 return _pfnCK (hkeySrc, pszSubKey, hkeyDst, NULL);
00549 }
00550
00551 BOOL vmsMoveFileAtWinBoot (LPCSTR pszSrc, LPCSTR pszDst)
00552 {
00553 if ((GetVersion () & 0x80000000) == 0)
00554 return MoveFileEx (pszSrc, pszDst, MOVEFILE_DELAY_UNTIL_REBOOT);
00555
00556 char szWinInit [MAX_PATH] = "";
00557 GetWindowsDirectory (szWinInit, MAX_PATH);
00558 if (szWinInit [3] != 0)
00559 lstrcat (szWinInit, "\\");
00560 lstrcat (szWinInit, "wininit.ini");
00561
00562 char sz [32000] = "";
00563 DWORD dwLen = GetPrivateProfileSection ("rename", sz, sizeof (sz), szWinInit);
00564 LPSTR psz = sz + dwLen;
00565 lstrcpy (psz, pszDst ? pszDst : "NUL");
00566 lstrcat (psz, "=");
00567 lstrcat (psz, pszSrc);
00568 psz [lstrlen (psz) + 1] = 0;
00569 return WritePrivateProfileSection ("rename", sz, szWinInit);
00570 }
00571
00572 BOOL vmsDeleteFileAtWinBoot (LPCSTR pszFile)
00573 {
00574 return vmsMoveFileAtWinBoot (pszFile, NULL);
00575 }
00576
00577 char vmsGetExeDriveLetter ()
00578 {
00579 char sz [MAX_PATH] = "";
00580 GetModuleFileName (NULL, sz, MAX_PATH);
00581 return sz [0];
00582 }
00583