ReactOS 0.4.15-dev-8096-ga0eec98
umandlg.h File Reference
#include <stdlib.h>
#include <windows.h>
#include <commctrl.h>
#include <tlhelp32.h>
#include <windowsx.h>
#include <debug.h>
#include <wchar.h>
#include <strsafe.h>
#include "resource.h"
Include dependency graph for umandlg.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  UTILMAN_GLOBALS
 
struct  _UTILMAN_STATE
 
struct  _REGISTRY_SETTINGS
 
struct  _REGISTRY_DATA
 

Macros

#define MAX_BUFFER   256
 

Typedefs

typedef struct _UTILMAN_STATE UTILMAN_STATE
 
typedef struct _UTILMAN_STATEPUTILMAN_STATE
 
typedef struct _REGISTRY_SETTINGS REGISTRY_SETTINGS
 
typedef struct _REGISTRY_SETTINGSPREGISTRY_SETTINGS
 
typedef struct _REGISTRY_DATA REGISTRY_DATA
 
typedef struct _REGISTRY_DATAPREGISTRY_DATA
 
typedef enum _WRITE_REGISTRY WRITE_REGISTRY
 
typedef enum _WRITE_REGISTRYPWRITE_REGISTRY
 

Enumerations

enum  _WRITE_REGISTRY { REGISTRY_ACCESSIBILITY , REGISTRY_UTILMAN }
 

Functions

VOID InitUtilsList (IN BOOL bInitGui)
 
BOOL DlgInitHandler (IN HWND hDlg)
 
VOID ShowAboutDlg (IN HWND hDlgParent)
 
VOID GroupBoxUpdateTitle (VOID)
 
VOID UpdateUtilityState (IN BOOL bUtilState)
 
INT_PTR APIENTRY DlgProc (IN HWND hDlg, IN UINT Msg, IN WPARAM wParam, IN LPARAM lParam)
 
INT ListBoxRefreshContents (VOID)
 
BOOL WINAPI UManStartDlg (VOID)
 
DWORD GetProcessID (IN LPCWSTR lpszProcessName)
 
BOOL IsProcessRunning (IN LPCWSTR lpszProcessName)
 
BOOL LaunchProcess (IN LPCWSTR lpszProcessName)
 
BOOL CloseProcess (IN LPCWSTR lpszProcessName)
 
BOOL InitAppRegKey (IN HKEY hPredefinedKey, IN LPCWSTR lpszSubKey, OUT PHKEY phKey, OUT LPDWORD lpdwDisposition)
 
BOOL QueryAppSettings (IN HKEY hKey, IN LPCWSTR lpszSubKey, IN LPCWSTR lpszRegValue, OUT PVOID ReturnedData, IN OUT LPDWORD lpdwSizeData)
 
BOOL SaveAppSettings (IN HKEY hKey, IN LPCWSTR lpszRegValue, IN DWORD dwRegType, IN PVOID Data, IN DWORD cbSize)
 

Variables

UTILMAN_GLOBALS Globals
 
REGISTRY_SETTINGS Settings
 
REGISTRY_DATA RegData
 

Macro Definition Documentation

◆ MAX_BUFFER

#define MAX_BUFFER   256

Definition at line 26 of file umandlg.h.

Typedef Documentation

◆ PREGISTRY_DATA

◆ PREGISTRY_SETTINGS

◆ PUTILMAN_STATE

◆ PWRITE_REGISTRY

◆ REGISTRY_DATA

◆ REGISTRY_SETTINGS

◆ UTILMAN_STATE

◆ WRITE_REGISTRY

Enumeration Type Documentation

◆ _WRITE_REGISTRY

Enumerator
REGISTRY_ACCESSIBILITY 
REGISTRY_UTILMAN 

Definition at line 84 of file umandlg.h.

