2 * ReactOS test program -
6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #define TARGET "UNICODE"
34 BOOL bUseAnsi
= FALSE
;
39 BOOL verbose_flagged
= FALSE
;
40 BOOL debug_flagged
= FALSE
;
41 BOOL loop_flagged
= FALSE
;
42 BOOL recursive_flagged
= FALSE
;
48 void dprintf(char* fmt
, ...)
54 wvsprintfA(buffer
, fmt
, args
);
55 WriteConsoleA(OutputHandle
, buffer
, lstrlenA(buffer
), NULL
, NULL
);
59 long getinput(char* buf
, int buflen
)
63 ReadConsoleA(InputHandle
, buf
, buflen
, &result
, NULL
);
67 DWORD
ReportLastError(void)
69 DWORD dwError
= GetLastError();
70 if (dwError
!= ERROR_SUCCESS
) {
72 if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_FROM_SYSTEM
,
73 0, dwError
, MAKELANGID(LANG_NEUTRAL
,SUBLANG_DEFAULT
), (PSTR
)&msg
, 0, NULL
)) {
75 dprintf("ReportLastError() %d - %s\n", dwError
, msg
);
77 dprintf("ERROR: ReportLastError() %d - returned TRUE but with no msg string!\n", dwError
);
80 dprintf("ReportLastError() %d - unknown error\n", dwError
);
89 const char* appName(const char* argv0
)
93 name
= (const char*)strrchr(argv0
, '\\');
99 int usage(const char* appName
)
101 dprintf("USAGE: %s libname [libname ...] [unicode]|[ansi] [loop][recurse]\n", appName
);
102 dprintf("\tWhere libname(s) is one or more libraries to load.\n");
103 dprintf("\t[unicode] - perform tests using UNICODE api calls\n");
104 dprintf("\t[ansi] - perform tests using ANSI api calls\n");
105 dprintf("\t default is %s\n", TARGET
);
106 dprintf("\t[loop] - run test process in continuous loop\n");
107 dprintf("\t[recurse] - load libraries recursively rather than sequentually\n");
108 dprintf("\t[debug] - enable debug mode (unused)\n");
109 dprintf("\t[verbose] - enable verbose output (unused)\n");
113 DWORD
LoadLibraryList(char** libnames
, int counter
, BOOL bUseAnsi
)
117 dprintf("Attempting to LoadLibrary");
119 dprintf("A(%s) - ", *libnames
);
120 hModule
= LoadLibraryA(*libnames
);
123 wchar_t libnameW
[500];
124 len
= mbstowcs(libnameW
, *libnames
, strlen(*libnames
));
126 libnameW
[len
] = L
'\0';
127 dprintf("W(%S) - ", libnameW
);
128 hModule
= LoadLibraryW(libnameW
);
130 return ERROR_INVALID_PARAMETER
;
133 if (hModule
== NULL
) {
134 dprintf("\nERROR: failed to obtain handle to module %s - %x\n", *libnames
, hModule
);
135 return ReportLastError();
137 dprintf("%x\n", hModule
);
140 LoadLibraryList(++libnames
, counter
, bUseAnsi
);
143 if (!FreeLibrary(hModule
)) {
144 dprintf("ERROR: failed to free module %s - %x\n", *libnames
, hModule
);
145 return ReportLastError();
147 dprintf("FreeLibrary(%x) - successfull.\n", hModule
);
152 int __cdecl
main(int argc
, char* argv
[])
154 char* libs
[MAX_LIBS
];
160 InputHandle
= GetStdHandle(STD_INPUT_HANDLE
);
161 OutputHandle
= GetStdHandle(STD_OUTPUT_HANDLE
);
163 dprintf("%s application - build %03d (default: %s)\n", appName(argv
[0]), APP_VERSION
, TARGET
);
165 /*return */usage(appName(argv
[0]));
167 memset(libs
, 0, sizeof(libs
));
168 for (i
= 1; i
< argc
; i
++) {
169 if (lstrcmpiA(argv
[i
], "ansi") == 0) {
171 } else if (lstrcmpiA(argv
[i
], "unicode") == 0) {
173 } else if (lstrcmpiA(argv
[i
], "loop") == 0) {
175 } else if (lstrcmpiA(argv
[i
], "recurse") == 0) {
176 recursive_flagged
= 1;
177 } else if (lstrcmpiA(argv
[i
], "verbose") == 0) {
179 } else if (lstrcmpiA(argv
[i
], "debug") == 0) {
182 if (lib_count
< MAX_LIBS
) {
183 libs
[lib_count
] = argv
[i
];
190 if (recursive_flagged
) {
191 result
= LoadLibraryList(libs
, lib_count
- 1, bUseAnsi
);
193 for (i
= 0; i
< lib_count
; i
++) {
194 result
= LoadLibraryList(&libs
[i
], 0, bUseAnsi
);
195 //if (result != 0) break;
198 } while (loop_flagged
);
203 dprintf("\nEnter library name to attempt loading: ");
204 len
= getinput(buffer
, sizeof(buffer
) - 1);
207 buffer
[len
-2] = '\0';
208 result
= LoadLibraryList(&buf
, 0, bUseAnsi
);
210 } while (!result
&& len
);
212 dprintf("finished\n");
218 char* args
[] = { "loadlib.exe", "advapi32.dll", "user32.dll", "recurse"};
219 int __cdecl
mainCRTStartup(void)
221 return main(3, args
);