ReactOS  0.4.14-dev-384-g5b37caa
EvtLogTest.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Tests
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: rostests/win32/advapi32/eventlog/EvtLogTest.c
5  * PURPOSE: Interactively test some EventLog service APIs and its behaviour.
6  * PROGRAMMER: Hermes Belusca-Maito
7  */
8 
9 #include <stdio.h>
10 #include <conio.h>
11 
12 #define WIN32_LEAN_AND_MEAN
13 #include <windows.h>
14 
15 #include "MyEventProvider.h"
16 
17 #define PROVIDER_NAME L"MyEventProvider"
18 
20  UINT MaxSize,
21  UINT SourcesCount,
22  LPCWSTR EventLogSources[])
23 {
24  BOOL Success = FALSE;
25  LONG lRet;
26  HKEY hKey = NULL, hEventKey = NULL, hSrcKey = NULL;
27  UINT i;
28  // WCHAR evtFile[] = L"D:\\myfile.evtx";
29 
30  wprintf(L"Creating log %s of MaxSize 0x%x with %d sources...", EventLogName, MaxSize, SourcesCount);
31 
33  L"SYSTEM\\CurrentControlSet\\Services\\Eventlog",
35  &hKey);
36  if (lRet != ERROR_SUCCESS)
37  goto Quit;
38 
39  /*
40  * At this precise moment, EventLog detects we create a new log registry key
41  * and therefore creates for us the log file in System32\config (<= Win2k3)
42  * or in System32\winevt\Logs (>= Vista).
43  */
44  lRet = RegCreateKeyExW(hKey,
45  EventLogName,
48  &hEventKey, NULL);
49  if (lRet != ERROR_SUCCESS)
50  goto Quit;
51 
52  RegSetValueExW(hEventKey, L"MaxSize", 0, REG_DWORD,
53  (LPBYTE)&MaxSize, sizeof(MaxSize));
54 
55  i = 0;
56  RegSetValueExW(hEventKey, L"Retention", 0, REG_DWORD,
57  (LPBYTE)&i, sizeof(i));
58 
59 #if 0
60  /*
61  * Set the flag that will allow EventLog to use an alternative log file name.
62  * If this flag is not set, EventLog will not care about the "File" value.
63  * When the flag is set, EventLog monitors for the "File" value, which can be
64  * changed at run-time, in which case a new event log file is created.
65  */
66  i = 1;
67  RegSetValueExW(hEventKey, L"Flags", 0, REG_DWORD,
68  (LPBYTE)&i, sizeof(i));
69 
70  RegSetValueExW(hEventKey, L"File", 0, REG_EXPAND_SZ,
71  (LPBYTE)evtFile, sizeof(evtFile));
72 #endif
73 
74  for (i = 0; i < SourcesCount; i++)
75  {
76  lRet = RegCreateKeyExW(hEventKey,
77  EventLogSources[i],
80  &hSrcKey, NULL);
81  RegFlushKey(hSrcKey);
82  RegCloseKey(hSrcKey);
83  }
84 
85  RegFlushKey(hEventKey);
86 
87  Success = TRUE;
88 
89 Quit:
90  if (Success)
91  wprintf(L"Success\n");
92  else
93  wprintf(L"Failure\n");
94 
95  if (hEventKey)
96  RegCloseKey(hEventKey);
97 
98  if (hKey)
99  RegCloseKey(hKey);
100 
101  return Success;
102 }
103 
105 {
106  BOOL Success = FALSE;
107  LONG lRet;
108  HKEY hKey, hEventKey;
109  DWORD MaxKeyNameLen, KeyNameLen;
110  LPWSTR Buf = NULL;
111 
112  wprintf(L"Deleting log %s...", EventLogName);
113 
115  L"SYSTEM\\CurrentControlSet\\Services\\Eventlog",
117  &hKey);
118  if (lRet != ERROR_SUCCESS)
119  goto Quit;
120 
121  lRet = RegOpenKeyExW(hKey,
122  EventLogName,
124  &hEventKey);
125  if (lRet != ERROR_SUCCESS)
126  goto Quit;
127 
128  lRet = RegQueryInfoKeyW(hEventKey,
129  NULL, NULL, NULL, NULL,
130  &MaxKeyNameLen,
131  NULL, NULL, NULL, NULL, NULL, NULL);
132  if (lRet != ERROR_SUCCESS)
133  goto Quit;
134 
135  MaxKeyNameLen++;
136 
137  Buf = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, MaxKeyNameLen * sizeof(WCHAR));
138  if (!Buf)
139  goto Quit;
140 
141  KeyNameLen = MaxKeyNameLen;
142  while (RegEnumKeyExW(hEventKey,
143  0,
144  Buf,
145  &KeyNameLen,
147  {
148  RegDeleteKeyW(hEventKey, Buf);
149  KeyNameLen = MaxKeyNameLen;
150  }
151 
152  RegFlushKey(hEventKey);
153 
154  HeapFree(GetProcessHeap(), 0, Buf);
155 
156  Success = TRUE;
157 
158 Quit:
159  if (Success)
160  {
161  RegCloseKey(hEventKey);
162  RegDeleteKeyW(hKey, EventLogName);
163 
164  wprintf(L"Success\n");
165  }
166  else
167  {
168  if (hEventKey)
169  RegCloseKey(hEventKey);
170 
171  wprintf(L"Failure\n");
172  }
173 
174  if (hKey)
175  RegCloseKey(hKey);
176 
177  return Success;
178 }
179 
181 {
182  BOOL Success = FALSE;
183  LPCWSTR EvtLog = L"MyLog";
184  LPCWSTR Sources[] = {L"Source1", L"Source2"};
185  HANDLE hEventLog;
186  ULONG MaxSize = max(0x30 + 0x28 + 0x200, 0x010000);
187 
188  /* Create the test event log */
189  if (!CreateEventLog(EvtLog, MaxSize, ARRAYSIZE(Sources), Sources))
190  return;
191 
192  wprintf(L"Press any key to continue...\n");
193  _getch();
194 
195  /* To report events we can either use a handle got from OpenEventLog or from RegisterEventSource! */
196  hEventLog = OpenEventLogW(NULL, EvtLog);
197  wprintf(L"OpenEventLogW(NULL, EvtLog = %s) ", EvtLog);
198  if (hEventLog)
199  {
200  LPCWSTR String = L"Event from OpenEventLog handle with EvtLog";
201 
202  wprintf(L"succeeded\n");
203  Success = ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, 1, 1, NULL, 1, 0, &String, NULL);
204  if (!Success)
205  wprintf(L" Failed to report event\n");
206  }
207  else
208  {
209  wprintf(L"failed\n");
210  }
211  CloseEventLog(hEventLog);
212 
213  /* This call should fail (where we use a source name for OpenEventLog) */
214  hEventLog = OpenEventLogW(NULL, L"Source1");
215  wprintf(L"OpenEventLogW(NULL, Source = %s) ", L"Source1");
216  if (hEventLog)
217  {
218  LPCWSTR String = L"Event from OpenEventLog handle with Source";
219 
220  wprintf(L"succeeded\n");
221  Success = ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, 1, 1, NULL, 1, 0, &String, NULL);
222  if (!Success)
223  wprintf(L" Failed to report event\n");
224  }
225  else
226  {
227  wprintf(L"failed\n");
228  }
229  CloseEventLog(hEventLog);
230 
231  /* Now use RegisterEventSource */
232  hEventLog = RegisterEventSourceW(NULL, EvtLog);
233  wprintf(L"RegisterEventSourceW(NULL, EvtLog = %s) ", EvtLog);
234  if (hEventLog)
235  {
236  LPCWSTR String = L"Event from RegisterEventSource handle with EvtLog";
237 
238  wprintf(L"succeeded\n");
239  Success = ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, 1, 1, NULL, 1, 0, &String, NULL);
240  if (!Success)
241  wprintf(L" Failed to report event\n");
242  }
243  else
244  {
245  wprintf(L"failed\n");
246  }
247  DeregisterEventSource(hEventLog);
248 
249  /* Now use RegisterEventSource */
250  hEventLog = RegisterEventSourceW(NULL, L"Source1");
251  wprintf(L"RegisterEventSourceW(NULL, Source = %s) ", L"Source1");
252  if (hEventLog)
253  {
254  LPCWSTR String = L"Event from RegisterEventSource handle with Source";
255 
256  wprintf(L"succeeded\n");
257  Success = ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, 1, 1, NULL, 1, 0, &String, NULL);
258  if (!Success)
259  wprintf(L" Failed to report event\n");
260  }
261  else
262  {
263  wprintf(L"failed\n");
264  }
265  DeregisterEventSource(hEventLog);
266 
267  /* Now fill the log with one big event */
268  hEventLog = OpenEventLogW(NULL, EvtLog);
269  wprintf(L"OpenEventLogW(NULL, EvtLog = %s) ", EvtLog);
270  if (hEventLog)
271  {
272  // LPWSTR String = L"Big event";
273  PVOID Data;
274 
275  wprintf(L"succeeded\n");
276 
277  // MaxSize -= (0x30 + 0x28 + 0x300 + 0x40);
278  MaxSize = 0xFC80 - sizeof(EVENTLOGRECORD); // With a StartOffset of 0x14, that should allow seeing the effect of splitting the EOF record in half...
279  Data = HeapAlloc(GetProcessHeap(), 0, MaxSize);
280  if (Data)
281  {
282  RtlFillMemory(Data, MaxSize, 0xCA);
283  Success = ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, 1, 1, NULL, 0 /* 1 */, MaxSize, NULL /* &String */, Data);
284  if (!Success)
285  wprintf(L" Failed to report event\n");
286 
288  }
289  }
290  else
291  {
292  wprintf(L"failed\n");
293  }
294  CloseEventLog(hEventLog);
295 
296  wprintf(L"Press any key to continue...\n");
297  _getch();
298 
299  /* Delete the test event log */
300  RemoveEventLog(EvtLog);
301 }
302 
303 /*
304  * This code was adapted from the MSDN article "Reporting Events" at:
305  * https://msdn.microsoft.com/en-us/library/windows/desktop/aa363680(v=vs.85).aspx
306  */
308 {
309  LONG lRet;
310  HKEY hKey = NULL, hSourceKey = NULL;
311  DWORD dwData;
312  // WCHAR DllPath[] = L"C:\\Users\\ReactOS\\Desktop\\EvtLogTest\\Debug\\" PROVIDER_NAME L".dll";
313  WCHAR DllPath[] = L"C:\\" PROVIDER_NAME L".dll";
314 
315  wprintf(L"Testing \"" PROVIDER_NAME L"\" in 'Application' log...");
316 
318  L"SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application",
320  &hKey);
321  if (lRet != ERROR_SUCCESS)
322  goto Quit;
323 
324  lRet = RegCreateKeyExW(hKey,
328  &hSourceKey, NULL);
329  if (lRet != ERROR_SUCCESS)
330  goto Quit;
331 
332  dwData = 3;
333  RegSetValueExW(hSourceKey, L"CategoryCount", 0, REG_DWORD,
334  (LPBYTE)&dwData, sizeof(dwData));
335 
337  RegSetValueExW(hSourceKey, L"TypesSupported", 0, REG_DWORD,
338  (LPBYTE)&dwData, sizeof(dwData));
339 
340  RegSetValueExW(hSourceKey, L"CategoryMessageFile", 0, REG_SZ,
341  (LPBYTE)DllPath, sizeof(DllPath));
342 
343  RegSetValueExW(hSourceKey, L"EventMessageFile", 0, REG_SZ,
344  (LPBYTE)DllPath, sizeof(DllPath));
345 
346  RegSetValueExW(hSourceKey, L"ParameterMessageFile", 0, REG_SZ,
347  (LPBYTE)DllPath, sizeof(DllPath));
348 
349  RegFlushKey(hSourceKey);
350 
351  {
352  CONST LPWSTR pBadCommand = L"The command that was not valid";
353  CONST LPWSTR pFilename = L"c:\\folder\\file.ext";
354  CONST LPWSTR pNumberOfRetries = L"3";
355  CONST LPWSTR pSuccessfulRetries = L"0";
356  CONST LPWSTR pQuarts = L"8";
357  CONST LPWSTR pGallons = L"2";
358 
359  HANDLE hEventLog = NULL;
360  LPWSTR pInsertStrings[2] = {NULL, NULL};
361  DWORD dwEventDataSize = 0;
362 
363  // The source name (provider) must exist as a subkey of Application.
365  if (NULL == hEventLog)
366  {
367  wprintf(L"RegisterEventSource failed with 0x%x.\n", GetLastError());
368  goto cleanup;
369  }
370 
371  // This event includes user-defined data as part of the event.
372  // The event message does not use insert strings.
373  dwEventDataSize = ((DWORD)wcslen(pBadCommand) + 1) * sizeof(WCHAR);
374  if (!ReportEventW(hEventLog, EVENTLOG_ERROR_TYPE, UI_CATEGORY, MSG_INVALID_COMMAND, NULL, 0, dwEventDataSize, NULL, pBadCommand))
375  {
376  wprintf(L"ReportEvent failed with 0x%x for event 0x%x.\n", GetLastError(), MSG_INVALID_COMMAND);
377  goto cleanup;
378  }
379 
380  // This event uses insert strings.
381  pInsertStrings[0] = pFilename;
382  if (!ReportEventW(hEventLog, EVENTLOG_ERROR_TYPE, DATABASE_CATEGORY, MSG_BAD_FILE_CONTENTS, NULL, 1, 0, (LPCWSTR*)pInsertStrings, NULL))
383  {
384  wprintf(L"ReportEvent failed with 0x%x for event 0x%x.\n", GetLastError(), MSG_BAD_FILE_CONTENTS);
385  goto cleanup;
386  }
387 
388  // This event uses insert strings.
389  pInsertStrings[0] = pNumberOfRetries;
390  pInsertStrings[1] = pSuccessfulRetries;
391  if (!ReportEventW(hEventLog, EVENTLOG_WARNING_TYPE, NETWORK_CATEGORY, MSG_RETRIES, NULL, 2, 0, (LPCWSTR*)pInsertStrings, NULL))
392  {
393  wprintf(L"ReportEvent failed with 0x%x for event 0x%x.\n", GetLastError(), MSG_RETRIES);
394  goto cleanup;
395  }
396 
397  // This event uses insert strings.
398  pInsertStrings[0] = pQuarts;
399  pInsertStrings[1] = pGallons;
400  if (!ReportEventW(hEventLog, EVENTLOG_INFORMATION_TYPE, UI_CATEGORY, MSG_COMPUTE_CONVERSION, NULL, 2, 0, (LPCWSTR*)pInsertStrings, NULL))
401  {
402  wprintf(L"ReportEvent failed with 0x%x for event 0x%x.\n", GetLastError(), MSG_COMPUTE_CONVERSION);
403  goto cleanup;
404  }
405 
406  wprintf(L"All events successfully reported.\n");
407 
408 cleanup:
409 
410  if (hEventLog)
411  DeregisterEventSource(hEventLog);
412 
413  }
414 
415 Quit:
416  // RegDeleteKeyW(hKey, PROVIDER_NAME);
417 
418  if (hKey)
419  RegCloseKey(hKey);
420 }
421 
422 int wmain(int argc, WCHAR* argv[])
423 {
424  UINT Choice = 0;
425 
426  wprintf(L"\n"
427  L"EventLog API interactive tester for ReactOS\n"
428  L"===========================================\n"
429  L"\n");
430 
431 ChoiceMenu:
432  do
433  {
434  wprintf(L"What do you want to do:\n"
435  L"1) Test events generation.\n"
436  L"2) Test customized event provider.\n"
437  L"\n"
438  L"0) Quit the program.\n"
439  L"(Enter the right number, or 0 to quit): ");
440  wscanf(L"%lu", &Choice);
441  wprintf(L"\n\n");
442  } while ((Choice != 0) && (Choice != 1) && (Choice != 2));
443 
444  switch (Choice)
445  {
446  case 0:
447  goto Quit;
448  break;
449 
450  case 1:
452  break;
453 
454  case 2:
456  break;
457 
458  default:
459  break;
460  }
461  wprintf(L"\n\n\n\n");
462  goto ChoiceMenu;
463 
464 Quit:
465  wprintf(L"Press any key to quit...\n");
466  _getch();
467  return 0;
468 }
HANDLE WINAPI OpenEventLogW(IN LPCWSTR lpUNCServerName, IN LPCWSTR lpSourceName)
Definition: eventlog.c:985
static int argc
Definition: ServiceArgs.c:12
#define max(a, b)
Definition: svc.c:63
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_SET_VALUE
Definition: nt_native.h:1017
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
_Check_return_ _CRTIMP int __cdecl wscanf(_In_z_ _Scanf_format_string_ const wchar_t *_Format,...)
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1237
static HANDLE ULONG_PTR dwData
Definition: file.c:35
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
static WCHAR String[]
Definition: stringtable.c:55
#define wprintf(...)
Definition: whoami.c:18
#define argv
Definition: mplay32.c:18
LONG WINAPI RegFlushKey(HKEY hKey)
Definition: reg.c:2974
#define DWORD
Definition: nt_native.h:44
BOOL RemoveEventLog(LPCWSTR EventLogName)
Definition: EvtLogTest.c:104
BOOL CreateEventLog(LPCWSTR EventLogName, UINT MaxSize, UINT SourcesCount, LPCWSTR EventLogSources[])
Definition: EvtLogTest.c:19
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
struct _EVENTLOGRECORD EVENTLOGRECORD
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
#define EVENTLOG_ERROR_TYPE
Definition: winnt_old.h:2630
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
int wmain(int argc, WCHAR *argv[])
Definition: EvtLogTest.c:422
smooth NULL
Definition: ftsmooth.c:416
_In_ LPGUID _In_ PVOID Data
Definition: classpnp.h:778
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
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 GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define EVENTLOG_INFORMATION_TYPE
Definition: winnt_old.h:2632
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define EVENTLOG_WARNING_TYPE
Definition: winnt_old.h:2631
unsigned long DWORD
Definition: ntddk_ex.h:95
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3686
static const WCHAR L[]
Definition: oid.c:1250
BOOL WINAPI CloseEventLog(IN HANDLE hEventLog)
Definition: eventlog.c:427
VOID TestMyEventProvider(VOID)
Definition: EvtLogTest.c:307
BOOL WINAPI ReportEventW(IN HANDLE hEventLog, IN WORD wType, IN WORD wCategory, IN DWORD dwEventID, IN PSID lpUserSid, IN WORD wNumStrings, IN DWORD dwDataSize, IN LPCWSTR *lpStrings, IN LPVOID lpRawData)
Definition: eventlog.c:1516
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
static const char const char * DllPath
Definition: image.c:34
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI DeregisterEventSource(IN HANDLE hEventLog)
Definition: eventlog.c:473
VOID TestEventsGeneration(VOID)
Definition: EvtLogTest.c:180
unsigned int ULONG
Definition: retypes.h:1
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
#define PROVIDER_NAME
Definition: EvtLogTest.c:17
char * cleanup(char *str)
Definition: wpickclick.c:99
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2527
WCHAR * LPWSTR
Definition: xmlstorage.h:184
int _getch()
Definition: getch.c:16
HANDLE WINAPI RegisterEventSourceW(IN LPCWSTR lpUNCServerName, IN LPCWSTR lpSourceName)
Definition: eventlog.c:1295
#define REG_DWORD
Definition: sdbapi.c:596
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:593
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1018
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:402
#define CONST
Definition: pedump.c:81
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1019
#define REG_SZ
Definition: layer.c:22