85{
enum _WRITE_REGISTRY WRITE_REGISTRY
@ REGISTRY_UTILMAN
Definition: umandlg.h:87
@ REGISTRY_ACCESSIBILITY
Definition: umandlg.h:86
enum _WRITE_REGISTRY * PWRITE_REGISTRY

Function Documentation

◆ CloseProcess()

BOOL CloseProcess ( IN LPCWSTR  lpszProcessName)

@CloseProcess

Closes a process.

Parameters
[in]lpszProcessNameThe name of the executable process.
Returns
Returns TRUE if the process has been terminated successfully, FALSE otherwise.

Definition at line 192 of file process.c.

193{
195 DWORD dwProcessID;
196
197 /* Get the process ID */
198 dwProcessID = GetProcessID(lpszProcessName);
199 if (dwProcessID == 0)
200 {
201 return FALSE;
202 }
203
204 /* Make sure that the given process ID is not ours, the parent process, so that we do not kill ourselves */
205 if (dwProcessID == GetCurrentProcessId())
206 {
207 return FALSE;
208 }
209
210 /* Open the process so that we can terminate it */
212 if (!hProcess)
213 {
214 DPRINT("CloseProcess(): Failed to open the process for termination! (Error: %lu)\n", GetLastError());
215 return FALSE;
216 }
217
218 /* Terminate it */
221 return TRUE;
222}
DWORD GetProcessID(IN LPCWSTR lpszProcessName)
Definition: process.c:26
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
Definition: proc.c:1532
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1227
unsigned long DWORD
Definition: ntddk_ex.h:95
#define PROCESS_TERMINATE
Definition: pstypes.h:157
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define DPRINT
Definition: sndvol32.h:73
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158

Referenced by DlgProc().

◆ DlgInitHandler()

BOOL DlgInitHandler ( IN HWND  hDlg)

@DlgInitHandler

Function which processes several operations for WM_INITDIALOG.

Parameters
[in]hDlgThe handle object of the dialog.
Returns
TRUE to inform the system that WM_INITDIALOG has been processed and that it should set the keyboard focus to the control.

Definition at line 97 of file umandlg.c.

98{
99 INT PosX, PosY;
100 RECT rc;
101 WCHAR szAboutDlg[MAX_BUFFER];
102 WCHAR szAppPath[MAX_BUFFER];
103 HMENU hSysMenu;
104
105 /* Save the dialog handle */
106 Globals.hMainDlg = hDlg;
107
108 /* Center the dialog on the screen */
109 GetWindowRect(hDlg, &rc);
110 PosX = (GetSystemMetrics(SM_CXSCREEN) - rc.right) / 2;
111 PosY = (GetSystemMetrics(SM_CYSCREEN) - rc.bottom) / 2;
112 SetWindowPos(hDlg, 0, PosX, PosY, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
113
114 /* Extract the icon resource from the executable process */
115 GetModuleFileNameW(NULL, szAppPath, _countof(szAppPath));
116 Globals.hIcon = ExtractIconW(Globals.hInstance, szAppPath, 0);
117
118 /* Set the icon within the dialog's title bar */
119 if (Globals.hIcon)
120 {
121 SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)Globals.hIcon);
122 }
123
124 /* Retrieve the system menu and append the "About" menu item onto it */
125 hSysMenu = GetSystemMenu(hDlg, FALSE);
126 if (hSysMenu != NULL)
127 {
128 if (LoadStringW(Globals.hInstance, IDM_ABOUT, szAboutDlg, _countof(szAboutDlg)))
129 {
130 AppendMenuW(hSysMenu, MF_SEPARATOR, 0, NULL);
131 AppendMenuW(hSysMenu, MF_STRING, IDM_ABOUT, szAboutDlg);
132 }
133 }
134
135 /* Get the dialog items, specifically the dialog list box, the Start and Stop buttons */
139
140 /* Initialize the GUI listbox */
142
143 /* Set the selection to the first item */
145
146 /* Refresh the list */
148
149 /* Create a timer, we'll use it to control the state of our items in the listbox */
150 Globals.iTimer = SetTimer(hDlg, 0, 400, NULL);
151
152 return TRUE;
153}
#define IDM_ABOUT
Definition: resource.h:29
#define IDC_STOP
Definition: resource.h:69
#define IDC_START
Definition: resource.h:135
#define MAX_BUFFER
Definition: precomp.h:20
#define IDC_LISTBOX
Definition: resource.h:13
#define NULL
Definition: types.h:112
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
HICON WINAPI ExtractIconW(HINSTANCE hInstance, LPCWSTR lpszFile, UINT nIconIndex)
Definition: shell32_main.c:876
#define _countof(array)
Definition: sndvol32.h:70
HICON hIcon
Definition: umandlg.h:33
HINSTANCE hInstance
Definition: umandlg.h:32
UINT_PTR iTimer
Definition: umandlg.h:34
HWND hListDlg
Definition: umandlg.h:38
INT iSelectedIndex
Definition: umandlg.h:35
HWND hDlgCtlStop
Definition: umandlg.h:37
HWND hMainDlg
Definition: umandlg.h:39
HWND hDlgCtlStart
Definition: umandlg.h:36
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
#define ICON_SMALL
Definition: tnclass.cpp:48
int32_t INT
Definition: typedefs.h:58
VOID InitUtilsList(IN BOOL bInitGui)
Definition: umandlg.c:38
UTILMAN_GLOBALS Globals
Definition: umandlg.c:15
INT ListBoxRefreshContents(VOID)
Definition: umandlg.c:226
LONG_PTR LPARAM
Definition: windef.h:208
#define SM_CYSCREEN
Definition: winuser.h:960
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define MF_STRING
Definition: winuser.h:138
#define SWP_NOSIZE
Definition: winuser.h:1245
HMENU WINAPI GetSystemMenu(_In_ HWND, _In_ BOOL)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define MF_SEPARATOR
Definition: winuser.h:137
#define SM_CXSCREEN
Definition: winuser.h:959
#define SWP_NOZORDER
Definition: winuser.h:1247
int WINAPI GetSystemMetrics(_In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by DlgProc().

◆ DlgProc()

INT_PTR APIENTRY DlgProc ( IN HWND  hDlg,
IN UINT  Msg,
IN WPARAM  wParam,
IN LPARAM  lParam 
)

@DlgProc

Main dialog application procedure function.

Parameters
[in]hDlgThe handle object of the dialog.
[in]MsgMessage events (in unsigned int).
[in]wParamMessage parameter (in UINT_PTR).
[in]lParamMessage parameter (in LONG_PTR).
Returns
Returns 0 to inform the system that the procedure has been handled.

Definition at line 292 of file umandlg.c.

297{
298 switch (Msg)
299 {
300 case WM_INITDIALOG:
301 DlgInitHandler(hDlg);
302 return TRUE;
303
304 case WM_CLOSE:
305 KillTimer(hDlg, Globals.iTimer);
307 EndDialog(hDlg, FALSE);
308 break;
309
310 case WM_COMMAND:
311 {
312 switch (LOWORD(wParam))
313 {
314 case IDC_OK:
315 case IDC_CANCEL:
316 EndDialog(hDlg, FALSE);
317 break;
318
319 case IDC_LISTBOX:
320 {
321 switch (HIWORD(wParam))
322 {
323 case LBN_SELCHANGE:
324 {
325 /* Retrieve the index of the current selected item */
327 if ((iIndex == LB_ERR) || (iIndex >= _countof(EntriesList)))
328 break;
329
330 /* Assign the selected index and check the utility's state */
331 Globals.iSelectedIndex = iIndex;
333 break;
334 }
335 break;
336 }
337 break;
338 }
339
340 case IDC_START:
342 break;
343
344 case IDC_STOP:
346 break;
347
348 default:
349 break;
350 }
351 break;
352 }
353
354 case WM_TIMER:
356 return 0;
357
358 case WM_SYSCOMMAND:
359 {
360 switch (LOWORD(wParam))
361 {
362 case IDM_ABOUT:
363 ShowAboutDlg(hDlg);
364 break;
365 }
366 break;
367 }
368 }
369
370 return 0;
371}
#define IDC_OK
Definition: resource.h:59
#define IDC_CANCEL
Definition: resource.h:60
BOOL CloseProcess(IN LPCWSTR lpszProcessName)
Definition: process.c:192
BOOL LaunchProcess(IN LPCWSTR lpszProcessName)
Definition: process.c:117
struct @1636 Msg[]
WPARAM wParam
Definition: combotst.c:138
#define LOWORD(l)
Definition: pedump.c:82
BOOL bState
Definition: umandlg.h:50
LPCWSTR lpszProgram
Definition: umandlg.h:47
#define HIWORD(l)
Definition: typedefs.h:247
VOID ShowAboutDlg(IN HWND hDlgParent)
Definition: umandlg.c:167
BOOL DlgInitHandler(IN HWND hDlg)
Definition: umandlg.c:97
UTILMAN_STATE EntriesList[]
Definition: umandlg.c:19
VOID UpdateUtilityState(IN BOOL bUtilState)
Definition: umandlg.c:208
#define LB_ERR
Definition: winuser.h:2432
#define WM_CLOSE
Definition: winuser.h:1621
#define WM_SYSCOMMAND
Definition: winuser.h:1741
#define WM_COMMAND
Definition: winuser.h:1740
#define WM_INITDIALOG
Definition: winuser.h:1739
#define WM_TIMER
Definition: winuser.h:1742
#define LBN_SELCHANGE
Definition: winuser.h:2075
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define LB_GETCURSEL
Definition: winuser.h:2039
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2084

◆ GetProcessID()

DWORD GetProcessID ( IN LPCWSTR  lpszProcessName)

@GetProcessID

Returns the process executable ID based on the given executable name.

Parameters
[in]lpszProcessNameThe name of the executable process.
Returns
Returns the ID number of the process, otherwise 0.

Definition at line 26 of file process.c.

27{
29
30 /* Create a snapshot and check if the given process name matches with the one from the process entry structure */
32
33 if (hSnapshot == INVALID_HANDLE_VALUE)
34 return 0;
35
36 /* Get the whole size of the structure */
37 Process.dwSize = sizeof(Process);
38
39 /* Enumerate the processes */
40 if (Process32FirstW(hSnapshot, &Process))
41 {
42 do
43 {
44 if (_wcsicmp(Process.szExeFile, lpszProcessName) == 0)
45 {
46 /* The names match, return the process ID we're interested */
47 CloseHandle(hSnapshot);
48 return Process.th32ProcessID;
49 }
50 }
51 while (Process32NextW(hSnapshot, &Process));
52 }
53
54 CloseHandle(hSnapshot);
55 return 0;
56}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
BOOL WINAPI Process32NextW(HANDLE hSnapshot, LPPROCESSENTRY32W lppe)
Definition: toolhelp.c:1073
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID)
Definition: toolhelp.c:1255
BOOL WINAPI Process32FirstW(HANDLE hSnapshot, LPPROCESSENTRY32W lppe)
Definition: toolhelp.c:984
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define TH32CS_SNAPPROCESS
Definition: tlhelp32.h:26

