ReactOS  0.4.13-dev-443-g10f00f8
shimdbg.c
Go to the documentation of this file.
1 /*
2  * PROJECT: shimdbg
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Test tool for SHIM engine caching
5  * COPYRIGHT: Copyright 2016-2017 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <ctype.h>
11 #include <ntndk.h>
12 
14 #define DPFLTR_ERROR_LEVEL 0
15 
16 void xprintf(const char *fmt, ...)
17 {
18  va_list ap;
19 
20  va_start(ap, fmt);
21  vprintf(fmt, ap);
23  va_end(ap);
24 }
25 
26 
29 {
31  xprintf("NtApphelpCacheControl returned 0x%x\n", (unsigned int)Status);
32 }
33 
34 HANDLE MapFile(char* filename, UNICODE_STRING* PathName, int MapIt)
35 {
36  OBJECT_ATTRIBUTES LocalObjectAttributes;
41  if (MapIt)
42  {
43  InitializeObjectAttributes(&LocalObjectAttributes, PathName,
47  &LocalObjectAttributes, &IoStatusBlock,
50  if (!NT_SUCCESS(Status))
51  {
52  xprintf("Failed opening the file, using a NULL handle\n");
53  FileHandle = NULL;
54  }
55  }
56  return FileHandle;
57 }
58 
59 void CallApphelpWithImage(char* filename, int MapIt,
61 {
62  UNICODE_STRING PathName = {0};
64 
65  HANDLE FileHandle = MapFile(filename, &PathName, MapIt);
66 
67  xprintf("Calling %s %s mapping\n", ServiceName, (MapIt ? "with" : "without"));
68 
69  RtlInitUnicodeString(&CacheEntry.ImageName, PathName.Buffer);
70  CacheEntry.ImageHandle = FileHandle ? FileHandle : (HANDLE)-1;
71  CallApphelp(Service, &CacheEntry);
72  // we piggy-back on the PathName, so let the Cleanup take care of the string
73  //RtlFreeUnicodeString(&CacheEntry.ImageName);
74 
75  if (FileHandle)
77  RtlFreeUnicodeString(&PathName);
78 }
79 
80 int IsOpt(char* argv, const char* check)
81 {
82  if( argv && (argv[0] == '-' || argv[0] == '/') ) {
83  return !_strnicmp(argv + 1, check, strlen(check));
84  }
85  return 0;
86 }
87 
88 int HandleImageArg(int argc, char* argv[], int* pn, char MapItChar,
90 {
91  int n = *pn;
92  if (n+1 < argc)
93  {
94  int MapIt = argv[n][1] == MapItChar;
96  (*pn) += 1;
97  return 0;
98  }
99  xprintf("Error: no image name specified\n");
100  return 1;
101 }
102 
103 typedef WORD TAG;
104 typedef UINT64 QWORD;
105 
106 #define TAG_TYPE_MASK 0xF000
107 #define TAG_TYPE_DWORD 0x4000
108 #define TAG_TYPE_QWORD 0x5000
109 #define TAG_TYPE_STRINGREF 0x6000
110 
111 #define ATTRIBUTE_AVAILABLE 0x1
112 #define ATTRIBUTE_FAILED 0x2
113 
114 typedef struct tagATTRINFO
115 {
116  TAG type;
117  DWORD flags; /* ATTRIBUTE_AVAILABLE, ATTRIBUTE_FAILED */
118  union
119  {
120  QWORD qwattr;
121  DWORD dwattr;
122  WCHAR *lpattr;
123  };
124 } ATTRINFO, *PATTRINFO;
125 
126 static PVOID hdll;
127 static LPCWSTR (WINAPI *pSdbTagToString)(TAG);
128 static BOOL (WINAPI *pSdbGetFileAttributes)(LPCWSTR, PATTRINFO *, LPDWORD);
129 static BOOL (WINAPI *pSdbFreeFileAttributes)(PATTRINFO);
130 
132 {
133  if (!hdll)
134  {
135  static UNICODE_STRING DllName = RTL_CONSTANT_STRING(L"apphelp.dll");
136  static ANSI_STRING SdbTagToString = RTL_CONSTANT_STRING("SdbTagToString");
137  static ANSI_STRING SdbGetFileAttributes = RTL_CONSTANT_STRING("SdbGetFileAttributes");
138  static ANSI_STRING SdbFreeFileAttributes = RTL_CONSTANT_STRING("SdbFreeFileAttributes");
139  if (!NT_SUCCESS(LdrLoadDll(NULL, NULL, &DllName, &hdll)))
140  {
141  xprintf("Unable to load apphelp.dll\n");
142  return FALSE;
143  }
144  if (!NT_SUCCESS(LdrGetProcedureAddress(hdll, &SdbTagToString, 0, (PVOID)&pSdbTagToString)) ||
145  !NT_SUCCESS(LdrGetProcedureAddress(hdll, &SdbGetFileAttributes, 0, (PVOID)&pSdbGetFileAttributes)) ||
146  !NT_SUCCESS(LdrGetProcedureAddress(hdll, &SdbFreeFileAttributes, 0, (PVOID)&pSdbFreeFileAttributes)))
147  {
149  hdll = NULL;
150  xprintf("Unable to resolve functions\n");
151  return FALSE;
152  }
153  }
154  return TRUE;
155 }
156 
157 
158 int HandleDumpAttributes(int argc, char* argv[], int* pn, const char* opt)
159 {
161  PATTRINFO attr;
162  DWORD num_attr, n;
163  int argn = *pn;
164  const char* arg;
165 
166  if (!InitApphelp())
167  return 1;
168 
169  if (strlen(argv[argn]) > (strlen(opt)+1))
170  {
171  arg = argv[argn] + strlen(opt);
172  }
173  else if (argn+1 >= argc)
174  {
175  xprintf("Error: no image name specified\n");
176  return 1;
177  }
178  else
179  {
180  arg = argv[argn+1];
181  (*pn) += 1;
182  }
183 
185 
186  if (pSdbGetFileAttributes(FileName.Buffer, &attr, &num_attr))
187  {
188  xprintf("Dumping attributes for %s\n", arg);
189  for (n = 0; n < num_attr; ++n)
190  {
191  TAG tagType;
192  LPCWSTR tagName;
194  continue;
195 
196  tagName = pSdbTagToString(attr[n].type);
197 
198  tagType = attr[n].type & TAG_TYPE_MASK;
199  switch (tagType)
200  {
201  case TAG_TYPE_DWORD:
202  xprintf("<%ls>0x%lx</%ls>\n", tagName, attr[n].dwattr, tagName);
203  break;
204  case TAG_TYPE_STRINGREF:
205  xprintf("<%ls>%ls</%ls>\n", tagName, attr[n].lpattr, tagName);
206  break;
207  case TAG_TYPE_QWORD:
208  xprintf("<%ls>0x%I64x</%ls>\n", tagName, attr[n].qwattr, tagName);
209  break;
210  default:
211  xprintf("<!-- Unknown tag type: 0x%x (from 0x%x)\n", tagType, attr[n].type);
212  break;
213  }
214  }
215  xprintf("Done\n");
216  }
217  else
218  {
219  xprintf("Unable to get attributes from %s\n", arg);
220  }
221 
222 
224  return 0;
225 }
226 
227 UNICODE_STRING AppCompatCacheKey = RTL_CONSTANT_STRING(L"\\Registry\\MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\AppCompatCache");
230 #define REG_BINARY ( 3 ) // Free form binary
231 
232 
233 /* produce a hex dump, stolen from rdesktop.c */
234 void hexdump(unsigned char *p, unsigned int len)
235 {
236  unsigned char *line = p;
237  unsigned int i, thisline, offset = 0;
238 
239  while (offset < len)
240  {
241  xprintf("%04x ", offset);
242  thisline = len - offset;
243  if (thisline > 16)
244  thisline = 16;
245 
246  for (i = 0; i < thisline; i++)
247  xprintf("%02x ", line[i]);
248 
249  for (; i < 16; i++)
250  xprintf(" ");
251 
252  for (i = 0; i < thisline; i++)
253  xprintf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
254 
255  xprintf("\n");
256  offset += thisline;
257  line += thisline;
258  }
259 }
260 
261 void DumpRegistryData(int IncludeDump)
262 {
265  KEY_VALUE_PARTIAL_INFORMATION KeyValueObject;
266  PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation = &KeyValueObject;
267  ULONG KeyInfoSize, ResultSize;
268 
269  xprintf("Dumping AppCompatCache registry key\n");
270 
272 
274  KeyValuePartialInformation, KeyValueInformation,
275  sizeof(KeyValueObject), &ResultSize);
276 
278  {
279  KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + KeyValueInformation->DataLength;
280  KeyValueInformation = malloc(KeyInfoSize);
281  if (KeyValueInformation != NULL)
282  {
284  KeyValuePartialInformation, KeyValueInformation,
285  KeyInfoSize, &ResultSize);
286  }
287  }
288 
289  if (NT_SUCCESS(Status) && KeyValueInformation->Type == REG_BINARY)
290  {
291  ULONG crc;
292  if (IncludeDump)
293  hexdump(KeyValueInformation->Data, KeyValueInformation->DataLength);
294  crc = RtlComputeCrc32(0, KeyValueInformation->Data, KeyValueInformation->DataLength);
295  xprintf("Len: %lu, Crc: 0x%lx\n", KeyValueInformation->DataLength, crc);
296  }
297  else
298  {
299  xprintf("Failed reading AppCompatCache from registry (0x%lx)\n", Status);
300  }
301 
302  if (KeyValueInformation != &KeyValueObject)
303  free(KeyValueInformation);
304 
305  if (KeyHandle)
307 }
308 
309 int _getch();
310 
311 int main(int argc, char* argv[])
312 {
313  int n, unhandled = 0, keepopen = 0;
314 
315  for (n = 1; n < argc; ++n)
316  {
317  char* arg = argv[n];
318  if (IsOpt(arg, "d"))
319  {
320  xprintf("Calling ApphelpCacheServiceDump\n");
322  unhandled = 0;
323  }
324  else if (IsOpt(arg, "h"))
325  {
326  DumpRegistryData(arg[1] == 'h');
327  unhandled = 0;
328  }
329  else if (IsOpt(arg, "f"))
330  {
331  xprintf("Calling ApphelpCacheServiceFlush\n");
333  unhandled = 0;
334  }
335  else if (IsOpt(arg, "z"))
336  {
337  xprintf("Calling ApphelpDBGReadRegistry\n");
339  unhandled = 0;
340  }
341  else if (IsOpt(arg, "x"))
342  {
343  xprintf("Calling ApphelpDBGWriteRegistry\n");
345  unhandled = 0;
346  }
347  else if (IsOpt(arg, "l"))
348  {
349  unhandled |= HandleImageArg(argc, argv, &n, 'l',
350  ApphelpCacheServiceLookup, "ApphelpCacheServiceLookup");
351  }
352  else if (IsOpt(arg, "u"))
353  {
354  unhandled |= HandleImageArg(argc, argv, &n, 'u',
355  ApphelpCacheServiceUpdate, "ApphelpCacheServiceUpdate");
356  }
357  else if (IsOpt(arg, "r"))
358  {
359  unhandled |= HandleImageArg(argc, argv, &n, 'r',
360  ApphelpCacheServiceRemove, "ApphelpCacheServiceRemove");
361  }
362  else if (IsOpt(arg, "a"))
363  {
364  unhandled |= HandleDumpAttributes(argc, argv, &n, "a");
365  }
366  else if (IsOpt(arg, "k"))
367  {
368  keepopen = 1;
369  }
370  else
371  {
372  unhandled = 1;
373  }
374  }
375  if (unhandled || argc == 1)
376  {
377  xprintf("Usage: %s [-d|-z|-x|-h|-H|-f|-[l|L] <image>|-[u|U] <image>|-[r|R] <image>|-k]\n", argv[0]);
378  xprintf(" -d: Dump shim cache over debug output\n");
379  xprintf(" -z: DEBUG Read shim cache from registry\n");
380  xprintf(" -x: DEBUG Write shim cache to registry\n");
381  xprintf(" -h: Hexdump shim registry key\n");
382  xprintf(" -H: Crc + Length from shim registry key only\n");
383  xprintf(" -f: Flush (clear) the shim cache\n");
384  xprintf(" -l: Lookup <image> in the shim cache\n");
385  xprintf(" -L: Lookup <image> in the shim cache without mapping it\n");
386  xprintf(" -u: Update (insert) <image> in the shim cache\n");
387  xprintf(" -U: Update (insert) <image> in the shim cache without mapping it\n");
388  xprintf(" -r: Remove <image> from the shim cache\n");
389  xprintf(" -R: Remove <image> from the shim cache without mapping it\n");
390  xprintf(" -a: Dump file attributes as used in the appcompat database\n");
391  xprintf(" -k: Keep the console open\n");
392  }
393  if (keepopen)
394  {
395  _getch();
396  }
397  return unhandled;
398 }
static BOOL(WINAPI *pSdbGetFileAttributes)(LPCWSTR
int main(int argc, char *argv[])
Definition: shimdbg.c:311
static int argc
Definition: ServiceArgs.c:12
#define TRUE
Definition: types.h:120
int IsOpt(char *argv, const char *check)
Definition: shimdbg.c:80
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
int HandleDumpAttributes(int argc, char *argv[], int *pn, const char *opt)
Definition: shimdbg.c:158
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4711
OBJECT_ATTRIBUTES AppCompatKeyAttributes
Definition: shimdbg.c:228
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
UNICODE_STRING AppCompatCacheKey
Definition: shimdbg.c:227
#define TAG_TYPE_DWORD
Definition: shimdbg.c:107
BOOL WINAPI SdbGetFileAttributes(LPCWSTR path, PATTRINFO *attr_info_ret, LPDWORD attr_count)
Definition: sdbfileattr.c:239
DWORD flags
Definition: apphelp.h:34
WCHAR * lpattr
Definition: apphelp.h:38
#define free
Definition: debug_ros.c:5
LONG NTSTATUS
Definition: precomp.h:26
GLintptr offset
Definition: glext.h:5920
GLdouble n
Definition: glext.h:7729
HANDLE MapFile(char *filename, UNICODE_STRING *PathName, int MapIt)
Definition: shimdbg.c:34
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
void * arg
Definition: msvc.h:12
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1252
#define TAG_TYPE_MASK
Definition: shimdbg.c:106
static LPCWSTR(WINAPI *pSdbTagToString)(TAG)
#define argv
Definition: mplay32.c:18
const char * filename
Definition: ioapi.h:135
#define NTSYSAPI
Definition: ntoskrnl.h:14
#define FILE_SHARE_READ
Definition: compat.h:125
UNICODE_STRING AppCompatCacheValue
Definition: shimdbg.c:229
void CallApphelpWithImage(char *filename, int MapIt, APPHELPCACHESERVICECLASS Service, char *ServiceName)
Definition: shimdbg.c:59
HANDLE FileHandle
Definition: stats.c:38
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
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define va_end(ap)
Definition: acmsvcex.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
struct tagATTRINFO * PATTRINFO
#define FILE_READ_DATA
Definition: nt_native.h:628
_Check_return_ _CRTIMP int __cdecl _strnicmp(_In_reads_or_z_(_MaxCount) const char *_Str1, _In_reads_or_z_(_MaxCount) const char *_Str2, _In_ size_t _MaxCount)
NTSTATUS NTAPI LdrGetProcedureAddress(IN PVOID BaseAddress, IN PANSI_STRING Name, IN ULONG Ordinal, OUT PVOID *ProcedureAddress)
Definition: ldrapi.c:823
LPCWSTR WINAPI SdbTagToString(TAG tag)
Definition: sdbapi.c:752
QWORD qwattr
Definition: apphelp.h:36
smooth NULL
Definition: ftsmooth.c:416
#define REG_BINARY
Definition: shimdbg.c:230
Definition: parser.c:48
char * va_list
Definition: acmsvcex.h:78
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
TAG type
Definition: apphelp.h:33
static PATTRINFO LPDWORD
Definition: shimdbg.c:128
void hexdump(unsigned char *p, unsigned int len)
Definition: shimdbg.c:234
UNICODE_STRING ImageName
Definition: pstypes.h:934
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
Definition: file.c:3951
CONST CHAR * PCCH
Definition: ntbasedef.h:399
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
LPTSTR ServiceName
Definition: ServiceMain.c:15
_Check_return_opt_ _CRTIMP int __cdecl vprintf(_In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
UINT64 QWORD
Definition: shimdbg.c:104
#define WINAPI
Definition: msvc.h:8
unsigned short WORD
Definition: ntddk_ex.h:93
NTSTATUS NTAPI NtApphelpCacheControl(_In_ APPHELPCACHESERVICECLASS Service, _In_opt_ PAPPHELP_CACHE_SERVICE_LOOKUP ServiceData)
Definition: apphelp.c:729
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID HANDLE
Definition: typedefs.h:71
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
WORD TAG
Definition: shimdbg.c:103
Definition: cookie.c:170
void check(CONTEXT *pContext)
Definition: NtContinue.c:61
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
GLbitfield flags
Definition: glext.h:7161
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define DPFLTR_ERROR_LEVEL
Definition: shimdbg.c:14
#define TAG_TYPE_QWORD
Definition: shimdbg.c:108
static BOOL InitApphelp()
Definition: shimdbg.c:131
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
__u8 attr
Definition: mkdosfs.c:359
static const WCHAR L[]
Definition: oid.c:1250
#define FILE_EXECUTE
Definition: nt_native.h:642
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
GLenum GLsizei len
Definition: glext.h:6722
NTSTATUS NTAPI DECLSPEC_HOTPATCH LdrLoadDll(IN PWSTR SearchPath OPTIONAL, IN PULONG DllCharacteristics OPTIONAL, IN PUNICODE_STRING DllName, OUT PVOID *BaseAddress)
Definition: ldrapi.c:310
#define SYNCHRONIZE
Definition: nt_native.h:61
DWORD dwattr
Definition: apphelp.h:37
Status
Definition: gdiplustypes.h:24
#define _In_
Definition: no_sal2.h:204
#define TAG_TYPE_STRINGREF
Definition: shimdbg.c:109
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
struct _FileName FileName
Definition: fatprocs.h:884
NTSTATUS NTAPI LdrUnloadDll(IN PVOID BaseAddress)
Definition: ldrapi.c:1322
NTSYSAPI ULONG NTAPI RtlComputeCrc32(_In_ ULONG InitialCrc, _In_ PUCHAR Buffer, _In_ ULONG Length)
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:61
#define _In_z_
Definition: no_sal2.h:239
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
BOOL WINAPI SdbFreeFileAttributes(PATTRINFO attr_info)
Definition: sdbfileattr.c:214
enum _APPHELPCACHESERVICECLASS APPHELPCACHESERVICECLASS
struct tagATTRINFO ATTRINFO
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define va_start(ap, A)
Definition: acmsvcex.h:91
static PVOID hdll
Definition: shimdbg.c:126
Definition: fs_rec.h:142
#define ATTRIBUTE_AVAILABLE
Definition: shimdbg.c:111
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
void CallApphelp(APPHELPCACHESERVICECLASS Service, PAPPHELP_CACHE_SERVICE_LOOKUP CacheEntry)
Definition: shimdbg.c:27
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32
int HandleImageArg(int argc, char *argv[], int *pn, char MapItChar, APPHELPCACHESERVICECLASS Service, char *ServiceName)
Definition: shimdbg.c:88
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define malloc
Definition: debug_ros.c:4
void DumpRegistryData(int IncludeDump)
Definition: shimdbg.c:261
unsigned long long UINT64
GLfloat GLfloat p
Definition: glext.h:8902
int _getch()
Definition: getch.c:16
Definition: dsound.c:943
void xprintf(const char *fmt,...)
Definition: shimdbg.c:16
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14