From 10a923d08310298bd87a571ad1294832d4ad3905 Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Thu, 21 Oct 2004 05:12:02 +0000 Subject: [PATCH] Moving tests....Almost done. svn path=/trunk/; revision=11364 --- rosapps/tests/bench/.cvsignore | 7 + rosapps/tests/bench/bench-syscall.c | 8 + rosapps/tests/bench/bench-thread.c | 81 ++ rosapps/tests/bench/makefile | 23 + rosapps/tests/bitblt/.cvsignore | 7 + rosapps/tests/bitblt/bitblt.c | 139 ++ rosapps/tests/bitblt/lena.bmp | Bin 0 -> 89322 bytes rosapps/tests/bitblt/makefile | 22 + rosapps/tests/button/.cvsignore | 7 + rosapps/tests/button/Makefile | 22 + rosapps/tests/button/buttontst.c | 107 ++ rosapps/tests/button2/.cvsignore | 7 + rosapps/tests/button2/Makefile | 22 + rosapps/tests/button2/buttontst2.c | 219 +++ rosapps/tests/capclock/.cvsignore | 7 + rosapps/tests/capclock/Makefile | 20 + rosapps/tests/capclock/capclock.c | 70 + rosapps/tests/capclock/capclock.ico | Bin 0 -> 766 bytes rosapps/tests/capclock/capclock.rc | 20 + rosapps/tests/carets/.cvsignore | 7 + rosapps/tests/carets/caret.bmp | Bin 0 -> 106 bytes rosapps/tests/carets/carets.c | 150 +++ rosapps/tests/carets/carets.rc | 5 + rosapps/tests/carets/makefile | 23 + rosapps/tests/carets/resource.h | 1 + rosapps/tests/combo/.cvsignore | 7 + rosapps/tests/combo/combotst.c | 687 ++++++++++ rosapps/tests/combo/makefile | 25 + rosapps/tests/combo/utils.c | 33 + rosapps/tests/combo/utils.h | 9 + rosapps/tests/consume/.cvsignore | 7 + rosapps/tests/consume/Makefile | 21 + rosapps/tests/consume/consume.c | 31 + rosapps/tests/copymove/.cvsignore | 7 + rosapps/tests/copymove/Makefile | 21 + rosapps/tests/copymove/copymove.c | 303 +++++ rosapps/tests/count/.cvsignore | 7 + rosapps/tests/count/Makefile | 23 + rosapps/tests/count/count.c | 15 + rosapps/tests/create-links/.cvsignore | 7 + rosapps/tests/create-links/Makefile | 25 + rosapps/tests/create-links/create-links.c | 97 ++ rosapps/tests/dibtest/.cvsignore | 7 + rosapps/tests/dibtest/dibtest.c | 196 +++ rosapps/tests/dibtest/makefile | 23 + rosapps/tests/dirdlg/.cvsignore | 7 + rosapps/tests/dirdlg/dirdlg.c | 115 ++ rosapps/tests/dirdlg/dirdlg.rc | 14 + rosapps/tests/dirdlg/makefile | 21 + rosapps/tests/dirdlg/resource.h | 6 + rosapps/tests/diskspeed/.cvsignore | 7 + rosapps/tests/diskspeed/diskspeed.c | 165 +++ rosapps/tests/diskspeed/makefile | 23 + rosapps/tests/dnsapi/.cvsignore | 7 + rosapps/tests/dnsapi/dnsapi.c | 33 + rosapps/tests/dnsapi/makefile | 22 + rosapps/tests/dnsquery/.cvsignore | 7 + rosapps/tests/dnsquery/dnsquery.c | 28 + rosapps/tests/dnsquery/makefile | 22 + rosapps/tests/dump_shared_data/.cvsignore | 7 + .../tests/dump_shared_data/dump_shared_data.c | 52 + rosapps/tests/dump_shared_data/makefile | 22 + rosapps/tests/edit/.cvsignore | 7 + rosapps/tests/edit/edittest.c | 649 +++++++++ rosapps/tests/edit/makefile | 24 + rosapps/tests/edit/utils.c | 33 + rosapps/tests/edit/utils.h | 9 + rosapps/tests/enhmetafile/.cvsignore | 7 + rosapps/tests/enhmetafile/enhmetafile.c | 123 ++ rosapps/tests/enhmetafile/makefile | 23 + rosapps/tests/enhmetafile/test.emf | Bin 0 -> 120908 bytes rosapps/tests/enumfonts/.cvsignore | 7 + rosapps/tests/enumfonts/enumfonts.cpp | 271 ++++ rosapps/tests/enumfonts/makefile | 24 + rosapps/tests/enumwnd/.cvsignore | 7 + rosapps/tests/enumwnd/enumwnd.c | 187 +++ rosapps/tests/enumwnd/enumwnd.dsp | 90 ++ rosapps/tests/enumwnd/makefile | 23 + rosapps/tests/enumws/.cvsignore | 7 + rosapps/tests/enumws/enumws.c | 35 + rosapps/tests/enumws/makefile | 21 + rosapps/tests/event/.cvsignore | 7 + rosapps/tests/event/event.c | 33 + rosapps/tests/event/makefile | 23 + rosapps/tests/eventpair/.cvsignore | 7 + rosapps/tests/eventpair/eventpair.c | 65 + rosapps/tests/eventpair/makefile | 23 + rosapps/tests/fiber/.cvsignore | 7 + rosapps/tests/fiber/Makefile | 21 + rosapps/tests/fiber/fiber.c | 446 ++++++ rosapps/tests/global_mem/.cvsignore | 7 + rosapps/tests/global_mem/Makefile | 21 + rosapps/tests/global_mem/global_mem.c | 1062 +++++++++++++++ rosapps/tests/gradient/.cvsignore | 7 + rosapps/tests/gradient/gradient.c | 181 +++ rosapps/tests/gradient/makefile | 23 + rosapps/tests/guithreadinfo/.cvsignore | 7 + rosapps/tests/guithreadinfo/guithreadinfo.c | 132 ++ rosapps/tests/guithreadinfo/makefile | 23 + rosapps/tests/hello/.cvsignore | 7 + rosapps/tests/hello/hello.c | 8 + rosapps/tests/hello/makefile | 21 + rosapps/tests/hivetest/.cvsignore | 7 + rosapps/tests/hivetest/hivetest.c | 1196 +++++++++++++++++ rosapps/tests/hivetest/makefile | 24 + rosapps/tests/mktime/.cvsignore | 7 + rosapps/tests/mktime/makefile | 21 + rosapps/tests/mktime/mktime.c | 29 + 108 files changed, 8045 insertions(+) create mode 100644 rosapps/tests/bench/.cvsignore create mode 100644 rosapps/tests/bench/bench-syscall.c create mode 100644 rosapps/tests/bench/bench-thread.c create mode 100644 rosapps/tests/bench/makefile create mode 100644 rosapps/tests/bitblt/.cvsignore create mode 100644 rosapps/tests/bitblt/bitblt.c create mode 100644 rosapps/tests/bitblt/lena.bmp create mode 100644 rosapps/tests/bitblt/makefile create mode 100644 rosapps/tests/button/.cvsignore create mode 100644 rosapps/tests/button/Makefile create mode 100644 rosapps/tests/button/buttontst.c create mode 100644 rosapps/tests/button2/.cvsignore create mode 100644 rosapps/tests/button2/Makefile create mode 100644 rosapps/tests/button2/buttontst2.c create mode 100644 rosapps/tests/capclock/.cvsignore create mode 100644 rosapps/tests/capclock/Makefile create mode 100644 rosapps/tests/capclock/capclock.c create mode 100644 rosapps/tests/capclock/capclock.ico create mode 100644 rosapps/tests/capclock/capclock.rc create mode 100644 rosapps/tests/carets/.cvsignore create mode 100644 rosapps/tests/carets/caret.bmp create mode 100644 rosapps/tests/carets/carets.c create mode 100644 rosapps/tests/carets/carets.rc create mode 100644 rosapps/tests/carets/makefile create mode 100644 rosapps/tests/carets/resource.h create mode 100644 rosapps/tests/combo/.cvsignore create mode 100644 rosapps/tests/combo/combotst.c create mode 100644 rosapps/tests/combo/makefile create mode 100644 rosapps/tests/combo/utils.c create mode 100644 rosapps/tests/combo/utils.h create mode 100644 rosapps/tests/consume/.cvsignore create mode 100644 rosapps/tests/consume/Makefile create mode 100644 rosapps/tests/consume/consume.c create mode 100644 rosapps/tests/copymove/.cvsignore create mode 100644 rosapps/tests/copymove/Makefile create mode 100644 rosapps/tests/copymove/copymove.c create mode 100644 rosapps/tests/count/.cvsignore create mode 100644 rosapps/tests/count/Makefile create mode 100644 rosapps/tests/count/count.c create mode 100644 rosapps/tests/create-links/.cvsignore create mode 100644 rosapps/tests/create-links/Makefile create mode 100644 rosapps/tests/create-links/create-links.c create mode 100644 rosapps/tests/dibtest/.cvsignore create mode 100644 rosapps/tests/dibtest/dibtest.c create mode 100644 rosapps/tests/dibtest/makefile create mode 100644 rosapps/tests/dirdlg/.cvsignore create mode 100644 rosapps/tests/dirdlg/dirdlg.c create mode 100644 rosapps/tests/dirdlg/dirdlg.rc create mode 100644 rosapps/tests/dirdlg/makefile create mode 100644 rosapps/tests/dirdlg/resource.h create mode 100644 rosapps/tests/diskspeed/.cvsignore create mode 100644 rosapps/tests/diskspeed/diskspeed.c create mode 100644 rosapps/tests/diskspeed/makefile create mode 100644 rosapps/tests/dnsapi/.cvsignore create mode 100644 rosapps/tests/dnsapi/dnsapi.c create mode 100644 rosapps/tests/dnsapi/makefile create mode 100644 rosapps/tests/dnsquery/.cvsignore create mode 100644 rosapps/tests/dnsquery/dnsquery.c create mode 100644 rosapps/tests/dnsquery/makefile create mode 100644 rosapps/tests/dump_shared_data/.cvsignore create mode 100644 rosapps/tests/dump_shared_data/dump_shared_data.c create mode 100644 rosapps/tests/dump_shared_data/makefile create mode 100644 rosapps/tests/edit/.cvsignore create mode 100644 rosapps/tests/edit/edittest.c create mode 100644 rosapps/tests/edit/makefile create mode 100644 rosapps/tests/edit/utils.c create mode 100644 rosapps/tests/edit/utils.h create mode 100644 rosapps/tests/enhmetafile/.cvsignore create mode 100644 rosapps/tests/enhmetafile/enhmetafile.c create mode 100644 rosapps/tests/enhmetafile/makefile create mode 100644 rosapps/tests/enhmetafile/test.emf create mode 100644 rosapps/tests/enumfonts/.cvsignore create mode 100644 rosapps/tests/enumfonts/enumfonts.cpp create mode 100644 rosapps/tests/enumfonts/makefile create mode 100644 rosapps/tests/enumwnd/.cvsignore create mode 100644 rosapps/tests/enumwnd/enumwnd.c create mode 100644 rosapps/tests/enumwnd/enumwnd.dsp create mode 100644 rosapps/tests/enumwnd/makefile create mode 100644 rosapps/tests/enumws/.cvsignore create mode 100644 rosapps/tests/enumws/enumws.c create mode 100644 rosapps/tests/enumws/makefile create mode 100644 rosapps/tests/event/.cvsignore create mode 100644 rosapps/tests/event/event.c create mode 100644 rosapps/tests/event/makefile create mode 100644 rosapps/tests/eventpair/.cvsignore create mode 100644 rosapps/tests/eventpair/eventpair.c create mode 100644 rosapps/tests/eventpair/makefile create mode 100644 rosapps/tests/fiber/.cvsignore create mode 100644 rosapps/tests/fiber/Makefile create mode 100644 rosapps/tests/fiber/fiber.c create mode 100644 rosapps/tests/global_mem/.cvsignore create mode 100644 rosapps/tests/global_mem/Makefile create mode 100644 rosapps/tests/global_mem/global_mem.c create mode 100644 rosapps/tests/gradient/.cvsignore create mode 100644 rosapps/tests/gradient/gradient.c create mode 100644 rosapps/tests/gradient/makefile create mode 100644 rosapps/tests/guithreadinfo/.cvsignore create mode 100644 rosapps/tests/guithreadinfo/guithreadinfo.c create mode 100644 rosapps/tests/guithreadinfo/makefile create mode 100644 rosapps/tests/hello/.cvsignore create mode 100644 rosapps/tests/hello/hello.c create mode 100644 rosapps/tests/hello/makefile create mode 100644 rosapps/tests/hivetest/.cvsignore create mode 100644 rosapps/tests/hivetest/hivetest.c create mode 100644 rosapps/tests/hivetest/makefile create mode 100644 rosapps/tests/mktime/.cvsignore create mode 100644 rosapps/tests/mktime/makefile create mode 100644 rosapps/tests/mktime/mktime.c diff --git a/rosapps/tests/bench/.cvsignore b/rosapps/tests/bench/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/bench/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/bench/bench-syscall.c b/rosapps/tests/bench/bench-syscall.c new file mode 100644 index 00000000000..447bc0f1e24 --- /dev/null +++ b/rosapps/tests/bench/bench-syscall.c @@ -0,0 +1,8 @@ +/* + * + */ + +int main(int argc, char* argv[]) +{ + +} diff --git a/rosapps/tests/bench/bench-thread.c b/rosapps/tests/bench/bench-thread.c new file mode 100644 index 00000000000..6648a254b8a --- /dev/null +++ b/rosapps/tests/bench/bench-thread.c @@ -0,0 +1,81 @@ +#include +#include + +#define NR_THREADS (30) + + +DWORD WINAPI +thread_main1(LPVOID param) +{ + printf("Thread 1 running (Counter %lu)\n", (DWORD)param); + SleepEx(INFINITE, TRUE); + return 0; +} + + +DWORD WINAPI +thread_main2(LPVOID param) +{ + printf("Thread 2 running (Counter %lu)\n", (DWORD)param); + Sleep(INFINITE); + return 0; +} + + +int main (void) +{ + DWORD i=0; + DWORD id; + +#if 1 + printf("Creating %d threads...\n",NR_THREADS*2); + for (i=0;i + * Updates can be downloaded at: + * + * Please do not hesistate to e-mail me at dmc27@ee.cornell.edu + * if you have any questions about this code. + */ + + +#include +#include + +HINSTANCE HInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam); + + +int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, + LPTSTR lpCmdLine, int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + + HInst = HInstance; + + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = HInstance; + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + /* wc.hbrBackground = reinterpret_cast(COLOR_BTNFACE + 1); */ + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszClassName = WndClassName; + + if (RegisterClass(&wc)) + { + HWND HWnd = + CreateWindow( + WndClassName, TEXT("BitBlt Bitmap Rendering Demo"), + WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | + WS_VISIBLE | WS_CLIPSIBLINGS, + 0, 0, 220, 230, + NULL, NULL, HInst, NULL + ); + + if (HWnd) + { + ShowWindow(HWnd, nCmdShow); + UpdateWindow(HWnd); + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} + +/* image related */ +BITMAP bmp; +LPCSTR filename = TEXT("lena.bmp"); +HDC HMemDC = NULL; +HBITMAP HOldBmp = NULL; + +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam) +{ + switch (Msg) + { + case WM_CREATE: + { + /* create a memory DC */ + HMemDC = CreateCompatibleDC(NULL); + if (HMemDC) + { + /* load a bitmap from file */ + HBITMAP HBmp = + /* static_cast */( + LoadImage(HInst, filename, IMAGE_BITMAP, + 0, 0, LR_LOADFROMFILE) + ); + if (HBmp) + { + /* extract dimensions of the bitmap */ + GetObject(HBmp, sizeof(BITMAP), &bmp); + + /* associate the bitmap with the memory DC */ + /* HOldBmp = static_cast */ + (SelectObject(HMemDC, HBmp) + ); + } + } + } + case WM_PAINT: + { + PAINTSTRUCT ps; + const HDC Hdc = BeginPaint(HWnd, &ps); +#if 0 + try +#endif + { + + /* TODO: add palette support (see Chapter 9)... */ + + + BitBlt(Hdc, 20, 15, + bmp.bmWidth, bmp.bmHeight, + HMemDC, 0, 0, + SRCCOPY); + } +#if 0 + catch (...) +#endif + { + EndPaint(HWnd, &ps); + } + EndPaint(HWnd, &ps); + break; + } + case WM_DESTROY: + { + /* clean up */ + DeleteObject(SelectObject(HMemDC, HOldBmp)); + DeleteDC(HMemDC); + + PostQuitMessage(0); + return 0; + } + } + return DefWindowProc(HWnd, Msg, WParam, LParam); +} diff --git a/rosapps/tests/bitblt/lena.bmp b/rosapps/tests/bitblt/lena.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9916963852a9748baf1b9ac6093fb3b9179dbbc GIT binary patch literal 89322 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 literal 0 HcmV?d00001 diff --git a/rosapps/tests/bitblt/makefile b/rosapps/tests/bitblt/makefile new file mode 100644 index 00000000000..6c009b3545f --- /dev/null +++ b/rosapps/tests/bitblt/makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = bitblt + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/button/.cvsignore b/rosapps/tests/button/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/button/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/button/Makefile b/rosapps/tests/button/Makefile new file mode 100644 index 00000000000..383ba5ae459 --- /dev/null +++ b/rosapps/tests/button/Makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = btntest + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = buttontst.o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/button/buttontst.c b/rosapps/tests/button/buttontst.c new file mode 100644 index 00000000000..c12887b6aee --- /dev/null +++ b/rosapps/tests/button/buttontst.c @@ -0,0 +1,107 @@ +/* Based on Radoslaw Sokol's static control test. */ +#include + +static LPSTR BUTTON_CLASS = "BUTTON"; +static LPSTR TEST_WND_CLASS = "TESTWND"; + +#ifdef NDEBUG + #define DPRINT(s) (void)0 +#else + #define DPRINT(s) OutputDebugStringA("BUTTONTEST: " s "\n") +#endif + +HINSTANCE AppInstance = NULL; + +LRESULT WmCreate( + HWND Wnd) +{ + DPRINT("WM_CREATE (enter)."); + DPRINT("test 1"); + CreateWindowEx(0, BUTTON_CLASS, "PushButton", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, + 10, 10, 150, 30, Wnd, NULL, AppInstance, NULL); + DPRINT("test 2"); + CreateWindowEx(0, BUTTON_CLASS, "DefPushButton", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE, + 10, 40, 150, 30, Wnd, NULL, AppInstance, NULL); + DPRINT("test 3"); + CreateWindowEx(0, BUTTON_CLASS, "AutoRadioButton", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, + 10, 70, 150, 30, Wnd, NULL, AppInstance, NULL); + DPRINT("test 4"); + CreateWindowEx(0, BUTTON_CLASS, "AutoCheckBox", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, + 10, 100, 150, 30, Wnd, NULL, AppInstance, NULL); + + DPRINT("WM_CREATE (leave)."); + return 0; +} + +LRESULT CALLBACK TestWndProc( + HWND Wnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + switch (Msg) { + case WM_CREATE: + return WmCreate(Wnd); + case WM_DESTROY: + PostQuitMessage(0); + return 0; + default: + return DefWindowProc(Wnd, Msg, wParam, lParam); + } +} + +int STDCALL WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nShowCmd) +{ + ATOM Result; + MSG Msg; + HWND MainWindow; + WNDCLASSEX TestWndClass = {0}; + DPRINT("Application starting up."); + // Remember instance handle. + AppInstance = GetModuleHandle(NULL); + // Register test window class. + TestWndClass.cbSize = sizeof(WNDCLASSEX); + TestWndClass.lpfnWndProc = &TestWndProc; + TestWndClass.hInstance = AppInstance; + TestWndClass.hCursor = LoadCursor(0, (LPCTSTR)IDC_ARROW); + TestWndClass.hbrBackground = CreateSolidBrush(RGB(255,255,230)); + TestWndClass.lpszClassName = TEST_WND_CLASS; + Result = RegisterClassEx(&TestWndClass); + if (Result == 0) { + DPRINT("Error registering class."); + MessageBox(0, "Error registering test window class.", + "Button control test", MB_ICONSTOP | MB_OK); + ExitProcess(0); + } + // Create main window. + DPRINT("Creating main window."); + MainWindow = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE, + TEST_WND_CLASS, "Button test", + WS_OVERLAPPEDWINDOW, 50, 50, 180, 365, + NULL, NULL, AppInstance, NULL); + if (MainWindow == 0) { + DPRINT("Error creating main window."); + UnregisterClass(TEST_WND_CLASS, AppInstance); + MessageBox(0, "Error creating test window.", + "Static control test", MB_ICONSTOP | MB_OK); + ExitProcess(0); + } + DPRINT("Showing main window."); + ShowWindow(MainWindow, SW_SHOWNORMAL); + UpdateWindow(MainWindow); + // Run message loop. + DPRINT("Entering message loop."); + while (GetMessage(&Msg, NULL, 0, 0) > 0) { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + // Unregister window class. + UnregisterClass(TEST_WND_CLASS, AppInstance); + DPRINT("Exiting."); + + return Msg.wParam; +} diff --git a/rosapps/tests/button2/.cvsignore b/rosapps/tests/button2/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/button2/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/button2/Makefile b/rosapps/tests/button2/Makefile new file mode 100644 index 00000000000..7d96224d6cb --- /dev/null +++ b/rosapps/tests/button2/Makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = btntest2 + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = buttontst2.o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/button2/buttontst2.c b/rosapps/tests/button2/buttontst2.c new file mode 100644 index 00000000000..b16c905e1aa --- /dev/null +++ b/rosapps/tests/button2/buttontst2.c @@ -0,0 +1,219 @@ +#include +#include + +HFONT tf; +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + HWND hbtn[26]; + + wc.lpszClassName = "ButtonTest"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("ButtonTest", + "Button Test", + WS_OVERLAPPEDWINDOW, + 0, + 0, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + + ShowWindow(hWnd, nCmdShow); + + hbtn[0] = CreateWindow( + "BUTTON","BS_DEFPUSHBUTTON",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, + 10, 10, 200, 40, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[1] = CreateWindow( + "BUTTON","BS_3STATE",WS_VISIBLE | WS_CHILD | BS_3STATE, + 10, 60, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[2] = CreateWindow( + "BUTTON","BS_AUTO3STATE",WS_VISIBLE | WS_CHILD | BS_AUTO3STATE, + 10, 90, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[3] = CreateWindow( + "BUTTON","BS_AUTOCHECKBOX",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, + 10, 120, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[4] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, + 10, 150, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[5] = CreateWindow( + "BUTTON","BS_CHECKBOX",WS_VISIBLE | WS_CHILD | BS_CHECKBOX, + 10, 180, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[6] = CreateWindow( + "BUTTON","BS_GROUPBOX",WS_VISIBLE | WS_CHILD | BS_GROUPBOX, + 10, 210, 200, 80, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[7] = CreateWindow( + "BUTTON","BS_PUSHBUTTON",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, + 20, 230, 180, 30, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[8] = CreateWindow( + "BUTTON","BS_RADIOBUTTON",WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON, + 10, 300, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[9] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, + 220, 160, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[10] = CreateWindow( + "BUTTON","BS_DEFPUSHBUTTON|BS_BOTTOM",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_BOTTOM, + 220, 10, 250, 40, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[11] = CreateWindow( + "BUTTON","BS_DEFPUSHBUTTON|BS_LEFT",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_LEFT, + 480, 10, 250, 40, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[12] = CreateWindow( + "BUTTON","BS_DEFPUSHBUTTON|BS_RIGHT|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_RIGHT |BS_MULTILINE, + 740, 10, 150, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[13] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON|BS_TOP",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_TOP, + 220, 60, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + // Other Combinations + + hbtn[14] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON|BS_BOTTOM|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_BOTTOM | BS_MULTILINE, + 480, 60, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[15] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON|BS_LEFT",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_LEFT, + 740, 80, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[16] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON|BS_RIGHT|BS_TOP",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_RIGHT | BS_TOP, + 220, 130, 200, 20, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[17] = CreateWindow( + "BUTTON","BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_TOP| BS_MULTILINE, + 480, 130, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[18] = CreateWindow( + "BUTTON","BS_AUTOCHECKBOX|BS_BOTTOM|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_BOTTOM | BS_MULTILINE, + 740, 130, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[19] = CreateWindow( + "BUTTON","BS_AUTOCHECKBOX|BS_TOP|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE, + 480, 190, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[20] = CreateWindow( + "BUTTON","BS_AUTOCHECKBOX|BS_LEFT|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_LEFT | BS_MULTILINE, + 220, 230, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[21] = CreateWindow( + "BUTTON","BS_AUTOCHECKBOX|BS_RIGHT|BS_MULTILINE",WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_RIGHT | BS_MULTILINE, + 480, 240, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[22] = CreateWindow( + "BUTTON","BS_GROUPBOX|BS_TOP",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_TOP, + 10, 340, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[23] = CreateWindow( + "BUTTON","BS_GROUPBOX|BS_BOTTOM",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_BOTTOM, + 10, 410, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[24] = CreateWindow( + "BUTTON","BS_GROUPBOXBOX|BS_LEFT",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_LEFT, + 520, 340, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + hbtn[25] = CreateWindow( + "BUTTON","BS_GROUPBOX|BS_RIGHT|BS_BOTTOM",WS_VISIBLE | WS_CHILD | BS_GROUPBOX | BS_BOTTOM | BS_RIGHT, + 300, 340, 200, 60, hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + DeleteObject(tf); + + return msg.wParam; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC hDC; + + switch(msg) + { + case WM_PAINT: + hDC = BeginPaint(hWnd, &ps); + SelectObject(hDC, tf); + EndPaint(hWnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + case WM_COMMAND: + switch(HIWORD(wParam)) + { + case BN_CLICKED: + printf("BUTTON CLICKED !\n"); + break; + case BN_DBLCLK: + printf("BUTTON DOUBLE-CLICKED !\n"); + break; + case BN_PUSHED: + printf("BUTTON PUSHED !\n"); + break; + case BN_PAINT: + printf("BUTTON PAINTED !\n"); + break; + case BN_UNPUSHED: + printf("BUTTON UNPUSHED !\n"); + break; + + } + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/capclock/.cvsignore b/rosapps/tests/capclock/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/capclock/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/capclock/Makefile b/rosapps/tests/capclock/Makefile new file mode 100644 index 00000000000..abc30f70091 --- /dev/null +++ b/rosapps/tests/capclock/Makefile @@ -0,0 +1,20 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = capclock + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = capclock.o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/capclock/capclock.c b/rosapps/tests/capclock/capclock.c new file mode 100644 index 00000000000..6a45468f093 --- /dev/null +++ b/rosapps/tests/capclock/capclock.c @@ -0,0 +1,70 @@ +/* $Id: capclock.c,v 1.1 2004/10/21 05:11:59 sedwards Exp $ + * + * DESCRIPTION: Simple Win32 Caption Clock + * PROJECT : ReactOS (test applications) + * AUTHOR : Emanuele Aliberti + * DATE : 2003-09-03 + * LICENSE : GNU GPL v2.0 + */ +#include +#include + +UINT Timer = 1; + +static BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM); +static VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD); + + +INT STDCALL WinMain (HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, INT nCmdShow) +{ + WNDCLASS wc; + + ZeroMemory (& wc, sizeof wc); + wc.lpfnWndProc = DefDlgProc; + wc.cbWndExtra = DLGWINDOWEXTRA; + wc.hInstance = hinst; + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); + wc.lpszClassName = "CapClock"; + RegisterClass (& wc); + return DialogBox(hinst, MAKEINTRESOURCE(2), NULL, DialogFunc); + +} +static int InitializeApp (HWND hDlg,WPARAM wParam, LPARAM lParam) +{ + Timer = SetTimer (hDlg,Timer,1000,TimerProc); + TimerProc (hDlg,0,0,0); + return 1; +} +static INT_PTR CALLBACK DialogFunc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + InitializeApp(hwndDlg,wParam,lParam); + return TRUE; + case WM_CLOSE: + KillTimer (hwndDlg,Timer); + EndDialog(hwndDlg,0); + return TRUE; + } + return FALSE; +} +static VOID CALLBACK TimerProc (HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) +{ + CHAR text [20]; + SYSTEMTIME lt; + + GetLocalTime (& lt); + wsprintf ( + text, + "%d-%02d-%02d %02d:%02d:%02d", + lt.wYear, + lt.wMonth, + lt.wDay, + lt.wHour, + lt.wMinute, + lt.wSecond); + SetWindowText (hwnd, text); +} +/* EOF */ diff --git a/rosapps/tests/capclock/capclock.ico b/rosapps/tests/capclock/capclock.ico new file mode 100644 index 0000000000000000000000000000000000000000..0b52fb0ccde9b5887ef492e7c6639565f413d9ab GIT binary patch literal 766 zcmd5%!3_f;3^S)bn4oW-9iyY=88%=X#b>UCvhA>0tB9v9xyu(;K}$R z67ePiTm!Z5CIBx)JkT>G1hrNQtzWce8Np*EbDKrIm<(RBmw)h_H+?=b`|ra`DI7)s uRZcC@HxnDsx$BEt!hR1r_xU#;->v^P&LwOM&J}yedgZ&`o6K?Vd)Wv5PX!48 literal 0 HcmV?d00001 diff --git a/rosapps/tests/capclock/capclock.rc b/rosapps/tests/capclock/capclock.rc new file mode 100644 index 00000000000..e3aada7e88a --- /dev/null +++ b/rosapps/tests/capclock/capclock.rc @@ -0,0 +1,20 @@ +/* $Id: capclock.rc,v 1.1 2004/10/21 05:11:59 sedwards Exp $ */ + +#include + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS W32 Caption Clock\0" +#define REACTOS_STR_INTERNAL_NAME "capclock\0" +#define REACTOS_STR_ORIGINAL_FILENAME "capclock.exe\0" +#include + +/* Icons */ + +1 ICON "capclock.ico" + +/* Dialogs */ + +2 DIALOG 6, 18, 132, 0 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +FONT 8, "Microsoft Sans Serif" +BEGIN +END diff --git a/rosapps/tests/carets/.cvsignore b/rosapps/tests/carets/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/carets/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/carets/caret.bmp b/rosapps/tests/carets/caret.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5082a5b71a56e8187732c0b1e70c34bec9f3d599 GIT binary patch literal 106 zcmZ?r&0>H6J0PV2#Oy%K4aAH<2m(4_5|jA<|36sJ0Z1kQaRCrl0C5eJ2JsVs*a3(^ F004le2q^#n literal 0 HcmV?d00001 diff --git a/rosapps/tests/carets/carets.c b/rosapps/tests/carets/carets.c new file mode 100644 index 00000000000..49007810578 --- /dev/null +++ b/rosapps/tests/carets/carets.c @@ -0,0 +1,150 @@ +#include +#include +#include "resource.h" + +static int CaretWidth = 2; +static int CaretHeight = 16; +static int CharWidth = 10; +static int CharHeight = 16; +static HBITMAP CaretBitmap; + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + CaretBitmap = LoadBitmap(hInstance, (LPCTSTR)IDB_CARET); + + wc.lpszClassName = "CaretTestClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)COLOR_WINDOW; + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow(wc.lpszClassName, + "Caret Test", + WS_OVERLAPPEDWINDOW, + 0, + 0, + 200, + 250, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + POINT pt; + switch(msg) + { + case WM_ACTIVATE: + switch(LOWORD(wParam)) + { + case WA_ACTIVE: + case WA_CLICKACTIVE: + if(!ShowCaret(hWnd)) + DbgPrint("ShowCaret(0x%x)\n", hWnd); + break; + case WA_INACTIVE: + if(!HideCaret(hWnd)) + DbgPrint("HideCaret(0x%x)\n", hWnd); + break; + } + break; + + case WM_KEYDOWN: + if(!GetCaretPos(&pt)) + { + DbgPrint("GetCaretPos() failed!\n"); + break; + } + switch(wParam) + { + case VK_LEFT: + pt.x -= CharWidth; + break; + case VK_UP: + pt.y -= CharHeight; + break; + case VK_RIGHT: + pt.x += CharWidth; + break; + case VK_DOWN: + pt.y += CharHeight; + break; + } + if(!SetCaretPos(pt.x, pt.y)) + DbgPrint("SetCaretPos() failed!\n"); + break; + + case WM_RBUTTONDOWN: + if(!CreateCaret(hWnd, CaretBitmap, 0, 0)) + DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); + else + if(!ShowCaret(hWnd)) + DbgPrint("ShowCaret(0x%x)\n", hWnd); + break; + + case WM_LBUTTONDOWN: + if(!CreateCaret(hWnd, (HBITMAP)0, CaretWidth, CaretHeight)) + DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); + else + if(!ShowCaret(hWnd)) + DbgPrint("ShowCaret(0x%x)\n", hWnd); + break; + + case WM_CREATE: + if(!CreateCaret(hWnd, (HBITMAP)0, CaretWidth, CaretHeight)) + DbgPrint("CreateCaret() for window 0x%x failed!\n", hWnd); + else + if(!SetCaretPos(1, 1)) + DbgPrint("SetCaretPos(%i, %i) failed!\n", 1, 1); + break; + + case WM_DESTROY: + if(!DestroyCaret()) + DbgPrint("DestroyCaret() failed!\n"); + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/carets/carets.rc b/rosapps/tests/carets/carets.rc new file mode 100644 index 00000000000..46206dad917 --- /dev/null +++ b/rosapps/tests/carets/carets.rc @@ -0,0 +1,5 @@ +#include +#include +#include "resource.h" + +IDB_CARET BITMAP DISCARDABLE "caret.bmp" diff --git a/rosapps/tests/carets/makefile b/rosapps/tests/carets/makefile new file mode 100644 index 00000000000..01c43bc5c6d --- /dev/null +++ b/rosapps/tests/carets/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:11:59 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = no + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = carets + +TARGET_SDKLIBS = kernel32.a gdi32.a ntdll.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/carets/resource.h b/rosapps/tests/carets/resource.h new file mode 100644 index 00000000000..4550828495a --- /dev/null +++ b/rosapps/tests/carets/resource.h @@ -0,0 +1 @@ +#define IDB_CARET 101 diff --git a/rosapps/tests/combo/.cvsignore b/rosapps/tests/combo/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/combo/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/combo/combotst.c b/rosapps/tests/combo/combotst.c new file mode 100644 index 00000000000..f99fc87da91 --- /dev/null +++ b/rosapps/tests/combo/combotst.c @@ -0,0 +1,687 @@ +/* ComboBox Control Test for ReactOS. + +* This is a test program. Not made to be fast, small +* easy to mantain, or portable. + +* I'm not erasing text because I don't want to use other functions from the API +* or make this more complex. Also Fonts are not heavily used. + +* This source code is in the PUBLIC DOMAIN and has NO WARRANTY. +* by Waldo Alvarez Cañizares , started July 11, 2003. */ + +//#define WIN32_LEAN_AND_MEAN +#include +#include "utils.h" + +#define CONTROLCLASS "COMBOBOX" /* the class name */ +#define CONTROLCLASSW L"COMBOBOX" /* the class name in unicode*/ + +#define WINDOWWIDTH 560 +#define WINDOWHEIGHT 350 + +/* --- Command IDs of some buttons --- */ +#define CREATEWINDOW_ID 106 +#define CREATEWINDOWEX_ID 107 +#define CREATEWINDOWW_ID 108 +#define INITPAGE_ID 400 +#define SECONDPAGE_ID 401 +#define BACKFIRSTPAGE_ID 402 + +/* --- Position where the result text goes --- */ +#define ResultX 0 +#define ResultY 305 + +/* --- Position where the notify text goes --- */ +#define NOTIFYX 390 +#define NOTIFYY 285 + +/* --- The width of most buttons --- */ +#define CHECKBUTWIDTH 190 +#define SCROLLAMOUNT -15 + +/* Size of buffer to hold resulting strings from conversion +and returned by messages */ +#define BUFFERLEN 80 +char TextBuffer[BUFFERLEN]={'R','e','s','u','l','t',':',' '}; + +HWND g_hwnd = NULL; +HINSTANCE g_hInst = NULL; + +int pos = 10; +int n = 0; +int yButPos = 10; +int xButPos = 0; + +DWORD ComboStyle = 0; + +/* --- Control coordinates --- */ +#define CONTROLPOSX 390 +#define CONTROLPOSY 10 +DWORD ControlWidth = 160; +DWORD ControlHeight = 150; + +static RECT srect = {CONTROLPOSX,CONTROLPOSY,WINDOWWIDTH,WINDOWHEIGHT}; + +HWND hwndEdit = NULL; + +RECT rect; +DWORD StartP,EndP; +HWND hwnd; /* main window handle */ + +char AddString[] = "string added"; + +typedef void FunctionHandler(HWND,DWORD,WPARAM,LPARAM); +typedef FunctionHandler* LPFUNCTIONHANDLER; + +void PrintTextXY(char* Text,int x,int y,int len, RECT rect) + { + HDC hdc; + hdc = GetDC (g_hwnd); + SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); + + TextOut (hdc, x,y,Text,len); + ReleaseDC (g_hwnd, hdc); + + ValidateRect (g_hwnd, &rect); + } + +static +VOID +HandlePrintReturnHex(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + LRESULT ret; + RECT rect; + ret = SendMessage(handle,Msg,wParam,lParam); + htoa((unsigned int)ret,&TextBuffer[8]); + GetWindowRect(g_hwnd,&rect); + PrintTextXY(TextBuffer,ResultX,ResultY,16,rect); + } + + +static +VOID +HandlePrintReturnStr(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + LRESULT ret; + RECT rect; + + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + ret = SendMessage(handle,Msg,wParam,lParam); + GetWindowRect(g_hwnd,&rect); + PrintTextXY(TextBuffer,ResultX,ResultY,8+(int)ret,rect); + } + +static +VOID +HandlePrintRect(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + RECT rect; + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + SendMessage(handle,Msg,wParam,lParam); + + htoa(rect.top,&TextBuffer[8]); + TextBuffer[8+8] = ' '; + htoa(rect.bottom,&TextBuffer[8+8+1]); + TextBuffer[8+8+8+1] = ' '; + htoa(rect.left,&TextBuffer[8+8+8+1+1]); + TextBuffer[8+8+8+8+1+1] = ' '; + htoa(rect.right,&TextBuffer[8+8+8+8+1+1+1]); + + GetWindowRect(g_hwnd,&rect); + PrintTextXY(TextBuffer,ResultX,ResultY,8+4*9-1,rect); + } + +struct + { + char* Text; /* Text for the button */ + DWORD MsgCode; /* Message Code */ + WPARAM wParam; /* Well hope you can understand this */ + LPARAM lParam; /* ditto */ + LPFUNCTIONHANDLER Handler; /* Funtion called to handle the result of each message */ + } +Msg[] = + { + {"CB_ADDSTRING",CB_ADDSTRING,0,(LPARAM)&AddString,&HandlePrintReturnHex}, + {"CB_ADDSTRING - long",CB_ADDSTRING,0,(LPARAM)"very loooooooooong striiinnnnnnnnnggg",&HandlePrintReturnHex}, + {"CB_DELETESTRING",CB_DELETESTRING,2,0,&HandlePrintReturnHex}, /* remember to catch WM_DELETEITEM*/ + + /* What a message, why M$ decided to implement his thing ? */ + {"CB_DIR - drives",CB_DIR,DDL_DRIVES, + /* Hoping that most machines have this */ + (LPARAM)"C:\\", + &HandlePrintReturnHex}, + + {"CB_DIR - dirs",CB_DIR,DDL_DIRECTORY,(LPARAM)"C:\\*",&HandlePrintReturnHex}, + + {"CB_DIR - files",CB_DIR, + DDL_ARCHIVE | DDL_EXCLUSIVE | DDL_HIDDEN | DDL_READONLY | DDL_READWRITE | DDL_SYSTEM, + (LPARAM)"C:\\*",&HandlePrintReturnHex}, + + /* Do not forget WM_COMPAREITEM */ + + {"CB_FINDSTRING",CB_FINDSTRING,1,(LPARAM)"str",&HandlePrintReturnHex}, + {"CB_FINDSTRINGEXACT(-1)",CB_FINDSTRINGEXACT,-1,(LPARAM)&AddString,&HandlePrintReturnHex}, + {"CB_FINDSTRINGEXACT(2)",CB_FINDSTRINGEXACT,2,(LPARAM)&AddString,&HandlePrintReturnHex}, + + /* "CB_GETCOMBOBOXINFO",CB_GETCOMBOBOXINFO,0,0,&HandlePrintReturnHex, winXP & .net server remember to handle the struct */ + + {"CB_GETCOUNT",CB_GETCOUNT,0,0,&HandlePrintReturnHex}, + + {"CB_GETCURSEL",CB_GETCURSEL,0,0,&HandlePrintReturnHex}, + + /* To implement "CB_GETEDITSEL - vars",CB_GETEDITSEL,,,&HandlePrintReturnHex, */ + + {"CB_GETEXTENDEDUI",CB_GETEXTENDEDUI,0,0,&HandlePrintReturnHex}, + {"CB_GETHORIZONTALEXTENT",CB_GETHORIZONTALEXTENT,0,0,&HandlePrintReturnHex}, + + + + {"CB_GETLBTEXT",CB_GETLBTEXT,1,(LPARAM)&TextBuffer[8],&HandlePrintReturnStr}, + {"CB_GETLBTEXTLEN",CB_GETLBTEXTLEN,1,0,&HandlePrintReturnHex}, + {"CB_GETLOCALE",CB_GETLOCALE,0,0,&HandlePrintReturnHex}, + + /* "CB_GETMINVISIBLE",CB_GETMINVISIBLE,0,0,&HandlePrintReturnHex, Included in Windows XP and Windows .NET Server. */ + + {"CB_GETTOPINDEX",CB_GETTOPINDEX,0,0,&HandlePrintReturnHex}, + + {"CB_INITSTORAGE",CB_INITSTORAGE,10,200,&HandlePrintReturnHex}, + {"CB_INSERTSTRING",CB_INSERTSTRING,2,(LPARAM)"inserted string",&HandlePrintReturnHex}, + + {"CB_LIMITTEXT",CB_LIMITTEXT,10,0,&HandlePrintReturnHex}, + {"CB_RESETCONTENT",CB_RESETCONTENT ,0,0,&HandlePrintReturnHex}, + {"CB_SELECTSTRING",CB_SELECTSTRING,2,(LPARAM)"str",&HandlePrintReturnHex}, + {"CB_SETCURSEL",CB_SETCURSEL,1,0,&HandlePrintReturnHex}, + + {"CB_SETDROPPEDWIDTH",CB_SETDROPPEDWIDTH,250,0,&HandlePrintReturnHex}, + + {"CB_SETEXTENDEDUI - set",CB_SETEXTENDEDUI,TRUE,0,&HandlePrintReturnHex}, + {"CB_SETEXTENDEDUI - clear",CB_SETEXTENDEDUI,FALSE,0,&HandlePrintReturnHex}, + + /* + * win2k have a small bug with this ^ , if you press F4 while it is cleared, + * the combobox is using style cbs_dropdown + * and the pointer is over the edit box then the mouse pointer is not changed + * to an arrow + */ + + {"CB_SETHORIZONTALEXTENT",CB_SETHORIZONTALEXTENT,500,0,&HandlePrintReturnHex}, + + {"CB_GETITEMDATA",CB_GETITEMDATA,1,0,&HandlePrintReturnHex}, + {"CB_SETITEMDATA",CB_SETITEMDATA,1,0x791031,&HandlePrintReturnHex}, + + {"CB_SETITEMHEIGHT",CB_SETITEMHEIGHT,-1,30,&HandlePrintReturnHex}, + {"CB_GETITEMHEIGHT",CB_GETITEMHEIGHT,2,0,&HandlePrintReturnHex}, + + /* "CB_SETMINVISIBLE",CB_SETMINVISIBLE,4,0,&HandlePrintReturnHex, Included in Windows XP and Windows .NET Server */ + + {"CB_GETEDITSEL",CB_GETEDITSEL,(WPARAM)NULL,(LPARAM)NULL,&HandlePrintReturnHex}, + {"CB_SETEDITSEL",CB_SETEDITSEL,0,0x00020005,&HandlePrintReturnHex}, + {"CB_SETEDITSEL - clear",CB_SETEDITSEL,0,0xFFFFFFFF,&HandlePrintReturnHex}, + + {"CB_SETTOPINDEX",CB_SETTOPINDEX,3,0,&HandlePrintReturnHex}, + + {"CB_SHOWDROPDOWN - true",CB_SHOWDROPDOWN,TRUE,0,&HandlePrintReturnHex}, + {"CB_SHOWDROPDOWN - false",CB_SHOWDROPDOWN,FALSE,0,&HandlePrintReturnHex}, + + {"CB_GETDROPPEDCONTROLRECT",CB_GETDROPPEDCONTROLRECT,0,(LPARAM)&rect,&HandlePrintRect}, + {"CB_GETDROPPEDSTATE",CB_GETDROPPEDSTATE,0,0,&HandlePrintReturnHex}, + {"CB_GETDROPPEDWIDTH",CB_GETDROPPEDWIDTH,0,0,&HandlePrintReturnHex}, + + {"WM_PASTE",WM_PASTE,0,0,&HandlePrintReturnHex}, + }; + +#define MAXMESSAGEBUTTONS 40 + +struct + { + char* Name; /* Text for the button */ + DWORD Code; /* Style Code */ + } +Styles[] = { + {"WS_DISABLED",WS_DISABLED}, + {"CBS_AUTOHSCROLL",CBS_AUTOHSCROLL}, + {"CBS_DISABLENOSCROLL",CBS_DISABLENOSCROLL}, + {"CBS_DROPDOWN",CBS_DROPDOWN}, + {"CBS_DROPDOWNLIST",CBS_DROPDOWNLIST}, + {"CBS_HASSTRINGS",CBS_HASSTRINGS}, + {"CBS_LOWERCASE",CBS_LOWERCASE}, + {"CBS_NOINTEGRALHEIGHT",CBS_NOINTEGRALHEIGHT}, + {"CBS_OEMCONVERT",CBS_OEMCONVERT}, + {"CBS_OWNERDRAWFIXED",CBS_OWNERDRAWFIXED}, + {"CBS_OWNERDRAWVARIABLE",CBS_OWNERDRAWVARIABLE}, + {"CBS_SIMPLE",CBS_SIMPLE}, + {"CBS_SORT",CBS_SORT}, + {"CBS_UPPERCASE",CBS_UPPERCASE}, + {"CBS_DISABLENOSCROLL",CBS_DISABLENOSCROLL}, + {"WS_HSCROLL",WS_HSCROLL}, + {"WS_VSCROLL",WS_VSCROLL} + }; + +/* The number of check buttons we have. +* Maybe some calculations at compile time would be better +*/ + +#define NUMBERCHECKS 17 + +#define NUMBERBUTTONS NUMBERCHECKS + 7 +HWND Buttons[NUMBERBUTTONS]; +HWND MessageButtons[MAXMESSAGEBUTTONS]; +HWND Back1But,Back2But; +HWND NextBut; + +HWND +CreateCheckButton(const char* lpWindowName, DWORD xSize, DWORD id) + { + HWND h; + h = CreateWindowEx(0, + "BUTTON", + lpWindowName, + WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + xButPos, /* x */ + yButPos, /* y */ + xSize, /* nWidth */ + 20, /* nHeight */ + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + yButPos += 21; + return h; + } + +HWND +CreatePushButton(const char* lpWindowName, DWORD xSize, DWORD id,DWORD Style) + { + + HWND h = CreateWindow("BUTTON", + lpWindowName, + WS_CHILD | BS_PUSHBUTTON | Style, + xButPos, /* x */ + yButPos, /* y */ + xSize, /* nWidth */ + 20, /* nHeight */ + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + + yButPos += 21; + return h; + } + +VOID +ReadNHide() + { + int i; + ComboStyle = 0; + for (i=0 ; i< NUMBERCHECKS ; i++) + { + if(BST_CHECKED == SendMessage(Buttons[i],BM_GETCHECK,0,0)) + ComboStyle |= Styles[i].Code; + ShowWindow(Buttons[i],SW_HIDE); + } + + for (; i< NUMBERBUTTONS ; i++)ShowWindow(Buttons[i],SW_HIDE); + for (i=0 ; i< 26 ; i++) ShowWindow(MessageButtons[i],SW_SHOW); + + ShowWindow(Back1But,SW_SHOW); + ShowWindow(NextBut,SW_SHOW); + } + +VOID +ForwardToSecondPage() + { + int i; + for (i=0;i<26;i++)ShowWindow(MessageButtons[i],SW_HIDE); + for(;i= 600) + { + Msg[LOWORD(wParam)-600].Handler(hwndEdit, + Msg[LOWORD(wParam)-600].MsgCode, + Msg[LOWORD(wParam)-600].wParam, + Msg[LOWORD(wParam)-600].lParam); + break; + } + + switch(LOWORD(wParam)){ + + case 100: + ControlWidth += 10; + break; + + case 101: + ControlWidth -= 10; + break; + + case 102: + ControlHeight += 10; + break; + + case 103: + ControlHeight -= 10; + break; + + case INITPAGE_ID: + BackToInitialPage(); + break; + + case SECONDPAGE_ID: + ForwardToSecondPage(); + break; + + case BACKFIRSTPAGE_ID: + BackToFirstPage(); + break; + + case CREATEWINDOW_ID: + ReadNHide(); + srect.top = CONTROLPOSY + ControlHeight; + hwndEdit = CreateWindow(CONTROLCLASS, + NULL, + ComboStyle | WS_CHILD | WS_VISIBLE, + CONTROLPOSX, + CONTROLPOSY, + ControlWidth, + ControlHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWEX_ID: + ReadNHide(); + srect.top = CONTROLPOSY + ControlHeight; + hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, + CONTROLCLASS, + NULL, + ComboStyle | WS_CHILD | WS_VISIBLE , + CONTROLPOSX, + CONTROLPOSY, + ControlWidth, + ControlHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWW_ID: + ReadNHide(); + srect.top = CONTROLPOSY + ControlHeight; + hwndEdit = CreateWindowExW(WS_EX_CLIENTEDGE, + CONTROLCLASSW, + NULL, + ComboStyle | WS_CHILD | WS_VISIBLE , + CONTROLPOSX, + CONTROLPOSY, + ControlWidth, + ControlHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + } + + if (lParam == (LPARAM)hwndEdit) + switch(HIWORD(wParam)) + { + case CBN_DROPDOWN: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_DROPDOWN notification",NOTIFYX,NOTIFYY,25,srect); + break; + + case CBN_CLOSEUP: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_CLOSEUP notification",NOTIFYX,NOTIFYY,24,srect); + break; + + case CBN_DBLCLK: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_DBLCLK notification",NOTIFYX,NOTIFYY,23,srect); + break; + + case CBN_EDITCHANGE: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_EDITCHANGE notification",NOTIFYX,NOTIFYY,27,srect); + break; + + case CBN_ERRSPACE: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_ERRSPACE notification",NOTIFYX,NOTIFYY,25,srect); + break; + + case CBN_KILLFOCUS: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_KILLFOCUS notification",NOTIFYX,NOTIFYY,26,srect); + break; + + case CBN_EDITUPDATE: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_EDITUPDATE notification",NOTIFYX,NOTIFYY,27,srect); + break; + + case CBN_SELCHANGE: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_SELCHANGE notification",NOTIFYX,NOTIFYY,26,srect); + break; + + case CBN_SELENDCANCEL: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_SELENDCANCEL notification",NOTIFYX,NOTIFYY,29,srect); + break; + + case CBN_SETFOCUS: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_SETFOCUS notification",NOTIFYX,NOTIFYY,25,srect); + break; + + case CBN_SELENDOK: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("CBN_SELENDOK notification",NOTIFYX,NOTIFYY,25,srect); + break; + } + + return DefWindowProc ( hwnd, msg, wParam, lParam ); + + case WM_MEASUREITEM: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("WM_MEASUREITEM called",NOTIFYX,NOTIFYY,21,srect); + break; + + case WM_COMPAREITEM: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("WM_COMPAREITEM called",NOTIFYX,NOTIFYY,21,srect); + break; + + case WM_DRAWITEM: + ScrollWindow (hwnd, 0, SCROLLAMOUNT, &srect, &srect); + PrintTextXY("WM_DRAWITEM called",NOTIFYX,NOTIFYY,18,srect); + break; + + case WM_SIZE : + return 0; + + case WM_CLOSE: + DestroyWindow (g_hwnd); + return 0; + + case WM_QUERYENDSESSION: + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefWindowProc ( hwnd, msg, wParam, lParam ); + } + + +HWND +RegisterAndCreateWindow (HINSTANCE hInst, + const char* className, + const char* title) + { + WNDCLASSEX wc; + + + g_hInst = hInst; + + wc.cbSize = sizeof (WNDCLASSEX); + + wc.lpfnWndProc = WndProc; /* window procedure */ + wc.hInstance = hInst; /* owner of the class */ + + wc.lpszClassName = className; + wc.hCursor = LoadCursor ( 0, (LPCTSTR)IDC_ARROW ); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hIcon = 0; + wc.hIconSm = 0; + wc.lpszMenuName = 0; + + if ( !RegisterClassEx ( &wc ) ) + return NULL; + + hwnd = CreateWindowEx ( + 0, /* dwStyleEx */ + className, /* class name */ + title, /* window title */ + + WS_OVERLAPPEDWINDOW, /* dwStyle */ + + 1, /* x */ + 1, /* y */ + WINDOWWIDTH, /* width */ + WINDOWHEIGHT, /* height */ + NULL, /* hwndParent */ + NULL, /* hMenu */ + hInst, + 0 + ); + + if (!hwnd) return NULL; + + ShowWindow (hwnd, SW_SHOW); + UpdateWindow (hwnd); + + return hwnd; + } + +int +WINAPI +WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdParam, int cmdShow ) + { + char className [] = "ComboBox Control Test"; + MSG msg; + + RegisterAndCreateWindow ( hInst, className, "ComboBox Control Test" ); + + while (GetMessage (&msg, NULL, 0, 0)) + { + TranslateMessage (&msg); + DispatchMessage (&msg); + } + return (int)msg.wParam; + } diff --git a/rosapps/tests/combo/makefile b/rosapps/tests/combo/makefile new file mode 100644 index 00000000000..fb80f9306e7 --- /dev/null +++ b/rosapps/tests/combo/makefile @@ -0,0 +1,25 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = combotst + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = \ + combotst.o \ + utils.o + +TARGET_CFLAGS = -Wall -Werror + + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/combo/utils.c b/rosapps/tests/combo/utils.c new file mode 100644 index 00000000000..f1eff54609f --- /dev/null +++ b/rosapps/tests/combo/utils.c @@ -0,0 +1,33 @@ +/* + * Edit Control Test for ReactOS, quick n' dirty. There you go + * This source code is in the PUBLIC DOMAIN and has NO WARRANTY. + * by Waldo Alvarez Cañizares , June 22, 2003. + */ + +#include + +static const char hexvals[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; +VOID htoa (unsigned int val, char *buf) +{ + int i; + buf += 7; + + for (i=0;i<8;i++) + { + *buf-- = hexvals[val & 0x0000000F]; + val = val >> 4; + } +} + + +VOID strcpy_(char *dst, const char *src) +{ + const char* p = src; + while ((*dst++ = *p++)) {} +} + +VOID strcpyw_(wchar_t* dst,wchar_t* src) +{ + const wchar_t* p = src; + while ((*dst++ = *p++)) {} +} diff --git a/rosapps/tests/combo/utils.h b/rosapps/tests/combo/utils.h new file mode 100644 index 00000000000..f6a12649c1e --- /dev/null +++ b/rosapps/tests/combo/utils.h @@ -0,0 +1,9 @@ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +VOID htoa (unsigned int, char *); +VOID strcpy_(char *, const char *); +VOID strcpyw_(wchar_t*,wchar_t*); +#ifdef __cplusplus + } +#endif diff --git a/rosapps/tests/consume/.cvsignore b/rosapps/tests/consume/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/consume/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/consume/Makefile b/rosapps/tests/consume/Makefile new file mode 100644 index 00000000000..ee4ff8ca555 --- /dev/null +++ b/rosapps/tests/consume/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:11:59 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = consume + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/consume/consume.c b/rosapps/tests/consume/consume.c new file mode 100644 index 00000000000..81a52cab071 --- /dev/null +++ b/rosapps/tests/consume/consume.c @@ -0,0 +1,31 @@ +#include +#include +#include + +#define SIZE (65*1024*1024) + +ULONG x[SIZE / 4096]; + +int main() +{ + int i; + PUCHAR BaseAddress; + + BaseAddress = VirtualAlloc(NULL, + SIZE, + MEM_COMMIT, + PAGE_READONLY); + if (BaseAddress == NULL) + { + printf("Failed to allocate virtual memory"); + return(1); + } + printf("BaseAddress %p\n", BaseAddress); + for (i = 0; i < (SIZE / 4096); i++) + { + printf("%.8x ", i*4096); + x[i] = BaseAddress[i*4096]; + } + + return(0); +} diff --git a/rosapps/tests/copymove/.cvsignore b/rosapps/tests/copymove/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/copymove/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/copymove/Makefile b/rosapps/tests/copymove/Makefile new file mode 100644 index 00000000000..d42613deb7d --- /dev/null +++ b/rosapps/tests/copymove/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = copymove + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/copymove/copymove.c b/rosapps/tests/copymove/copymove.c new file mode 100644 index 00000000000..f938368b8bc --- /dev/null +++ b/rosapps/tests/copymove/copymove.c @@ -0,0 +1,303 @@ +/* + * CopyFile, MoveFile and related routines test + */ + +#include +#include +#include +#include +#include + +static TCHAR +FindOtherDrive() +{ + DWORD drives = GetLogicalDrives(); + BOOL found = FALSE; + TCHAR drive; + TCHAR rootdir[] = _T( "?:\\" ); + TCHAR currentdir[MAX_PATH + 1]; + + if (0 != GetCurrentDirectory(MAX_PATH + 1, currentdir)) { + for (drive = _T('A'); ! found && drive <= _T('Z'); drive++) { + if (0 != (drives & (1 << (drive - _T('A'))))&& + drive != _totupper(currentdir[0])) { + rootdir[0] = drive; + found = (DRIVE_FIXED == GetDriveType(rootdir)); + } + } + } + + return found ? drive - 1 : _T( ' ' ); +} + +static void +DeleteTestFile(LPCTSTR filename) +{ + SetFileAttributes(filename, FILE_ATTRIBUTE_NORMAL); + DeleteFile(filename); +} + +static void +CreateTestFile(LPCTSTR filename, DWORD attributes) +{ + HANDLE file; + char buffer[4096]; + DWORD wrote; + int c; + + DeleteTestFile(filename); + file = CreateFile(filename, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + 0, + 0); + + if (INVALID_HANDLE_VALUE == file) { + fprintf(stderr, "CreateFile failed with code %lu\n", GetLastError()); + exit(1); + } + for(c = 0; c < sizeof(buffer); c++) { + buffer[c] = (char) c; + } + if (! WriteFile(file, buffer, sizeof(buffer), &wrote, NULL)) { + fprintf(stderr, "WriteFile failed with code %lu\n", GetLastError()); + exit(1); + } + CloseHandle(file); + + if (! SetFileAttributes(filename, attributes)) { + fprintf(stderr, "SetFileAttributes failed with code %lu\n", GetLastError()); + exit(1); + } +} + +static void +DeleteTestDir(LPCTSTR dirname) +{ + RemoveDirectory(dirname); +} + +static void +CreateTestDir(LPCTSTR dirname) +{ + if (! CreateDirectory(dirname, NULL)) { + fprintf(stderr, "CreateDirectory failed with code %lu\n", GetLastError()); + exit(1); + } +} + +static void +CheckTestFile(LPCTSTR filename, DWORD attributes) +{ + HANDLE file; + char buffer[4096]; + DWORD read; + int c; + DWORD diskattr; + + file = CreateFile(filename, + GENERIC_READ, + 0, + NULL, + OPEN_EXISTING, + 0, + 0); + + if (INVALID_HANDLE_VALUE == file) { + fprintf(stderr, "CreateFile failed with code %lu\n", GetLastError()); + exit(1); + } + + if (! ReadFile(file, buffer, sizeof(buffer), &read, NULL)) { + fprintf(stderr, "ReadFile failed with code %lu\n", GetLastError()); + exit(1); + } + if (read != sizeof(buffer)) { + fprintf(stderr, "Trying to read %u bytes but got %lu bytes\n", sizeof(buffer), read); + exit(1); + } + for(c = 0; c < sizeof(buffer); c++) { + if (buffer[c] != (char) c) { + fprintf(stderr, "File contents changed at position %u\n", c); + exit(1); + } + } + + CloseHandle(file); + + diskattr = GetFileAttributes(filename); + if (INVALID_FILE_ATTRIBUTES == diskattr) { + fprintf(stderr, "GetFileAttributes failed with code %lu\n", GetLastError()); + exit(1); + } + if (diskattr != attributes) { + fprintf(stderr, "Attribute mismatch, expected 0x%08lx found 0x%08lx\n", attributes, diskattr); + exit(1); + } +} + +int +main(int argc, char *argv[]) +{ + TCHAR otherdrive; + TCHAR otherfile[ ] = _T("?:\\other.dat"); + + otherdrive = FindOtherDrive(); + + printf("Testing simple move\n"); + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(_T("end.dat")); + if (! MoveFile(_T("begin.dat"), _T("end.dat"))) { + fprintf(stderr, "MoveFile failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(_T("end.dat")); + + printf("Testing move of non-existing file\n"); + DeleteTestFile(_T("begin.dat")); + DeleteTestFile(_T("end.dat")); + if (MoveFile(_T("begin.dat"), _T("end.dat"))) { + fprintf(stderr, "MoveFile succeeded but shouldn't have\n"); + exit(1); + } else if (ERROR_FILE_NOT_FOUND != GetLastError()) { + fprintf(stderr, "MoveFile failed with unexpected code %lu\n", GetLastError()); + exit(1); + } + DeleteTestFile(_T("end.dat")); + +/* Not correctly implemented in ros, destination file is kept open after this */ +#if 0 + printf("Testing move to existing file\n"); + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE); + if (MoveFile(_T("begin.dat"), _T("end.dat"))) { + fprintf(stderr, "MoveFile succeeded but shouldn't have\n"); + exit(1); + } else if (ERROR_ALREADY_EXISTS != GetLastError()) { + fprintf(stderr, "MoveFile failed with unexpected code %lu\n", GetLastError()); + exit(1); + } + DeleteTestFile(_T("begin.dat")); + DeleteTestFile(_T("end.dat")); +#endif + +/* Not implemented yet in ros */ +#if 0 + printf("Testing directory move\n"); + CreateTestDir(_T("begin")); + CreateTestFile(_T("begin\\file.dat"), FILE_ATTRIBUTE_NORMAL); + DeleteTestDir(_T("end")); + if (! MoveFile(_T("begin"), _T("end"))) { + fprintf(stderr, "MoveFile failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_NORMAL); + DeleteTestFile(_T("end\\file.dat")); + DeleteTestDir(_T("end")); +#endif + + printf("Testing file move to different directory\n"); + CreateTestFile(_T("file.dat"), FILE_ATTRIBUTE_NORMAL); + CreateTestDir(_T("end")); + if (! MoveFile(_T("file.dat"), _T("end\\file.dat"))) { + fprintf(stderr, "MoveFile failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(_T("end\\file.dat")); + DeleteTestDir(_T("end")); + + printf("Testing move of read-only file\n"); + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_READONLY); + DeleteTestFile(_T("end.dat")); + if (! MoveFile(_T("begin.dat"), _T("end.dat"))) { + fprintf(stderr, "MoveFile failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY); + DeleteTestFile(_T("end.dat")); + + printf("Testing move to different drive\n"); + if (_T(' ') != otherdrive) { + otherfile[0] = otherdrive; + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(otherfile); + if (! MoveFile(_T("begin.dat"), otherfile)) { + fprintf(stderr, "MoveFile failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(otherfile, FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(otherfile); + } else { + printf(" Test skipped, no other drive available\n"); + } + + printf("Testing move/overwrite of existing file\n"); + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE); + if (! MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING)) { + fprintf(stderr, "MoveFileEx failed with code %lu\n", GetLastError()); + exit(1); + } + DeleteTestFile(_T("begin.dat")); + DeleteTestFile(_T("end.dat")); + +/* Not (correctly) implemented in ros yet */ +#if 0 + printf("Testing move/overwrite of existing readonly file\n"); + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_READONLY); + if (MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING)) { + fprintf(stderr, "MoveFileEx succeeded but shouldn't have\n"); + exit(1); + } else if (ERROR_ALREADY_EXISTS != GetLastError() && + ERROR_ACCESS_DENIED != GetLastError()) { + fprintf(stderr, "MoveFileEx failed with unexpected code %lu\n", GetLastError()); + exit(1); + } + DeleteTestFile(_T("begin.dat")); + DeleteTestFile(_T("end.dat")); +#endif + +/* Not implemented in ros yet */ +#if 0 + printf("Testing move to different drive without COPY_ALLOWED\n"); + if (_T(' ') != otherdrive) { + otherfile[0] = otherdrive; + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(otherfile); + if (MoveFileEx(_T("begin.dat"), otherfile, 0)) { + fprintf(stderr, "MoveFileEx succeeded but shouldn't have\n"); + exit(1); + } else if (ERROR_NOT_SAME_DEVICE != GetLastError()) { + fprintf(stderr, "MoveFileEx failed with unexpected code %lu\n", GetLastError()); + exit(1); + } + DeleteTestFile(otherfile); + } else { + printf(" Test skipped, no other drive available\n"); + } +#endif + + printf("Testing move to different drive with COPY_ALLOWED\n"); + if (_T(' ') != otherdrive) { + otherfile[0] = otherdrive; + CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(otherfile); + if (! MoveFileEx(_T("begin.dat"), otherfile, MOVEFILE_COPY_ALLOWED)) { + fprintf(stderr, "MoveFileEx failed with code %lu\n", GetLastError()); + exit(1); + } + CheckTestFile(otherfile, FILE_ATTRIBUTE_ARCHIVE); + DeleteTestFile(otherfile); + } else { + printf(" Test skipped, no other drive available\n"); + } + + printf("All tests successfully completed\n"); + + return 0; +} diff --git a/rosapps/tests/count/.cvsignore b/rosapps/tests/count/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/count/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/count/Makefile b/rosapps/tests/count/Makefile new file mode 100644 index 00000000000..e486cc0c2f5 --- /dev/null +++ b/rosapps/tests/count/Makefile @@ -0,0 +1,23 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = count + +TARGET_SDKLIBS = kernel32.a user32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/count/count.c b/rosapps/tests/count/count.c new file mode 100644 index 00000000000..5d3ebb2dc67 --- /dev/null +++ b/rosapps/tests/count/count.c @@ -0,0 +1,15 @@ +/* $Id: count.c,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + * + */ +#include + +int n = 0; + +int +main (int argc, char * argv []) +{ + while (1) printf ("%d ", n ++ ); + return (0); +} + +/* EOF */ diff --git a/rosapps/tests/create-links/.cvsignore b/rosapps/tests/create-links/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/create-links/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/create-links/Makefile b/rosapps/tests/create-links/Makefile new file mode 100644 index 00000000000..6dba618b3c3 --- /dev/null +++ b/rosapps/tests/create-links/Makefile @@ -0,0 +1,25 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = create-links + +TARGET_SDKLIBS = kernel32.a gdi32.a ole32.a shell32.a shlwapi.a + +TARGET_GCCLIBS = uuid + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API -D_WIN32_IE=0x0400 + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/create-links/create-links.c b/rosapps/tests/create-links/create-links.c new file mode 100644 index 00000000000..a2b4ce0523a --- /dev/null +++ b/rosapps/tests/create-links/create-links.c @@ -0,0 +1,97 @@ +/* + + compile via: + gcc -o create-links -D_WIN32_IE=0x400 create-links.c -lole32 -luuid -lshell32 -lshlwapi + + Martin Fuchs, 27.12.2003 + +*/ + +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include +#include + +#include + +HRESULT CreateShellLink(LPCSTR linkPath, LPCSTR cmd, LPCSTR arg, LPCSTR dir, LPCSTR iconPath, int icon_nr, LPCSTR comment) +{ + IShellLinkA* psl; + IPersistFile* ppf; + WCHAR buffer[MAX_PATH]; + + HRESULT hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID*)&psl); + + printf("creating shortcut file '%s' to %s...\n", linkPath, cmd); + + if (SUCCEEDED(hr)) { + hr = psl->lpVtbl->SetPath(psl, cmd); + + if (arg) + hr = psl->lpVtbl->SetArguments(psl, arg); + + if (dir) + hr = psl->lpVtbl->SetWorkingDirectory(psl, dir); + + if (iconPath) + hr = psl->lpVtbl->SetIconLocation(psl, iconPath, icon_nr); + + if (comment) + hr = psl->lpVtbl->SetDescription(psl, comment); + + hr = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (LPVOID*)&ppf); + + if (SUCCEEDED(hr)) { + MultiByteToWideChar(CP_ACP, 0, linkPath, -1, buffer, MAX_PATH); + + hr = ppf->lpVtbl->Save(ppf, buffer, TRUE); + + ppf->lpVtbl->Release(ppf); + } + + psl->lpVtbl->Release(psl); + } + + if (SUCCEEDED(hr)) + printf("OK\n\n"); + else + printf("error %08x\n\n", (int) hr); + + return hr; +} + + +int main() +{ + char path[MAX_PATH]; + LPSTR p; + + CoInitialize(NULL); + + /* create some shortcuts in the start menu "programs" folder */ + SHGetSpecialFolderPathA(0, path, CSIDL_PROGRAMS, TRUE); + p = PathAddBackslash(path); + + strcpy(p, "start-cmd.lnk"); + CreateShellLink(path, "cmd.exe", "", NULL, NULL, 0, "open console window"); + + strcpy(p, "start-winhello.lnk"); + CreateShellLink(path, "winhello.exe", "", NULL, NULL, 0, "launch winhello"); + + + /* create some shortcuts on the desktop */ + SHGetSpecialFolderPathA(0, path, CSIDL_DESKTOP, TRUE); + p = PathAddBackslash(path); + + strcpy(p, "start-wcmd.lnk"); + CreateShellLink(path, "cmd.exe", "", NULL, NULL, 0, "open console window"); + + strcpy(p, "start-winemine.lnk"); + CreateShellLink(path, "winemine.exe", "", NULL, NULL, 0, "launch winemine"); + + CoUninitialize(); + + return 0; +} diff --git a/rosapps/tests/dibtest/.cvsignore b/rosapps/tests/dibtest/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/dibtest/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/dibtest/dibtest.c b/rosapps/tests/dibtest/dibtest.c new file mode 100644 index 00000000000..27ce8091614 --- /dev/null +++ b/rosapps/tests/dibtest/dibtest.c @@ -0,0 +1,196 @@ +#include +#include +#include + +#define CELL_SIZE 10 + +static RGBQUAD Colors[] = +{ + { 0x00, 0x00, 0x00, 0x00 }, // black + { 0x00, 0x00, 0x80, 0x00 }, // red + { 0x00, 0x80, 0x00, 0x00 }, // green + { 0x00, 0x80, 0x80, 0x00 }, // brown + { 0x80, 0x00, 0x00, 0x00 }, // blue + { 0x80, 0x00, 0x80, 0x00 }, // magenta + { 0x80, 0x80, 0x00, 0x00 }, // cyan + { 0x80, 0x80, 0x80, 0x00 }, // dark gray + { 0xc0, 0xc0, 0xc0, 0x00 }, // light gray + { 0x00, 0x00, 0xFF, 0x00 }, // bright red + { 0x00, 0xFF, 0x00, 0x00 }, // bright green + { 0x00, 0xFF, 0xFF, 0x00 }, // bright yellow + { 0xFF, 0x00, 0x00, 0x00 }, // bright blue + { 0xFF, 0x00, 0xFF, 0x00 }, // bright magenta + { 0xFF, 0xFF, 0x00, 0x00 }, // bright cyan + { 0xFF, 0xFF, 0xFF, 0x00 } // bright white +}; + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + wc.lpszClassName = "DibTestClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("DibTestClass", + "DIB Test", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + 25 * CELL_SIZE + 5, + 25 * CELL_SIZE + 20, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; +} + +static void PaintCells(HDC WindowDC, WORD BitCount1, WORD BitCount2, + int XDest, int YDest) +{ + HBRUSH Brush; + RECT Rect; + UINT row, col; + BITMAPINFO *BitmapInfo; + HBITMAP DIB1, DIB2; + HDC DC1, DC2; + + BitmapInfo = malloc(sizeof(BITMAPINFO) + 15 * sizeof(RGBQUAD)); + BitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + BitmapInfo->bmiHeader.biWidth = 4 * CELL_SIZE + 9; + BitmapInfo->bmiHeader.biHeight = -(4 * CELL_SIZE + 9); // it's top down (since BI_RGB is used, the sign is operative of direction) + BitmapInfo->bmiHeader.biPlanes = 1; + BitmapInfo->bmiHeader.biBitCount = BitCount1; + BitmapInfo->bmiHeader.biCompression = BI_RGB; + BitmapInfo->bmiHeader.biSizeImage = 0; + BitmapInfo->bmiHeader.biXPelsPerMeter = 0; + BitmapInfo->bmiHeader.biYPelsPerMeter = 0; + BitmapInfo->bmiHeader.biClrUsed = 16; + BitmapInfo->bmiHeader.biClrImportant = 16; + for (col = 0; col < 16; col++) { + BitmapInfo->bmiColors[col] = Colors[col]; + } + DIB1 = CreateDIBSection(NULL, BitmapInfo, DIB_RGB_COLORS, NULL, NULL, 0); + DC1 = CreateCompatibleDC(NULL); + SelectObject(DC1, DIB1); + + BitmapInfo->bmiHeader.biBitCount = BitCount2; + DIB2 = CreateDIBSection(NULL, BitmapInfo, DIB_RGB_COLORS, NULL, NULL, 0); + DC2 = CreateCompatibleDC(NULL); + SelectObject(DC2, DIB2); + free(BitmapInfo); + + /* Now paint on the first bitmap */ + for (row = 0; row < 4; row++) + { + for (col = 0; col < 4; col++) + { + Brush = CreateSolidBrush(RGB(Colors[4 * row + col].rgbRed, + Colors[4 * row + col].rgbGreen, + Colors[4 * row + col].rgbBlue)); + Rect.left = CELL_SIZE * col + 5; + Rect.top = CELL_SIZE * row + 5; + Rect.right = Rect.left + CELL_SIZE; + Rect.bottom = Rect.top + CELL_SIZE; + FillRect(DC1, &Rect, Brush); + DeleteObject(Brush); + } + } + + /* Copy the first bitmap to the second */ + BitBlt(DC2, 4, 4, 4 * CELL_SIZE, 4 * CELL_SIZE, DC1, 5, 5, SRCCOPY); + + /* Show results on screen */ + BitBlt(WindowDC, XDest, YDest, 4 * CELL_SIZE, 4 * CELL_SIZE, DC2, 4, 4, SRCCOPY); +} + +LRESULT CALLBACK MainWndProc(HWND Wnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC WindowDC; + + switch(msg) + { + case WM_PAINT: + WindowDC = BeginPaint(Wnd, &ps); + + PaintCells(WindowDC, 4, 4, 0, 0); + PaintCells(WindowDC, 4, 8, 5 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 16, 10 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 24, 15 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 32, 20 * CELL_SIZE, 0); + + PaintCells(WindowDC, 8, 4, 0, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 8, 5 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 16, 10 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 24, 15 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 32, 20 * CELL_SIZE, 5 * CELL_SIZE); + + PaintCells(WindowDC, 16, 4, 0, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 8, 5 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 16, 10 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 24, 15 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 32, 20 * CELL_SIZE, 10 * CELL_SIZE); + + PaintCells(WindowDC, 24, 4, 0, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 8, 5 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 16, 10 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 24, 15 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 32, 20 * CELL_SIZE, 15 * CELL_SIZE); + + PaintCells(WindowDC, 32, 4, 0, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 8, 5 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 16, 10 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 24, 15 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 32, 20 * CELL_SIZE, 20 * CELL_SIZE); + + EndPaint(Wnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(Wnd, msg, wParam, lParam); + } + + return 0; +} diff --git a/rosapps/tests/dibtest/makefile b/rosapps/tests/dibtest/makefile new file mode 100644 index 00000000000..94851812179 --- /dev/null +++ b/rosapps/tests/dibtest/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = dibtest + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/dirdlg/.cvsignore b/rosapps/tests/dirdlg/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/dirdlg/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/dirdlg/dirdlg.c b/rosapps/tests/dirdlg/dirdlg.c new file mode 100644 index 00000000000..fdcb074dd78 --- /dev/null +++ b/rosapps/tests/dirdlg/dirdlg.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include "resource.h" + +static char selected[MAX_PATH + 1]; + +INT_PTR +CALLBACK +DlgMainProc( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + char dir[MAX_PATH + 1]; + + switch(uMsg) + { + case WM_COMMAND: + { + switch(HIWORD(wParam)) + { + case LBN_DBLCLK: + { + switch(LOWORD(wParam)) + { + case IDC_DIRS: + { + if(DlgDirSelectEx(hwndDlg, dir, MAX_PATH, IDC_DIRS)) + { + chdir(dir); + GetCurrentDirectory(MAX_PATH, dir); + DlgDirList(hwndDlg, dir, IDC_DIRS, IDC_DIREDIT, DDL_DIRECTORY | DDL_DRIVES); + } + else + { + SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_OK, 0), 0); + } + break; + } + } + break; + } + default: + { + switch(LOWORD(wParam)) + { + case IDC_OK: + { + char file[MAX_PATH + 1]; + int len; + + if(!DlgDirSelectEx(hwndDlg, file, MAX_PATH, IDC_DIRS)) + { + GetCurrentDirectory(MAX_PATH, selected); + len = strlen(selected); + if(strlen(file)) + { + if(selected[len - 1] != '\\') + { + lstrcat(selected, "\\"); + } + lstrcat(selected, file); + EndDialog(hwndDlg, IDC_OK); + } + } + break; + } + case IDC_CANCEL: + { + EndDialog(hwndDlg, IDC_CANCEL); + break; + } + } + break; + } + } + break; + } + case WM_INITDIALOG: + { + SendDlgItemMessage(hwndDlg, IDC_DIRS, LB_SETCOLUMNWIDTH, 150, 0); + GetCurrentDirectory(MAX_PATH, dir); + DlgDirList(hwndDlg, dir, IDC_DIRS, IDC_DIREDIT, DDL_DIRECTORY | DDL_DRIVES); + SetFocus(GetDlgItem(hwndDlg, IDC_DIRS)); + break; + } + case WM_CLOSE: + { + EndDialog(hwndDlg, IDC_CANCEL); + return TRUE; + } + } + return FALSE; +} + +int WINAPI +WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + char str[MAX_PATH + 32]; + if(DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, DlgMainProc) == IDC_OK) + { + sprintf(str, "You selected \"%s\"", selected); + MessageBox(0, str, "Selected file", MB_ICONINFORMATION); + } + return 0; +} + diff --git a/rosapps/tests/dirdlg/dirdlg.rc b/rosapps/tests/dirdlg/dirdlg.rc new file mode 100644 index 00000000000..72385411b88 --- /dev/null +++ b/rosapps/tests/dirdlg/dirdlg.rc @@ -0,0 +1,14 @@ +#include +#include +#include "resource.h" + +IDD_MAIN DIALOG DISCARDABLE 20, 20, 220, 140 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Sans Serif" +CAPTION "Select a file" +BEGIN + EDITTEXT IDC_DIREDIT, 5, 5, 210, 13, ES_READONLY | ES_LEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP + LISTBOX IDC_DIRS, 5, 23, 210, 92, LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL + PUSHBUTTON "&OK", IDC_OK, 60, 120, 40, 15, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Cancel", IDC_CANCEL, 120, 120, 40, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/rosapps/tests/dirdlg/makefile b/rosapps/tests/dirdlg/makefile new file mode 100644 index 00000000000..69d454e5abe --- /dev/null +++ b/rosapps/tests/dirdlg/makefile @@ -0,0 +1,21 @@ +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = no + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = dirdlg + +TARGET_SDKLIBS = ntdll.a kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/dirdlg/resource.h b/rosapps/tests/dirdlg/resource.h new file mode 100644 index 00000000000..7a1063b932e --- /dev/null +++ b/rosapps/tests/dirdlg/resource.h @@ -0,0 +1,6 @@ +#define IDD_MAIN 101 + +#define IDC_OK 1 +#define IDC_CANCEL 2 +#define IDC_DIRS 100 +#define IDC_DIREDIT 101 diff --git a/rosapps/tests/diskspeed/.cvsignore b/rosapps/tests/diskspeed/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/diskspeed/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/diskspeed/diskspeed.c b/rosapps/tests/diskspeed/diskspeed.c new file mode 100644 index 00000000000..d19f8c0f344 --- /dev/null +++ b/rosapps/tests/diskspeed/diskspeed.c @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2004 ReactOS Team + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS diskspeed.exe + * FILE: apps/tests/diskspeed/diskspeed.c + * PURPOSE: Determines disk transfer rates + * PROGRAMMER: Hartmut Birr + */ + +#include +#include +#include +#include +#include +#include + +BOOL GetInquiryData(HANDLE hDevice, PINQUIRYDATA InquiryData) +{ + BOOL Result; + DWORD dwReturned; + SCSI_ADDRESS ScsiAddress; + PSCSI_ADAPTER_BUS_INFO AdapterInfo; + PSCSI_INQUIRY_DATA InquiryBuffer; + BYTE Buffer[4096]; + int i; + + Result = DeviceIoControl(hDevice, + IOCTL_SCSI_GET_ADDRESS, + NULL, + 0, + &ScsiAddress, + sizeof(ScsiAddress), + &dwReturned, + FALSE); + if (Result == FALSE) + { + return FALSE; + } + Result = DeviceIoControl(hDevice, + IOCTL_SCSI_GET_INQUIRY_DATA, + NULL, + 0, + Buffer, + sizeof(Buffer), + &dwReturned, + FALSE); + if (Result) + { + AdapterInfo = (PSCSI_ADAPTER_BUS_INFO)Buffer; + for (i = 0; i < AdapterInfo->NumberOfBuses; i++) + { + InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + AdapterInfo->BusData[i].InquiryDataOffset); + if (AdapterInfo->BusData[i].InquiryDataOffset) + { + while (1) + { + if (InquiryBuffer->PathId == ScsiAddress.PathId && + InquiryBuffer->TargetId == ScsiAddress.TargetId && + InquiryBuffer->Lun == ScsiAddress.Lun) + { + memcpy(InquiryData, InquiryBuffer->InquiryData, sizeof(INQUIRYDATA)); + return TRUE; + } + if (InquiryBuffer->NextInquiryDataOffset == 0) + { + break; + } + InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + InquiryBuffer->NextInquiryDataOffset); + } + } + } + } + return FALSE; +} + + + +int main(void) +{ + HANDLE hDevice; + OVERLAPPED ov; + + PBYTE Buffer; + DWORD Start; + DWORD dwReturned; + DWORD dwReadTotal; + DWORD Size; + BOOL Result; + ULONG Drive; + CHAR Name[20]; + + INQUIRYDATA InquiryData; + + + Drive = 0; + while (1) + { + sprintf(Name, "\\\\.\\PHYSICALDRIVE%ld", Drive); + hDevice = CreateFile(Name, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + 0, + NULL); + if (hDevice == INVALID_HANDLE_VALUE) + { + if (Drive > 0) + { + VirtualFree(Buffer, 512 * 1024, MEM_RELEASE); + } + else + { + printf("Cannot open '%s'\n", Name); + } + break; + } + if (Drive == 0) + { + printf("Transfer Size (kB) 1 2 4 8 16 32 64 128 256\n"); + printf("Transfer Rate (MB/s)\n"); + printf("-------------------------------------------------------------------------------\n"); + + Buffer = VirtualAlloc(NULL, 512 * 1024, MEM_COMMIT, PAGE_READWRITE); + } + Result = GetInquiryData(hDevice, &InquiryData); + if (Result) + { + printf("%.24s ", InquiryData.VendorId); + } + else + { + printf("Disk %ld ", Drive + 1); + } + Size = 1024; + memset(&ov, 0, sizeof(OVERLAPPED)); + while (Size <= 256 * 1024) + { + memset(Buffer, 0, Size); + dwReadTotal = 0; + + Start = GetTickCount() + 2000; + while (Start > GetTickCount()) + { + Result = ReadFile(hDevice, Buffer, Size, &dwReturned, &ov); + if (Result) + { + dwReadTotal += dwReturned; + ov.Offset += dwReturned; + } + } + dwReadTotal /= 2048; + printf("%3ld.%ld ", dwReadTotal / 1024, (dwReadTotal % 1024) * 10 / 1024); + Size *= 2; + } + printf("\n"); + CloseHandle(hDevice); + Drive++; + } + printf("\n"); + + + return 0; +} diff --git a/rosapps/tests/diskspeed/makefile b/rosapps/tests/diskspeed/makefile new file mode 100644 index 00000000000..d2ec7a2e9a9 --- /dev/null +++ b/rosapps/tests/diskspeed/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:00 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = diskspeed + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/dnsapi/.cvsignore b/rosapps/tests/dnsapi/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/dnsapi/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/dnsapi/dnsapi.c b/rosapps/tests/dnsapi/dnsapi.c new file mode 100644 index 00000000000..b85a1f20d8c --- /dev/null +++ b/rosapps/tests/dnsapi/dnsapi.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include + +int main( int argc, char **argv ) { + PDNS_RECORD QueryReply, AddrResponse; + DWORD Addr; + + assert (DnsValidateName( "||||", DnsNameDomain ) == DNS_ERROR_INVALID_NAME_CHAR); + assert (DnsValidateName( "a.b.c", DnsNameDomainLabel ) == DNS_ERROR_INVALID_NAME); + assert (DnsValidateName( "1234", DnsNameDomainLabel ) == ERROR_SUCCESS); + assert (DnsValidateName( "fubar", DnsNameDomain ) == ERROR_SUCCESS); + assert (DnsQuery ("www.reactos.com", DNS_TYPE_A, DNS_QUERY_STANDARD, + NULL, &QueryReply, NULL) == ERROR_SUCCESS); + AddrResponse = QueryReply; + while( AddrResponse ) { + if( AddrResponse->wType == DNS_TYPE_A ) { + Addr = ntohl( AddrResponse->Data.A.IpAddress ); + printf( "www.reactos.com == %d.%d.%d.%d\n", + (int)(Addr >> 24) & 0xff, + (int)(Addr >> 16) & 0xff, + (int)(Addr >> 8) & 0xff, + (int)Addr & 0xff ); + } + AddrResponse = AddrResponse->pNext; + } + DnsRecordListFree( QueryReply, DnsFreeRecordList ); + + return 0; +} diff --git a/rosapps/tests/dnsapi/makefile b/rosapps/tests/dnsapi/makefile new file mode 100644 index 00000000000..ee9431e5689 --- /dev/null +++ b/rosapps/tests/dnsapi/makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = dnsapi + +TARGET_SDKLIBS = dnsapi.a ws2_32.a kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -g + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/dnsquery/.cvsignore b/rosapps/tests/dnsquery/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/dnsquery/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/dnsquery/dnsquery.c b/rosapps/tests/dnsquery/dnsquery.c new file mode 100644 index 00000000000..45780207eae --- /dev/null +++ b/rosapps/tests/dnsquery/dnsquery.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include +#include + +int main( int argc, char **argv ) { + PDNS_RECORD QueryReply, AddrResponse; + DWORD Addr; + + assert (DnsQuery ("www.reactos.com", DNS_TYPE_A, DNS_QUERY_STANDARD, + NULL, &QueryReply, NULL) == ERROR_SUCCESS); + AddrResponse = QueryReply; + while( AddrResponse ) { + if( AddrResponse->wType == DNS_TYPE_A ) { + Addr = ntohl( AddrResponse->Data.A.IpAddress ); + printf( "www.reactos.com == %d.%d.%d.%d\n", + (int)(Addr >> 24) & 0xff, + (int)(Addr >> 16) & 0xff, + (int)(Addr >> 8) & 0xff, + (int)Addr & 0xff ); + } + AddrResponse = AddrResponse->pNext; + } + DnsRecordListFree( QueryReply, DnsFreeRecordList ); + + return 0; +} diff --git a/rosapps/tests/dnsquery/makefile b/rosapps/tests/dnsquery/makefile new file mode 100644 index 00000000000..55c9ad94b2f --- /dev/null +++ b/rosapps/tests/dnsquery/makefile @@ -0,0 +1,22 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = dnsquery + +TARGET_SDKLIBS = dnsapi.a ws2_32.a kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -g + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/dump_shared_data/.cvsignore b/rosapps/tests/dump_shared_data/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/dump_shared_data/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/dump_shared_data/dump_shared_data.c b/rosapps/tests/dump_shared_data/dump_shared_data.c new file mode 100644 index 00000000000..6ae2aeb0d9e --- /dev/null +++ b/rosapps/tests/dump_shared_data/dump_shared_data.c @@ -0,0 +1,52 @@ +#include +#include + +int main() +{ + int i; + + printf("TickCountLow: %lx\n", + SharedUserData->TickCountLow); + printf("Drives: "); + for (i = 0; i < 26; i++) + { + printf("%c", (SharedUserData->DosDeviceMap & (1 << i))?'1':'0'); + } + printf("\n"); + for (i = 0; i < 26; i++) + { + if (SharedUserData->DosDeviceMap & (1 << i)) + { + printf("%c: ", 'A'+i); + switch(SharedUserData->DosDeviceDriveType[i]) + { + case DOSDEVICE_DRIVE_UNKNOWN: + printf("Unknown\n"); + break; + case DOSDEVICE_DRIVE_CALCULATE: + printf("No root\n"); + break; + case DOSDEVICE_DRIVE_REMOVABLE: + printf("Removable\n"); + break; + case DOSDEVICE_DRIVE_FIXED: + printf("Fixed\n"); + break; + case DOSDEVICE_DRIVE_REMOTE: + printf("Remote\n"); + break; + case DOSDEVICE_DRIVE_CDROM: + printf("CD-ROM\n"); + break; + case DOSDEVICE_DRIVE_RAMDISK: + printf("Ram disk\n"); + break; + default: + printf("undefined type\n"); + break; + } + } + } + printf("\n\n"); + return 0; +} diff --git a/rosapps/tests/dump_shared_data/makefile b/rosapps/tests/dump_shared_data/makefile new file mode 100644 index 00000000000..48722fa7989 --- /dev/null +++ b/rosapps/tests/dump_shared_data/makefile @@ -0,0 +1,22 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:01 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = dump_shared_data + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF + diff --git a/rosapps/tests/edit/.cvsignore b/rosapps/tests/edit/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/edit/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/edit/edittest.c b/rosapps/tests/edit/edittest.c new file mode 100644 index 00000000000..723464651c8 --- /dev/null +++ b/rosapps/tests/edit/edittest.c @@ -0,0 +1,649 @@ +/* Edit Control Test for ReactOS, quick n' dirty. Very rigid too. + * There you go, is only a test program. Not made to be fast, small + * easy to mantain, or portable. Lots of duplicated code too. + + * I'm not erasing text because I don't want to use other functions from th API + * or make this more complex. + + * This source code is in the PUBLIC DOMAIN and has NO WARRANTY. + * by Waldo Alvarez Cañizares , June 22, 2003. */ + +//#define WIN32_LEAN_AND_MEAN +#include +#include "utils.h" + +#define CREATEWINDOW 106 +#define CREATEWINDOWEX 107 +#define CREATEWINDOWW 108 + +#define ResultX 0 +#define ResultY 305 + +#define NOTIFYX 350 +#define NOTIFYY 285 + +#define BUFFERLEN 80 /* Size of buffer to hold result strings */ + +/* Edit is created with this text */ +#define TestStr "The quick brown fox jumps over the lazy dog" + +#define TestStrW L"This is a WCHAR string" /* Wide to support unicode edits */ + +#define MAXMESSAGEBUTTONS 42 + +HWND g_hwnd = NULL; +HINSTANCE g_hInst = NULL; + +int pos = 10; +int n = 0; +int yButPos = 10; +int xButPos = 10; + +DWORD EditStyle = 0; +DWORD EditWidth = 240; +DWORD EditHeight = 250; + +BOOL UnicodeUsed = FALSE; + +HWND hwndEdit = NULL; + +POINTL point={10,3}; +RECT rect = {0,0,20,20},rect2; +DWORD StartP,EndP; + +#define ReplaceTextStr "->> Replaced!! <<-" + +char* AllocatedText; /* Buffer in the heap to feed it to the edit control */ +char* NewText = "New text for the edit control"; +wchar_t* NewTextW = L"New text for the edit control in UNICODE"; // Wide + +char TextBuffer[BUFFERLEN]={'R','e','s','u','l','t',':',' '}; + +typedef void FunctionHandler(HWND,DWORD,WPARAM,LPARAM); +typedef FunctionHandler* LPFUNCTIONHANDLER; + +VOID +PrintTextXY(char* Text,int x,int y,int len) +{ + HDC hdc; + hdc = GetDC (g_hwnd); + SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); + + TextOut (hdc, x,y,Text,len); + ReleaseDC (g_hwnd, hdc); + ValidateRect (g_hwnd, &rect); +} + +static +VOID +HandlePrintReturnHex(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + int ret; + ret = SendMessage(handle,Msg,wParam,lParam); + htoa(ret,&TextBuffer[8]); + PrintTextXY(TextBuffer,ResultX,ResultY,16); + } + +static +VOID +HandleSetHandlePrintHex(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + LPVOID pMem; + HANDLE hNewBuffer; + int ret; + + LocalFree((HLOCAL)SendMessage(handle, EM_GETHANDLE, 0, 0L)); + if (UnicodeUsed) + { + hNewBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT, 100); + pMem = LocalLock(hNewBuffer); + strcpyw_((wchar_t*)pMem,NewTextW); + } + else + { + hNewBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT,50); + pMem = LocalLock(hNewBuffer); + strcpy_((char*)pMem,NewText); + } + + LocalUnlock(pMem); + hNewBuffer = LocalHandle(pMem); + + /* Updates the buffer and displays new buffer */ + ret = SendMessage(handle, EM_SETHANDLE, (WPARAM)hNewBuffer, 0L); + + htoa(ret,&TextBuffer[8]); + PrintTextXY(TextBuffer,ResultX,ResultY,16); + } + +static +VOID +HandlePrintReturnStr(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + int ret; + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + ret = SendMessage(handle,Msg,wParam,lParam); + PrintTextXY(TextBuffer,ResultX,ResultY,8+ret); + } + +static +VOID +HandlePrintRect(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + TextBuffer[8] = (char)(BUFFERLEN - 8); /* Setting the max size to put chars in first byte */ + SendMessage(handle,Msg,wParam,lParam); + + htoa(rect.top,&TextBuffer[8]); + TextBuffer[8+8] = ' '; + htoa(rect.bottom,&TextBuffer[8+8+1]); + TextBuffer[8+8+8+1] = ' '; + htoa(rect.left,&TextBuffer[8+8+8+1+1]); + TextBuffer[8+8+8+8+1+1] = ' '; + htoa(rect.right,&TextBuffer[8+8+8+8+1+1+1]); + + PrintTextXY(TextBuffer,ResultX,ResultY,8+4*9-1); + } + +static +VOID +HandlePrintPasswdChar(HWND handle,DWORD Msg,WPARAM wParam,LPARAM lParam) + { + HDC hdc; + int ret = SendMessage(handle,Msg,wParam,lParam); + + int s; + + if (ret) + { + s = 1; + TextBuffer[8] = (char)(ret); + } + else + { + TextBuffer[8] = 'N'; + TextBuffer[9] = 'U'; + TextBuffer[10] = 'L'; + TextBuffer[11] = 'L'; + s = 4; + } + + hdc = GetDC (g_hwnd); + SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); + + TextOut (hdc,ResultX ,ResultY,TextBuffer,8+s); + ReleaseDC (g_hwnd, hdc); + ValidateRect (g_hwnd, &rect); + } + + +struct +{ + char* Text; /* Text for the button */ + DWORD MsgCode; /* Message Code */ + WPARAM wParam; /* Well hope you can understand this */ + LPARAM lParam; /* ditto */ + LPFUNCTIONHANDLER Handler; /* Funtion called to handle the result of each message */ +} +Msg[] = +{ + {"EM_CANUNDO",EM_CANUNDO,0,0,&HandlePrintReturnHex}, + {"EM_CHARFROMPOS",EM_CHARFROMPOS,(WPARAM)&point,0,&HandlePrintReturnHex}, + {"EM_EMPTYUNDOBUFFER",EM_EMPTYUNDOBUFFER,0,0,&HandlePrintReturnHex}, + {"EM_FMTLINES",EM_FMTLINES,TRUE,0,&HandlePrintReturnHex}, + {"EM_GETFIRSTVISIBLELINE",EM_GETFIRSTVISIBLELINE,0,0,&HandlePrintReturnHex}, + + {"EM_GETLIMITTEXT",EM_GETLIMITTEXT,0,0,&HandlePrintReturnHex}, + {"EM_GETLINE",EM_GETLINE,2,(WPARAM)&TextBuffer[8],&HandlePrintReturnStr}, + {"EM_GETLINECOUNT",EM_GETLINECOUNT,0,0,&HandlePrintReturnHex}, + {"EM_GETMARGINS",EM_GETMARGINS,0,0,&HandlePrintReturnHex}, + {"EM_SETMARGINS",EM_SETMARGINS,EC_LEFTMARGIN,10,&HandlePrintReturnHex}, + + {"EM_GETMODIFY",EM_GETMODIFY,0,0,&HandlePrintReturnHex}, + {"EM_SETMODIFY",EM_SETMODIFY,TRUE,0,&HandlePrintReturnHex}, + + {"EM_GETSEL",EM_GETSEL,(WPARAM)&StartP,(LPARAM)&EndP,&HandlePrintReturnHex}, + + {"EM_GETTHUMB",EM_GETTHUMB,0,0,&HandlePrintReturnHex}, + + {"EM_LIMITTEXT",EM_LIMITTEXT,10,0,&HandlePrintReturnHex}, + {"EM_LINEFROMCHAR",EM_LINEFROMCHAR,-1,0,&HandlePrintReturnHex}, + {"EM_POSFROMCHAR",EM_POSFROMCHAR,10,0,&HandlePrintReturnHex}, + {"EM_LINEINDEX",EM_LINEINDEX,2,0,&HandlePrintReturnHex}, + {"EM_LINELENGTH",EM_LINELENGTH,-1,0,&HandlePrintReturnHex}, + + {"EM_GETWORDBREAKPROC",EM_GETWORDBREAKPROC,0,0,&HandlePrintReturnHex}, + {"EM_REPLACESEL",EM_REPLACESEL,TRUE,(LPARAM)&ReplaceTextStr,&HandlePrintReturnHex}, + + {"EM_LINESCROLL",EM_LINESCROLL,5,1,&HandlePrintReturnHex}, + {"EM_SCROLL",EM_SCROLL,SB_LINEDOWN,0,&HandlePrintReturnHex}, + {"EM_SCROLLCARET",EM_SCROLLCARET,0,0,&HandlePrintReturnHex}, + + {"EM_SETHANDLE",EM_SETHANDLE,0,0,&HandleSetHandlePrintHex}, + {"EM_GETHANDLE",EM_GETHANDLE,0,0,&HandlePrintReturnHex}, + {"EM_GETPASSWORDCHAR",EM_GETPASSWORDCHAR,0,0,&HandlePrintPasswdChar}, + {"EM_SETPASSWORDCHAR - clear",EM_SETPASSWORDCHAR,0,0,&HandlePrintReturnHex}, + {"EM_SETPASSWORDCHAR - x",EM_SETPASSWORDCHAR,'x',0,&HandlePrintReturnHex}, + + {"EM_SETREADONLY - set",EM_SETREADONLY,TRUE,0,&HandlePrintReturnHex}, + {"EM_SETREADONLY - clear",EM_SETREADONLY,FALSE,0,&HandlePrintReturnHex}, + + {"EM_GETRECT",EM_GETRECT,0,(LPARAM)&rect2,&HandlePrintRect}, + {"EM_SETRECT",EM_SETRECT,0,(LPARAM)&rect,&HandlePrintReturnHex}, + {"EM_SETRECTNP",EM_SETRECTNP,0,(LPARAM)&rect,&HandlePrintReturnHex}, + {"EM_SETSEL",EM_SETSEL,1,3,&HandlePrintReturnHex}, + + {"EM_SETSEL - all",EM_SETSEL,0,-1,&HandlePrintReturnHex}, + {"EM_SETSEL - remove",EM_SETSEL,-1,0,&HandlePrintReturnHex}, + {"EM_UNDO",EM_UNDO,0,0,&HandlePrintReturnHex}, + {"WM_UNDO",WM_UNDO,0,0,&HandlePrintReturnHex}, + {"WM_PASTE",WM_PASTE,0,0,&HandlePrintReturnHex}, + + {"WM_CUT",WM_CUT,0,0,&HandlePrintReturnHex}, + {"WM_COPY",WM_COPY,0,0,&HandlePrintReturnHex} + +}; + +DWORD EditStyles[] = { + WS_THICKFRAME,WS_DISABLED,WS_BORDER,ES_LOWERCASE,ES_UPPERCASE,ES_NUMBER,ES_AUTOVSCROLL, + ES_AUTOHSCROLL,ES_LEFT,ES_CENTER,ES_RIGHT,ES_MULTILINE, + ES_NOHIDESEL,ES_OEMCONVERT,ES_PASSWORD,ES_READONLY,ES_WANTRETURN, + WS_HSCROLL,WS_VSCROLL + }; + +char* StyleNames[] = { + "WS_THICKFRAME","WS_DISABLED","WS_BORDER","ES_LOWERCASE","ES_UPPERCASE","ES_NUMBER","ES_AUTOVSCROLL", + "ES_AUTOHSCROLL","ES_LEFT","ES_CENTER","ES_RIGHT","ES_MULTILINE", + "ES_NOHIDESEL","ES_OEMCONVERT","ES_PASSWORD","ES_READONLY","ES_WANTRETURN", + "WS_HSCROLL","WS_VSCROLL" + }; + +#define NUMBERBUTTONS 26 +HWND Buttons[NUMBERBUTTONS]; +HWND MessageButtons[MAXMESSAGEBUTTONS]; +HWND Back1But,Back2But; +HWND NextBut; + + +HWND +CreateCheckButton(const char* lpWindowName, DWORD xSize, DWORD id) + { + HWND h; + h = CreateWindowEx(0, + "BUTTON", + lpWindowName, + WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, + xButPos, /* x */ + yButPos, /* y */ + xSize, /* nWidth */ + 20, /* nHeight */ + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + yButPos += 21; + return h; + } + +HWND +CreatePushButton(const char* lpWindowName, DWORD xSize, DWORD id,DWORD Style) + { + + HWND h = CreateWindow("BUTTON", + lpWindowName, + WS_CHILD | BS_PUSHBUTTON | Style, + xButPos, // x + yButPos, // y + xSize, // nWidth + 20, // nHeight + g_hwnd, + (HMENU) id, + g_hInst, + NULL + ); + + yButPos += 21; + return h; + } + +VOID +ReadNHide() + { + int i; + EditStyle = 0; + for (i=0 ; i< 19 ; i++) + { + if(BST_CHECKED == SendMessage(Buttons[i],BM_GETCHECK,0,0)) + EditStyle |= EditStyles[i]; + ShowWindow(Buttons[i],SW_HIDE); + } + + for (; i< NUMBERBUTTONS ; i++)ShowWindow(Buttons[i],SW_HIDE); + for (i=0 ; i< 26 ; i++) ShowWindow(MessageButtons[i],SW_SHOW); + + ShowWindow(Back1But,SW_SHOW); + ShowWindow(NextBut,SW_SHOW); + } + +VOID +ForwardToSecondPage() + { + int i; + for (i=0;i<26;i++)ShowWindow(MessageButtons[i],SW_HIDE); + for(;i= 600) + { + Msg[LOWORD(wParam)-600].Handler(hwndEdit, + Msg[LOWORD(wParam)-600].MsgCode, + Msg[LOWORD(wParam)-600].wParam, + Msg[LOWORD(wParam)-600].lParam); + break; + } + + switch(LOWORD(wParam)){ + + case 100: + EditWidth += 10; + break; + + case 101: + EditWidth -= 10; + break; + + case 102: + EditHeight += 10; + break; + + case 103: + EditHeight -= 10; + break; + + case 400: + BackToInitialPage(); + break; + + case 401: + ForwardToSecondPage(); + break; + + case 402: + BackToFirstPage(); + break; + + case CREATEWINDOW: + UnicodeUsed = FALSE; + ReadNHide(); + hwndEdit = CreateWindow("EDIT", + TestStr, + EditStyle | WS_CHILD | WS_VISIBLE, + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWEX: + UnicodeUsed = FALSE; + ReadNHide(); + hwndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, + "EDIT", + TestStr, + EditStyle | WS_CHILD | WS_VISIBLE , + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + + case CREATEWINDOWW: + UnicodeUsed = TRUE; + ReadNHide(); + hwndEdit = CreateWindowExW(WS_EX_CLIENTEDGE, + L"EDIT", + TestStrW, + EditStyle | WS_CHILD | WS_VISIBLE , + 350, + 10, + EditWidth, + EditHeight, + g_hwnd, + NULL, + g_hInst, + NULL); + break; + } + + if (lParam == (LPARAM)hwndEdit) + switch(HIWORD(wParam)) + { + case EN_CHANGE: + PrintTextXY("EN_CHANGE notification",NOTIFYX,NOTIFYY,22); + break; + + case EN_ERRSPACE: + PrintTextXY("EN_ERRSPACE notification",NOTIFYX,NOTIFYY,24); + break; + + /* --- FIXME not defined in w32api-2.3 headers + case H_SCROLL: + PrintTextXY("H_SCROLL notification",NOTIFYX,NOTIFYY,21); + break; */ + + /* --- FIXME not defined in w32api-2.3 headers + case KILL_FOCUS: + PrintTextXY("KILL_FOCUS notification",NOTIFYX,NOTIFYY,23); + break; */ + + /* --- FIXME not defined in w32api-2.3 headers + case EN_MAXTEST: + PrintTextXY("EN_MAXTEXT notification",NOTIFYX,NOTIFYY,23); + break; */ + + case EN_SETFOCUS: + PrintTextXY("EN_SETFOCUS notification",NOTIFYX,NOTIFYY,24); + break; + + case EN_UPDATE: + PrintTextXY("EN_UPDATE notification",NOTIFYX,NOTIFYY + 20,22); + break; + + case EN_VSCROLL: + PrintTextXY("EN_VSCROLL notification",NOTIFYX,NOTIFYY,23); + break; + + } + + break; + + case WM_SIZE : + return 0; + + case WM_CLOSE: + DestroyWindow (g_hwnd); + return 0; + + case WM_QUERYENDSESSION: + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefWindowProc ( hwnd, msg, wParam, lParam ); +} + +HWND +RegisterAndCreateWindow (HINSTANCE hInst, + const char* className, + const char* title) +{ + WNDCLASSEX wc; + HWND hwnd; + + g_hInst = hInst; + + wc.cbSize = sizeof (WNDCLASSEX); + + wc.lpfnWndProc = WndProc; /* window procedure */ + wc.hInstance = hInst; /* owner of the class */ + + wc.lpszClassName = className; + wc.hCursor = LoadCursor ( 0, (LPCTSTR)IDC_ARROW ); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hIcon = 0; + wc.hIconSm = 0; + wc.lpszMenuName = 0; + + if ( !RegisterClassEx ( &wc ) ) + return NULL; + + hwnd = CreateWindowEx ( + 0, /* dwStyleEx */ + className, /* class name */ + title, /* window title */ + + WS_OVERLAPPEDWINDOW, /* dwStyle */ + + 1, /* x */ + 1, /* y */ + 560, /* width */ + 350, /* height */ + NULL, /* hwndParent */ + NULL, /* hMenu */ + hInst, + 0 + ); + + if (!hwnd) return NULL; + + ShowWindow (hwnd, SW_SHOW); + UpdateWindow (hwnd); + + return hwnd; +} + +int +WINAPI +WinMain ( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdParam, int cmdShow ) +{ + char className [] = "Edit Control Test"; + MSG msg; + + RegisterAndCreateWindow ( hInst, className, "Edit Control Styles Test" ); + + // Message loop + while (GetMessage (&msg, NULL, 0, 0)) + { + TranslateMessage (&msg); + DispatchMessage (&msg); + } + return msg.wParam; + +} diff --git a/rosapps/tests/edit/makefile b/rosapps/tests/edit/makefile new file mode 100644 index 00000000000..bdc75204962 --- /dev/null +++ b/rosapps/tests/edit/makefile @@ -0,0 +1,24 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = edittest + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = \ + edittest.o \ + utils.o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/edit/utils.c b/rosapps/tests/edit/utils.c new file mode 100644 index 00000000000..f1eff54609f --- /dev/null +++ b/rosapps/tests/edit/utils.c @@ -0,0 +1,33 @@ +/* + * Edit Control Test for ReactOS, quick n' dirty. There you go + * This source code is in the PUBLIC DOMAIN and has NO WARRANTY. + * by Waldo Alvarez Cañizares , June 22, 2003. + */ + +#include + +static const char hexvals[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; +VOID htoa (unsigned int val, char *buf) +{ + int i; + buf += 7; + + for (i=0;i<8;i++) + { + *buf-- = hexvals[val & 0x0000000F]; + val = val >> 4; + } +} + + +VOID strcpy_(char *dst, const char *src) +{ + const char* p = src; + while ((*dst++ = *p++)) {} +} + +VOID strcpyw_(wchar_t* dst,wchar_t* src) +{ + const wchar_t* p = src; + while ((*dst++ = *p++)) {} +} diff --git a/rosapps/tests/edit/utils.h b/rosapps/tests/edit/utils.h new file mode 100644 index 00000000000..f6a12649c1e --- /dev/null +++ b/rosapps/tests/edit/utils.h @@ -0,0 +1,9 @@ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +VOID htoa (unsigned int, char *); +VOID strcpy_(char *, const char *); +VOID strcpyw_(wchar_t*,wchar_t*); +#ifdef __cplusplus + } +#endif diff --git a/rosapps/tests/enhmetafile/.cvsignore b/rosapps/tests/enhmetafile/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/enhmetafile/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/enhmetafile/enhmetafile.c b/rosapps/tests/enhmetafile/enhmetafile.c new file mode 100644 index 00000000000..cd90e6e42f7 --- /dev/null +++ b/rosapps/tests/enhmetafile/enhmetafile.c @@ -0,0 +1,123 @@ +#include +#include +#include + +//HFONT tf; +HENHMETAFILE EnhMetafile; +SIZE EnhMetafileSize; +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + ENHMETAHEADER emh; + + EnhMetafile = GetEnhMetaFile("test.emf"); + if(!EnhMetafile) + { + fprintf(stderr, "GetEnhMetaFile failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + GetEnhMetaFileHeader(EnhMetafile, sizeof(ENHMETAHEADER), &emh); + EnhMetafileSize.cx = emh.rclBounds.right - emh.rclBounds.left; + EnhMetafileSize.cy = emh.rclBounds.bottom - emh.rclBounds.top; + + wc.lpszClassName = "EnhMetaFileClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + DeleteEnhMetaFile(EnhMetafile); + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("EnhMetaFileClass", + "Enhanced Metafile test", + WS_OVERLAPPEDWINDOW, + 0, + 0, + EnhMetafileSize.cx + (2 * GetSystemMetrics(SM_CXSIZEFRAME)) + 2, + EnhMetafileSize.cy + (2 * GetSystemMetrics(SM_CYSIZEFRAME)) + GetSystemMetrics(SM_CYCAPTION) + 2, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + DeleteEnhMetaFile(EnhMetafile); + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + //tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + // ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + // DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + DeleteEnhMetaFile(EnhMetafile); + + //DeleteObject(tf); + UnregisterClass("EnhMetaFileClass", hInstance); + + return msg.wParam; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + + case WM_PAINT: + { + PAINTSTRUCT ps; + RECT rc; + HDC hDC; + int bk; + + GetClientRect(hWnd, &rc); + hDC = BeginPaint(hWnd, &ps); + rc.left = (rc.right / 2) - (EnhMetafileSize.cx / 2); + rc.top = (rc.bottom / 2) - (EnhMetafileSize.cy / 2); + rc.right = rc.left + EnhMetafileSize.cx; + rc.bottom = rc.top + EnhMetafileSize.cy; + bk = SetBkMode(hDC, TRANSPARENT); + Rectangle(hDC, rc.left - 1, rc.top - 1, rc.right + 1, rc.bottom + 1); + SetBkMode(hDC, bk); + PlayEnhMetaFile(hDC, EnhMetafile, &rc); + EndPaint(hWnd, &ps); + break; + } + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/enhmetafile/makefile b/rosapps/tests/enhmetafile/makefile new file mode 100644 index 00000000000..5b152fb2309 --- /dev/null +++ b/rosapps/tests/enhmetafile/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:01 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = enhmetafile + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/enhmetafile/test.emf b/rosapps/tests/enhmetafile/test.emf new file mode 100644 index 0000000000000000000000000000000000000000..d056e2070df42f2bc1dba9539d22e13042c74239 GIT binary patch literal 120908 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 +// Updates can be downloaded at: +// +// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu +// if you have any questions about this code. +// ------------------------------------------------------------------ + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#include +#include + + +#ifndef SNDMSG +#define SNDMSG ::SendMessage +#endif /* ifndef SNDMSG */ + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +HWND hListBox = NULL; +const int ID_LISTBOX = 101; + +HINSTANCE hInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam); + + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, + int nCmdShow) +{ + hInst = hInstance; + + WNDCLASS wc; + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.lpszClassName = WndClassName; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = hInstance; + wc.hCursor = NULL; //LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = reinterpret_cast( + COLOR_BTNFACE + 1 + ); + + if (RegisterClass(&wc)) + { + HWND hWnd = + CreateWindow( + WndClassName, TEXT("Font Enumeration Demo"), + WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | + WS_VISIBLE | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 295, 285, + NULL, NULL, hInst, NULL + ); + + if (hWnd) + { + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} +//------------------------------------------------------------------------- + + +int CALLBACK MyEnumFontFamExProc(ENUMLOGFONTEX *lpelfe, + NEWTEXTMETRICEX* lpntme, int FontType, LPARAM lParam) +{ + if (FontType == TRUETYPE_FONTTYPE) + { + // if the typeface name is not already in the list + LPARAM name = reinterpret_cast(lpelfe->elfFullName); + if (SNDMSG(hListBox, LB_FINDSTRINGEXACT, (ULONG)-1, name) == LB_ERR) + { + // add each font to the list box + int index = SNDMSG(hListBox, LB_ADDSTRING, 0, name); + + // fix the size of the font + lpelfe->elfLogFont.lfHeight = -20; + lpelfe->elfLogFont.lfWidth = 0; + + // create a new font and store its handle + // as the data of the newly added item + HFONT hFont = CreateFontIndirect(&lpelfe->elfLogFont); + SNDMSG(hListBox, LB_SETITEMDATA, index, + reinterpret_cast(hFont)); + } + } + return TRUE; +} +//------------------------------------------------------------------------- + + +void AddScreenFonts() +{ + // grab a handle to the screen's DC + HDC hScreenDC = GetDC(NULL); + try + { + // + // NOTE: Windows 95, 98 and Me requires that the lpLogfont + // (second) parameter of the EnumFontFamiliesEx function is + // non-NULL. This parameter can be NULL on Windows NT/2000. + // + LOGFONT lf = {0}; + lf.lfCharSet = DEFAULT_CHARSET; + + // enumerate the current screen fonts + EnumFontFamiliesEx( + hScreenDC, &lf, + (FONTENUMPROC)MyEnumFontFamExProc, + 0, 0 + ); + } + catch (...) + { + // release the screen's DC + ReleaseDC(NULL, hScreenDC); + } + // release the screen's DC + ReleaseDC(NULL, hScreenDC); +} +//------------------------------------------------------------------------- + + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) + { + case WM_CREATE: + { + hListBox = + CreateWindowEx( + WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""), + WS_CHILD | WS_VISIBLE | LBS_STANDARD | + LBS_HASSTRINGS | LBS_OWNERDRAWFIXED, + 20, 10, 250, 250, + hWnd, reinterpret_cast(ID_LISTBOX), + hInst, NULL + ); + if (hListBox) + { + AddScreenFonts(); + } + } + case WM_MEASUREITEM: + { + // grab a pointer to the MEASUREITEMSTRUCT structure + LPMEASUREITEMSTRUCT lpmis = + reinterpret_cast(lParam); + + // test the identifier of the control that + // the message is meant for + if ((int)lpmis->CtlID == ID_LISTBOX) + { + // adjust the height + lpmis->itemHeight = 25; + + return TRUE; + } + break; + } + case WM_DRAWITEM: + { + // grab a pointer to the DRAWITEMSTRUCT structure + LPDRAWITEMSTRUCT lpdis = + reinterpret_cast(lParam); + + // test the identifier of the control that + // the message is meant for + if ((int)lpdis->CtlID == ID_LISTBOX) + { + COLORREF OldColor = GetTextColor(lpdis->hDC); + int stock = WHITE_BRUSH; + + // if the item is currently selected + if (lpdis->itemState & ODS_SELECTED) + { + // set the text color to white and + // the background color to black + COLORREF clrWhite = PALETTERGB(255, 255, 255); + OldColor = SetTextColor(lpdis->hDC, clrWhite); + stock = BLACK_BRUSH; + } + FillRect( + lpdis->hDC, &lpdis->rcItem, + static_cast(GetStockObject(stock)) + ); + + if ((int)lpdis->itemID != -1) + { + // extract the item's text + char text[MAX_PATH]; + SNDMSG(hListBox, LB_GETTEXT, lpdis->itemID, + reinterpret_cast(text)); + + // extract the corresponding font handle + DWORD value = + SNDMSG(hListBox, LB_GETITEMDATA, lpdis->itemID, 0); + HFONT hFont = reinterpret_cast(value); + + // select the corresponding font + // into the device context + HFONT HOldFont = static_cast( + SelectObject(lpdis->hDC, hFont) + ); + + // render the text transparently + SetBkMode(lpdis->hDC, TRANSPARENT); + + // render the text + RECT RText = lpdis->rcItem; + InflateRect(&RText, -2, -2); + DrawText(lpdis->hDC, text, strlen(text), &RText, + DT_LEFT | DT_VCENTER | DT_SINGLELINE); + + // restore the previous font + SelectObject(lpdis->hDC, HOldFont); + } + + // render the focus rectangle + if (lpdis->itemState & ODS_FOCUS) + { + DrawFocusRect(lpdis->hDC, &lpdis->rcItem); + } + + // restore the previous color/mode + SetTextColor(lpdis->hDC, OldColor); + SetBkMode(lpdis->hDC, OPAQUE); + + return TRUE; + } + break; + } + case WM_DESTROY: + { + // delete each created font object + int count = SNDMSG(hListBox, LB_GETCOUNT, 0, 0); + for (int index = 0; index < count; ++index) + { + DWORD value = SNDMSG(hListBox, LB_GETITEMDATA, index, 0); + DeleteObject(reinterpret_cast(value)); + } + + PostQuitMessage(0); + break; + } + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} +//------------------------------------------------------------------------- + + + diff --git a/rosapps/tests/enumfonts/makefile b/rosapps/tests/enumfonts/makefile new file mode 100644 index 00000000000..2d8115c83e3 --- /dev/null +++ b/rosapps/tests/enumfonts/makefile @@ -0,0 +1,24 @@ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = enumfonts + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_GCCLIBS = stdc++ + +TARGET_CPPFLAGS = -Wall -Werror -D__USE_W32API -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -fexceptions -Wall -I. + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/enumwnd/.cvsignore b/rosapps/tests/enumwnd/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/enumwnd/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/enumwnd/enumwnd.c b/rosapps/tests/enumwnd/enumwnd.c new file mode 100644 index 00000000000..c5b60ef6a03 --- /dev/null +++ b/rosapps/tests/enumwnd/enumwnd.c @@ -0,0 +1,187 @@ +/* + * enumwnd.c + * + * application to test the various Window Enumeration functions + */ + +//#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +HBRUSH hbrBackground; +HFONT tf; +int test = 0; +const TCHAR* APP_NAME = "EnumWnd Test"; +const TCHAR* CLASS_NAME = "EnumWndTestClass"; + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + wc.lpszClassName = CLASS_NAME; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + _ftprintf ( stderr, _T("RegisterClass failed (last error 0x%lX)\n"), + GetLastError()); + return(1); + } + + hWnd = CreateWindow(CLASS_NAME, + APP_NAME, + WS_OVERLAPPEDWINDOW, + 0, + 0, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + _ftprintf ( stderr, _T("CreateWindow failed (last error 0x%lX)\n"), + GetLastError()); + return(1); + } + + tf = CreateFont (14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, _T("Timmons")); + + hbrBackground = CreateSolidBrush ( RGB(192,192,192) ); + + ShowWindow ( hWnd, nCmdShow ); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + DeleteObject(hbrBackground); + + DeleteObject(tf); + + return msg.wParam; +} + +void MyTextOut ( HDC hdc, int x, int y, const TCHAR* text ) +{ + TextOut ( hdc, x, y, text, _tcslen(text) ); +} + +typedef struct _EnumData +{ + HDC hdc; + int x; + int y; +} EnumData; + +BOOL CALLBACK MyWindowEnumProc ( HWND hwnd, LPARAM lParam ) +{ + TCHAR wndcaption[1024], buf[1024]; + EnumData* ped = (EnumData*)lParam; + GetWindowText ( hwnd, wndcaption, sizeof(wndcaption)/sizeof(*wndcaption) ); + _sntprintf ( buf, sizeof(buf)/sizeof(*buf), _T("%x - %s"), hwnd, wndcaption ); + MyTextOut ( ped->hdc, ped->x, ped->y, buf ); + ped->y += 13; + return TRUE; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC hDC; + RECT rect; + TCHAR buf[100]; + EnumData ed; + + switch(msg) + { + case WM_PAINT: + hDC = BeginPaint(hWnd, &ps); + SelectObject(hDC, tf); + + GetClientRect ( hWnd, &rect ); + FillRect ( hDC, &rect, hbrBackground ); + + MyTextOut ( hDC, 10, 10, "EnumWnd Test" ); + + _sntprintf ( buf, sizeof(buf)/sizeof(*buf), _T("My HWND: %x"), hWnd ); + MyTextOut ( hDC, 10, 30, buf ); + + ed.hdc = hDC; + ed.x = 10; + ed.y = 70; + + switch ( test ) + { + case 1: + MyTextOut ( hDC, 10, 50, _T("Test #1: EnumWindows()") ); + EnumWindows ( MyWindowEnumProc, (LPARAM)&ed ); + break; + case 2: + MyTextOut ( hDC, 10, 50, _T("Test #2: EnumChildWindows()") ); + EnumChildWindows ( hWnd, MyWindowEnumProc, (LPARAM)&ed ); + break; + case 3: + MyTextOut ( hDC, 10, 50, _T("Test #3: EnumDesktopWindows") ); + EnumDesktopWindows ( NULL, MyWindowEnumProc, (LPARAM)&ed ); + break; + case 4: + MyTextOut ( hDC, 10, 50, _T("Test #4: EnumThreadWindows") ); + EnumThreadWindows ( GetCurrentThreadId(), MyWindowEnumProc, (LPARAM)&ed ); + break; + default: + MyTextOut ( hDC, 10, 50, _T("Press any of the number keys from 1 to 4 to run a test") ); + MyTextOut ( hDC, 10, 70, _T("Press the left and right mouse buttons to cycle through the tests") ); + break; + } + + EndPaint(hWnd, &ps); + break; + + case WM_CHAR: + test = (TCHAR)wParam - '1' + 1; + RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE ); + break; + + case WM_LBUTTONDOWN: + if ( ++test > 4 ) + test = 1; + RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE ); + break; + + case WM_RBUTTONDOWN: + if ( !--test ) + test = 4; + RedrawWindow ( hWnd, NULL, NULL, RDW_INVALIDATE ); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/enumwnd/enumwnd.dsp b/rosapps/tests/enumwnd/enumwnd.dsp new file mode 100644 index 00000000000..b18de899a0c --- /dev/null +++ b/rosapps/tests/enumwnd/enumwnd.dsp @@ -0,0 +1,90 @@ +# Microsoft Developer Studio Project File - Name="enumwnd" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=enumwnd - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "enumwnd.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "enumwnd.mak" CFG="enumwnd - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "enumwnd - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "enumwnd - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "enumwnd - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "enumwnd - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /debug /machine:I386 /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "enumwnd - Win32 Release" +# Name "enumwnd - Win32 Debug" +# Begin Source File + +SOURCE=.\enumwnd.c +# End Source File +# End Target +# End Project diff --git a/rosapps/tests/enumwnd/makefile b/rosapps/tests/enumwnd/makefile new file mode 100644 index 00000000000..549eeea4bbf --- /dev/null +++ b/rosapps/tests/enumwnd/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:01 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = enumwnd + +TARGET_SDKLIBS = kernel32.a gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/enumws/.cvsignore b/rosapps/tests/enumws/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/enumws/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/enumws/enumws.c b/rosapps/tests/enumws/enumws.c new file mode 100644 index 00000000000..93d5a216bb2 --- /dev/null +++ b/rosapps/tests/enumws/enumws.c @@ -0,0 +1,35 @@ +#include +#include + +BOOL CALLBACK +EnumDesktopProc(LPWSTR lpszWindowStation, LPARAM lParam) +{ + printf("\t%S\n", lpszWindowStation); + + return TRUE; +} + +BOOL CALLBACK +EnumWindowStationProc(LPWSTR lpszWindowStation, LPARAM lParam) +{ + HWINSTA hWinSta; + + printf("%S\n", lpszWindowStation); + hWinSta = OpenWindowStationW(lpszWindowStation, FALSE, + WINSTA_ENUMDESKTOPS); + if (hWinSta == NULL) + { + printf("\tCan't open window station.\n"); + return TRUE; + } + EnumDesktopsW(hWinSta, EnumDesktopProc, 0xdede); + + return TRUE; +} + +int main() +{ + EnumWindowStationsW(EnumWindowStationProc, 0xbadbed); + + return 0; +} diff --git a/rosapps/tests/enumws/makefile b/rosapps/tests/enumws/makefile new file mode 100644 index 00000000000..782f6639808 --- /dev/null +++ b/rosapps/tests/enumws/makefile @@ -0,0 +1,21 @@ +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = enumws + +TARGET_SDKLIBS = user32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/event/.cvsignore b/rosapps/tests/event/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/event/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/event/event.c b/rosapps/tests/event/event.c new file mode 100644 index 00000000000..9942bea0745 --- /dev/null +++ b/rosapps/tests/event/event.c @@ -0,0 +1,33 @@ +#include +#include + +HANDLE events[2]; + +DWORD WINAPI thread( LPVOID crap ) +{ + SetEvent( events[0] ); + if( crap ) + SetEvent( events[1] ); + return 1; +} + +int main( void ) +{ + DWORD id, Status; + printf( "Creating events\n" ); + events[0] = CreateEvent( 0, TRUE, FALSE, 0 ); + events[1] = CreateEvent( 0, TRUE, FALSE, 0 ); + printf( "Created events\n" ); + CreateThread( 0, 0, thread, 0, 0, &id ); + printf( "WaitForSingleObject %s\n", ( WaitForSingleObject( events[0], INFINITE ) == WAIT_OBJECT_0 ? "worked" : "failed" ) ); + ResetEvent( events[0] ); + CreateThread( 0, 0, thread, 0, 0, &id ); + printf( "WaitForMultipleObjects with waitall = FALSE %s\n", ( WaitForMultipleObjects( 2, events, FALSE, INFINITE ) == WAIT_OBJECT_0 ? "worked" : "failed" ) ); + ResetEvent( events[0] ); + CreateThread( 0, 0, thread, (void *)1, 0, &id ); + Status = WaitForMultipleObjects( 2, events, TRUE, INFINITE ); + printf( "WaitForMultipleObjects with waitall = TRUE %s\n", ( Status == WAIT_OBJECT_0 || Status == WAIT_OBJECT_0 + 1 ? "worked" : "failed" ) ); + ResetEvent( events[0] ); + printf( "WaitForSingleObject with timeout %s\n", ( WaitForSingleObject( events[0], 100 ) == WAIT_TIMEOUT ? "worked" : "failed" ) ); + return 0; +} diff --git a/rosapps/tests/event/makefile b/rosapps/tests/event/makefile new file mode 100644 index 00000000000..b587ac1705c --- /dev/null +++ b/rosapps/tests/event/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:01 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = event + +TARGET_SDKLIBS = kernel32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/eventpair/.cvsignore b/rosapps/tests/eventpair/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/eventpair/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/eventpair/eventpair.c b/rosapps/tests/eventpair/eventpair.c new file mode 100644 index 00000000000..f20a725a7f9 --- /dev/null +++ b/rosapps/tests/eventpair/eventpair.c @@ -0,0 +1,65 @@ +/* + * Author: Skywing (skywing@valhallalegends.com) + * Date: 09/09/2003 + * Purpose: Test Thread-EventPair functionality. + */ + +#include +#include +#include + +#ifndef NTAPI +#define NTAPI WINAPI +#endif + +HANDLE MakeEventPair() +{ + NTSTATUS Status; + HANDLE EventPair; + OBJECT_ATTRIBUTES Attributes; + + InitializeObjectAttributes(&Attributes, NULL, 0, NULL, NULL); + Status = NtCreateEventPair(&EventPair, STANDARD_RIGHTS_ALL, &Attributes); + printf("Status %08lx creating eventpair\n", Status); + return EventPair; +} + +DWORD __stdcall threadfunc(void* eventpair) +{ + printf("Thread: Set eventpair status %08lx\n", NtSetInformationThread(NtCurrentThread(), ThreadEventPair, &eventpair, sizeof(HANDLE))); + Sleep(2500); + + printf("Thread: Setting low and waiting high...\n"); + printf("Thread: status = %08lx\n", NtSetLowWaitHighThread()); + printf("Thread: status = %08lx\n", NtSetHighWaitLowThread()); + printf("Thread: Terminating...\n"); + return 0; +} + +int main(int ac, char **av) +{ + DWORD id; + HANDLE EventPair, Thread; + + printf("Main: NtSetLowWaitHighThread is at %08lx\n", NtSetLowWaitHighThread()); + + EventPair = MakeEventPair(); + + if(!EventPair) { + printf("Main: Could not create event pair.\n"); + return 0; + } + + printf("Main: EventPair = %08lx\n", (DWORD)EventPair); + Thread = CreateThread(0, 0, threadfunc, EventPair, 0, &id); + printf("Main: ThreadId for new thread is %08lx\n", id); + printf("Main: Setting high and waiting low\n"); + printf("Main: status = %08lx\n", NtSetHighWaitLowEventPair(EventPair)); + Sleep(2500); + printf("Main: status = %08lx\n", NtSetLowWaitHighEventPair(EventPair)); + NtClose(EventPair); + /* WaitForSingleObject(Thread, INFINITE); FIXME: Waiting on thread handle causes double spinlock acquisition (and subsequent crash) in PsUnblockThread - ntoskrnl/ps/thread.c */ + NtClose(Thread); + printf("Main: Terminating...\n"); + return 0; +} diff --git a/rosapps/tests/eventpair/makefile b/rosapps/tests/eventpair/makefile new file mode 100644 index 00000000000..8962a901c1d --- /dev/null +++ b/rosapps/tests/eventpair/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:01 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = eventpair + +TARGET_SDKLIBS = ntdll.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/fiber/.cvsignore b/rosapps/tests/fiber/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/fiber/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/fiber/Makefile b/rosapps/tests/fiber/Makefile new file mode 100644 index 00000000000..18482b5e31e --- /dev/null +++ b/rosapps/tests/fiber/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:12:02 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = fiber + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror -D__USE_W32API + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/fiber/fiber.c b/rosapps/tests/fiber/fiber.c new file mode 100644 index 00000000000..2c0aefc1772 --- /dev/null +++ b/rosapps/tests/fiber/fiber.c @@ -0,0 +1,446 @@ +/* $Id: fiber.c,v 1.1 2004/10/21 05:12:02 sedwards Exp $ +*/ + +#include +#include +#include +#include +#include + +#include +#include + +#ifndef InitializeListHead +#define InitializeListHead(PLH__) ((PLH__)->Flink = (PLH__)->Blink = (PLH__)) +#endif + +#ifndef IsListEmpty +#define IsListEmpty(PLH__) ((PLH__)->Flink == (PVOID)(PLH__)) +#endif + +#ifndef RemoveEntryList + +#define RemoveEntryList(PLE__) \ +{ \ + PLIST_ENTRY pleBack__ = (PLIST_ENTRY)((PLE__)->Blink); \ + PLIST_ENTRY pleForward__ = (PLIST_ENTRY)((PLE__)->Flink); \ + \ + pleBack__->Flink = pleForward__; \ + pleForward__->Blink = pleBack__; \ +} + +#endif + +#ifndef InsertTailList + +#define InsertTailList(PLH__, PLE__) \ +{ \ + PLIST_ENTRY pleListHead__ = (PLH__); \ + PLIST_ENTRY pleBlink__ = (PLIST_ENTRY)((PLH__)->Blink); \ + \ + (PLE__)->Flink = pleListHead__; \ + (PLE__)->Blink = pleBlink__; \ + pleBlink__->Flink = (PLE__); \ + pleListHead__->Blink = (PLE__); \ +} + +#endif + +#ifndef RemoveHeadList + +#define RemoveHeadList(PLH__) \ + (PLIST_ENTRY)((PLH__)->Flink); \ + RemoveEntryList((PLIST_ENTRY)((PLH__)->Flink)); + +#endif + +#define FIBERTEST_COUNT 500 + +struct FiberData +{ + unsigned nMagic; + unsigned nId; + unsigned nPrio; + unsigned nRealPrio; + PVOID pFiber; + LIST_ENTRY leQueue; + int nQuantumQueued; + int nBoost; + struct FiberData * pfdPrev; + int bExitPrev; +}; + +static LIST_ENTRY a_leQueues[32]; +static unsigned nQuantum = 0; +static struct FiberData * pfdLastStarveScan = NULL; + +void Fbt_Create(int); +void Fbt_Exit(void); +void Fbt_Yield(void); + +struct FiberData * Fbt_GetCurrent(void); +unsigned Fbt_GetCurrentId(void); +VOID CALLBACK Fbt_Startup(PVOID); +void Fbt_Dispatch(struct FiberData *, int); +void Fbt_AfterSwitch(struct FiberData *); + +void DoStuff(void); + +struct FiberData * Fbt_GetCurrent(VOID) +{ + return GetFiberData(); +} + +unsigned Fbt_GetCurrentId(VOID) +{ + return Fbt_GetCurrent()->nId; +} + +void Fbt_Yield(VOID) +{ + struct FiberData * pfdCur; + + pfdCur = Fbt_GetCurrent(); + + if(pfdCur->nBoost) + { + -- pfdCur->nBoost; + + if(!pfdCur->nBoost) + pfdCur->nPrio = pfdCur->nRealPrio; + } + else if((rand() % 100) > 50 - (45 * pfdCur->nPrio) / 32) + Fbt_Dispatch(pfdCur, 0); +} + +void Fbt_AfterSwitch(struct FiberData * pfdCur) +{ + struct FiberData * pfdPrev; + + pfdPrev = pfdCur->pfdPrev; + + /* The previous fiber left some homework for us */ + if(pfdPrev) + { + /* Kill the predecessor */ + if(pfdCur->bExitPrev) + { + if(pfdLastStarveScan == pfdPrev) + pfdLastStarveScan = 0; + + DeleteFiber(pfdPrev->pFiber); + free(pfdPrev); + } + /* Enqueue the previous fiber in the correct ready queue */ + else + { + /* Remember the quantum in which the previous fiber was queued */ + pfdPrev->nQuantumQueued = nQuantum; + + /* Disable the anti-starvation boost */ + if(pfdPrev->nBoost) + { + pfdPrev->nBoost = 0; + pfdPrev->nPrio = pfdPrev->nRealPrio; + } + + /* Enqueue the previous fiber */ + InsertTailList + ( + &a_leQueues[pfdPrev->nPrio], + &pfdPrev->leQueue + ); + } + } +} + +VOID CALLBACK Fbt_Startup(PVOID pParam) +{ + assert(pParam == GetFiberData()); + Fbt_AfterSwitch(pParam); + DoStuff(); + Fbt_Exit(); +} + +void Fbt_Dispatch(struct FiberData * pfdCur, int bExit) +{ + UCHAR i; + UCHAR n; + struct FiberData * pfdNext; + + assert(pfdCur == GetFiberData()); + + ++ nQuantum; + + /* Every ten quantums check for starving threads */ + /* FIXME: this implementation of starvation prevention isn't that great */ + if(nQuantum % 10 == 0) + { + int j; + int k; + int b; + int bResume; + PLIST_ENTRY ple = NULL; + + bResume = 0; + i = 0; + + /* Pick up from where we left last time */ + if(pfdLastStarveScan) + { + unsigned nPrio; + + nPrio = pfdLastStarveScan->nPrio; + + /* The last fiber we scanned for starvation isn't queued anymore */ + if(IsListEmpty(&pfdLastStarveScan->leQueue)) + /* Scan the ready queue for its priority */ + i = nPrio; + /* Last fiber for its priority level */ + else if(pfdLastStarveScan->leQueue.Flink == &a_leQueues[nPrio]) + /* Scan the ready queue for the next priority level */ + i = nPrio + 1; + /* Scan the next fiber in the ready queue */ + else + { + i = nPrio; + ple = pfdLastStarveScan->leQueue.Flink; + bResume = 1; + } + + /* Priority levels 15-31 are never checked for starvation */ + if(i >= 15) + { + if(bResume) + bResume = 0; + + i = 0; + } + } + + /* + Scan at most 16 threads, in the priority range 0-14, applying in total at + most 10 boosts. This loop scales O(1) + */ + for(j = 0, k = 0, b = 0; j < 16 && k < 15 && b < 10; ++ j) + { + unsigned nDiff; + + /* No previous state to resume from */ + if(!bResume) + { + int nQueue; + + /* Get the first element in the current queue */ + nQueue = (k + i) % 15; + + if(IsListEmpty(&a_leQueues[nQueue])) + { + ++ k; + continue; + } + + ple = (PLIST_ENTRY)a_leQueues[nQueue].Flink; + } + else + bResume = 0; + + /* Get the current fiber */ + pfdLastStarveScan = CONTAINING_RECORD(ple, struct FiberData, leQueue); + assert(pfdLastStarveScan->nMagic == 0x12345678); + assert(pfdLastStarveScan != pfdCur); + + /* Calculate the number of quantums the fiber has been in the queue */ + if(nQuantum > pfdLastStarveScan->nQuantumQueued) + nDiff = nQuantum - pfdLastStarveScan->nQuantumQueued; + else + nDiff = UINT_MAX - pfdLastStarveScan->nQuantumQueued + nQuantum; + + /* The fiber has been ready for more than 30 quantums: it's starving */ + if(nDiff > 30) + { + /* Plus one boost applied */ + ++ b; + + /* Apply the boost */ + pfdLastStarveScan->nBoost = 1; + pfdLastStarveScan->nRealPrio = pfdLastStarveScan->nPrio; + pfdLastStarveScan->nPrio = 15; + + /* Re-enqueue the fiber in the correct priority queue */ + RemoveEntryList(&pfdLastStarveScan->leQueue); + InsertTailList(&a_leQueues[15], &pfdLastStarveScan->leQueue); + } + } + } + + pfdNext = NULL; + + /* This fiber is going to die: scan all ready queues */ + if(bExit) + n = 1; + /* + Scan only ready queues for priorities greater than or equal to the priority of + the current thread (round-robin) + */ + else + n = pfdCur->nPrio + 1; + + /* This loop scales O(1) */ + for(i = 32; i >= n; -- i) + { + PLIST_ENTRY pleNext; + + /* No fiber ready for this priority level */ + if(IsListEmpty(&a_leQueues[i - 1])) + continue; + + /* Get the next ready fiber */ + pleNext = RemoveHeadList(&a_leQueues[i - 1]); + InitializeListHead(pleNext); + pfdNext = CONTAINING_RECORD(pleNext, struct FiberData, leQueue); + assert(pfdNext->pFiber != GetCurrentFiber()); + assert(pfdNext->nMagic == 0x12345678); + break; + } + + /* Next fiber chosen */ + if(pfdNext) + { + /* Give some homework to the next fiber */ + pfdNext->pfdPrev = pfdCur; + pfdNext->bExitPrev = bExit; + + /* Switch to the next fiber */ + SwitchToFiber(pfdNext->pFiber); + + /* Complete the switch back to this fiber */ + Fbt_AfterSwitch(pfdCur); + } + /* No next fiber, and current fiber exiting */ + else if(bExit) + { + PVOID pCurFiber; + + /* Delete the current fiber. This kills the thread and stops the simulation */ + if(pfdLastStarveScan == pfdCur) + pfdLastStarveScan = NULL; + + pCurFiber = pfdCur->pFiber; + free(pfdCur); + DeleteFiber(pCurFiber); + } + /* No next fiber: continue running the current one */ +} + +void Fbt_Exit(VOID) +{ + Fbt_Dispatch(GetFiberData(), 1); +} + +void Fbt_CreateFiber(int bInitial) +{ + PVOID pFiber; + struct FiberData * pData; + static int s_bFiberPrioSeeded = 0; + static LONG s_nFiberIdSeed = 0; + + pData = malloc(sizeof(struct FiberData)); + + assert(pData); + + if(bInitial) + pFiber = ConvertThreadToFiber(pData); + else + pFiber = CreateFiber(0, Fbt_Startup, pData); + + if(!s_bFiberPrioSeeded) + { + unsigned nFiberPrioSeed; + time_t tCurTime; + + tCurTime = time(NULL); + memcpy(&nFiberPrioSeed, &tCurTime, sizeof(nFiberPrioSeed)); + srand(nFiberPrioSeed); + s_bFiberPrioSeeded = 1; + } + + assert(pFiber); + + pData->nMagic = 0x12345678; + pData->nId = InterlockedIncrement(&s_nFiberIdSeed); + pData->nPrio = rand() % 32; + pData->pFiber = pFiber; + pData->nQuantumQueued = 0; + pData->nBoost = 0; + pData->nRealPrio = pData->nPrio; + pData->pfdPrev = NULL; + pData->bExitPrev = 0; + + if(bInitial) + { + InitializeListHead(&pData->leQueue); + } + else + { + InsertTailList + ( + &a_leQueues[pData->nPrio], + &pData->leQueue + ); + } +} + +void DoStuff(void) +{ + unsigned i; + unsigned n; + unsigned nId; + + n = rand() % 1000; + nId = Fbt_GetCurrentId(); + + _ftprintf(stderr, _T("[%u] BEGIN\n"), nId); + + for(i = 0; i < n; ++ i) + { + unsigned j; + unsigned m; + + _ftprintf(stderr, _T("[%u] [%u/%u]\n"), nId, i + 1, n); + + m = rand() % 1000; + + for(j = 0; j < m; ++ j) + Sleep(0); + + Fbt_Yield(); + } + + _ftprintf(stderr, _T("[%u] END\n"), nId); +} + +int _tmain(int argc, _TCHAR const * const * argv) +{ + unsigned i; + unsigned nFibers; + + if(argc > 1) + nFibers = _tcstoul(argv[1], NULL, 0); + else + nFibers = FIBERTEST_COUNT; + + for(i = 0; i < 32; ++ i) + { + InitializeListHead(&a_leQueues[i]); + } + + for(i = 0; i < nFibers; ++ i) + Fbt_CreateFiber(i == 0); + + Fbt_Startup(GetFiberData()); + + return 0; +} + +/* EOF */ diff --git a/rosapps/tests/global_mem/.cvsignore b/rosapps/tests/global_mem/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/global_mem/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/global_mem/Makefile b/rosapps/tests/global_mem/Makefile new file mode 100644 index 00000000000..09e3d081cbc --- /dev/null +++ b/rosapps/tests/global_mem/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/10/21 05:12:02 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = global_mem + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/global_mem/global_mem.c b/rosapps/tests/global_mem/global_mem.c new file mode 100644 index 00000000000..b9cb7149871 --- /dev/null +++ b/rosapps/tests/global_mem/global_mem.c @@ -0,0 +1,1062 @@ +/* File: global_mem.c +** +** This program is a test application used for testing correctness of the +** GlobalXXX memory API implementation. +** +** Programmer: Mark Tempel +*/ +#include +#include +#include + +/* +** All output is line wrapped to fit a 80 column screen. +** these defines control that formatting. To shrink the +** screen columns, just change the DISPLAY_COMUMNS macro. +*/ +#define DISPLAY_COLUMNS 78 +#define LINE_BUFFER_SIZE DISPLAY_COLUMNS + 2 + +/* +** This define controls the size of a memory allocation request. +** For this test suite to really be comprehensive, we should +** probably be testing many different block sizes. +*/ +#define MEM_BLOCK_SIZE 0x80000 + +/* +** This enumeration is really the return value for the program. +** All test return a TestStatus and test statuses can be combined +** with the relation TEST_CombineStatus. +*/ +typedef enum TestStatus +{ + FAILED = 0, + PASSED = 1, + SKIPPED = -1 +} TEST_STATUS; + +/*--------------------------------------------------------------------------- +** This is a relation used to combine two test statuses. +** The combine rules are as follows: +** FAIL & Anything == FAIL +** SKIPPED & Anything == Anything +** +*/ +TEST_STATUS TEST_CombineStatus(TEST_STATUS a, TEST_STATUS b) +{ + TEST_STATUS result = a; + + switch (a) + { + case PASSED: result = (PASSED == b || SKIPPED == b) ? (PASSED) : (FAILED); break; + case FAILED: result = FAILED; break; + case SKIPPED: result = b; break; + } + + return result; +} + +/*--------------------------------------------------------------------------- +** This outputs the banner border lines. +*/ +void OUTPUT_BannerLine() +{ + int c = 0; + printf("+"); + for (c = 1; c < DISPLAY_COLUMNS; c++) + { + printf("-"); + } + printf("\n"); +} + + +/*--------------------------------------------------------------------------- +** This method prints a line that has a | on the left, and is line wrapped +** to be no more that DISPLAY_COLUMNS +2 wide. +*/ +void OUTPUT_Line(const char *szLine) +{ + int spaceIndex = 0; + char output[LINE_BUFFER_SIZE]; + + memset(output, 0, DISPLAY_COLUMNS + 2); + + /*If this line is longer than DISPLAY_COLUMNS, + * break it at the first space. + */ + if (DISPLAY_COLUMNS - 2 < strlen(szLine)) + { + for (spaceIndex = DISPLAY_COLUMNS / 2; spaceIndex < DISPLAY_COLUMNS - 2; spaceIndex++) + { + if (' ' == szLine[spaceIndex]) + { + break; + } + } + + memcpy(output + 2, szLine, spaceIndex + 1); + output[0] = '|'; + output[1] = ' '; + output[strlen(output)] = '\n'; + printf(output); + + OUTPUT_Line(szLine + spaceIndex + 1); + } + else + { + sprintf(output,"| %s\n", szLine); + printf(output); + } + +} + +/*--------------------------------------------------------------------------- +** +*/ +void OUTPUT_Banner(const char *szBanner) +{ + OUTPUT_BannerLine(); + OUTPUT_Line(szBanner); + OUTPUT_BannerLine(); +} + +/*--------------------------------------------------------------------------- +** +*/ +void OUTPUT_Result(TEST_STATUS status) +{ + switch (status) + { + case PASSED: OUTPUT_Line("==> PASSED"); break; + case FAILED: OUTPUT_Line("*** FAILED"); break; + case SKIPPED: OUTPUT_Line("==> SKIPPED"); break; + } + OUTPUT_Line(""); +} + +/*--------------------------------------------------------------------------- +** +*/ +void OUTPUT_HexDword(DWORD dw) +{ + char buffer[32]; + sprintf(buffer, "0x%lX",dw); + OUTPUT_Line(buffer); +} + +/*--------------------------------------------------------------------------- +** +*/ +void OutputAllocFlags(UINT pFlags) +{ + if (pFlags & GMEM_MOVEABLE) + { + OUTPUT_Line("Movable Memory"); + } + else + { + OUTPUT_Line("Fixed Memory"); + } + + if (pFlags & GMEM_ZEROINIT) + { + OUTPUT_Line("Zero Initialized Memory"); + } +} + +/*--------------------------------------------------------------------------- +** +*/ +void OutputErrorCode() +{ + char buffer[256]; + + sprintf(buffer,"GetLastError() returned %lu", GetLastError()); + + OUTPUT_Line(buffer); +} +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TEST_MemoryWrite(LPVOID mem, DWORD cbSize) +{ + TEST_STATUS result = FAILED; + + if (0 == IsBadWritePtr(mem, cbSize)) + { + result = PASSED; + } + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TEST_MemoryRead(LPVOID mem, DWORD cbSize) +{ + TEST_STATUS result = FAILED; + + if (0 == IsBadReadPtr(mem, cbSize)) + { + result = PASSED; + } + return result; +} + +/*--------------------------------------------------------------------------- +** This method tests to see if a block of global memory is movable +** by seeing if the value returned from GlobalLock is different from +** the passed in value. +*/ +int IsMovable(HGLOBAL hMem) +{ + LPVOID pMem = 0; + int rc = 0; + + pMem = GlobalLock(hMem); + if (pMem != hMem) + { + rc = 1; + } + GlobalUnlock(hMem); + + return rc; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalAllocNFree(UINT allocFlags) +{ + TEST_STATUS status = SKIPPED; + HGLOBAL hTest = 0; + OUTPUT_Banner("Testing the GlobalAlloc and GlobalFree calls"); + OUTPUT_Line("Allocate a buffer"); + + OutputAllocFlags(allocFlags); + + status = FAILED; + hTest = GlobalAlloc(allocFlags, MEM_BLOCK_SIZE); + if (0 != hTest) + { + if (0 == GlobalFree(hTest)); + { + status = PASSED; + } + } + + OUTPUT_Line("Result for this run:"); + OUTPUT_Result(status); + OUTPUT_Line(""); + + return status; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalLockNUnlock(UINT allocFlags) +{ + HGLOBAL hMem = 0; + LPVOID pMem = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = FAILED; + + OUTPUT_Banner("Testing the GlobalLock/Unlock functions."); + OutputAllocFlags(allocFlags); + OUTPUT_Line(""); + + hMem = GlobalAlloc(allocFlags, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Allocated a memory block"); + + OUTPUT_Line("Testing Lock"); + pMem = GlobalLock(hMem); + if (0 != pMem) + { + OUTPUT_Result(PASSED); + + OUTPUT_Line("Testing memory for read."); + subtest = TEST_MemoryRead(pMem, MEM_BLOCK_SIZE); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(PASSED, subtest); + + + OUTPUT_Line("Testing memory for write."); + subtest = TEST_MemoryRead(pMem, MEM_BLOCK_SIZE); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + + OUTPUT_Line("Unlocking memory"); + if (GlobalUnlock(hMem)) + { + OUTPUT_Result(PASSED); + result = TEST_CombineStatus(result, PASSED); + } + else + { + if (NO_ERROR == GetLastError()) + { + OUTPUT_Result(PASSED); + result = TEST_CombineStatus(result, PASSED); + } + else + { + OutputErrorCode(); + OUTPUT_Result(FAILED); + result = TEST_CombineStatus(result, FAILED); + } + } + } + + OUTPUT_Line("Freeing memory"); + if (0 == GlobalFree(hMem)) + { + OUTPUT_Result(PASSED); + result = TEST_CombineStatus(result, PASSED); + } + else + { + OutputErrorCode(); + OUTPUT_Result(FAILED); + result = TEST_CombineStatus(result, FAILED); + } + } + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalReAllocFixed() +{ + HGLOBAL hMem = 0; + HGLOBAL hReAlloced = 0; + LPVOID pMem = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = SKIPPED; + + OUTPUT_Line("Testing GlobalReAlloc() on memory allocated as GMEM_FIXED"); + + /* Case 1: convert a fixed block to a movable block. */ + OUTPUT_Line("Allocating buffer"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Testing to see if this is converted into a movable block"); + hReAlloced = GlobalReAlloc(hMem, MEM_BLOCK_SIZE + 100, GMEM_MOVEABLE | GMEM_MODIFY); + if (0 == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc failed-- returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + hMem = hReAlloced; + if (0 == IsMovable(hMem)) + { + OUTPUT_Line("GlobalReAlloc returned a fixed pointer."); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + pMem = GlobalLock(hMem); + subtest = TEST_CombineStatus(subtest, PASSED); + subtest = TEST_CombineStatus(subtest, TEST_MemoryRead(pMem, MEM_BLOCK_SIZE + 100)); + if (FAILED == subtest) + { + OUTPUT_Line("Memory Read failed."); + } + subtest = TEST_CombineStatus(subtest, TEST_MemoryWrite(pMem, MEM_BLOCK_SIZE + 100)); + if (FAILED == subtest) + { + OUTPUT_Line("Memory Write failed."); + } + GlobalUnlock(hMem); + } + } + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("Global Alloc Failed."); + subtest = TEST_CombineStatus(subtest, FAILED); + } + OUTPUT_Line("Subtest result:"); + OUTPUT_Result(subtest); + OUTPUT_Line(""); + + result = TEST_CombineStatus(result, subtest); + subtest = SKIPPED; + + /* case 2 only move a fixed block */ + OUTPUT_Line("Allocating buffer"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Testing to see if a new fixed block is returned."); + hReAlloced = GlobalReAlloc(hMem, MEM_BLOCK_SIZE - 100, GMEM_MOVEABLE); + if (0 == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc failed-- returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + OUTPUT_Line("Alloced Handle: "); + OUTPUT_HexDword((DWORD)hMem); + OUTPUT_Line("ReAlloced Handle: "); + OUTPUT_HexDword((DWORD)hReAlloced); + if (hMem == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc returned the same pointer. The documentation states that this is wrong, but Windows NT works this way."); + } + + hMem = hReAlloced; + subtest = TEST_CombineStatus(subtest, PASSED); + subtest = TEST_CombineStatus(subtest, TEST_MemoryRead((LPVOID)hMem, MEM_BLOCK_SIZE - 100)); + subtest = TEST_CombineStatus(subtest, TEST_MemoryWrite((LPVOID)hMem, MEM_BLOCK_SIZE - 100)); + } + + GlobalFree(hMem); + } + else + { + subtest = TEST_CombineStatus(subtest, FAILED); + } + OUTPUT_Line("Subtest result:"); + OUTPUT_Result(subtest); + OUTPUT_Line(""); + + result = TEST_CombineStatus(result, subtest); + subtest = SKIPPED; + + /* Case 3: re-allocate a fixed block in place */ + OUTPUT_Line("Allocating buffer"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Testing to see if a fixed pointer is reallocated in place."); + hReAlloced = GlobalReAlloc(hMem, MEM_BLOCK_SIZE - 100, 0); + if (0 == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc failed-- returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + OUTPUT_Line("Alloced Handle: "); + OUTPUT_HexDword((DWORD)hMem); + OUTPUT_Line("ReAlloced Handle: "); + OUTPUT_HexDword((DWORD)hReAlloced); + if (hMem != hReAlloced) + { + OUTPUT_Line("GlobalReAlloc returned a different."); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + subtest = TEST_CombineStatus(subtest, PASSED); + subtest = TEST_CombineStatus(subtest, TEST_MemoryRead((LPVOID)hMem, MEM_BLOCK_SIZE - 100)); + subtest = TEST_CombineStatus(subtest, TEST_MemoryWrite((LPVOID)hMem, MEM_BLOCK_SIZE - 100)); + } + } + + GlobalFree(hMem); + } + else + { + subtest = TEST_CombineStatus(subtest, FAILED); + } + OUTPUT_Line("Subtest result:"); + OUTPUT_Result(subtest); + OUTPUT_Line(""); + + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Line(""); + return result; +} +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalReAllocMovable() +{ + HGLOBAL hMem = 0; + HGLOBAL hReAlloced = 0; + LPVOID pMem = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = SKIPPED; + + OUTPUT_Line("Testing GlobalReAlloc() on memory allocated as GMGM_MOVEABLE"); + + /* case 1 test reallocing a movable block that is unlocked. */ + OUTPUT_Line("Allocating buffer"); + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Testing GlobalReAlloc on a unlocked block."); + hReAlloced = GlobalReAlloc(hMem, MEM_BLOCK_SIZE - 100, 0); + if (0 == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc failed-- returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + OUTPUT_Line("Alloced Handle: "); + OUTPUT_HexDword((DWORD)hMem); + OUTPUT_Line("ReAlloced Handle: "); + OUTPUT_HexDword((DWORD)hReAlloced); + + pMem = GlobalLock(hReAlloced); + hMem = hReAlloced; + subtest = TEST_CombineStatus(subtest, PASSED); + subtest = TEST_CombineStatus(subtest, TEST_MemoryRead(pMem, MEM_BLOCK_SIZE - 100)); + subtest = TEST_CombineStatus(subtest, TEST_MemoryWrite(pMem, MEM_BLOCK_SIZE - 100)); + GlobalUnlock(hReAlloced); + } + + GlobalFree(hMem); + } + else + { + subtest = TEST_CombineStatus(subtest, FAILED); + } + OUTPUT_Line("Subtest result:"); + OUTPUT_Result(subtest); + OUTPUT_Line(""); + + result = TEST_CombineStatus(result, subtest); + subtest = SKIPPED; + + /* Case 2: re-allocate a moveable block that is locked */ + OUTPUT_Line("Allocating buffer"); + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + + OUTPUT_Line("Testing GlobalReAlloc on a locked block."); + pMem = GlobalLock(hMem); + hReAlloced = GlobalReAlloc(hMem, MEM_BLOCK_SIZE - 100, 0); + if (0 == hReAlloced) + { + OUTPUT_Line("GlobalReAlloc failed-- returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + OUTPUT_Result(subtest); + } + else + { + OUTPUT_Line("Alloced Handle: "); + OUTPUT_HexDword((DWORD)hMem); + OUTPUT_Line("ReAlloced Handle: "); + OUTPUT_HexDword((DWORD)hReAlloced); + if (hMem != hReAlloced) + { + OUTPUT_Line("GlobalReAlloc returned a different block."); + } + pMem = GlobalLock(hReAlloced); + subtest = TEST_CombineStatus(subtest, PASSED); + subtest = TEST_CombineStatus(subtest, TEST_MemoryRead(pMem, MEM_BLOCK_SIZE - 100)); + subtest = TEST_CombineStatus(subtest, TEST_MemoryWrite(pMem , MEM_BLOCK_SIZE - 100)); + GlobalUnlock(hReAlloced); + + } + + GlobalUnlock(hMem); + + GlobalFree(hMem); + } + else + { + subtest = TEST_CombineStatus(subtest, FAILED); + } + OUTPUT_Line("Subtest result:"); + OUTPUT_Result(subtest); + OUTPUT_Line(""); + + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Line(""); + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalReAlloc() +{ + OUTPUT_Banner("Testing GlobalReAlloc()"); + TEST_STATUS result = SKIPPED; + + result = TEST_CombineStatus(result, TestGlobalReAllocFixed()); + result = TEST_CombineStatus(result, TestGlobalReAllocMovable()); + + OUTPUT_Line("GlobalReAlloc test result:"); + OUTPUT_Result(result); + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalFlagsMoveable() +{ + HGLOBAL hMem = 0; + UINT uFlags = 0; + TEST_STATUS result = SKIPPED; + + OUTPUT_Line("Test for the proper lock count"); + + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + + OUTPUT_Line("Testing initial allocation"); + + OUTPUT_Line("Testing for a lock of 0"); + uFlags = GlobalFlags(hMem); + if (((GMEM_LOCKCOUNT & uFlags) == 0)) /*no locks*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Result(result); + + OUTPUT_Line("Pointer from handle: "); + OUTPUT_HexDword((DWORD)GlobalLock(hMem)); + + OUTPUT_Line("Testing after a lock"); + OUTPUT_Line("Testing for a lock of 1"); + uFlags = GlobalFlags(hMem); + if (((GMEM_LOCKCOUNT & uFlags) == 1)) /*no locks*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Result(result); + + GlobalUnlock(hMem); + OUTPUT_Line("Testing after an unlock"); + OUTPUT_Line("Testing for a lock of 0"); + uFlags = GlobalFlags(hMem); + if (((GMEM_LOCKCOUNT & uFlags) == 0)) /*no locks*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Result(result); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + result = TEST_CombineStatus(result, FAILED); + } + + OUTPUT_Line("Test for discarded memory"); + OUTPUT_Line("Allocating an empty moveable block---automatically marked as discarded"); + hMem = GlobalAlloc(GMEM_MOVEABLE, 0); /*allocate a discarded block*/ + if (0 != hMem) + { + OUTPUT_Line("Allocation handle: "); + OUTPUT_HexDword((DWORD)hMem); + OUTPUT_Line("Testing for a discarded flag"); + uFlags = GlobalFlags(hMem); + if (0 != (uFlags & GMEM_DISCARDED)) /*discarded*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Line("Flags:"); + OUTPUT_HexDword(uFlags); + OUTPUT_Result(result); + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + result = TEST_CombineStatus(result, FAILED); + } + return result; +} + + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalFlagsFixed() +{ + HGLOBAL hMem = 0; + UINT uFlags = 0; + TEST_STATUS result = SKIPPED; + + OUTPUT_Line("Testing for correct handling of GMEM_FIXED memory"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + + OUTPUT_Line("Allocation handle: "); + OUTPUT_HexDword((DWORD)hMem); + + OUTPUT_Line("Testing initial allocation"); + OUTPUT_Line("Testing for non-discarded and lock of 0"); + uFlags = GlobalFlags(hMem); + if (((GMEM_LOCKCOUNT & uFlags) == 0) && /*no locks*/ + (((uFlags >> 8) & 0xff) == 0 )) /*not discarded*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Result(result); + + OUTPUT_Line("Pointer from handle: "); + OUTPUT_HexDword((DWORD)GlobalLock(hMem)); + OUTPUT_Line("Testing after a lock"); + OUTPUT_Line("Testing for non-discarded and lock of 0"); + uFlags = GlobalFlags(hMem); + if (((GMEM_LOCKCOUNT & uFlags) == 0) && /*no locks*/ + (((uFlags >> 8) & 0xff) == 0 )) /*not discarded*/ + { + result = TEST_CombineStatus(result, PASSED); + } + else + { + result = TEST_CombineStatus(result, FAILED); + } + OUTPUT_Result(result); + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + result = TEST_CombineStatus(result, FAILED); + } + + return result; +} +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalFlags() +{ + OUTPUT_Banner("Testing GlobalFlags()"); + TEST_STATUS result = SKIPPED; + + result = TEST_CombineStatus(result, TestGlobalFlagsFixed()); + result = TEST_CombineStatus(result, TestGlobalFlagsMoveable()); + + OUTPUT_Line("GlobalFlags result:"); + OUTPUT_Result(result); + return result; +} +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalHandle() +{ + HGLOBAL hMem = 0; + HGLOBAL hTest = 0; + PVOID pMem = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = SKIPPED; + + OUTPUT_Banner("Testing GlobalHandle()"); + + OUTPUT_Line("Testing GlobalHandle with a block of GMEM_FIXED memory"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + + OUTPUT_Line("Allocation handle: "); + OUTPUT_HexDword((DWORD)hMem); + + hTest = GlobalHandle(hMem); + if (hMem == hTest) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("GlobalHandle returned:"); + OUTPUT_HexDword((DWORD)hTest); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + + subtest = SKIPPED; + OUTPUT_Line("Testing GlobalHandle with a block of GMEM_MOVEABLE memory"); + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + + OUTPUT_Line("Allocation handle: "); + OUTPUT_HexDword((DWORD)hMem); + pMem = GlobalLock(hMem); + hTest = GlobalHandle(pMem); + if (hMem == hTest) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("GlobalHandle returned:"); + OUTPUT_HexDword((DWORD)hTest); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + GlobalUnlock(hMem); + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + + OUTPUT_Line("Global Handle test results:"); + OUTPUT_Result(result); + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalSize() +{ + HGLOBAL hMem = 0; + SIZE_T size = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = SKIPPED; + OUTPUT_Banner("Testing GlobalSize()"); + + OUTPUT_Line("Testing GlobalSize with a block of GMEM_FIXED memory"); + hMem = GlobalAlloc(GMEM_FIXED, MEM_BLOCK_SIZE); + if (0 != hMem) + { + size = GlobalSize(hMem); + if (MEM_BLOCK_SIZE <= size) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("GlobalSize returned:"); + OUTPUT_HexDword(size); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Line("Testing GlobalSize with a block of GMEM_MOVEABLE memory"); + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + size = GlobalSize(hMem); + if (MEM_BLOCK_SIZE <= size) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("GlobalSize returned:"); + OUTPUT_HexDword(size); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Line("Testing GlobalSize with discarded memory"); + hMem = GlobalAlloc(GMEM_MOVEABLE, 0); + if (0 != hMem) + { + size = GlobalSize(hMem); + if (0 == size) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("GlobalSize returned:"); + OUTPUT_HexDword(size); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + GlobalFree(hMem); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Line("Test result:"); + OUTPUT_Result(result); + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +TEST_STATUS TestGlobalDiscard() +{ + HGLOBAL hMem = 0; + HGLOBAL hTest = 0; + DWORD uFlags = 0; + TEST_STATUS subtest = SKIPPED; + TEST_STATUS result = SKIPPED; + + OUTPUT_Banner("Testing GlobalDiscard()"); + hMem = GlobalAlloc(GMEM_MOVEABLE, MEM_BLOCK_SIZE); + if (0 != hMem) + { + OUTPUT_Line("Allocation handle: "); + OUTPUT_HexDword((DWORD)hMem); + + hTest = GlobalDiscard(hMem); + if (0 == hTest) + { + OUTPUT_Line("GlobalDiscard returned NULL"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + else + { + uFlags = GlobalFlags(hTest); + OUTPUT_Line("Flags from the new memory block."); + OUTPUT_HexDword(uFlags); + if (0 != (uFlags & GMEM_DISCARDED)) + { + subtest = TEST_CombineStatus(subtest, PASSED); + } + else + { + OUTPUT_Line("Block is not marked as discardable."); + subtest = TEST_CombineStatus(subtest, FAILED); + } + } + + GlobalFree(hTest); + } + else + { + OUTPUT_Line("GlobalAlloc failed!"); + subtest = TEST_CombineStatus(subtest, FAILED); + } + + OUTPUT_Line("Result from subtest:"); + OUTPUT_Result(subtest); + + result = TEST_CombineStatus(result, subtest); + + OUTPUT_Result(result); + return result; +} + +/*--------------------------------------------------------------------------- +** +*/ +int main(int argc, char ** argv) +{ + TEST_STATUS test_set = SKIPPED; + OUTPUT_Banner("Testing GlobalXXX memory management functions."); + + test_set = TEST_CombineStatus(test_set, TestGlobalAllocNFree(GPTR)); + test_set = TEST_CombineStatus(test_set, TestGlobalAllocNFree(GHND)); + test_set = TEST_CombineStatus(test_set, TestGlobalAllocNFree(GMEM_FIXED)); + test_set = TEST_CombineStatus(test_set, TestGlobalAllocNFree(GMEM_MOVEABLE)); + + if (FAILED == test_set) + { + OUTPUT_Line("Skipping any further tests. GlobalAlloc/Free fails."); + OUTPUT_Result(test_set); + return test_set; + } + + test_set = TEST_CombineStatus(test_set, TestGlobalLockNUnlock(GPTR)); + test_set = TEST_CombineStatus(test_set, TestGlobalLockNUnlock(GHND)); + test_set = TEST_CombineStatus(test_set, TestGlobalLockNUnlock(GMEM_FIXED)); + test_set = TEST_CombineStatus(test_set, TestGlobalLockNUnlock(GMEM_MOVEABLE)); + + test_set = TEST_CombineStatus(test_set, TestGlobalReAlloc()); + + test_set = TEST_CombineStatus(test_set, TestGlobalFlags()); + + test_set = TEST_CombineStatus(test_set, TestGlobalHandle()); + + test_set = TEST_CombineStatus(test_set, TestGlobalSize()); + + test_set = TEST_CombineStatus(test_set, TestGlobalDiscard()); + + /* output the result for the entire set of tests*/ + OUTPUT_Banner("Test suite result"); + OUTPUT_Result(test_set); + return test_set; +} diff --git a/rosapps/tests/gradient/.cvsignore b/rosapps/tests/gradient/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/gradient/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/gradient/gradient.c b/rosapps/tests/gradient/gradient.c new file mode 100644 index 00000000000..e291b2101ec --- /dev/null +++ b/rosapps/tests/gradient/gradient.c @@ -0,0 +1,181 @@ +#include +#include +#include + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + wc.lpszClassName = "GradientClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("GradientClass", + "GradientFill Test", + WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, + 0, + 0, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + //tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + // ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + // DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + //DeleteObject(tf); + + return msg.wParam; +} +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HDC hDC; + + switch(msg) + { + case WM_PAINT: + { + PAINTSTRUCT ps; + TRIVERTEX vert [5] ; + GRADIENT_TRIANGLE gTRi[3]; + GRADIENT_RECT gRect[2]; + hDC = BeginPaint(hWnd, &ps); + + vert [0] .x = 0; + vert [0] .y = 0; + vert [0] .Red = 0xff00; + vert [0] .Green = 0xff00; + vert [0] .Blue = 0xff00; + vert [0] .Alpha = 0x0000; + + vert [1] .x = 300; + vert [1] .y = 20; + vert [1] .Red = 0x0000; + vert [1] .Green = 0x0000; + vert [1] .Blue = 0xff00; + vert [1] .Alpha = 0x0000; + + vert [2] .x = 100; + vert [2] .y = 200; + vert [2] .Red = 0xff00; + vert [2] .Green = 0x0000; + vert [2] .Blue = 0x0000; + vert [2] .Alpha = 0x0000; + + vert [3] .x = 250; + vert [3] .y = 300; + vert [3] .Red = 0x8000; + vert [3] .Green = 0x8000; + vert [3] .Blue = 0x0000; + vert [3] .Alpha = 0x0000; + + vert [4] .x = 325; + vert [4] .y = 300; + vert [4] .Red = 0x0000; + vert [4] .Green = 0xff00; + vert [4] .Blue = 0x0000; + vert [4] .Alpha = 0x0000; + + gTRi[0].Vertex1 = 0; + gTRi[0].Vertex2 = 1; + gTRi[0].Vertex3 = 2; + + gTRi[1].Vertex1 = 1; + gTRi[1].Vertex2 = 2; + gTRi[1].Vertex3 = 3; + + gTRi[2].Vertex1 = 1; + gTRi[2].Vertex2 = 3; + gTRi[2].Vertex3 = 4; + + GdiGradientFill(hDC,vert,5,&gTRi,3,GRADIENT_FILL_TRIANGLE); + + + vert [0] .x = 5; + vert [0] .y = 200; + vert [0] .Red = 0x0000; + vert [0] .Green = 0x0000; + vert [0] .Blue = 0x0000; + vert [0] .Alpha = 0x0000; + + vert [1] .x = 90; + vert [1] .y = 240; + vert [1] .Red = 0x0000; + vert [1] .Green = 0x0000; + vert [1] .Blue = 0xff00; + vert [1] .Alpha = 0x0000; + + vert [2] .x = 5; + vert [2] .y = 245; + vert [2] .Red = 0x0000; + vert [2] .Green = 0x0000; + vert [2] .Blue = 0x0000; + vert [2] .Alpha = 0x0000; + + vert [3] .x = 90; + vert [3] .y = 300; + vert [3] .Red = 0x0000; + vert [3] .Green = 0x0000; + vert [3] .Blue = 0xff00; + vert [3] .Alpha = 0x0000; + + gRect[0].UpperLeft = 0; + gRect[0].LowerRight = 1; + + gRect[1].UpperLeft = 2; + gRect[1].LowerRight = 3; + + GdiGradientFill(hDC,vert,4,&gRect[0],1,GRADIENT_FILL_RECT_H); + GdiGradientFill(hDC,vert,4,&gRect[1],1,GRADIENT_FILL_RECT_V); + + EndPaint(hWnd, &ps); + break; + } + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/gradient/makefile b/rosapps/tests/gradient/makefile new file mode 100644 index 00000000000..9e11021c010 --- /dev/null +++ b/rosapps/tests/gradient/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:02 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = gradient + +TARGET_SDKLIBS = gdi32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/guithreadinfo/.cvsignore b/rosapps/tests/guithreadinfo/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/guithreadinfo/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/guithreadinfo/guithreadinfo.c b/rosapps/tests/guithreadinfo/guithreadinfo.c new file mode 100644 index 00000000000..8e8da78b0cf --- /dev/null +++ b/rosapps/tests/guithreadinfo/guithreadinfo.c @@ -0,0 +1,132 @@ +#include +#include +#include + +static GUITHREADINFO gti; +//HFONT tf; +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + wc.lpszClassName = "GuiThreadInfoClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("GuiThreadInfoClass", + "GetGUIThreadInfo", + WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, + 0, + 0, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + //tf = CreateFontA(14, 0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + // ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + // DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + + gti.cbSize = sizeof(GUITHREADINFO); + GetGUIThreadInfo(0, >i); + + SetTimer(hWnd, 1, 1000, NULL); + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + //DeleteObject(tf); + + return msg.wParam; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC hDC; + char str[255]; + + switch(msg) + { + + case WM_PAINT: + hDC = BeginPaint(hWnd, &ps); + wsprintf(str, "flags: "); + if(gti.flags & GUI_16BITTASK) lstrcat(str, "GUI_16BITTASK "); + if(gti.flags & GUI_CARETBLINKING) lstrcat(str, "GUI_CARETBLINKING "); + if(gti.flags & GUI_INMENUMODE) lstrcat(str, "GUI_INMENUMODE "); + if(gti.flags & GUI_INMOVESIZE) lstrcat(str, "GUI_INMOVESIZE "); + if(gti.flags & GUI_POPUPMENUMODE) lstrcat(str, "GUI_POPUPMENUMODE "); + if(gti.flags & GUI_SYSTEMMENUMODE) lstrcat(str, "GUI_SYSTEMMENUMODE "); + TextOut(hDC, 10, 10, str, strlen(str)); + + wsprintf(str, "hwndActive == %08X", gti.hwndActive); + TextOut(hDC, 10, 30, str, strlen(str)); + wsprintf(str, "hwndFocus == %08X", gti.hwndFocus); + TextOut(hDC, 10, 50, str, strlen(str)); + wsprintf(str, "hwndCapture == %08X", gti.hwndCapture); + TextOut(hDC, 10, 70, str, strlen(str)); + wsprintf(str, "hwndMenuOwner == %08X", gti.hwndMenuOwner); + TextOut(hDC, 10, 90, str, strlen(str)); + wsprintf(str, "hwndMoveSize == %08X", gti.hwndMoveSize); + TextOut(hDC, 10, 110, str, strlen(str)); + wsprintf(str, "hwndCaret == %08X", gti.hwndCaret); + TextOut(hDC, 10, 130, str, strlen(str)); + wsprintf(str, "rcCaret == (%lu, %lu, %lu, %lu)", gti.rcCaret.left, gti.rcCaret.top, gti.rcCaret.right, gti.rcCaret.bottom); + TextOut(hDC, 10, 150, str, strlen(str)); + + wsprintf(str, "GetGuiResources for the current process: %08X", GetCurrentProcess()); + TextOut(hDC, 10, 180, str, strlen(str)); + wsprintf(str, "GetGuiResources: GR_GDIOBJECTS == %04X", GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS)); + TextOut(hDC, 10, 200, str, strlen(str)); + wsprintf(str, "GetGuiResources: GR_USEROBJECTS == %04x", GetGuiResources(GetCurrentProcess(), GR_USEROBJECTS)); + TextOut(hDC, 10, 220, str, strlen(str)); + EndPaint(hWnd, &ps); + break; + + case WM_TIMER: + GetGUIThreadInfo(0, >i); + InvalidateRect(hWnd, NULL, TRUE); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rosapps/tests/guithreadinfo/makefile b/rosapps/tests/guithreadinfo/makefile new file mode 100644 index 00000000000..6f91fa38c8b --- /dev/null +++ b/rosapps/tests/guithreadinfo/makefile @@ -0,0 +1,23 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:02 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = windows + +TARGET_NAME = guithreadinfo + +TARGET_SDKLIBS = kernel32.a gdi32.a user32.a + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/hello/.cvsignore b/rosapps/tests/hello/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/hello/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/hello/hello.c b/rosapps/tests/hello/hello.c new file mode 100644 index 00000000000..9e793383d21 --- /dev/null +++ b/rosapps/tests/hello/hello.c @@ -0,0 +1,8 @@ +#include +#include + +int main(int argc, char* argv[]) +{ + printf("Hello world\n"); + return(0); +} diff --git a/rosapps/tests/hello/makefile b/rosapps/tests/hello/makefile new file mode 100644 index 00000000000..2f5b3b73b76 --- /dev/null +++ b/rosapps/tests/hello/makefile @@ -0,0 +1,21 @@ +# $Id: makefile,v 1.1 2004/10/21 05:12:02 sedwards Exp $ + +PATH_TO_TOP = ../../../reactos + +TARGET_NORC = yes + +TARGET_TYPE = program + +TARGET_APPTYPE = console + +TARGET_NAME = hello + +TARGET_OBJECTS = $(TARGET_NAME).o + +TARGET_CFLAGS = -Wall -Werror + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +# EOF diff --git a/rosapps/tests/hivetest/.cvsignore b/rosapps/tests/hivetest/.cvsignore new file mode 100644 index 00000000000..060f7fa87a2 --- /dev/null +++ b/rosapps/tests/hivetest/.cvsignore @@ -0,0 +1,7 @@ +*.o +*.d +*.a +*.exe +*.coff +*.sym +*.map \ No newline at end of file diff --git a/rosapps/tests/hivetest/hivetest.c b/rosapps/tests/hivetest/hivetest.c new file mode 100644 index 00000000000..2dc2fa31f54 --- /dev/null +++ b/rosapps/tests/hivetest/hivetest.c @@ -0,0 +1,1196 @@ +#include +#include +#include +#include +#include +#include + +HANDLE OutputHandle; +HANDLE InputHandle; + +void dprintf(char* fmt, ...) +{ + va_list args; + char buffer[255]; + + va_start(args,fmt); + vsprintf(buffer,fmt,args); + WriteConsoleA(OutputHandle, buffer, strlen(buffer), NULL, NULL); + va_end(args); +} + +void do_enumeratekey(PWSTR Name) +{ + ULONG Index,Length,i; + KEY_BASIC_INFORMATION KeyInformation[5]; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE hKey1; + UNICODE_STRING KeyName; + + RtlInitUnicodeString(&KeyName, Name); + InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE + , NULL, NULL); + Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes); + dprintf("NtEnumerateKey : \n"); + Index=0; + while(Status == STATUS_SUCCESS) + { + Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation + ,&KeyInformation[0], sizeof(KeyInformation) + ,&Length); + if(Status== STATUS_SUCCESS) + { + dprintf("\tSubKey Name = "); + for (i=0;i +#include + +struct tm time_str; + +char daybuf[20]; + +int main(void) +{ + printf("Testing mktime() by asking\n"); + printf("What day of the week is July 4, 2001?\n"); + + time_str.tm_year = 2001 - 1900; + time_str.tm_mon = 7 - 1; + time_str.tm_mday = 4; + time_str.tm_hour = 0; + time_str.tm_min = 0; + time_str.tm_sec = 1; + time_str.tm_isdst = -1; + if (mktime(&time_str) == -1) + (void)puts("-unknown-"); + else { + (void)strftime(daybuf, sizeof(daybuf), "%A", &time_str); + (void)puts(daybuf); + } + return 0; +} +