ReactOS 0.4.15-dev-8093-g3285f69
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
33static const char regpath_root[] = "Software\\Microsoft\\PCHealth\\ErrorReporting";
34static 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;
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
158START_TEST(faultrep)
159{
161}
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
static SID_IDENTIFIER_AUTHORITY NtAuthority
Definition: security.c:40
#define RegCloseKey(hKey)
Definition: registry.h:49
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1179
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3234
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2287
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:411
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:674
#define CloseHandle
Definition: compat.h:739
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define GetCurrentProcess()
Definition: compat.h:759
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
BOOL WINAPI AddERExcludedApplicationA(LPCSTR lpAppFileName)
Definition: faultrep.c:88
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
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 const char regpath_root[]
Definition: faultrep.c:33
static BOOL is_process_limited(void)
Definition: faultrep.c:37
static void test_AddERExcludedApplicationA(void)
Definition: faultrep.c:101
static const char regpath_exclude[]
Definition: faultrep.c:34
struct _SID * PSID
Definition: eventlog.c:35
_In_opt_ PSID Group
Definition: rtlfuncs.h:1646
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
long LONG
Definition: pedump.c:60
PVOID HANDLE
Definition: typedefs.h:73
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
BOOL * PBOOL
Definition: windef.h:161
#define WINAPI
Definition: msvc.h:6
enum _TOKEN_ELEVATION_TYPE TOKEN_ELEVATION_TYPE
@ TokenElevationTypeLimited
Definition: winnt_old.h:2488
@ TokenElevationTypeDefault
Definition: winnt_old.h:2486
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
#define TOKEN_QUERY
Definition: setypes.h:928
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
@ TokenElevationType
Definition: setypes.h:983
#define DOMAIN_ALIAS_RID_POWER_USERS
Definition: setypes.h:655
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652