ReactOS  0.4.14-dev-50-g13bb5e2
csystray.cpp
Go to the documentation of this file.
1 /*
2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/shellext/stobject/csystray.cpp
5 * PURPOSE: Systray shell service object implementation
6 * PROGRAMMERS: David Quintana <gigaherz@gmail.com>
7 * Shriraj Sawant a.k.a SR13 <sr.official@hotmail.com>
8 */
9 
10 #include "precomp.h"
11 
12 #include <undocshell.h>
13 #include <shellutils.h>
14 
19 };
21 
24 
26 {
27  HKEY hKey;
28  DWORD dwSize;
29 
30  /* Enable power and volume by default */
32 
34  L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\SysTray",
35  0,
36  NULL,
38  KEY_READ,
39  NULL,
40  &hKey,
41  NULL) == ERROR_SUCCESS)
42  {
43  dwSize = sizeof(DWORD);
44  RegQueryValueExW(hKey,
45  L"Services",
46  NULL,
47  NULL,
48  (LPBYTE)&this->dwServicesEnabled,
49  &dwSize);
50 
51  RegCloseKey(hKey);
52  }
53 }
54 
56 {
57  HKEY hKey;
58 
59  if (bEnable)
60  this->dwServicesEnabled |= dwServiceFlag;
61  else
62  this->dwServicesEnabled &= ~dwServiceFlag;
63 
65  L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\SysTray",
66  0,
67  NULL,
69  KEY_WRITE,
70  NULL,
71  &hKey,
72  NULL) == ERROR_SUCCESS)
73  {
74  RegSetValueExW(hKey,
75  L"Services",
76  0,
77  REG_DWORD,
78  (LPBYTE)&this->dwServicesEnabled,
79  sizeof(DWORD));
80 
81  RegCloseKey(hKey);
82  }
83 }
84 
86 {
87  return (this->dwServicesEnabled & dwServiceFlag);
88 }
89 
91 {
92  HRESULT hr = CoCreateInstance(CLSID_ConnectionTray, 0, 1u, IID_PPV_ARG(IOleCommandTarget, &pctNetShell));
93  if (FAILED(hr))
94  return hr;
95 
96  return pctNetShell->Exec(&CGID_ShellServiceObject,
99 }
100 
102 {
103  if (!pctNetShell)
104  return S_FALSE;
105  HRESULT hr = pctNetShell->Exec(&CGID_ShellServiceObject,
108  pctNetShell.Release();
109  return hr;
110 }
111 
113 {
114  TRACE("Initializing Notification icons...\n");
115  for (int i = 0; i < g_NumIcons; i++)
116  {
117  if (this->dwServicesEnabled & g_IconHandlers[i].dwServiceFlag)
118  {
119  HRESULT hr = g_IconHandlers[i].pfnInit(this);
120  if (FAILED(hr))
121  return hr;
122  }
123  }
124 
125  return InitNetShell();
126 }
127 
129 {
130  TRACE("Shutting down Notification icons...\n");
131  for (int i = 0; i < g_NumIcons; i++)
132  {
133  if (this->dwServicesEnabled & g_IconHandlers[i].dwServiceFlag)
134  {
136  if (FAILED(hr))
137  return hr;
138  }
139  }
140 
141  return ShutdownNetShell();
142 }
143 
145 {
146  TRACE("Updating Notification icons...\n");
147  for (int i = 0; i < g_NumIcons; i++)
148  {
149  if (this->dwServicesEnabled & g_IconHandlers[i].dwServiceFlag)
150  {
152  if (FAILED(hr))
153  return hr;
154  }
155  }
156 
157  return S_OK;
158 }
159 
161 {
162  for (int i = 0; i < g_NumIcons; i++)
163  {
164  HRESULT hr = g_IconHandlers[i].pfnMessage(this, uMsg, wParam, lParam, lResult);
165  if (FAILED(hr))
166  return hr;
167 
168  if (hr == S_OK)
169  return hr;
170  }
171 
172  // Not handled by anyone, so return accordingly.
173  return S_FALSE;
174 }
175 
176 /*++
177 * @name NotifyIcon
178 *
179 * Basically a Shell_NotifyIcon wrapper.
180 * Based on the parameters provided, it changes the current state of the notification icon.
181 *
182 * @param code
183 * Determines whether to add, delete or modify the notification icon (represented by uId).
184 * @param uId
185 * Represents the particular notification icon.
186 * @param hIcon
187 * A handle to an icon for the notification object.
188 * @param szTip
189 * A string for the tooltip of the notification.
190 * @param dwstate
191 * Determines whether to show or hide the notification icon.
192 *
193 * @return The error code.
194 *
195 *--*/
197 {
198  NOTIFYICONDATA nim = { 0 };
199 
200  TRACE("NotifyIcon code=%d, uId=%d, hIcon=%p, szTip=%S\n", code, uId, hIcon, szTip);
201 
202  nim.cbSize = sizeof(nim);
203  nim.uFlags = NIF_MESSAGE | NIF_ICON | NIF_STATE | NIF_TIP;
204  nim.hIcon = hIcon;
205  nim.uID = uId;
206  nim.uCallbackMessage = uId;
207  nim.dwState = dwstate;
208  nim.dwStateMask = NIS_HIDDEN;
209  nim.hWnd = m_hWnd;
210  nim.uVersion = NOTIFYICON_VERSION;
211  if (szTip)
212  StringCchCopy(nim.szTip, _countof(nim.szTip), szTip);
213  else
214  nim.szTip[0] = 0;
215  BOOL ret = Shell_NotifyIcon(code, &nim);
216  return ret ? S_OK : E_FAIL;
217 }
218 
220 {
221  CSysTray * st = (CSysTray*) param;
222  return st->SysTrayThreadProc();
223 }
224 
226 {
227  BOOL ret;
228  MSG msg;
229 
230  while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0)
231  {
232  if (ret < 0)
233  break;
234 
237  }
238 
239  return S_OK;
240 }
241 
243 {
244  WCHAR strFileName[MAX_PATH];
245  GetModuleFileNameW(g_hInstance, strFileName, MAX_PATH);
246  HMODULE hLib = LoadLibraryW(strFileName);
247 
249 
250  Create(NULL);
251 
253 
254  CoUninitialize();
255 
257 }
258 
260 {
261  TRACE("CSysTray Init TODO: Initialize tray icon handlers.\n");
262 
264 
266 
267  return S_OK;
268 }
269 
271 {
272  DestroyWindow();
273  hwndSysTray = NULL;
274  return S_OK;
275 }
276 
277 // *** IOleCommandTarget methods ***
278 HRESULT STDMETHODCALLTYPE CSysTray::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
279 {
281  return S_OK;
282 }
283 
284 HRESULT STDMETHODCALLTYPE CSysTray::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
285 {
286  if (!IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject))
287  return E_FAIL;
288 
289  switch (nCmdID)
290  {
291  case OLECMDID_NEW: // init
292  return CreateSysTrayThread();
293  case OLECMDID_SAVE: // shutdown
294  return DestroySysTrayWindow();
295  }
296  return S_OK;
297 }
298 
300 {
301  HRESULT hr;
302 
303  if (hWnd != m_hWnd)
304  return FALSE;
305 
306  switch (uMsg)
307  {
308  case WM_NCCREATE:
309  case WM_NCDESTROY:
310  return FALSE;
311 
312  case WM_CREATE:
314  InitIcons();
315  SetTimer(1, 2000, NULL);
316  return TRUE;
317 
318  case WM_TIMER:
319  if (wParam == 1)
320  UpdateIcons();
321  else
322  ProcessIconMessage(uMsg, wParam, lParam, lResult);
323  return TRUE;
324 
325  case WM_DESTROY:
326  KillTimer(1);
327  ShutdownIcons();
328  return TRUE;
329  }
330 
331  TRACE("SysTray message received %u (%08p %08p)\n", uMsg, wParam, lParam);
332 
333  hr = ProcessIconMessage(uMsg, wParam, lParam, lResult);
334  if (FAILED(hr))
335  return FALSE;
336 
337  return (hr == S_OK);
338 }
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 * u
Definition: glfuncs.h:240
static DWORD WINAPI s_SysTrayThreadProc(PVOID param)
Definition: csystray.cpp:219
#define POWER_SERVICE_FLAG
Definition: precomp.h:37
HWND hwndSysTray
Definition: csystray.h:32
#define HOTPLUG_SERVICE_FLAG
Definition: precomp.h:38
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:609
#define NIF_MESSAGE
Definition: shellapi.h:102
#define DispatchMessage
Definition: winuser.h:5666
HRESULT STDMETHODCALLTYPE Power_Init(_In_ CSysTray *pSysTray)
Definition: power.cpp:115
BOOL WINAPI TranslateMessage(_In_ const MSG *)
static HICON
Definition: imagelist.c:84
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
HRESULT InitNetShell()
Definition: csystray.cpp:90
HRESULT CreateSysTrayThread()
Definition: csystray.cpp:259
#define KEY_READ
Definition: nt_native.h:1023
HRESULT STDMETHODCALLTYPE Power_Update(_In_ CSysTray *pSysTray)
Definition: power.cpp:123
_In_ BOOLEAN Create
Definition: pstypes.h:511
#define _countof(array)
Definition: fontsub.cpp:30
#define HKEY_CURRENT_USER
Definition: winreg.h:11
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
const int g_NumIcons
Definition: csystray.cpp:20
HWND hWnd
Definition: settings.c:17
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID=0)
Definition: csystray.cpp:299
HRESULT STDMETHODCALLTYPE Volume_Message(_In_ CSysTray *pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
Definition: volume.cpp:261
UINT_PTR WPARAM
Definition: windef.h:207
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
#define WM_NCCREATE
Definition: winuser.h:1665
BOOL WINAPI DestroyWindow(_In_ HWND)
#define DWORD
Definition: nt_native.h:44
int32_t INT
Definition: typedefs.h:56
SysTrayIconHandlers_t g_IconHandlers[]
Definition: csystray.cpp:15
WPARAM wParam
Definition: combotst.c:138
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:1091
HRESULT DestroySysTrayWindow()
Definition: csystray.cpp:270
VOID EnableService(DWORD dwServiceFlag, BOOL bEnable)
Definition: csystray.cpp:55
VOID WINAPI FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode)
Definition: loader.c:516
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
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD dwStateMask
Definition: shellapi.h:237
BOOL IsServiceEnabled(DWORD dwServiceFlag)
Definition: csystray.cpp:85
CHAR szTip[128]
Definition: shellapi.h:235
HRESULT STDMETHODCALLTYPE Hotplug_Init(_In_ CSysTray *pSysTray)
Definition: hotplug.cpp:130
#define S_FALSE
Definition: winerror.h:2357
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:136
#define NIF_TIP
Definition: shellapi.h:104
HRESULT STDMETHODCALLTYPE Power_Message(_In_ CSysTray *pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
Definition: power.cpp:230
#define LoadLibraryW(x)
Definition: compat.h:404
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define NIF_ICON
Definition: shellapi.h:103
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
HRESULT NotifyIcon(INT code, UINT uId, HICON hIcon, LPCWSTR szTip, DWORD dwstate=0)
Definition: csystray.cpp:196
#define WM_DESTROY
Definition: winuser.h:1591
HRESULT STDMETHODCALLTYPE Hotplug_Message(_In_ CSysTray *pSysTray, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
Definition: hotplug.cpp:242
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
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:4895
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwServicesEnabled
Definition: csystray.h:31
HRESULT STDMETHODCALLTYPE Hotplug_Shutdown(_In_ CSysTray *pSysTray)
Definition: hotplug.cpp:149
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
CSysTray()
Definition: csystray.cpp:22
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define VOLUME_SERVICE_FLAG
Definition: precomp.h:39
LONG HRESULT
Definition: typedefs.h:77
#define WM_TIMER
Definition: winuser.h:1724
#define WM_NCDESTROY
Definition: winuser.h:1666
GLfloat param
Definition: glext.h:5796
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT ShutdownIcons()
Definition: csystray.cpp:128
virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
Definition: csystray.cpp:284
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
int ret
static const WCHAR L[]
Definition: oid.c:1250
#define StringCchCopy
Definition: strsafe.h:139
virtual ~CSysTray()
Definition: csystray.cpp:23
CComPtr< IOleCommandTarget > pctNetShell
Definition: csystray.h:27
HRESULT ShutdownNetShell()
Definition: csystray.cpp:101
HRESULT SysTrayMessageLoop()
Definition: csystray.cpp:225
PFNSTUPDATE pfnUpdate
Definition: precomp.h:53
UINT uCallbackMessage
Definition: shellapi.h:229
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3234
HRESULT SysTrayThreadProc()
Definition: csystray.cpp:242
#define S_OK
Definition: intsafe.h:59
_In_ BOOL bEnable
Definition: winddi.h:3426
HICON hIcon
Definition: msconfig.c:44
HRESULT STDMETHODCALLTYPE Hotplug_Update(_In_ CSysTray *pSysTray)
Definition: hotplug.cpp:139
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
HRESULT ProcessIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult)
Definition: csystray.cpp:160
HRESULT InitIcons()
Definition: csystray.cpp:112
HRESULT UpdateIcons()
Definition: csystray.cpp:144
HRESULT STDMETHODCALLTYPE Volume_Update(_In_ CSysTray *pSysTray)
Definition: volume.cpp:168
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:1935
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
#define GetMessage
Definition: winuser.h:5691
HANDLE hThread
Definition: wizard.c:27
PFNSTMESSAGE pfnMessage
Definition: precomp.h:54
HRESULT STDMETHODCALLTYPE Volume_Init(_In_ CSysTray *pSysTray)
Definition: volume.cpp:137
#define msg(x)
Definition: auth_time.c:54
VOID GetServicesEnabled()
Definition: csystray.cpp:25
#define Shell_NotifyIcon
Definition: shellapi.h:687
#define WM_CREATE
Definition: winuser.h:1590
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:114
HRESULT STDMETHODCALLTYPE Volume_Shutdown(_In_ CSysTray *pSysTray)
Definition: volume.cpp:200
HRESULT STDMETHODCALLTYPE Power_Shutdown(_In_ CSysTray *pSysTray)
Definition: power.cpp:131
HINSTANCE g_hInstance
Definition: MainWindow.cpp:18
LONG_PTR LRESULT
Definition: windef.h:209
virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
Definition: csystray.cpp:278
#define REG_DWORD
Definition: sdbapi.c:596
LPARAM lParam
Definition: combotst.c:139
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
PFNSTINIT pfnInit
Definition: precomp.h:51
PFNSTSHUTDOWN pfnShutdown
Definition: precomp.h:52