Author: mjansen Date: Sun Jul 2 11:56:01 2017 New Revision: 75264 URL: http://svn.reactos.org/svn/reactos?rev=75264&view=rev Log: [SHIMDBG] Output both to the console and the debug output + fix a copypasta error.
Modified: trunk/rosapps/applications/devutils/shimdbg/shimdbg.c Modified: trunk/rosapps/applications/devutils/shimdbg/shimdbg.c URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/devutils/shimdbg/shimdbg.c?rev=75264&r1=75263&r2=75264&view=diff ============================================================================== --- trunk/rosapps/applications/devutils/shimdbg/shimdbg.c [iso-8859-1] (original) +++ trunk/rosapps/applications/devutils/shimdbg/shimdbg.c [iso-8859-1] Sun Jul 2 11:56:01 2017 @@ -10,11 +10,31 @@ #include <ctype.h> #include <ntndk.h> +void __stdcall OutputDebugStringA(PCSTR); + +void xprintf(const char *fmt, ...) +{ + va_list ap; + int length; + char *buf; + + va_start(ap, fmt); + length = _vscprintf(fmt, ap); + buf = malloc(length + 1); + vsprintf(buf, fmt, ap); + buf[length] = '\0'; + va_end(ap); + + fputs(buf, stdout); + OutputDebugStringA(buf); +} + + void CallApphelp(APPHELPCACHESERVICECLASS Service, PAPPHELP_CACHE_SERVICE_LOOKUP CacheEntry) { NTSTATUS Status = NtApphelpCacheControl(Service, CacheEntry); - printf("NtApphelpCacheControl returned 0x%x\n", (unsigned int)Status); + xprintf("NtApphelpCacheControl returned 0x%x\n", (unsigned int)Status); } HANDLE MapFile(char* filename, UNICODE_STRING* PathName, int MapIt) @@ -35,7 +55,7 @@ FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); if (!NT_SUCCESS(Status)) { - printf("Failed opening the file, using a NULL handle\n"); + xprintf("Failed opening the file, using a NULL handle\n"); FileHandle = NULL; } } @@ -50,7 +70,7 @@ HANDLE FileHandle = MapFile(filename, &PathName, MapIt); - printf("Calling %s %s mapping\n", ServiceName, (MapIt ? "with" : "without")); + xprintf("Calling %s %s mapping\n", ServiceName, (MapIt ? "with" : "without")); RtlInitUnicodeString(&CacheEntry.ImageName, PathName.Buffer); CacheEntry.ImageHandle = FileHandle ? FileHandle : (HANDLE)-1; @@ -82,7 +102,7 @@ (*pn) += 1; return 0; } - printf("Error: no image name specified\n"); + xprintf("Error: no image name specified\n"); return 1; } @@ -124,7 +144,7 @@ static ANSI_STRING SdbFreeFileAttributes = RTL_CONSTANT_STRING("SdbFreeFileAttributes"); if (!NT_SUCCESS(LdrLoadDll(NULL, NULL, &DllName, &hdll))) { - printf("Unable to load apphelp.dll\n"); + xprintf("Unable to load apphelp.dll\n"); return FALSE; } if (!NT_SUCCESS(LdrGetProcedureAddress(hdll, &SdbTagToString, 0, (PVOID)&pSdbTagToString)) || @@ -133,7 +153,7 @@ { LdrUnloadDll(hdll); hdll = NULL; - printf("Unable to resolve functions\n"); + xprintf("Unable to resolve functions\n"); return FALSE; } } @@ -158,7 +178,7 @@ } else if (argn+1 >= argc) { - printf("Error: no image name specified\n"); + xprintf("Error: no image name specified\n"); return 1; } else @@ -171,7 +191,7 @@ if (pSdbGetFileAttributes(FileName.Buffer, &attr, &num_attr)) { - printf("Dumping attributes for %s\n", arg); + xprintf("Dumping attributes for %s\n", arg); for (n = 0; n < num_attr; ++n) { TAG tagType; @@ -185,24 +205,24 @@ switch (tagType) { case TAG_TYPE_DWORD: - printf("<%ls>0x%lx</%ls><!-- %ld -->\n", tagName, attr[n].dwattr, tagName, attr[n].dwattr); + xprintf("<%ls>0x%lx</%ls>\n", tagName, attr[n].dwattr, tagName); break; case TAG_TYPE_STRINGREF: - printf("<%ls>0x%ls</%ls>\n", tagName, attr[n].lpattr, tagName); + xprintf("<%ls>%ls</%ls>\n", tagName, attr[n].lpattr, tagName); break; case TAG_TYPE_QWORD: - printf("<%ls>0x%I64x</%ls><!-- %I64d -->\n", tagName, attr[n].qwattr, tagName, attr[n].qwattr); + xprintf("<%ls>0x%I64x</%ls>\n", tagName, attr[n].qwattr, tagName); break; default: - printf("<!-- Unknown tag type: 0x%x (from 0x%x)\n", tagType, attr[n].type); + xprintf("<!-- Unknown tag type: 0x%x (from 0x%x)\n", tagType, attr[n].type); break; } } - printf("Done\n"); + xprintf("Done\n"); } else { - printf("Unable to get attributes from %s\n", arg); + xprintf("Unable to get attributes from %s\n", arg); } @@ -224,21 +244,21 @@ while (offset < len) { - printf("%04x ", offset); + xprintf("%04x ", offset); thisline = len - offset; if (thisline > 16) thisline = 16; for (i = 0; i < thisline; i++) - printf("%02x ", line[i]); + xprintf("%02x ", line[i]); for (; i < 16; i++) - printf(" "); + xprintf(" "); for (i = 0; i < thisline; i++) - printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'); - - printf("\n"); + xprintf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'); + + xprintf("\n"); offset += thisline; line += thisline; } @@ -252,7 +272,7 @@ PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation = &KeyValueObject; ULONG KeyInfoSize, ResultSize; - printf("Dumping AppCompatCache registry key\n"); + xprintf("Dumping AppCompatCache registry key\n"); Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &AppCompatKeyAttributes); @@ -278,11 +298,11 @@ if (IncludeDump) hexdump(KeyValueInformation->Data, KeyValueInformation->DataLength); crc = RtlComputeCrc32(0, KeyValueInformation->Data, KeyValueInformation->DataLength); - printf("Len: %lu, Crc: 0x%lx\n", KeyValueInformation->DataLength, crc); + xprintf("Len: %lu, Crc: 0x%lx\n", KeyValueInformation->DataLength, crc); } else { - printf("Failed reading AppCompatCache from registry (0x%lx)\n", Status); + xprintf("Failed reading AppCompatCache from registry (0x%lx)\n", Status); } if (KeyValueInformation != &KeyValueObject) @@ -303,7 +323,7 @@ char* arg = argv[n]; if (IsOpt(arg, "d")) { - printf("Calling ApphelpCacheServiceDump\n"); + xprintf("Calling ApphelpCacheServiceDump\n"); CallApphelp(ApphelpCacheServiceDump, NULL); unhandled = 0; } @@ -314,19 +334,19 @@ } else if (IsOpt(arg, "f")) { - printf("Calling ApphelpCacheServiceFlush\n"); + xprintf("Calling ApphelpCacheServiceFlush\n"); CallApphelp(ApphelpCacheServiceFlush, NULL); unhandled = 0; } else if (IsOpt(arg, "z")) { - printf("Calling ApphelpDBGReadRegistry\n"); + xprintf("Calling ApphelpDBGReadRegistry\n"); CallApphelp(ApphelpDBGReadRegistry, NULL); unhandled = 0; } else if (IsOpt(arg, "x")) { - printf("Calling ApphelpDBGWriteRegistry\n"); + xprintf("Calling ApphelpDBGWriteRegistry\n"); CallApphelp(ApphelpDBGWriteRegistry, NULL); unhandled = 0; } @@ -360,21 +380,21 @@ } if (unhandled || argc == 1) { - printf("Usage: %s [-d|-z|-x|-h|-H|-f|-[l|L] <image>|-[u|U] <image>|-[r|R] <image>|-k]\n", argv[0]); - printf(" -d: Dump shim cache over debug output\n"); - printf(" -z: DEBUG Read shim cache from registry\n"); - printf(" -x: DEBUG Write shim cache to registry\n"); - printf(" -h: Hexdump shim registry key\n"); - printf(" -H: Crc + Length from shim registry key only\n"); - printf(" -f: Flush (clear) the shim cache\n"); - printf(" -l: Lookup <image> in the shim cache\n"); - printf(" -L: Lookup <image> in the shim cache without mapping it\n"); - printf(" -u: Update (insert) <image> in the shim cache\n"); - printf(" -U: Update (insert) <image> in the shim cache without mapping it\n"); - printf(" -r: Remove <image> from the shim cache\n"); - printf(" -R: Remove <image> from the shim cache without mapping it\n"); - printf(" -a: Dump file attributes as used in the appcompat database\n"); - printf(" -k: Keep the console open\n"); + xprintf("Usage: %s [-d|-z|-x|-h|-H|-f|-[l|L] <image>|-[u|U] <image>|-[r|R] <image>|-k]\n", argv[0]); + xprintf(" -d: Dump shim cache over debug output\n"); + xprintf(" -z: DEBUG Read shim cache from registry\n"); + xprintf(" -x: DEBUG Write shim cache to registry\n"); + xprintf(" -h: Hexdump shim registry key\n"); + xprintf(" -H: Crc + Length from shim registry key only\n"); + xprintf(" -f: Flush (clear) the shim cache\n"); + xprintf(" -l: Lookup <image> in the shim cache\n"); + xprintf(" -L: Lookup <image> in the shim cache without mapping it\n"); + xprintf(" -u: Update (insert) <image> in the shim cache\n"); + xprintf(" -U: Update (insert) <image> in the shim cache without mapping it\n"); + xprintf(" -r: Remove <image> from the shim cache\n"); + xprintf(" -R: Remove <image> from the shim cache without mapping it\n"); + xprintf(" -a: Dump file attributes as used in the appcompat database\n"); + xprintf(" -k: Keep the console open\n"); } if (keepopen) {