From c374e4ed3e56f4b341807b6da11c267a90c848f4 Mon Sep 17 00:00:00 2001 From: Robert Dickenson Date: Sun, 5 Jan 2003 14:17:42 +0000 Subject: [PATCH] Created test program for loading libraries in various ways. svn path=/trunk/; revision=3936 --- reactos/apps/testsets/loadlib/.cvsignore | 5 + reactos/apps/testsets/loadlib/loadlib.c | 222 +++++++++++++++++++++++ reactos/apps/testsets/loadlib/loadlib.h | 45 +++++ reactos/apps/testsets/loadlib/makefile | 24 +++ 4 files changed, 296 insertions(+) create mode 100644 reactos/apps/testsets/loadlib/.cvsignore create mode 100644 reactos/apps/testsets/loadlib/loadlib.c create mode 100644 reactos/apps/testsets/loadlib/loadlib.h create mode 100644 reactos/apps/testsets/loadlib/makefile diff --git a/reactos/apps/testsets/loadlib/.cvsignore b/reactos/apps/testsets/loadlib/.cvsignore new file mode 100644 index 00000000000..7e878167e8e --- /dev/null +++ b/reactos/apps/testsets/loadlib/.cvsignore @@ -0,0 +1,5 @@ +*.o +*.d +*.exe +*.coff +*.sym diff --git a/reactos/apps/testsets/loadlib/loadlib.c b/reactos/apps/testsets/loadlib/loadlib.c new file mode 100644 index 00000000000..fd767c0b13e --- /dev/null +++ b/reactos/apps/testsets/loadlib/loadlib.c @@ -0,0 +1,222 @@ +/* + * ReactOS test program - + * + * loadlib.c + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "loadlib.h" + + +#define APP_VERSION 1 +#define MAX_LIBS 25 + +#ifdef UNICODE +#define TARGET "UNICODE" +BOOL bUseAnsi = FALSE; +#else +#define TARGET "MBCS" +BOOL bUseAnsi = TRUE; +#endif +BOOL verbose_flagged = FALSE; +BOOL debug_flagged = FALSE; +BOOL loop_flagged = FALSE; +BOOL recursive_flagged = FALSE; + +HANDLE OutputHandle; +HANDLE InputHandle; + + +void dprintf(char* fmt, ...) +{ + va_list args; + char buffer[255]; + + va_start(args, fmt); + wvsprintfA(buffer, fmt, args); + WriteConsoleA(OutputHandle, buffer, lstrlenA(buffer), NULL, NULL); + va_end(args); +} + +long getinput(char* buf, int buflen) +{ + DWORD result; + + ReadConsoleA(InputHandle, buf, buflen, &result, NULL); + return (long)result; +} + +DWORD ReportLastError(void) +{ + DWORD dwError = GetLastError(); + if (dwError != ERROR_SUCCESS) { + PSTR msg = NULL; + if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, + 0, dwError, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PSTR)&msg, 0, NULL)) { + if (msg != NULL) { + dprintf("ReportLastError() %d - %s\n", dwError, msg); + } else { + dprintf("ERROR: ReportLastError() %d - returned TRUE but with no msg string!\n", dwError); + } + } else { + dprintf("ReportLastError() %d - unknown error\n", dwError); + } + if (msg != NULL) { + LocalFree(msg); + } + } + return dwError; +} + +const char* appName(const char* argv0) +{ + const char* name; + + name = (const char*)strrchr(argv0, '\\'); + if (name != NULL) + return name + 1; + return argv0; +} + +int usage(const char* appName) +{ + dprintf("USAGE: %s libname [libname ...] [unicode]|[ansi] [loop][recurse]\n", appName); + dprintf("\tWhere libname(s) is one or more libraries to load.\n"); + dprintf("\t[unicode] - perform tests using UNICODE api calls\n"); + dprintf("\t[ansi] - perform tests using ANSI api calls\n"); + dprintf("\t default is %s\n", TARGET); + dprintf("\t[loop] - run test process in continuous loop\n"); + dprintf("\t[recurse] - load libraries recursively rather than sequentually\n"); + dprintf("\t[debug] - enable debug mode (unused)\n"); + dprintf("\t[verbose] - enable verbose output (unused)\n"); + return 0; +} + +DWORD LoadLibraryList(char** libnames, int counter, BOOL bUseAnsi) +{ + HMODULE hModule; + + dprintf("Attempting to LoadLibrary"); + if (bUseAnsi) { + dprintf("A(%s) - ", *libnames); + hModule = LoadLibraryA(*libnames); + } else { + int len; + wchar_t libnameW[500]; + len = mbstowcs(libnameW, *libnames, strlen(*libnames)); + if (len) { + libnameW[len] = L'\0'; + dprintf("W(%S) - ", libnameW); + hModule = LoadLibraryW(libnameW); + } else { + return ERROR_INVALID_PARAMETER; + } + } + if (hModule == NULL) { + dprintf("\nERROR: failed to obtain handle to module %s - %x\n", *libnames, hModule); + return ReportLastError(); + } + dprintf("%x\n", hModule); + + if (counter--) { + LoadLibraryList(++libnames, counter, bUseAnsi); + } + + if (!FreeLibrary(hModule)) { + dprintf("ERROR: failed to free module %s - %x\n", *libnames, hModule); + return ReportLastError(); + } else { + dprintf("FreeLibrary(%x) - successfull.\n", hModule); + } + return 0L; +} + +int __cdecl main(int argc, char* argv[]) +{ + char* libs[MAX_LIBS]; + int lib_count = 0; + int test_num = 0; + int result = 0; + int i = 0; + + AllocConsole(); + InputHandle = GetStdHandle(STD_INPUT_HANDLE); + OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE); + + dprintf("%s application - build %03d (default: %s)\n", appName(argv[0]), APP_VERSION, TARGET); + if (argc < 2) { + /*return */usage(appName(argv[0])); + } + memset(libs, 0, sizeof(libs)); + for (i = 1; i < argc; i++) { + if (lstrcmpiA(argv[i], "ansi") == 0) { + bUseAnsi = TRUE; + } else if (lstrcmpiA(argv[i], "unicode") == 0) { + bUseAnsi = FALSE; + } else if (lstrcmpiA(argv[i], "loop") == 0) { + loop_flagged = 1; + } else if (lstrcmpiA(argv[i], "recurse") == 0) { + recursive_flagged = 1; + } else if (lstrcmpiA(argv[i], "verbose") == 0) { + verbose_flagged = 1; + } else if (lstrcmpiA(argv[i], "debug") == 0) { + debug_flagged = 1; + } else { + if (lib_count < MAX_LIBS) { + libs[lib_count] = argv[i]; + ++lib_count; + } + } + } + if (lib_count) { + do { + if (recursive_flagged) { + result = LoadLibraryList(libs, lib_count - 1, bUseAnsi); + } else { + for (i = 0; i < lib_count; i++) { + result = LoadLibraryList(&libs[i], 0, bUseAnsi); + //if (result != 0) break; + } + } + } while (loop_flagged); + } else { + int len; + char buffer[500]; + do { + dprintf("\nEnter library name to attempt loading: "); + len = getinput(buffer, sizeof(buffer) - 1); + if (len > 2) { + char* buf = buffer; + buffer[len-2] = '\0'; + result = LoadLibraryList(&buf, 0, bUseAnsi); + } else break; + } while (!result && len); + } + dprintf("finished\n"); + return result; +} + + +#ifdef _NOCRT +char* args[] = { "loadlib.exe", "advapi32.dll", "user32.dll", "recurse"}; +int __cdecl mainCRTStartup(void) +{ + return main(3, args); +} +#endif /*__GNUC__*/ diff --git a/reactos/apps/testsets/loadlib/loadlib.h b/reactos/apps/testsets/loadlib/loadlib.h new file mode 100644 index 00000000000..51210d4722e --- /dev/null +++ b/reactos/apps/testsets/loadlib/loadlib.h @@ -0,0 +1,45 @@ +/* + * ReactOS test program - + * + * loadlib.h + * + * Copyright (C) 2002 Robert Dickenson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __LOADLIB_H__ +#define __LOADLIB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +extern BOOL verbose_flagged; +extern BOOL debug_flagged; +extern BOOL loop_flagged; +extern BOOL recursive_flagged; + +DWORD ReportLastError(void); +long getinput(char* Buffer, int buflen); +void dprintf(char* fmt, ...); + + +#ifdef __cplusplus +}; +#endif + +#endif // __LOADLIB_H__ diff --git a/reactos/apps/testsets/loadlib/makefile b/reactos/apps/testsets/loadlib/makefile new file mode 100644 index 00000000000..a10e2440ca8 --- /dev/null +++ b/reactos/apps/testsets/loadlib/makefile @@ -0,0 +1,24 @@ +# +# $Id: makefile,v 1.0 + +PATH_TO_TOP = ../../.. + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = loadlib + +#TARGET_CFLAGS = -DDBG -DUNICODE -D_UNICODE + +TARGET_SDKLIBS = kernel32.a ntdll.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF