ReactOS  0.4.15-dev-2985-g54406bf
faultrep.c
Go to the documentation of this file.
1 /*
2  * Unit test suite for fault reporting in XP and above
3  *
4  * Copyright 2010 Detlef Riekenberg
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  */
21 
22 #include <stdarg.h>
23 #include <stdio.h>
24 
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winerror.h"
28 #include "winreg.h"
29 
30 #include "errorrep.h"
31 #include "wine/test.h"
32 
33 static const char regpath_root[] = "Software\\Microsoft\\PCHealth\\ErrorReporting";
34 static const char regpath_exclude[] = "ExclusionList";
35 
36 
38 {
39  static BOOL (WINAPI *pCheckTokenMembership)(HANDLE,PSID,PBOOL) = NULL;
40  static BOOL (WINAPI *pOpenProcessToken)(HANDLE, DWORD, PHANDLE) = NULL;
42  PSID Group;
43  BOOL IsInGroup;
44  HANDLE token;
45 
46  if (!pOpenProcessToken)
47  {
48  HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
49  pOpenProcessToken = (void*)GetProcAddress(hadvapi32, "OpenProcessToken");
50  pCheckTokenMembership = (void*)GetProcAddress(hadvapi32, "CheckTokenMembership");
51  if (!pCheckTokenMembership || !pOpenProcessToken)
52  {
53  /* Win9x (power to the masses) or NT4 (no way to know) */
54  trace("missing pOpenProcessToken or CheckTokenMembership\n");
55  return FALSE;
56  }
57  }
58 
61  0, 0, 0, 0, 0, 0, &Group) ||
62  !pCheckTokenMembership(NULL, Group, &IsInGroup))
63  {
64  trace("Could not check if the current user is an administrator\n");
65  return FALSE;
66  }
67  if (!IsInGroup)
68  {
72  0, 0, 0, 0, 0, 0, &Group) ||
73  !pCheckTokenMembership(NULL, Group, &IsInGroup))
74  {
75  trace("Could not check if the current user is a power user\n");
76  return FALSE;
77  }
78  if (!IsInGroup)
79  {
80  /* Only administrators and power users can be powerful */
81  return TRUE;
82  }
83  }
84 
85  if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
86  {
87  BOOL ret;
89  DWORD size;
90 
93  return (ret && type == TokenElevationTypeLimited);
94  }
95  return FALSE;
96 }
97 
98 
99 /* ###### */
100 
102 {
103  BOOL res;
104  LONG lres;
105  HKEY hroot;
106  HKEY hexclude = 0;
107 
108  /* clean state */
110  if (lres == ERROR_ACCESS_DENIED)
111  {
112  skip("Not enough access rights\n");
113  return;
114  }
115 
116  if (!lres)
117  lres = RegOpenKeyA(hroot, regpath_exclude, &hexclude);
118 
119  if (!lres)
120  RegDeleteValueA(hexclude, "winetest_faultrep.exe");
121 
122 
123  SetLastError(0xdeadbeef);
125  ok(!res, "got %d and 0x%x (expected FALSE)\n", res, GetLastError());
126 
127  SetLastError(0xdeadbeef);
129  ok(!res, "got %d and 0x%x (expected FALSE)\n", res, GetLastError());
130 
131  SetLastError(0xdeadbeef);
132  /* existence of the path doesn't matter this function succeeded */
133  res = AddERExcludedApplicationA("winetest_faultrep.exe");
134  if (is_process_limited())
135  {
136  /* LastError is not set! */
137  ok(!res, "AddERExcludedApplicationA should have failed got %d\n", res);
138  }
139  else
140  {
141  ok(res, "AddERExcludedApplicationA failed (le=0x%x)\n", GetLastError());
142 
143  /* add, when already present */
144  SetLastError(0xdeadbeef);
145  res = AddERExcludedApplicationA("winetest_faultrep.exe");
146  ok(res, "AddERExcludedApplicationA failed (le=0x%x)\n", GetLastError());
147  }
148 
149  /* cleanup */
150  RegDeleteValueA(hexclude, "winetest_faultrep.exe");
151 
152  RegCloseKey(hexclude);
153  RegCloseKey(hroot);
154 }
155 
156 /* ########################### */
157 
158 START_TEST(faultrep)
159 {
161 }
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3257
enum _TOKEN_ELEVATION_TYPE TOKEN_ELEVATION_TYPE
#define CloseHandle
Definition: compat.h:598
#define TRUE
Definition: types.h:120
_In_opt_ PSID Group
Definition: rtlfuncs.h:1605
static BOOL is_process_limited(void)
Definition: faultrep.c:37
START_TEST(faultrep)
Definition: faultrep.c:158
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
#define DOMAIN_ALIAS_RID_POWER_USERS
Definition: setypes.h:627
static const char regpath_exclude[]
Definition: faultrep.c:34
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
#define FALSE
Definition: types.h:117
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
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 token
Definition: glfuncs.h:210
static void test_AddERExcludedApplicationA(void)
Definition: faultrep.c:101
static const char regpath_root[]
Definition: faultrep.c:33
BOOL * PBOOL
Definition: windef.h:161
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1177
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:526
GLsizeiptr size
Definition: glext.h:5919
#define trace
Definition: atltest.h:70
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:553
#define TOKEN_QUERY
Definition: setypes.h:878
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID HANDLE
Definition: typedefs.h:73
#define SetLastError(x)
Definition: compat.h:611
struct _SID * PSID
Definition: eventlog.c:35
int ret
BOOL WINAPI AddERExcludedApplicationA(LPCSTR lpAppFileName)
Definition: faultrep.c:88
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:454
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define GetCurrentProcess()
Definition: compat.h:618
#define ok(value,...)
Definition: atltest.h:57
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2319
#define NULL
Definition: types.h:112
#define skip(...)
Definition: atltest.h:64
GLuint res
Definition: glext.h:9613
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:413
#define GetProcAddress(x, y)
Definition: compat.h:612
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:624
SID_IDENTIFIER_AUTHORITY NtAuthority
Definition: database.c:21
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:553
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12