Referenced by CloseProcess(), and IsProcessRunning().

◆ GroupBoxUpdateTitle()

VOID GroupBoxUpdateTitle ( VOID  )

@GroupBoxUpdateTitle

Updates the title of the groupbox.

Returns
Nothing.

Definition at line 187 of file umandlg.c.

188{
189 WCHAR szFormat[MAX_BUFFER];
190
191 /* Format the string with the utility's name and set it to the listbox's title */
194}
#define IDC_GROUPBOX
Definition: resource.h:24
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
WCHAR szGrpBoxTitle[MAX_BUFFER]
Definition: umandlg.h:42
WCHAR szResource[MAX_BUFFER]
Definition: umandlg.h:49
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)

Referenced by UpdateUtilityState().

◆ InitAppRegKey()

BOOL InitAppRegKey ( IN HKEY  hPredefinedKey,
IN LPCWSTR  lpszSubKey,
OUT PHKEY  phKey,
OUT LPDWORD  lpdwDisposition 
)

@InitAppRegKey

Initialize a key. The function may not necessarily create it but open the key if it already exists. The disposition pointed lpdwDisposition determines that. This is a function helper.

Parameters
[in]hPredefinedKeyThe predefined key (e.g. HKEY_CLASSES_ROOT).
[in]lpszSubKeyThe path to the sub key to be created.
[out]phKeyA pointer that receives a handle to the key given by the function.
[out]lpdwDispositionA pointer that receives the disposition given by the function.
Returns
Returns TRUE if the function successfully created a key (or opened it), FALSE otherwise for failure.

