2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/rapps/misc.cpp
5 * PURPOSE: Misc functions
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
7 * Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
8 * Alexander Shaposhnikov (chaez.san@gmail.com)
15 /* SESSION Operation */
16 #define EXTRACT_FILLFILELIST 0x00000001
17 #define EXTRACT_EXTRACTFILES 0x00000002
19 static HANDLE hLog
= NULL
;
42 CHAR Destination
[MAX_PATH
];
43 CHAR CurrentFile
[MAX_PATH
];
44 CHAR Reserved
[MAX_PATH
];
48 typedef HRESULT(WINAPI
*fnExtract
)(SESSION
*dest
, LPCSTR szCabName
);
53 GetWindowWidth(HWND hwnd
)
57 GetWindowRect(hwnd
, &Rect
);
58 return (Rect
.right
- Rect
.left
);
62 GetWindowHeight(HWND hwnd
)
66 GetWindowRect(hwnd
, &Rect
);
67 return (Rect
.bottom
- Rect
.top
);
71 GetClientWindowWidth(HWND hwnd
)
75 GetClientRect(hwnd
, &Rect
);
76 return (Rect
.right
- Rect
.left
);
80 GetClientWindowHeight(HWND hwnd
)
84 GetClientRect(hwnd
, &Rect
);
85 return (Rect
.bottom
- Rect
.top
);
89 CopyTextToClipboard(LPCWSTR lpszText
)
93 if (OpenClipboard(NULL
))
100 cchBuffer
= wcslen(lpszText
) + 1;
101 ClipBuffer
= GlobalAlloc(GMEM_DDESHARE
, cchBuffer
* sizeof(WCHAR
));
102 Buffer
= (PWCHAR
) GlobalLock(ClipBuffer
);
103 hr
= StringCchCopyW(Buffer
, cchBuffer
, lpszText
);
104 GlobalUnlock(ClipBuffer
);
107 SetClipboardData(CF_UNICODETEXT
, ClipBuffer
);
116 ATL::CStringW szText
;
118 szText
.LoadStringW(hInst
, IDS_WELCOME_TITLE
);
119 NewRichEditText(szText
, CFE_BOLD
);
121 szText
.LoadStringW(hInst
, IDS_WELCOME_TEXT
);
122 InsertRichEditText(szText
, 0);
124 szText
.LoadStringW(hInst
, IDS_WELCOME_URL
);
125 InsertRichEditText(szText
, CFM_LINK
);
129 ShowPopupMenu(HWND hwnd
, UINT MenuID
, UINT DefaultItem
)
138 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(MenuID
));
139 hPopupMenu
= GetSubMenu(hMenu
, 0);
142 hPopupMenu
= GetMenu(hwnd
);
144 ZeroMemory(&mii
, sizeof(mii
));
145 mii
.cbSize
= sizeof(mii
);
146 mii
.fMask
= MIIM_STATE
;
147 GetMenuItemInfoW(hPopupMenu
, DefaultItem
, FALSE
, &mii
);
149 if (!(mii
.fState
& MFS_GRAYED
))
150 SetMenuDefaultItem(hPopupMenu
, DefaultItem
, FALSE
);
154 SetForegroundWindow(hwnd
);
155 TrackPopupMenu(hPopupMenu
, 0, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
162 StartProcess(ATL::CStringW
&Path
, BOOL Wait
)
164 BOOL result
= StartProcess(const_cast<LPWSTR
>(Path
.GetString()), Wait
);
169 StartProcess(LPWSTR lpPath
, BOOL Wait
)
171 PROCESS_INFORMATION pi
;
176 ZeroMemory(&si
, sizeof(si
));
178 si
.dwFlags
= STARTF_USESHOWWINDOW
;
179 si
.wShowWindow
= SW_SHOW
;
181 if (!CreateProcessW(NULL
, lpPath
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
186 CloseHandle(pi
.hThread
);
187 if (Wait
) EnableWindow(hMainWnd
, FALSE
);
191 dwRet
= MsgWaitForMultipleObjects(1, &pi
.hProcess
, FALSE
, INFINITE
, QS_ALLEVENTS
);
192 if (dwRet
== WAIT_OBJECT_0
+ 1)
194 while (PeekMessageW(&msg
, NULL
, 0, 0, PM_REMOVE
))
196 TranslateMessage(&msg
);
197 DispatchMessage(&msg
);
202 if (dwRet
== WAIT_OBJECT_0
|| dwRet
== WAIT_FAILED
)
207 CloseHandle(pi
.hProcess
);
211 EnableWindow(hMainWnd
, TRUE
);
212 SetForegroundWindow(hMainWnd
);
220 GetStorageDirectory(ATL::CStringW
& Directory
)
222 if (!SHGetSpecialFolderPathW(NULL
, Directory
.GetBuffer(MAX_PATH
), CSIDL_LOCAL_APPDATA
, TRUE
))
224 Directory
.ReleaseBuffer();
228 Directory
.ReleaseBuffer();
229 Directory
+= L
"\\rapps";
231 return (CreateDirectoryW(Directory
.GetString(), NULL
) || GetLastError() == ERROR_ALREADY_EXISTS
);
235 ExtractFilesFromCab(const ATL::CStringW
&CabName
, const ATL::CStringW
&OutputPath
)
237 return ExtractFilesFromCab(CabName
.GetString(), OutputPath
.GetString());
241 ExtractFilesFromCab(LPCWSTR lpCabName
, LPCWSTR lpOutputPath
)
243 HINSTANCE hCabinetDll
;
244 CHAR szCabName
[MAX_PATH
];
248 hCabinetDll
= LoadLibraryW(L
"cabinet.dll");
251 pfnExtract
= (fnExtract
) GetProcAddress(hCabinetDll
, "Extract");
254 ZeroMemory(&Dest
, sizeof(Dest
));
256 WideCharToMultiByte(CP_ACP
, 0, lpOutputPath
, -1, Dest
.Destination
, MAX_PATH
, NULL
, NULL
);
257 WideCharToMultiByte(CP_ACP
, 0, lpCabName
, -1, szCabName
, MAX_PATH
, NULL
, NULL
);
258 Dest
.Operation
= EXTRACT_FILLFILELIST
;
260 Result
= pfnExtract(&Dest
, szCabName
);
263 Dest
.Operation
= EXTRACT_EXTRACTFILES
;
264 Result
= pfnExtract(&Dest
, szCabName
);
267 FreeLibrary(hCabinetDll
);
272 FreeLibrary(hCabinetDll
);
281 WCHAR szBuf
[MAX_PATH
] = L
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\ReactOS Application Manager";
282 WCHAR szPath
[MAX_PATH
];
283 DWORD dwCategoryNum
= 1;
284 DWORD dwDisp
, dwData
;
287 if (!SettingsInfo
.bLogEnabled
) return;
289 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
,
291 REG_OPTION_NON_VOLATILE
,
292 KEY_WRITE
, NULL
, &hKey
, &dwDisp
) != ERROR_SUCCESS
)
297 if (!GetModuleFileNameW(NULL
, szPath
, _countof(szPath
)))
300 if (RegSetValueExW(hKey
,
305 (DWORD
) (wcslen(szPath
) + 1) * sizeof(WCHAR
)) != ERROR_SUCCESS
)
311 dwData
= EVENTLOG_ERROR_TYPE
| EVENTLOG_WARNING_TYPE
|
312 EVENTLOG_INFORMATION_TYPE
;
314 if (RegSetValueExW(hKey
,
319 sizeof(DWORD
)) != ERROR_SUCCESS
)
325 if (RegSetValueExW(hKey
,
326 L
"CategoryMessageFile",
330 (DWORD
) (wcslen(szPath
) + 1) * sizeof(WCHAR
)) != ERROR_SUCCESS
)
336 if (RegSetValueExW(hKey
,
340 (LPBYTE
) &dwCategoryNum
,
341 sizeof(DWORD
)) != ERROR_SUCCESS
)
349 hLog
= RegisterEventSourceW(NULL
, L
"ReactOS Application Manager");
356 if (hLog
) DeregisterEventSource(hLog
);
361 WriteLogMessage(WORD wType
, DWORD dwEventID
, LPCWSTR lpMsg
)
363 if (!SettingsInfo
.bLogEnabled
) return TRUE
;
365 if (!ReportEventW(hLog
, wType
, 0, dwEventID
,
366 NULL
, 1, 0, &lpMsg
, NULL
))
375 GetInstalledVersion_WowUser(_Out_opt_
ATL::CStringW
* szVersionResult
,
376 _In_z_
const ATL::CStringW
& RegName
,
381 BOOL bHasSucceded
= FALSE
;
382 ATL::CStringW szVersion
;
383 ATL::CStringW szPath
= L
"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + RegName
;
385 if (RegOpenKeyExW(IsUserKey
? HKEY_CURRENT_USER
: HKEY_LOCAL_MACHINE
,
386 szPath
.GetString(), 0, keyWow
| KEY_READ
,
387 &hKey
) == ERROR_SUCCESS
)
389 if (szVersionResult
!= NULL
)
391 DWORD dwSize
= MAX_PATH
* sizeof(WCHAR
);
392 DWORD dwType
= REG_SZ
;
393 if (RegQueryValueExW(hKey
,
397 (LPBYTE
) szVersion
.GetBuffer(MAX_PATH
),
398 &dwSize
) == ERROR_SUCCESS
)
400 szVersion
.ReleaseBuffer();
401 *szVersionResult
= szVersion
;
406 szVersion
.ReleaseBuffer();
412 szVersion
.ReleaseBuffer();
421 BOOL
GetInstalledVersion(ATL::CStringW
* pszVersion
, const ATL::CStringW
& szRegName
)
423 return (!szRegName
.IsEmpty()
424 && (GetInstalledVersion_WowUser(pszVersion
, szRegName
, TRUE
, KEY_WOW64_32KEY
)
425 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, FALSE
, KEY_WOW64_32KEY
)
426 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, TRUE
, KEY_WOW64_64KEY
)
427 || GetInstalledVersion_WowUser(pszVersion
, szRegName
, FALSE
, KEY_WOW64_64KEY
)));