Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224/* * ReactOS test program - * * loadlib.c * * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> * * 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 <windows.h>#include "loadlib.h"#include <string.h>#include <stdlib.h>#include <wchar.h>
#define APP_VERSION 1#define MAX_LIBS 25
#ifdef UNICODE#define TARGET "UNICODE"BOOL bUseAnsi = FALSE;#else#define TARGET "MBCS"BOOL bUseAnsi = TRUE;#endifBOOL 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 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 _NOCRTchar* args[] = { "loadlib.exe", "advapi32.dll", "user32.dll", "recurse"};int __cdecl mainCRTStartup(void){ return main(3, args);}#endif /*__GNUC__*/