Definition at line 50 of file registry.c.

54{
55 LONG lResult;
56
57 lResult = RegCreateKeyExW(hPredefinedKey,
58 lpszSubKey,
59 0,
60 NULL,
61 0,
63 NULL,
64 phKey,
65 lpdwDisposition);
66 if (lResult != ERROR_SUCCESS)
67 {
68 DPRINT("InitAppRegKey(): Failed to create the following key (or open the key) of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
69 return FALSE;
70 }
71
72 return TRUE;
73}
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
#define KEY_WRITE
Definition: nt_native.h:1031
long LONG
Definition: pedump.c:60

◆ InitUtilsList()

VOID InitUtilsList ( IN BOOL  bInitGui)

@InitUtilsList

Initializes the list of accessibility utilities.

Parameters
[in]bInitGuiWhether we are initializing the UI list (TRUE) or the internal array (FALSE).
Returns
Nothing.

Definition at line 38 of file umandlg.c.

39{
40 UINT i;
41
42 if (!bInitGui)
43 {
44 // TODO: Load the list dynamically from the registry key
45 // hklm\software\microsoft\windows nt\currentversion\accessibility
46
47 /* Initialize the resource utility strings only once */
48 for (i = 0; i < _countof(EntriesList); ++i)
49 {
52
54 }
55 }
56 else
57 {
58 INT iItem;
59 BOOL bIsRunning;
60 WCHAR szFormat[MAX_BUFFER];
61
62 /* Reset the listbox */
64
65 /* Add the utilities in the listbox */
66 for (i = 0; i < _countof(EntriesList); ++i)
67 {
68 bIsRunning = IsProcessRunning(EntriesList[i].lpszProgram);
69 EntriesList[i].bState = bIsRunning;
70
71 /* Load the string and append the utility's name to the format */
72 StringCchPrintfW(szFormat, _countof(szFormat),
73 (bIsRunning ? Globals.szRunning : Globals.szNotRunning),
75
76 /* Add the item in the listbox */
77 iItem = (INT)SendMessageW(Globals.hListDlg, LB_ADDSTRING, 0, (LPARAM)szFormat);
78 if (iItem != LB_ERR)
80 }
81 }
82}
BOOL IsProcessRunning(IN LPCWSTR lpszProcessName)
Definition: process.c:71
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define INT
Definition: polytest.cpp:20
WCHAR szRunning[MAX_BUFFER]
Definition: umandlg.h:40
WCHAR szNotRunning[MAX_BUFFER]
Definition: umandlg.h:41
UINT uNameId
Definition: umandlg.h:48
#define LB_ADDSTRING
Definition: winuser.h:2031
#define LB_RESETCONTENT
Definition: winuser.h:2055
#define LB_SETITEMDATA
Definition: winuser.h:2065

Referenced by DlgInitHandler(), and UManStartDlg().

◆ IsProcessRunning()

BOOL IsProcessRunning ( IN LPCWSTR  lpszProcessName)

@IsProcessRunning

Checks if a process is running.

Parameters
[in]lpszProcessNameThe name of the executable process.
Returns
Returns TRUE if the given process' name is running, FALSE otherwise.

Definition at line 71 of file process.c.

72{
73 DWORD dwReturn, dwProcessID;
75
76 /* Get the process ID */
77 dwProcessID = GetProcessID(lpszProcessName);
78 if (dwProcessID == 0)
79 {
80 return FALSE;
81 }
82
83 /* Synchronize the process to get its signaling state */
84 hProcess = OpenProcess(SYNCHRONIZE, FALSE, dwProcessID);
85 if (!hProcess)
86 {
87 DPRINT("IsProcessRunning(): Failed to open the process! (Error: %lu)\n", GetLastError());
88 return FALSE;
89 }
90
91 /* Wait for the process */
92 dwReturn = WaitForSingleObject(hProcess, 0);
93 if (dwReturn == WAIT_TIMEOUT)
94 {
95 /* The process is still running */
97 return TRUE;
98 }
99
101 return FALSE;
102}
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define SYNCHRONIZE
Definition: nt_native.h:61
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82

Referenced by InitUtilsList(), and ListBoxRefreshContents().

◆ LaunchProcess()

BOOL LaunchProcess ( IN LPCWSTR  lpszProcessName)

@LaunchProcess

Executes a process.

Parameters
[in]lpProcessNameThe name of the executable process.
Returns
Returns TRUE if the process has been launched successfully, FALSE otherwise.

Definition at line 117 of file process.c.

118{
119 STARTUPINFOW si;
121 HANDLE hUserToken, hProcessToken;
123 WCHAR ExpandedCmdLine[MAX_PATH];
124
125 /* Expand the process path string */
126 ExpandEnvironmentStringsW(lpszProcessName, ExpandedCmdLine, ARRAYSIZE(ExpandedCmdLine));
127
128 ZeroMemory(&pi, sizeof(pi));
129 ZeroMemory(&si, sizeof(si));
130 si.cb = sizeof(si);
133
134 /* Get the token of the parent (current) process of the application */
136 if (!bSuccess)
137 {
138 DPRINT("OpenProcessToken() failed with error -> %lu\n", GetLastError());
139 return FALSE;
140 }
141
142 /* Duplicate a new token so that we can use it to create our process */
144 if (!bSuccess)
145 {
146 DPRINT("DuplicateTokenEx() failed with error -> %lu\n", GetLastError());
148 return FALSE;
149 }
150
151 /* Finally create the process */
152 bSuccess = CreateProcessAsUserW(hProcessToken,
153 NULL,
154 ExpandedCmdLine,
155 NULL,
156 NULL,
157 FALSE,
158 0, // DETACHED_PROCESS, NORMAL_PRIORITY_CLASS
159 NULL,
160 NULL,
161 &si,
162 &pi);
163
164 if (!bSuccess)
165 {
166 DPRINT("CreateProcessAsUserW() failed with error -> %lu\n", GetLastError());
168 CloseHandle(hProcessToken);
169 return FALSE;
170 }
171
172 CloseHandle(pi.hProcess);
173 CloseHandle(pi.hThread);
175 CloseHandle(hProcessToken);
176 return TRUE;
177}
HANDLE hUserToken
Definition: install.c:39
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessAsUserW(_In_opt_ HANDLE hToken, _In_opt_ LPCWSTR lpApplicationName, _Inout_opt_ LPWSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCWSTR lpCurrentDirectory, _In_ LPSTARTUPINFOW lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation)
Definition: logon.c:993
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI DuplicateTokenEx(IN HANDLE ExistingTokenHandle, IN DWORD dwDesiredAccess, IN LPSECURITY_ATTRIBUTES lpTokenAttributes OPTIONAL, IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, IN TOKEN_TYPE TokenType, OUT PHANDLE DuplicateTokenHandle)
Definition: security.c:3859
#define GetCurrentProcess()
Definition: compat.h:759
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
static BOOLEAN bSuccess
Definition: drive.cpp:433
@ SecurityIdentification
Definition: lsa.idl:56
@ TokenPrimary
Definition: imports.h:273
static refpint_t pi[]
Definition: server.c:96
DWORD cb
Definition: winbase.h:852
DWORD dwFlags
Definition: winbase.h:863
WORD wShowWindow
Definition: winbase.h:864
#define ZeroMemory
Definition: winbase.h:1712
#define STARTF_USESHOWWINDOW
Definition: winbase.h:491
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define TOKEN_DUPLICATE
Definition: setypes.h:926
#define TOKEN_QUERY
Definition: setypes.h:928
#define TOKEN_ALL_ACCESS
Definition: setypes.h:946

Referenced by DlgProc().

◆ ListBoxRefreshContents()

INT ListBoxRefreshContents ( VOID  )

@ListBoxRefreshContents

Handle the tasks on a periodic cycle. This function handles WM_TIMER message.

Returns
Returns 0 to inform the system that WM_TIMER has been processed.

Definition at line 226 of file umandlg.c.

227{
228 UINT i;
229 INT iItem;
230 BOOL bIsRunning;
231 WCHAR szFormat[MAX_BUFFER];
232
233 /* Disable listbox redraw */
235
236 for (i = 0; i < _countof(EntriesList); ++i)
237 {
238 /* Check the utility's state */
239 bIsRunning = IsProcessRunning(EntriesList[i].lpszProgram);
240 if (bIsRunning != EntriesList[i].bState)
241 {
242 /* The utility's state has changed, save it */
243 EntriesList[i].bState = bIsRunning;
244
245 /* Update the corresponding item in the listbox */
246 StringCchPrintfW(szFormat, _countof(szFormat),
247 (bIsRunning ? Globals.szRunning : Globals.szNotRunning),
249
252 if (iItem != LB_ERR)
254 }
255 }
256
257 /* Re-enable listbox redraw */
259
260 /*
261 * Check the previously selected item. This will help us determine what
262 * item has been selected and set its focus selection back. Furthermore, check
263 * the state of each accessibility tool and enable/disable the buttons.
264 */
267
268 return 0;
269}
UINT_PTR WPARAM
Definition: windef.h:207
#define LB_DELETESTRING
Definition: winuser.h:2032
#define LB_INSERTSTRING
Definition: winuser.h:2053
#define LB_SETCURSEL
Definition: winuser.h:2063
#define WM_SETREDRAW
Definition: winuser.h:1616

Referenced by DlgInitHandler(), and DlgProc().

◆ QueryAppSettings()

BOOL QueryAppSettings ( IN HKEY  hKey,
IN LPCWSTR  lpszSubKey,
IN LPCWSTR  lpszRegValue,
OUT PVOID  ReturnedData,
IN OUT LPDWORD  lpdwSizeData 
)

@QueryAppSettings

Query the setting from the application's key. This is a function helper.

Parameters
[in]hKeyA handle to a key.
[in]lpszSubKeyThe path to a sub-key.
[in]lpszRegValueThe registry value where we need to get the data from.
[out]ReturnedDataAn arbitrary pointer that receives the returned data. Being arbitrary, the data can be of any type.
[in,out]lpdwSizeDataA pointer to the returned data pointed by ReturnedData parameter that retrieves the size of the aforementioned data, in bytes.
Returns
Returns TRUE if the function successfully loaded the value we wanted, FALSE otherwise for failure.

Definition at line 102 of file registry.c.

107{
108 LONG lResult;
109 HKEY hKeyQueryValue;
110
111 lResult = RegOpenKeyExW(hKey,
112 lpszSubKey,
113 0,
114 KEY_READ,
115 &hKeyQueryValue);
116 if (lResult != ERROR_SUCCESS)
117 {
118 DPRINT("QueryAppSettings(): Failed to open the key of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
119 return FALSE;
120 }
121
122 lResult = RegQueryValueExW(hKeyQueryValue,
123 lpszRegValue,
124 NULL,
125 NULL,
126 (LPBYTE)&ReturnedData,
127 lpdwSizeData);
128 if (lResult != ERROR_SUCCESS)
129 {
130 DPRINT("QueryAppSettings(): Failed to query the data from value \"%S\". The error code is \"%li\".\n", lpszRegValue, lResult);
131 RegCloseKey(hKeyQueryValue);
132 return FALSE;
133 }
134
135 RegCloseKey(hKeyQueryValue);
136 return TRUE;
137}
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
FxAutoRegKey hKey
#define KEY_READ
Definition: nt_native.h:1023
unsigned char * LPBYTE
Definition: typedefs.h:53

◆ SaveAppSettings()

BOOL SaveAppSettings ( IN HKEY  hKey,
IN LPCWSTR  lpszRegValue,
IN DWORD  dwRegType,
IN PVOID  Data,
IN DWORD  cbSize 
)

@SaveAppSettings

Save an application's setting data to the Registry. This is a function helper.

Parameters
[in]hKeyA handle to a key.
[in]lpszRegValueThe path to the sub key where the value needs to be created.
[out]dwRegTypeThe type of registry value to be created (e.g. a REG_DWORD).
[in]DataA pointer to an arbitrary data for the value to be set. Being arbitrary, the data can be of any type (in conformity with the registry type pointed by dwRegType) otherwise the function might lead to a undefined behaviour.
[in]cbSizeThe size of the buffer data pointed by Data parameter, in bytes.
Returns
Returns TRUE if the function successfully saved the application's setting, FALSE otherwise for failure.

Definition at line 166 of file registry.c.

171{
172 LONG lResult;
173 HKEY hKeySetValue;
174
175 lResult = RegOpenKeyExW(hKey,
176 NULL,
177 0,
179 &hKeySetValue);
180 if (lResult != ERROR_SUCCESS)
181 {
182 DPRINT("SaveAppSettings(): Failed to open the key, the error code is \"%li\"!\n", lResult);
183 return FALSE;
184 }
185
186 lResult = RegSetValueExW(hKeySetValue,
187 lpszRegValue,
188 0,
189 dwRegType,
190 (LPBYTE)&Data,
191 cbSize);
192 if (lResult != ERROR_SUCCESS)
193 {
194 DPRINT("SaveAppSettings(): Failed to set the \"%S\" value with data, the error code is \"%li\"!\n", lpszRegValue, lResult);
195 RegCloseKey(hKeySetValue);
196 return FALSE;
197 }
198
199 RegCloseKey(hKeySetValue);
200 return TRUE;
201}
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
#define KEY_SET_VALUE
Definition: nt_native.h:1017

◆ ShowAboutDlg()

VOID ShowAboutDlg ( IN HWND  hDlgParent)

@ShowAboutDlg

Displays the Shell "About" dialog box.

Parameters
[in]hDlgParentA handle to the parent dialog window.
Returns
Nothing.

Definition at line 167 of file umandlg.c.

168{
169 WCHAR szApp[MAX_BUFFER];
170 WCHAR szAuthors[MAX_BUFFER];
171
173 LoadStringW(Globals.hInstance, IDS_AUTHORS, szAuthors, _countof(szAuthors));
174
175 ShellAboutW(hDlgParent, szApp, szAuthors, Globals.hIcon);
176}
#define IDS_APP_NAME
Definition: resource.h:137
#define IDS_AUTHORS
Definition: osk_res.h:50
BOOL WINAPI ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon)

Referenced by DlgProc().

◆ UManStartDlg()

BOOL WINAPI UManStartDlg ( VOID  )

@UManStartDlg

Executes the dialog initialization mechanism and starts Utility Manager. The function is exported for use by the main process.

Returns
Returns TRUE when the operation has succeeded, FALSE otherwise.

Definition at line 383 of file umandlg.c.

384{
386 DWORD dwError;
388
389 /* Create a mutant object for the program. */
390 hMutex = CreateMutexW(NULL, FALSE, L"Utilman");
391 if (hMutex)
392 {
393 /* Check if there's already a mutex for the program */
394 dwError = GetLastError();
395 if (dwError == ERROR_ALREADY_EXISTS)
396 {
397 /*
398 The program's instance is already here. That means
399 the program is running and we should not set a new instance
400 and mutex object.
401 */
403 return FALSE;
404 }
405 }
406
407 /* Load the common controls for the program */
408 iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
410 InitCommonControlsEx(&iccex);
411
418
419 /* Initialize the list of accessibility utilities */
421
422 /* Create the dialog box of the program */
426 DlgProc);
427
428 /* Delete the mutex */
429 if (hMutex)
430 {
432 }
433
434 return TRUE;
435}
#define IDD_MAIN_DIALOG
Definition: resource.h:6
#define IDS_RUNNING
Definition: resource.h:264
#define IDS_NOTRUNNING
Definition: resource.h:20
#define IDS_GROUPBOX_OPTIONS_TITLE
Definition: resource.h:25
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
DLGPROC DlgProc
Definition: desk.c:122
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
HANDLE hMutex
Definition: mutex.c:11
#define L(x)
Definition: ntvdm.h:50
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
#define ICC_STANDARD_CLASSES
Definition: commctrl.h:73
#define ICC_WIN95_CLASSES
Definition: commctrl.h:66
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexW(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:576
#define DialogBoxW(i, t, p, f)
Definition: winuser.h:4399
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by wWinMain().

◆ UpdateUtilityState()

VOID UpdateUtilityState ( IN BOOL  bUtilState)

@UpdateUtilityState

Checks the state of the given accessibility tool.

Parameters
[in]bUtilStateState condition (boolean TRUE: started / FALSE: stopped).
Returns
Nothing.

Definition at line 208 of file umandlg.c.

209{
210 Button_Enable(Globals.hDlgCtlStart, !bUtilState);
211 Button_Enable(Globals.hDlgCtlStop, bUtilState);
212
213 /* Update the groupbox's title based on the selected utility item */
215}
VOID GroupBoxUpdateTitle(VOID)
Definition: umandlg.c:187
#define Button_Enable(hwndCtl, fEnable)
Definition: windowsx.h:30

Referenced by DlgProc(), and ListBoxRefreshContents().

Variable Documentation

◆ Globals

UTILMAN_GLOBALS Globals
extern

Definition at line 13 of file clipbrd.c.

◆ RegData

REGISTRY_DATA RegData
extern

Definition at line 14 of file registry.c.

◆ Settings

Definition at line 25 of file charmap.c.