mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 05:32:21 +00:00
Move testsets from reactos to rostests (into a "win32" directory for now). 2/2
svn path=/trunk/; revision=26012
This commit is contained in:
parent
102ccaa64d
commit
1423048911
38 changed files with 3891 additions and 0 deletions
223
rostests/win32/loadlib/loadlib.c
Normal file
223
rostests/win32/loadlib/loadlib.c
Normal file
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
* 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;
|
||||
#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 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__*/
|
Loading…
Add table
Add a link
Reference in a new issue