mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 17:14:41 +00:00
Moving the tests
svn path=/trunk/; revision=11360
This commit is contained in:
parent
68d63b431f
commit
dbf0e6e889
78 changed files with 5211 additions and 0 deletions
113
rosapps/tests/Makefile
Normal file
113
rosapps/tests/Makefile
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
#
|
||||||
|
# ReactOS test applications makefile
|
||||||
|
#
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../reactos
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
TEST_APPS = \
|
||||||
|
accelerator \
|
||||||
|
alive \
|
||||||
|
alphablend \
|
||||||
|
apc \
|
||||||
|
apc2 \
|
||||||
|
args \
|
||||||
|
atomtest \
|
||||||
|
bench \
|
||||||
|
bitblt \
|
||||||
|
button \
|
||||||
|
button2 \
|
||||||
|
capclock \
|
||||||
|
carets \
|
||||||
|
combo \
|
||||||
|
consume \
|
||||||
|
copymove \
|
||||||
|
count \
|
||||||
|
dibtest \
|
||||||
|
dirdlg \
|
||||||
|
dump_shared_data \
|
||||||
|
edit \
|
||||||
|
enhmetafile \
|
||||||
|
enumwnd \
|
||||||
|
enumws \
|
||||||
|
event \
|
||||||
|
eventpair \
|
||||||
|
fiber \
|
||||||
|
global_mem \
|
||||||
|
gradient \
|
||||||
|
guithreadinfo \
|
||||||
|
hello \
|
||||||
|
mdi \
|
||||||
|
hivetest \
|
||||||
|
icontest \
|
||||||
|
isotest \
|
||||||
|
lineclip \
|
||||||
|
linetest \
|
||||||
|
lpc \
|
||||||
|
map_dup_inherit \
|
||||||
|
mktime \
|
||||||
|
mstest \
|
||||||
|
multithrdwin \
|
||||||
|
multiwin \
|
||||||
|
mutex \
|
||||||
|
nptest \
|
||||||
|
patblt \
|
||||||
|
popupmenu \
|
||||||
|
primitives \
|
||||||
|
pteb \
|
||||||
|
p_dup_handle \
|
||||||
|
regtest \
|
||||||
|
sectest \
|
||||||
|
sertest \
|
||||||
|
shaptest \
|
||||||
|
shm \
|
||||||
|
statst \
|
||||||
|
statst2 \
|
||||||
|
stretchblt \
|
||||||
|
suspend \
|
||||||
|
tcpsvr \
|
||||||
|
terminate \
|
||||||
|
txtscale \
|
||||||
|
thread \
|
||||||
|
thread_msg \
|
||||||
|
threadwait \
|
||||||
|
tokentest \
|
||||||
|
vmtest \
|
||||||
|
winhello \
|
||||||
|
wm_erasebkgnd \
|
||||||
|
wm_paint
|
||||||
|
|
||||||
|
all: $(TEST_APPS)
|
||||||
|
|
||||||
|
depends:
|
||||||
|
|
||||||
|
implib: $(TEST_APPS:%=%_implib)
|
||||||
|
|
||||||
|
clean: $(TEST_APPS:%=%_clean)
|
||||||
|
|
||||||
|
install: $(TEST_APPS:%=%_install)
|
||||||
|
|
||||||
|
.PHONY: all depends implib clean install
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test Applications
|
||||||
|
#
|
||||||
|
$(TEST_APPS): %:
|
||||||
|
$(MAKE) -C $*
|
||||||
|
|
||||||
|
$(TEST_APPS:%=%_implib): %_implib:
|
||||||
|
$(MAKE) -C $* implib
|
||||||
|
|
||||||
|
$(TEST_APPS:%=%_clean): %_clean:
|
||||||
|
$(MAKE) -C $* clean
|
||||||
|
|
||||||
|
$(TEST_APPS:%=%_install): %_install:
|
||||||
|
$(MAKE) -C $* install
|
||||||
|
|
||||||
|
.PHONY: $(TEST_APPS) $(TEST_APPS:%=%_implib) $(TEST_APPS:%=%_clean) $(TEST_APPS:%=%_install)
|
||||||
|
|
||||||
|
etags:
|
||||||
|
find . -name "*.[ch]" -print | etags --language=c -
|
||||||
|
|
||||||
|
# EOF
|
3
rosapps/tests/README.txt
Normal file
3
rosapps/tests/README.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
This folder contains tests that are not merged in to the new regression system.
|
||||||
|
|
||||||
|
Please DO NOT add new tests here.
|
7
rosapps/tests/accelerator/.cvsignore
Normal file
7
rosapps/tests/accelerator/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
19
rosapps/tests/accelerator/Makefile
Normal file
19
rosapps/tests/accelerator/Makefile
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = accelerator
|
||||||
|
|
||||||
|
#TARGET_SDKLIBS = kernel32.a user32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = accelerator.o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
161
rosapps/tests/accelerator/accelerator.c
Normal file
161
rosapps/tests/accelerator/accelerator.c
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define ID_ACCEL1 0x100
|
||||||
|
#define ID_ACCEL2 0x101
|
||||||
|
#define ID_ACCEL3 0x102
|
||||||
|
#define ID_ACCEL4 0x103
|
||||||
|
|
||||||
|
/*
|
||||||
|
* {fVirt, key, cmd}
|
||||||
|
* fVirt |= FVIRTKEY | FCONTROL | FALT | FSHIFT
|
||||||
|
*/
|
||||||
|
//static HFONT tf;
|
||||||
|
static ACCEL Accelerators[4] = {
|
||||||
|
{ FVIRTKEY, VK_A, ID_ACCEL1},
|
||||||
|
{ FVIRTKEY | FSHIFT, VK_A, ID_ACCEL2},
|
||||||
|
{ FVIRTKEY | FCONTROL, VK_A, ID_ACCEL3},
|
||||||
|
{ FVIRTKEY | FALT, VK_A, ID_ACCEL4}};
|
||||||
|
static HACCEL hAcceleratorTable;
|
||||||
|
static char Event[200];
|
||||||
|
|
||||||
|
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 = "AcceleratorTest";
|
||||||
|
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("AcceleratorTest",
|
||||||
|
"Accelerator 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");*/
|
||||||
|
|
||||||
|
Event[0] = 0;
|
||||||
|
|
||||||
|
ShowWindow(hWnd, nCmdShow);
|
||||||
|
|
||||||
|
hAcceleratorTable = CreateAcceleratorTable(Accelerators,
|
||||||
|
sizeof(Accelerators)/sizeof(Accelerators[1]));
|
||||||
|
if (hAcceleratorTable == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "CreateAcceleratorTable failed (last error 0x%lX)\n",
|
||||||
|
GetLastError());
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while(GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
if (!TranslateAccelerator(hWnd, hAcceleratorTable, &msg))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DestroyAcceleratorTable(hAcceleratorTable))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "DestroyAcceleratorTable failed (last error 0x%lX)\n",
|
||||||
|
GetLastError());
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//DeleteObject(tf);
|
||||||
|
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC hDC;
|
||||||
|
char buf[200];
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case WM_PAINT:
|
||||||
|
hDC = BeginPaint(hWnd, &ps);
|
||||||
|
//SelectObject(hDC, tf);
|
||||||
|
sprintf(buf, "Event: '%s'", Event);
|
||||||
|
TextOut(hDC, 10, 10, buf, strlen(buf));
|
||||||
|
EndPaint(hWnd, &ps);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case ID_ACCEL1:
|
||||||
|
strcpy(Event, "A");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_ACCEL2:
|
||||||
|
strcpy(Event, "SHIFT+A");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_ACCEL3:
|
||||||
|
strcpy(Event, "CTRL+A");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_ACCEL4:
|
||||||
|
strcpy(Event, "ALT+A");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
sprintf(Event, "%d", LOWORD(wParam));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
InvalidateRect(hWnd, NULL, TRUE);
|
||||||
|
UpdateWindow(hWnd);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/alive/.cvsignore
Normal file
7
rosapps/tests/alive/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/alive/Makefile
Normal file
23
rosapps/tests/alive/Makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: Makefile,v 1.1 2004/10/21 04:48:44 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = alive
|
||||||
|
|
||||||
|
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
|
48
rosapps/tests/alive/alive.c
Normal file
48
rosapps/tests/alive/alive.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/* $Id: alive.c,v 1.1 2004/10/21 04:48:44 sedwards Exp $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
HANDLE StandardOutput = INVALID_HANDLE_VALUE;
|
||||||
|
CHAR Message [80];
|
||||||
|
DWORD CharactersToWrite = 0;
|
||||||
|
DWORD WrittenCharacters = 0;
|
||||||
|
INT d = 0, h = 0, m = 0, s = 0;
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char * argv [])
|
||||||
|
{
|
||||||
|
StandardOutput = GetStdHandle (STD_OUTPUT_HANDLE);
|
||||||
|
if (INVALID_HANDLE_VALUE == StandardOutput)
|
||||||
|
{
|
||||||
|
return (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
/* Prepare the message and update it */
|
||||||
|
CharactersToWrite =
|
||||||
|
wsprintf (
|
||||||
|
Message,
|
||||||
|
"Alive for %dd %dh %d' %d\" \r",
|
||||||
|
d, h, m, s
|
||||||
|
);
|
||||||
|
WriteConsole (
|
||||||
|
StandardOutput,
|
||||||
|
Message,
|
||||||
|
CharactersToWrite,
|
||||||
|
& WrittenCharacters,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
/* suspend the execution for 1s */
|
||||||
|
Sleep (1000);
|
||||||
|
/* increment seconds */
|
||||||
|
++ s;
|
||||||
|
if (60 == s) { s = 0; ++ m; }
|
||||||
|
if (60 == m) { m = 0; ++ h; }
|
||||||
|
if (24 == h) { h = 0; ++ d; }
|
||||||
|
}
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
7
rosapps/tests/alphablend/.cvsignore
Normal file
7
rosapps/tests/alphablend/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
213
rosapps/tests/alphablend/alphablend.c
Normal file
213
rosapps/tests/alphablend/alphablend.c
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef AC_SRC_ALPHA
|
||||||
|
#define AC_SRC_ALPHA (0x1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HINSTANCE HInst;
|
||||||
|
const char* WndClassName = "GMainWnd";
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
|
||||||
|
LPARAM LParam);
|
||||||
|
|
||||||
|
WINBOOL
|
||||||
|
STDCALL
|
||||||
|
GdiAlphaBlend(HDC hdcDst,LONG DstX,LONG DstY,LONG DstCx,LONG DstCy,HDC hdcSrc,LONG SrcX,LONG SrcY,LONG SrcCx,LONG SrcCy,BLENDFUNCTION BlendFunction);
|
||||||
|
|
||||||
|
|
||||||
|
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<HBRUSH>(COLOR_BTNFACE + 1); */
|
||||||
|
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||||
|
wc.lpszClassName = WndClassName;
|
||||||
|
|
||||||
|
if (RegisterClass(&wc))
|
||||||
|
{
|
||||||
|
HWND HWnd =
|
||||||
|
CreateWindow(
|
||||||
|
WndClassName, TEXT("AlphaBlend Rendering Demo"),
|
||||||
|
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |
|
||||||
|
WS_VISIBLE | WS_CLIPSIBLINGS,
|
||||||
|
0, 0, 320, 430,
|
||||||
|
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, HMemDC2 = NULL;
|
||||||
|
HBITMAP HOldBmp = NULL;
|
||||||
|
PVOID pBmpBits = NULL;
|
||||||
|
HBITMAP H32BppBitmap = NULL;
|
||||||
|
BITMAPINFO bmpi;
|
||||||
|
|
||||||
|
BOOL ConvertBitmapTo32Bpp(HDC hDC, BITMAP *bmp)
|
||||||
|
{
|
||||||
|
ZeroMemory(&bmpi, sizeof(BITMAPINFO));
|
||||||
|
bmpi.bmiHeader.biSize = sizeof(BITMAPINFO);
|
||||||
|
bmpi.bmiHeader.biWidth = bmp->bmWidth;
|
||||||
|
bmpi.bmiHeader.biHeight = bmp->bmHeight;
|
||||||
|
bmpi.bmiHeader.biPlanes = 1;
|
||||||
|
bmpi.bmiHeader.biBitCount = 32;
|
||||||
|
bmpi.bmiHeader.biCompression = BI_RGB;
|
||||||
|
bmpi.bmiHeader.biSizeImage = 4 * bmpi.bmiHeader.biWidth * bmpi.bmiHeader.biHeight;
|
||||||
|
H32BppBitmap = CreateDIBSection(hDC, &bmpi, DIB_RGB_COLORS, &pBmpBits, 0, 0);
|
||||||
|
if(H32BppBitmap)
|
||||||
|
{
|
||||||
|
HBITMAP bmpalpha;
|
||||||
|
SelectObject(hDC, H32BppBitmap);
|
||||||
|
BitBlt(hDC, 0, 0, bmp->bmWidth, bmp->bmHeight, HMemDC, 0, 0, SRCCOPY);
|
||||||
|
|
||||||
|
/* load and apply alpha channel */
|
||||||
|
bmpalpha = LoadImage(HInst, TEXT("lenaalpha.bmp"), IMAGE_BITMAP,
|
||||||
|
0, 0, LR_LOADFROMFILE);
|
||||||
|
if(bmpalpha)
|
||||||
|
{
|
||||||
|
COLORREF *col = pBmpBits;
|
||||||
|
int x, y;
|
||||||
|
HDC hdcTemp = CreateCompatibleDC(NULL);
|
||||||
|
if(!hdcTemp)
|
||||||
|
{
|
||||||
|
DeleteObject(bmpalpha);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
SelectObject(hdcTemp, bmpalpha);
|
||||||
|
|
||||||
|
for(y = 0; y < bmp->bmHeight; y++)
|
||||||
|
{
|
||||||
|
for(x = 0; x < bmp->bmWidth; x++)
|
||||||
|
{
|
||||||
|
COLORREF Color = (COLORREF)GetRValue(GetPixel(hdcTemp, x, y)) << 24;
|
||||||
|
*col++ |= Color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteObject(bmpalpha);
|
||||||
|
DeleteDC(hdcTemp);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
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<HBITMAP> */(
|
||||||
|
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<HBITMAP> */
|
||||||
|
(SelectObject(HMemDC, HBmp)
|
||||||
|
);
|
||||||
|
HMemDC2 = CreateCompatibleDC(NULL);
|
||||||
|
if(!ConvertBitmapTo32Bpp(HMemDC2, &bmp))
|
||||||
|
{
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
BLENDFUNCTION BlendFunc;
|
||||||
|
HDC Hdc = BeginPaint(HWnd, &ps);
|
||||||
|
#if 0
|
||||||
|
try
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
BlendFunc.BlendOp = AC_SRC_OVER;
|
||||||
|
BlendFunc.BlendFlags = 0;
|
||||||
|
BlendFunc.SourceConstantAlpha = 128;
|
||||||
|
BlendFunc.AlphaFormat = 0;
|
||||||
|
|
||||||
|
BitBlt(Hdc, 100, 90,
|
||||||
|
bmp.bmWidth, bmp.bmHeight,
|
||||||
|
HMemDC2, 0, 0,
|
||||||
|
SRCCOPY);
|
||||||
|
GdiAlphaBlend(Hdc, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
BlendFunc);
|
||||||
|
GdiAlphaBlend(Hdc, bmp.bmWidth - 15, 10, bmp.bmWidth / 2, bmp.bmHeight / 2,
|
||||||
|
HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
BlendFunc);
|
||||||
|
|
||||||
|
BlendFunc.SourceConstantAlpha = 255;
|
||||||
|
BlendFunc.AlphaFormat = AC_SRC_ALPHA;
|
||||||
|
|
||||||
|
GdiAlphaBlend(Hdc, 140, 200, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
BlendFunc);
|
||||||
|
GdiAlphaBlend(Hdc, 20, 210, (bmp.bmWidth / 3) * 2, (bmp.bmHeight / 3) * 2,
|
||||||
|
HMemDC2, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
BlendFunc);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
EndPaint(HWnd, &ps);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
EndPaint(HWnd, &ps);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
/* clean up */
|
||||||
|
DeleteObject(SelectObject(HMemDC, HOldBmp));
|
||||||
|
DeleteDC(HMemDC);
|
||||||
|
DeleteDC(HMemDC2);
|
||||||
|
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(HWnd, Msg, WParam, LParam);
|
||||||
|
}
|
BIN
rosapps/tests/alphablend/lena.bmp
Normal file
BIN
rosapps/tests/alphablend/lena.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
BIN
rosapps/tests/alphablend/lenaalpha.bmp
Normal file
BIN
rosapps/tests/alphablend/lenaalpha.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
22
rosapps/tests/alphablend/makefile
Normal file
22
rosapps/tests/alphablend/makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = alphablend
|
||||||
|
|
||||||
|
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
|
7
rosapps/tests/apc/.cvsignore
Normal file
7
rosapps/tests/apc/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
94
rosapps/tests/apc/apc.c
Normal file
94
rosapps/tests/apc/apc.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
#include <rosrtl/string.h>
|
||||||
|
|
||||||
|
HANDLE OutputHandle;
|
||||||
|
HANDLE InputHandle;
|
||||||
|
|
||||||
|
VOID STDCALL
|
||||||
|
ApcRoutine(PVOID Context,
|
||||||
|
PIO_STATUS_BLOCK IoStatus,
|
||||||
|
ULONG Reserved)
|
||||||
|
{
|
||||||
|
printf("(apc.exe) ApcRoutine(Context %p)\n", Context);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
HANDLE FileHandle;
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
UNICODE_STRING FileName = ROS_STRING_INITIALIZER(L"\\C:\\a.txt");
|
||||||
|
IO_STATUS_BLOCK IoStatus;
|
||||||
|
CHAR Buffer[256];
|
||||||
|
HANDLE EventHandle;
|
||||||
|
LARGE_INTEGER off;
|
||||||
|
|
||||||
|
AllocConsole();
|
||||||
|
InputHandle = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
printf("APC test program\n");
|
||||||
|
|
||||||
|
EventHandle = CreateEventW(NULL,
|
||||||
|
FALSE,
|
||||||
|
FALSE,
|
||||||
|
NULL);
|
||||||
|
if (EventHandle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
printf("Failed to create event\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Opening file\n");
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&FileName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
printf("Creating file\n");
|
||||||
|
FileHandle = CreateFileW(L"C:\\a.txt",
|
||||||
|
FILE_GENERIC_READ | FILE_GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_FLAG_OVERLAPPED,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (FileHandle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
|
||||||
|
printf("Open failed last err 0x%lu\n",GetLastError());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
off.QuadPart = 0;
|
||||||
|
|
||||||
|
printf("Reading file\n");
|
||||||
|
Status = ZwReadFile(FileHandle,
|
||||||
|
NULL,
|
||||||
|
(PIO_APC_ROUTINE)ApcRoutine,
|
||||||
|
(PVOID) 0xdeadbeef,
|
||||||
|
&IoStatus,
|
||||||
|
Buffer,
|
||||||
|
256,//len
|
||||||
|
&off ,//offset must exist if file was opened for asynch. i/o aka. OVERLAPPED
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf("Read failed status 0x%lu\n",Status);
|
||||||
|
}
|
||||||
|
printf("Waiting\n");
|
||||||
|
WaitForSingleObjectEx(EventHandle, INFINITE, TRUE);
|
||||||
|
printf("Returned from wait\n");
|
||||||
|
ZwClose(FileHandle);
|
||||||
|
printf("Program finished\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
23
rosapps/tests/apc/makefile
Normal file
23
rosapps/tests/apc/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:44 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = apc
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
7
rosapps/tests/apc2/.cvsignore
Normal file
7
rosapps/tests/apc2/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
53
rosapps/tests/apc2/apc2.c
Normal file
53
rosapps/tests/apc2/apc2.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
VOID CALLBACK TimerApcProc(
|
||||||
|
LPVOID lpArg,
|
||||||
|
DWORD dwTimerLowValue,
|
||||||
|
DWORD dwTimerHighValue )
|
||||||
|
{
|
||||||
|
printf("APC Callback %lu\n", *(PDWORD)lpArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
HANDLE hTimer;
|
||||||
|
BOOL bSuccess;
|
||||||
|
LARGE_INTEGER DueTime;
|
||||||
|
DWORD value = 1;
|
||||||
|
|
||||||
|
hTimer = CreateWaitableTimer(NULL, FALSE, NULL );
|
||||||
|
|
||||||
|
if (!hTimer)
|
||||||
|
{
|
||||||
|
printf("CreateWaitableTimer failed!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DueTime.QuadPart = -(LONGLONG)(5 * 10000000);
|
||||||
|
|
||||||
|
bSuccess = SetWaitableTimer(
|
||||||
|
hTimer,
|
||||||
|
&DueTime,
|
||||||
|
2001 /*interval (using an odd number to be able to find it easy in kmode) */,
|
||||||
|
TimerApcProc,
|
||||||
|
&value /*callback argument*/,
|
||||||
|
FALSE );
|
||||||
|
|
||||||
|
if (!bSuccess)
|
||||||
|
{
|
||||||
|
printf("SetWaitableTimer failed!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;value <= 10; value++ )
|
||||||
|
{
|
||||||
|
SleepEx(INFINITE, TRUE /*alertable*/ );
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle( hTimer );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
23
rosapps/tests/apc2/makefile
Normal file
23
rosapps/tests/apc2/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = apc2
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
7
rosapps/tests/args/.cvsignore
Normal file
7
rosapps/tests/args/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
39
rosapps/tests/args/args.c
Normal file
39
rosapps/tests/args/args.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
HANDLE OutputHandle;
|
||||||
|
HANDLE InputHandle;
|
||||||
|
|
||||||
|
void debug_printf(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
AllocConsole();
|
||||||
|
InputHandle = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
printf("GetCommandLineA() %s\n",GetCommandLineA());
|
||||||
|
debug_printf("GetCommandLineA() %s\n",GetCommandLineA());
|
||||||
|
debug_printf("argc %d\n", argc);
|
||||||
|
for (i=0; i<argc; i++)
|
||||||
|
{
|
||||||
|
debug_printf("Argv[%d]: %x\n",i,argv[i]);
|
||||||
|
debug_printf("Argv[%d]: '%s'\n",i,argv[i]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
21
rosapps/tests/args/makefile
Normal file
21
rosapps/tests/args/makefile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:44 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = args
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
7
rosapps/tests/atomtest/.cvsignore
Normal file
7
rosapps/tests/atomtest/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
114
rosapps/tests/atomtest/atomtest.c
Normal file
114
rosapps/tests/atomtest/atomtest.c
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 256
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
PRTL_ATOM_TABLE AtomTable = NULL;
|
||||||
|
RTL_ATOM AtomA = -1, AtomB = -1, AtomC = -1;
|
||||||
|
NTSTATUS Status;
|
||||||
|
WCHAR Buffer[BUFFER_SIZE];
|
||||||
|
ULONG NameLength, Data1, Data2;
|
||||||
|
|
||||||
|
printf("Atom table test app\n\n");
|
||||||
|
|
||||||
|
printf("RtlCreateAtomTable()\n");
|
||||||
|
Status = RtlCreateAtomTable(37,
|
||||||
|
&AtomTable);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf(" AtomTable %p\n", AtomTable);
|
||||||
|
|
||||||
|
printf("RtlAddAtomToAtomTable()\n");
|
||||||
|
Status = RtlAddAtomToAtomTable(AtomTable,
|
||||||
|
L"TestAtomA",
|
||||||
|
&AtomA);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf(" AtomA 0x%x\n", AtomA);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("RtlAddAtomToAtomTable()\n");
|
||||||
|
Status = RtlAddAtomToAtomTable(AtomTable,
|
||||||
|
L"TestAtomB",
|
||||||
|
&AtomB);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf(" AtomB 0x%x\n", AtomB);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("RtlLookupAtomInAtomTable()\n");
|
||||||
|
Status = RtlLookupAtomInAtomTable(AtomTable,
|
||||||
|
L"TestAtomA",
|
||||||
|
&AtomC);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf(" AtomC 0x%x\n", AtomC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printf("RtlPinAtomInAtomTable()\n");
|
||||||
|
Status = RtlPinAtomInAtomTable(AtomTable,
|
||||||
|
AtomC);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
printf("RtlPinAtomInAtomTable()\n");
|
||||||
|
Status = RtlPinAtomInAtomTable(AtomTable,
|
||||||
|
AtomC);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
|
||||||
|
// printf("RtlDeleteAtomFromAtomTable()\n");
|
||||||
|
// Status = RtlDeleteAtomFromAtomTable(AtomTable,
|
||||||
|
// AtomC);
|
||||||
|
// printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
|
||||||
|
// printf("RtlEmptyAtomTable()\n");
|
||||||
|
// Status = RtlEmptyAtomTable(AtomTable,
|
||||||
|
// TRUE);
|
||||||
|
// printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
|
||||||
|
// printf("RtlLookupAtomInAtomTable()\n");
|
||||||
|
// Status = RtlLookupAtomInAtomTable(AtomTable,
|
||||||
|
// L"TestAtomA",
|
||||||
|
// &AtomC);
|
||||||
|
// printf(" Status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
|
||||||
|
printf("RtlQueryAtomInAtomTable()\n");
|
||||||
|
NameLength = sizeof(WCHAR) * BUFFER_SIZE;
|
||||||
|
Status = RtlQueryAtomInAtomTable(AtomTable,
|
||||||
|
AtomC,
|
||||||
|
&Data1,
|
||||||
|
&Data2,
|
||||||
|
Buffer,
|
||||||
|
&NameLength);
|
||||||
|
printf(" Status 0x%08lx\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
printf(" RefCount %ld\n", Data1);
|
||||||
|
printf(" PinCount %ld\n", Data2);
|
||||||
|
printf(" NameLength %lu\n", NameLength);
|
||||||
|
printf(" AtomName: %S\n", Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("RtlDestroyAtomTable()\n");
|
||||||
|
RtlDestroyAtomTable(AtomTable);
|
||||||
|
|
||||||
|
|
||||||
|
printf("Atom table test app finished\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
22
rosapps/tests/atomtest/makefile
Normal file
22
rosapps/tests/atomtest/makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:44 sedwards Exp $
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = atomtest
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
7
rosapps/tests/stretchblt/.cvsignore
Normal file
7
rosapps/tests/stretchblt/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
31
rosapps/tests/stretchblt/makefile
Normal file
31
rosapps/tests/stretchblt/makefile
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = stretchblt
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_CPPFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = \
|
||||||
|
kernel32.a \
|
||||||
|
user32.a \
|
||||||
|
gdi32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = \
|
||||||
|
stretchblt.o
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# overide LD_CC to use g++ for linking of the executable
|
||||||
|
LD_CC = $(CXX)
|
||||||
|
|
||||||
|
# EOF
|
380
rosapps/tests/stretchblt/stretchblt.cpp
Normal file
380
rosapps/tests/stretchblt/stretchblt.cpp
Normal file
|
@ -0,0 +1,380 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 1 - Listing 1.5 (StretchBlt Zooming Demo)
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Modified by Aleksey Bragin (aleksey at studiocerebral.com)
|
||||||
|
// to support non-uniform scaling, and output via sretchdibits
|
||||||
|
// (type something in the command line to invoke this mode,
|
||||||
|
// in future it will be source BPP)
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
|
||||||
|
HWND HListBox = NULL;
|
||||||
|
HWND VListBox = NULL;
|
||||||
|
const int ID_LISTBOX = 101;
|
||||||
|
const int ID_LISTBOX2 = 102;
|
||||||
|
BOOL useDIBits=FALSE; // How to display the image - via StretchDIBits
|
||||||
|
|
||||||
|
HINSTANCE HInst;
|
||||||
|
HINSTANCE HPrevInst;
|
||||||
|
TCHAR *cmdline;
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
HInst = HInstance;
|
||||||
|
HPrevInst = HPrevInstance;
|
||||||
|
cmdline = lpCmdLine;
|
||||||
|
|
||||||
|
WNDCLASS wc;
|
||||||
|
memset(&wc, 0, sizeof(WNDCLASS));
|
||||||
|
|
||||||
|
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
|
||||||
|
wc.lpfnWndProc = MainWndProc;
|
||||||
|
wc.hInstance = HInstance;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1);
|
||||||
|
wc.lpszClassName = WndClassName;
|
||||||
|
|
||||||
|
if (RegisterClass(&wc))
|
||||||
|
{
|
||||||
|
HWND HWnd =
|
||||||
|
CreateWindow(WndClassName, TEXT("StretchBlt NonUniform Zooming Demo"),
|
||||||
|
WS_OVERLAPPEDWINDOW | WS_CAPTION |
|
||||||
|
WS_VISIBLE | WS_CLIPSIBLINGS,
|
||||||
|
0, 0, 675, 560,
|
||||||
|
NULL, NULL, HInst, NULL);
|
||||||
|
|
||||||
|
if (HWnd)
|
||||||
|
{
|
||||||
|
HListBox =
|
||||||
|
CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
|
||||||
|
LBS_NOTIFY | WS_CHILD | WS_VISIBLE,
|
||||||
|
530, 5, 130, 150, HWnd,
|
||||||
|
reinterpret_cast<HMENU>(ID_LISTBOX),
|
||||||
|
HInst, NULL);
|
||||||
|
VListBox =
|
||||||
|
CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
|
||||||
|
LBS_NOTIFY | WS_CHILD | WS_VISIBLE,
|
||||||
|
530, 5+170, 130, 150, HWnd,
|
||||||
|
reinterpret_cast<HMENU>(ID_LISTBOX2),
|
||||||
|
HInst, NULL);
|
||||||
|
|
||||||
|
if (HListBox && VListBox)
|
||||||
|
{
|
||||||
|
// horizontal zoom
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 25%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 50%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 75%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 100%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 125%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 150%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 200%"));
|
||||||
|
SNDMSG(HListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 300%"));
|
||||||
|
// vertical zoom
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 25%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 50%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 75%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 100%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 125%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 150%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 200%"));
|
||||||
|
SNDMSG(VListBox, LB_ADDSTRING, 0,
|
||||||
|
reinterpret_cast<LPARAM>("Zoom 300%"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowWindow(HWnd, nCmdShow);
|
||||||
|
UpdateWindow(HWnd);
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// image related
|
||||||
|
BITMAP bmp;
|
||||||
|
BITMAPINFO bmInfo;
|
||||||
|
char *bbits = NULL; // bitmap bits
|
||||||
|
const char* filename = "LENA.BMP";
|
||||||
|
HDC HMemDC = NULL;
|
||||||
|
HBITMAP HOldBmp = NULL;
|
||||||
|
|
||||||
|
// zooming related
|
||||||
|
float zoom_factor_h = 0.5;
|
||||||
|
float zoom_factor_v = 0.5;
|
||||||
|
RECT RDest = {5, 5, 0, 0};
|
||||||
|
enum {ID_ZOOM25, ID_ZOOM50, ID_ZOOM75, ID_ZOOM100,
|
||||||
|
ID_ZOOM125, ID_ZOOM150, ID_ZOOM200, ID_ZOOM300};
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
|
||||||
|
LPARAM LParam)
|
||||||
|
{
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
{
|
||||||
|
// check commandline
|
||||||
|
if (strlen(cmdline) != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
useDIBits = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
useDIBits = FALSE;
|
||||||
|
|
||||||
|
// create a memory DC
|
||||||
|
HMemDC = CreateCompatibleDC(NULL);
|
||||||
|
if (HMemDC)
|
||||||
|
{
|
||||||
|
// load a bitmap from file
|
||||||
|
HBITMAP HBmp =
|
||||||
|
static_cast<HBITMAP>(
|
||||||
|
LoadImage(HInst, filename, IMAGE_BITMAP,
|
||||||
|
0, 0, LR_LOADFROMFILE)
|
||||||
|
);
|
||||||
|
if (HBmp)
|
||||||
|
{
|
||||||
|
// extract dimensions of the bitmap
|
||||||
|
GetObject(HBmp, sizeof(BITMAP), &bmp);
|
||||||
|
|
||||||
|
// fill the BITMAPINFO stucture for further use by StretchDIBits
|
||||||
|
bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
|
bmInfo.bmiHeader.biWidth = bmp.bmWidth;
|
||||||
|
bmInfo.bmiHeader.biHeight = bmp.bmHeight;
|
||||||
|
bmInfo.bmiHeader.biPlanes = 1;//bmp.bmPlanes;
|
||||||
|
bmInfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
|
||||||
|
bmInfo.bmiHeader.biCompression = BI_RGB;
|
||||||
|
bmInfo.bmiHeader.biSizeImage = 0;
|
||||||
|
bmInfo.bmiHeader.biXPelsPerMeter = 0;
|
||||||
|
bmInfo.bmiHeader.biClrImportant = 0;
|
||||||
|
bmInfo.bmiHeader.biClrUsed = 0;
|
||||||
|
|
||||||
|
// associate the bitmap with the memory DC
|
||||||
|
HOldBmp = static_cast<HBITMAP>(
|
||||||
|
SelectObject(HMemDC, HBmp)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (useDIBits)
|
||||||
|
{
|
||||||
|
bbits = new char[bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8)];
|
||||||
|
//GetDIBits(HMemDC, HBmp, 0, bmp.bmHeight, bbits, &bmInfo, DIB_RGB_COLORS);
|
||||||
|
|
||||||
|
// Here goes a temp hack, since GetDIBits doesn't exist in ReactOS yet
|
||||||
|
FILE *f = fopen(filename, "rb");
|
||||||
|
BITMAPFILEHEADER bmpHeader;
|
||||||
|
|
||||||
|
fread(&bmpHeader, sizeof(BITMAPFILEHEADER), 1, f);
|
||||||
|
fread(&bmInfo, sizeof(BITMAPINFO), 1, f);
|
||||||
|
fseek(f, bmpHeader.bfOffBits, SEEK_SET);
|
||||||
|
fread(bbits, bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8), 1, f);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
if (WParam == MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) ||
|
||||||
|
WParam == MAKEWPARAM(ID_LISTBOX2, LBN_SELCHANGE))
|
||||||
|
{
|
||||||
|
switch (SNDMSG(HListBox, LB_GETCURSEL, 0, 0))
|
||||||
|
{
|
||||||
|
case ID_ZOOM25: zoom_factor_h = 0.25; break;
|
||||||
|
case ID_ZOOM50: zoom_factor_h = 0.50; break;
|
||||||
|
case ID_ZOOM75: zoom_factor_h = 0.75; break;
|
||||||
|
case ID_ZOOM100: zoom_factor_h = 1.00; break;
|
||||||
|
case ID_ZOOM125: zoom_factor_h = 1.25; break;
|
||||||
|
case ID_ZOOM150: zoom_factor_h = 1.50; break;
|
||||||
|
case ID_ZOOM200: zoom_factor_h = 2.00; break;
|
||||||
|
case ID_ZOOM300: zoom_factor_h = 3.00; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (SNDMSG(VListBox, LB_GETCURSEL, 0, 0))
|
||||||
|
{
|
||||||
|
case ID_ZOOM25: zoom_factor_v = 0.25; break;
|
||||||
|
case ID_ZOOM50: zoom_factor_v = 0.50; break;
|
||||||
|
case ID_ZOOM75: zoom_factor_v = 0.75; break;
|
||||||
|
case ID_ZOOM100: zoom_factor_v = 1.00; break;
|
||||||
|
case ID_ZOOM125: zoom_factor_v = 1.25; break;
|
||||||
|
case ID_ZOOM150: zoom_factor_v = 1.50; break;
|
||||||
|
case ID_ZOOM200: zoom_factor_v = 2.00; break;
|
||||||
|
case ID_ZOOM300: zoom_factor_v = 3.00; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the new width and height
|
||||||
|
const int new_width =
|
||||||
|
static_cast<int>(zoom_factor_h * bmp.bmWidth);
|
||||||
|
const int new_height =
|
||||||
|
static_cast<int>(zoom_factor_v * bmp.bmHeight);
|
||||||
|
|
||||||
|
// is zooming in?
|
||||||
|
bool zoom_in = (new_width > RDest.right - RDest.left);
|
||||||
|
|
||||||
|
// caculate the area that needs to be updated
|
||||||
|
RECT RUpdate = {
|
||||||
|
RDest.left, RDest.top,
|
||||||
|
RDest.left + max(new_width, RDest.right - RDest.left),
|
||||||
|
RDest.top + max(new_height, RDest.bottom - RDest.top)
|
||||||
|
};
|
||||||
|
|
||||||
|
// adjust the dimenstions of the
|
||||||
|
// destination rectangle
|
||||||
|
RDest.right = RDest.left + new_width;
|
||||||
|
RDest.bottom = RDest.top + new_height;
|
||||||
|
|
||||||
|
// create an update region from the XOR combination
|
||||||
|
// of the update and destination rectangles
|
||||||
|
HRGN HUpdateRgn = CreateRectRgnIndirect(&RUpdate);
|
||||||
|
HRGN HDestRgn = CreateRectRgnIndirect(&RDest);
|
||||||
|
int result =
|
||||||
|
CombineRgn(HUpdateRgn, HUpdateRgn, HDestRgn, RGN_XOR);
|
||||||
|
|
||||||
|
// incite a repaint
|
||||||
|
if (result != NULLREGION && result != ERROR)
|
||||||
|
{
|
||||||
|
InvalidateRgn(HWnd, HUpdateRgn, true);
|
||||||
|
RedrawWindow(HWnd, &RDest, NULL, RDW_NOERASE | RDW_INVALIDATE);
|
||||||
|
}
|
||||||
|
else if (result == NULLREGION)
|
||||||
|
{
|
||||||
|
InvalidateRect(HWnd, &RUpdate, zoom_in ? false : true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
DeleteObject(HUpdateRgn);
|
||||||
|
DeleteObject(HDestRgn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
const HDC Hdc = BeginPaint(HWnd, &ps);
|
||||||
|
#if 0
|
||||||
|
try
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// TODO: add palette support (see Chapter 9)...
|
||||||
|
//
|
||||||
|
if (useDIBits)
|
||||||
|
{
|
||||||
|
if (RDest.right - RDest.left > 0)
|
||||||
|
{
|
||||||
|
if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0)
|
||||||
|
{
|
||||||
|
SetStretchBltMode(Hdc, COLORONCOLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
// render the zoomed image
|
||||||
|
StretchDIBits(Hdc, RDest.left, RDest.top,
|
||||||
|
RDest.right - RDest.left,
|
||||||
|
RDest.bottom - RDest.top,
|
||||||
|
0, 0,
|
||||||
|
bmp.bmWidth, bmp.bmHeight,
|
||||||
|
bbits, &bmInfo,
|
||||||
|
DIB_RGB_COLORS,
|
||||||
|
SRCCOPY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (RDest.right - RDest.left > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
// use BitBlt when not zooming
|
||||||
|
if (zoom_factor_h == 1.0 && zoom_factor_v == 1.0)
|
||||||
|
{
|
||||||
|
BitBlt(Hdc, RDest.left, RDest.top,
|
||||||
|
RDest.right - RDest.left,
|
||||||
|
RDest.bottom - RDest.top,
|
||||||
|
HMemDC, 0, 0,
|
||||||
|
SRCCOPY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0)
|
||||||
|
{
|
||||||
|
SetStretchBltMode(Hdc, COLORONCOLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
// render the zoomed image
|
||||||
|
StretchBlt(Hdc, RDest.left, RDest.top,
|
||||||
|
RDest.right - RDest.left,
|
||||||
|
RDest.bottom - RDest.top,
|
||||||
|
HMemDC, 0, 0,
|
||||||
|
bmp.bmWidth, bmp.bmHeight,
|
||||||
|
SRCCOPY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
catch (...)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
EndPaint(HWnd, &ps);
|
||||||
|
}
|
||||||
|
EndPaint(HWnd, &ps);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
// clean up
|
||||||
|
DeleteObject(SelectObject(HMemDC, HOldBmp));
|
||||||
|
DeleteDC(HMemDC);
|
||||||
|
|
||||||
|
if (bbits)
|
||||||
|
delete bbits;
|
||||||
|
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(HWnd, Msg, WParam, LParam);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
7
rosapps/tests/subclass/.cvsignore
Normal file
7
rosapps/tests/subclass/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/subclass/makefile
Normal file
23
rosapps/tests/subclass/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = subclass
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = kernel32.a gdi32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS += -D_DISABLE_TIDENTS -Werror -Wall
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
173
rosapps/tests/subclass/subclass.c
Normal file
173
rosapps/tests/subclass/subclass.c
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
LRESULT WINAPI UnicodeWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
LRESULT WINAPI UnicodeSubclassProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
LRESULT WINAPI AnsiSubclassProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
|
||||||
|
static WNDPROC SavedWndProcW;
|
||||||
|
static WNDPROC SavedWndProcA;
|
||||||
|
|
||||||
|
int WINAPI
|
||||||
|
WinMain(HINSTANCE hInstance,
|
||||||
|
HINSTANCE hPrevInstance,
|
||||||
|
LPSTR lpszCmdLine,
|
||||||
|
int nCmdShow)
|
||||||
|
{
|
||||||
|
WNDCLASSW wc;
|
||||||
|
MSG msg;
|
||||||
|
HWND hWnd;
|
||||||
|
WCHAR WindowTextW[256];
|
||||||
|
char WindowTextA[256];
|
||||||
|
|
||||||
|
wc.lpszClassName = L"UnicodeClass";
|
||||||
|
wc.lpfnWndProc = UnicodeWndProc;
|
||||||
|
wc.style = 0;
|
||||||
|
wc.hInstance = hInstance;
|
||||||
|
wc.hIcon = NULL;
|
||||||
|
wc.hCursor = NULL;
|
||||||
|
wc.hbrBackground = NULL;
|
||||||
|
wc.lpszMenuName = NULL;
|
||||||
|
wc.cbClsExtra = 0;
|
||||||
|
wc.cbWndExtra = 0;
|
||||||
|
if (RegisterClassW(&wc) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "RegisterClassW failed (last error 0x%X)\n",
|
||||||
|
GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("Unicode class registered, WndProc = 0x%08x\n", wc.lpfnWndProc);
|
||||||
|
|
||||||
|
hWnd = CreateWindowA("UnicodeClass",
|
||||||
|
"Unicode Window",
|
||||||
|
WS_OVERLAPPEDWINDOW,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
hInstance,
|
||||||
|
NULL);
|
||||||
|
if (hWnd == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "CreateWindowA failed (last error 0x%X)\n",
|
||||||
|
GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Window created, IsWindowUnicode returns %s\n", IsWindowUnicode(hWnd) ? "TRUE" : "FALSE");
|
||||||
|
|
||||||
|
printf("Calling GetWindowTextW\n");
|
||||||
|
if (! GetWindowTextW(hWnd, WindowTextW, sizeof(WindowTextW) / sizeof(WindowTextW[0])))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GetWindowTextW failed (last error 0x%X)\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("GetWindowTextW returned Unicode string \"%S\"\n", WindowTextW);
|
||||||
|
|
||||||
|
printf("Calling GetWindowTextA\n");
|
||||||
|
if (! GetWindowTextA(hWnd, WindowTextA, sizeof(WindowTextA) / sizeof(WindowTextA[0])))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GetWindowTextA failed (last error 0x%X)\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("GetWindowTextA returned Ansi string \"%s\"\n", WindowTextA);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
SavedWndProcW = (WNDPROC) GetWindowLongW(hWnd, GWL_WNDPROC);
|
||||||
|
printf("GetWindowLongW returned 0x%08x\n", SavedWndProcW);
|
||||||
|
SavedWndProcA = (WNDPROC) GetWindowLongA(hWnd, GWL_WNDPROC);
|
||||||
|
printf("GetWindowLongA returned 0x%08x\n", SavedWndProcA);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Subclassing window using SetWindowLongW, new WndProc 0x%08x\n", UnicodeSubclassProc);
|
||||||
|
SetWindowLongW(hWnd, GWL_WNDPROC, (LONG) UnicodeSubclassProc);
|
||||||
|
printf("After subclass, IsWindowUnicode %s, WndProcA 0x%08x, WndProcW 0x%08x\n",
|
||||||
|
IsWindowUnicode(hWnd) ? "TRUE" : "FALSE", GetWindowLongA(hWnd, GWL_WNDPROC),
|
||||||
|
GetWindowLongW(hWnd, GWL_WNDPROC));
|
||||||
|
|
||||||
|
printf("Calling GetWindowTextW\n");
|
||||||
|
if (! GetWindowTextW(hWnd, WindowTextW, sizeof(WindowTextW) / sizeof(WindowTextW[0])))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GetWindowTextW failed (last error 0x%X)\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("GetWindowTextW returned Unicode string \"%S\"\n", WindowTextW);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
printf("Subclassing window using SetWindowLongA, new WndProc 0x%08x\n", AnsiSubclassProc);
|
||||||
|
SetWindowLongA(hWnd, GWL_WNDPROC, (LONG) AnsiSubclassProc);
|
||||||
|
printf("After subclass, IsWindowUnicode %s, WndProcA 0x%08x, WndProcW 0x%08x\n",
|
||||||
|
IsWindowUnicode(hWnd) ? "TRUE" : "FALSE", GetWindowLongA(hWnd, GWL_WNDPROC),
|
||||||
|
GetWindowLongW(hWnd, GWL_WNDPROC));
|
||||||
|
|
||||||
|
printf("Calling GetWindowTextW\n");
|
||||||
|
if (! GetWindowTextW(hWnd, WindowTextW, sizeof(WindowTextW) / sizeof(WindowTextW[0])))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GetWindowTextW failed (last error 0x%X)\n", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("GetWindowTextW returned Unicode string \"%S\"\n", WindowTextW);
|
||||||
|
|
||||||
|
DestroyWindow(hWnd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK UnicodeWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case WM_GETTEXT:
|
||||||
|
printf("UnicodeWndProc calling DefWindowProcW\n");
|
||||||
|
Result = DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||||
|
printf("UnicodeWndProc Unicode window text \"%S\"\n", (LPWSTR) lParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Result = DefWindowProcW(hWnd, msg, wParam, lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK UnicodeSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case WM_GETTEXT:
|
||||||
|
printf("UnicodeSubclassProc calling SavedWindowProc\n");
|
||||||
|
Result = CallWindowProcW(SavedWndProcW, hWnd, msg, wParam, lParam);
|
||||||
|
printf("UnicodeSubclassProc Unicode window text \"%S\"\n", (LPWSTR) lParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Result = CallWindowProcW(SavedWndProcW, hWnd, msg, wParam, lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CALLBACK AnsiSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case WM_GETTEXT:
|
||||||
|
printf("AnsiSubclassProc calling SavedWindowProcA\n");
|
||||||
|
Result = CallWindowProcA(SavedWndProcA, hWnd, msg, wParam, lParam);
|
||||||
|
printf("AnsiSubclassProc Ansi window text \"%s\"\n", (LPSTR) lParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Result = CallWindowProcA(SavedWndProcA, hWnd, msg, wParam, lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
7
rosapps/tests/suspend/.cvsignore
Normal file
7
rosapps/tests/suspend/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
21
rosapps/tests/suspend/Makefile
Normal file
21
rosapps/tests/suspend/Makefile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# $Id: Makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = suspend
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
74
rosapps/tests/suspend/suspend.c
Normal file
74
rosapps/tests/suspend/suspend.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#define UNICODE
|
||||||
|
|
||||||
|
#define NTOS_MODE_USER
|
||||||
|
#include <ntos.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define DBG
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
static volatile DWORD z;
|
||||||
|
static volatile DWORD x=0;
|
||||||
|
|
||||||
|
static NTSTATUS STDCALL
|
||||||
|
thread_1(PVOID Param)
|
||||||
|
{
|
||||||
|
DWORD y=0;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
z++;
|
||||||
|
if(x>50)
|
||||||
|
{
|
||||||
|
printf("I should have been suspended for years :-)\n");
|
||||||
|
Sleep(100);
|
||||||
|
x=0;y++;
|
||||||
|
if(y==3) ExitProcess(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
HANDLE thread;
|
||||||
|
DWORD thread_id;
|
||||||
|
CONTEXT context;
|
||||||
|
|
||||||
|
context.ContextFlags=CONTEXT_CONTROL;
|
||||||
|
|
||||||
|
z=0;
|
||||||
|
thread=CreateThread(NULL,
|
||||||
|
0x1000,
|
||||||
|
(LPTHREAD_START_ROUTINE)thread_1,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&thread_id);
|
||||||
|
|
||||||
|
if(!thread)
|
||||||
|
{
|
||||||
|
printf("Error: could not create thread ...\n");
|
||||||
|
ExitProcess(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
|
||||||
|
SuspendThread(thread);
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
printf("%lx ", z);
|
||||||
|
Sleep(100);x++;
|
||||||
|
if(x>100 && GetThreadContext(thread, &context))
|
||||||
|
{
|
||||||
|
printf("EIP: %lx\n", context.Eip);
|
||||||
|
printf("Calling resumethread ... \n");
|
||||||
|
ResumeThread(thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExitProcess(0);
|
||||||
|
return(0);
|
||||||
|
}
|
7
rosapps/tests/tcpsvr/.cvsignore
Normal file
7
rosapps/tests/tcpsvr/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/tcpsvr/makefile
Normal file
23
rosapps/tests/tcpsvr/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = tcpsvr
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = kernel32.a ws2_32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -D__USE_W32API -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
175
rosapps/tests/tcpsvr/tcpsvr.c
Normal file
175
rosapps/tests/tcpsvr/tcpsvr.c
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
/* tcpServer.c
|
||||||
|
*
|
||||||
|
* Simple Winsock TCP server test.
|
||||||
|
* Later will be used as base for ReactOS telnetd
|
||||||
|
*
|
||||||
|
* HISTORY:
|
||||||
|
* 6-15-02 - Added Winsock support to UNIX tcp test
|
||||||
|
* 6-16-02 - Removed Unix support
|
||||||
|
* 6-17-02 - Added extra comments to code
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#undef ERROR
|
||||||
|
#define SUCCESS 0
|
||||||
|
#define ERROR 1
|
||||||
|
|
||||||
|
#define END_LINE 0x0A
|
||||||
|
#define SERVER_PORT 23
|
||||||
|
#define MAX_MSG 100
|
||||||
|
|
||||||
|
/* function readline */
|
||||||
|
int read_line();
|
||||||
|
|
||||||
|
int main (int argc, char *argv[]) {
|
||||||
|
|
||||||
|
WORD wVersionRequested;
|
||||||
|
WSADATA WsaData;
|
||||||
|
INT Status;
|
||||||
|
int sd, newSd, cliLen;
|
||||||
|
|
||||||
|
struct sockaddr_in cliAddr, servAddr;
|
||||||
|
char line[MAX_MSG];
|
||||||
|
|
||||||
|
wVersionRequested = MAKEWORD(2, 2);
|
||||||
|
|
||||||
|
Status = WSAStartup(wVersionRequested, &WsaData);
|
||||||
|
if (Status != 0) {
|
||||||
|
printf("Could not initialize winsock dll.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create socket */
|
||||||
|
sd = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if(sd<0) {
|
||||||
|
perror("cannot open socket ");
|
||||||
|
WSACleanup();
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bind server port */
|
||||||
|
servAddr.sin_family = AF_INET;
|
||||||
|
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
servAddr.sin_port = htons(SERVER_PORT);
|
||||||
|
|
||||||
|
if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
|
||||||
|
perror("cannot bind port ");
|
||||||
|
WSACleanup();
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen(sd,5);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
|
||||||
|
printf("%s: \n"
|
||||||
|
"To start test, Please telnet to localhost (127.0.0.1) port 23 \n"
|
||||||
|
"When connected input raw data followed by End of Line\n"
|
||||||
|
"Test is now running on TCP port %u\n",argv[0],SERVER_PORT);
|
||||||
|
|
||||||
|
cliLen = sizeof(cliAddr);
|
||||||
|
newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen);
|
||||||
|
if(newSd<0) {
|
||||||
|
perror("cannot accept connection ");
|
||||||
|
WSACleanup();
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* init line */
|
||||||
|
memset(line,0x0,MAX_MSG);
|
||||||
|
|
||||||
|
/* receive segments */
|
||||||
|
while(read_line(newSd,line)!=ERROR) {
|
||||||
|
|
||||||
|
printf("%s: received from %s:TCP%d : %s\n", argv[0],
|
||||||
|
inet_ntoa(cliAddr.sin_addr),
|
||||||
|
ntohs(cliAddr.sin_port), line);
|
||||||
|
/* init line */
|
||||||
|
memset(line,0x0,MAX_MSG);
|
||||||
|
|
||||||
|
} /* while(read_line) */
|
||||||
|
|
||||||
|
} /* while (1) */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING */
|
||||||
|
/* this function is experimental.. I don't know yet if it works */
|
||||||
|
/* correctly or not. Use Steven's readline() function to have */
|
||||||
|
/* something robust. */
|
||||||
|
/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING */
|
||||||
|
|
||||||
|
/* rcv_line is my function readline(). Data is read from the socket when */
|
||||||
|
/* needed, but not byte after bytes. All the received data is read. */
|
||||||
|
/* This means only one call to recv(), instead of one call for */
|
||||||
|
/* each received byte. */
|
||||||
|
/* You can set END_CHAR to whatever means endofline for you. (0x0A is \n)*/
|
||||||
|
/* read_lin returns the number of bytes returned in line_to_return */
|
||||||
|
int read_line(int newSd, char *line_to_return) {
|
||||||
|
|
||||||
|
static int rcv_ptr=0;
|
||||||
|
static char rcv_msg[MAX_MSG];
|
||||||
|
static int n;
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
offset=0;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
if(rcv_ptr==0) {
|
||||||
|
/* read data from socket */
|
||||||
|
memset(rcv_msg,0x0,MAX_MSG); /* init buffer */
|
||||||
|
n = recv(newSd, rcv_msg, MAX_MSG, 0); /* wait for data */
|
||||||
|
if (n<0) {
|
||||||
|
perror(" cannot receive data ");
|
||||||
|
return ERROR;
|
||||||
|
} else if (n==0) {
|
||||||
|
printf(" connection closed by client\n");
|
||||||
|
close(newSd);
|
||||||
|
WSACleanup();
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if new data read on socket */
|
||||||
|
/* OR */
|
||||||
|
/* if another line is still in buffer */
|
||||||
|
|
||||||
|
/* copy line into 'line_to_return' */
|
||||||
|
while(*(rcv_msg+rcv_ptr)!=END_LINE && rcv_ptr<n) {
|
||||||
|
memcpy(line_to_return+offset,rcv_msg+rcv_ptr,1);
|
||||||
|
offset++;
|
||||||
|
rcv_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of line + end of buffer => return line */
|
||||||
|
if(rcv_ptr==n-1) {
|
||||||
|
/* set last byte to END_LINE */
|
||||||
|
*(line_to_return+offset)=END_LINE;
|
||||||
|
rcv_ptr=0;
|
||||||
|
return ++offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of line but still some data in buffer => return line */
|
||||||
|
if(rcv_ptr <n-1) {
|
||||||
|
/* set last byte to END_LINE */
|
||||||
|
*(line_to_return+offset)=END_LINE;
|
||||||
|
rcv_ptr++;
|
||||||
|
return ++offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of buffer but line is not ended => */
|
||||||
|
/* wait for more data to arrive on socket */
|
||||||
|
if(rcv_ptr == n) {
|
||||||
|
rcv_ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* while */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
7
rosapps/tests/terminate/.cvsignore
Normal file
7
rosapps/tests/terminate/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
21
rosapps/tests/terminate/Makefile
Normal file
21
rosapps/tests/terminate/Makefile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# $Id: Makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = terminate
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
76
rosapps/tests/terminate/terminate.c
Normal file
76
rosapps/tests/terminate/terminate.c
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
#define UNICODE
|
||||||
|
|
||||||
|
#define NTOS_MODE_USER
|
||||||
|
#include <ntos.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define DBG
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
static volatile DWORD z;
|
||||||
|
static volatile DWORD x=0;
|
||||||
|
|
||||||
|
static NTSTATUS STDCALL
|
||||||
|
thread_1(PVOID Param)
|
||||||
|
{
|
||||||
|
DWORD y=0;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
z++;
|
||||||
|
if(x>50)
|
||||||
|
{
|
||||||
|
Sleep(100);
|
||||||
|
x=0;y++;
|
||||||
|
if(y==3) return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
HANDLE thread;
|
||||||
|
DWORD thread_id;
|
||||||
|
CONTEXT context;
|
||||||
|
DWORD z = 0;
|
||||||
|
|
||||||
|
context.ContextFlags=CONTEXT_CONTROL;
|
||||||
|
|
||||||
|
while (z < 50)
|
||||||
|
{
|
||||||
|
z++;
|
||||||
|
thread=CreateThread(NULL,
|
||||||
|
0x1000,
|
||||||
|
(LPTHREAD_START_ROUTINE)thread_1,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&thread_id);
|
||||||
|
|
||||||
|
if(!thread)
|
||||||
|
{
|
||||||
|
printf("Error: could not create thread ...\n");
|
||||||
|
ExitProcess(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sleep(1000);
|
||||||
|
|
||||||
|
printf("T");
|
||||||
|
if ((z % 5) == 0)
|
||||||
|
{
|
||||||
|
TerminateThread(thread, 0);
|
||||||
|
}
|
||||||
|
printf("C");
|
||||||
|
GetThreadContext(thread, &context);
|
||||||
|
printf("S");
|
||||||
|
SuspendThread(thread);
|
||||||
|
printf("R");
|
||||||
|
ResumeThread(thread);
|
||||||
|
TerminateThread(thread, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExitProcess(0);
|
||||||
|
return(0);
|
||||||
|
}
|
7
rosapps/tests/thread/.cvsignore
Normal file
7
rosapps/tests/thread/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/thread/makefile
Normal file
23
rosapps/tests/thread/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = thread
|
||||||
|
|
||||||
|
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
|
88
rosapps/tests/thread/thread.c
Normal file
88
rosapps/tests/thread/thread.c
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/* $Id: thread.c,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define NR_THREADS (10)
|
||||||
|
|
||||||
|
ULONG nr;
|
||||||
|
|
||||||
|
DWORD WINAPI thread_main1(LPVOID param)
|
||||||
|
{
|
||||||
|
ULONG s;
|
||||||
|
|
||||||
|
printf("Thread %ld running\n", (DWORD)param);
|
||||||
|
s = nr = ((nr * 1103515245) + 12345) & 0x7fffffff;
|
||||||
|
s = s % 10;
|
||||||
|
printf("s %ld\n", s);
|
||||||
|
Sleep(s);
|
||||||
|
printf("Thread %ld finished\n", (DWORD)param);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shows the help on how to use these program to the user
|
||||||
|
void showHelp(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
printf("\nReactOS threads test program (built on %s).\n\n", __DATE__);
|
||||||
|
printf("syntax:\tthread.exe <seed>\n");
|
||||||
|
printf("\twhere <seed> is an integer number\n");
|
||||||
|
printf("\texample: thread.exe 100\n");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char* argv[])
|
||||||
|
{
|
||||||
|
DWORD i=0;
|
||||||
|
DWORD id;
|
||||||
|
ULONG nr;
|
||||||
|
HANDLE ThreadHandle[NR_THREADS];
|
||||||
|
|
||||||
|
// The user must supply one argument (the seed). if he/she doesn't
|
||||||
|
// then we show the help.
|
||||||
|
// if(argc < 2) {
|
||||||
|
// showHelp();
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// nr = atoi(argv[1]);
|
||||||
|
nr = 500;
|
||||||
|
printf("Seed %ld\n", nr);
|
||||||
|
|
||||||
|
printf("Creating %d threads...\n",NR_THREADS*2);
|
||||||
|
for (i=0;i<NR_THREADS;i++)
|
||||||
|
{
|
||||||
|
ThreadHandle[i] = CreateThread(NULL,
|
||||||
|
0,
|
||||||
|
thread_main1,
|
||||||
|
(LPVOID)i,
|
||||||
|
CREATE_SUSPENDED,
|
||||||
|
&id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0;i<NR_THREADS;i++)
|
||||||
|
{
|
||||||
|
ResumeThread(ThreadHandle[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0;i<NR_THREADS;i++)
|
||||||
|
{
|
||||||
|
SuspendThread(ThreadHandle[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0;i<NR_THREADS;i++)
|
||||||
|
{
|
||||||
|
ResumeThread(ThreadHandle[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("All threads created...\n");
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/thread_msg/.cvsignore
Normal file
7
rosapps/tests/thread_msg/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/thread_msg/makefile
Normal file
23
rosapps/tests/thread_msg/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = thread_msg
|
||||||
|
|
||||||
|
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
|
97
rosapps/tests/thread_msg/thread_msg.c
Normal file
97
rosapps/tests/thread_msg/thread_msg.c
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/**
|
||||||
|
* Test case for PostThreadMessage
|
||||||
|
* (C) 2003 ReactOS
|
||||||
|
* License: LGPL
|
||||||
|
* See: LGPL.txt in top directory.
|
||||||
|
* Author: arty
|
||||||
|
*
|
||||||
|
* Windows thread message queue test case.
|
||||||
|
* Derived from ../event/event.c in part.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
HANDLE hWaitForFailure;
|
||||||
|
HANDLE hOkToPostThreadMessage;
|
||||||
|
HANDLE hOkToTerminate;
|
||||||
|
|
||||||
|
DWORD WINAPI thread( LPVOID crap )
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
|
/* Failure case ... Wait for the parent to try to post a message
|
||||||
|
before queue creation */
|
||||||
|
printf( "Waiting to create the message queue.\n" );
|
||||||
|
|
||||||
|
WaitForSingleObject(hWaitForFailure,INFINITE);
|
||||||
|
|
||||||
|
printf( "Creating message queue.\n" );
|
||||||
|
|
||||||
|
/* "Create" a message queue */
|
||||||
|
PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
|
||||||
|
|
||||||
|
printf( "Signalling the parent that we're ready.\n" );
|
||||||
|
|
||||||
|
/* Signal that it's ok to post */
|
||||||
|
SetEvent( hOkToPostThreadMessage );
|
||||||
|
|
||||||
|
printf( "Listening messages.\n" );
|
||||||
|
|
||||||
|
/* Now read some messages */
|
||||||
|
while( GetMessage( &msg, 0,0,0 ) ) {
|
||||||
|
printf( "Received message: %04x %04x %08lx\n",
|
||||||
|
(msg.message & 0xffff),
|
||||||
|
(msg.wParam & 0xffff),
|
||||||
|
msg.lParam );
|
||||||
|
assert( !msg.hwnd );
|
||||||
|
}
|
||||||
|
|
||||||
|
printf( "Finished receiving messages.\n" );
|
||||||
|
SetEvent( hOkToTerminate );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
DWORD id;
|
||||||
|
|
||||||
|
printf( "Creating events\n" );
|
||||||
|
|
||||||
|
hOkToPostThreadMessage = CreateEvent( NULL, FALSE, FALSE, NULL );
|
||||||
|
hOkToTerminate = CreateEvent( NULL, FALSE, FALSE, NULL );
|
||||||
|
hWaitForFailure = CreateEvent( NULL, FALSE, FALSE, NULL );
|
||||||
|
|
||||||
|
printf( "Created events\n" );
|
||||||
|
|
||||||
|
if( CreateThread( 0, 0, thread, 0, 0, &id ) == NULL ) {
|
||||||
|
printf( "Couldn't create one thread.\n" );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf( "Posting to non-existent queue\n" );
|
||||||
|
|
||||||
|
/* Check failure case */
|
||||||
|
assert( PostThreadMessage( id, WM_USER + 0, 1, 2 ) == FALSE );
|
||||||
|
|
||||||
|
printf( "Signalling thread to advance.\n" );
|
||||||
|
|
||||||
|
SetEvent( hWaitForFailure );
|
||||||
|
|
||||||
|
printf( "Waiting for signal from thread.\n" );
|
||||||
|
WaitForSingleObject( hOkToPostThreadMessage, INFINITE );
|
||||||
|
|
||||||
|
printf( "Sending three messages, then quit.\n" );
|
||||||
|
assert( PostThreadMessage( id, WM_USER + 0, 1, 2 ) );
|
||||||
|
assert( PostThreadMessage( id, WM_USER + 1, 3, 4 ) );
|
||||||
|
Sleep( 500 ); /* Sleep a bit, so that the queue is empty for a bit. */
|
||||||
|
assert( PostThreadMessage( id, WM_USER + 2, 5, 6 ) );
|
||||||
|
assert( PostThreadMessage( id, WM_QUIT, 0,0 ) );
|
||||||
|
|
||||||
|
WaitForSingleObject( hOkToTerminate, INFINITE );
|
||||||
|
printf( "Test complete.\n" );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/threadwait/.cvsignore
Normal file
7
rosapps/tests/threadwait/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/threadwait/makefile
Normal file
23
rosapps/tests/threadwait/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = threadwait
|
||||||
|
|
||||||
|
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
|
31
rosapps/tests/threadwait/threadwait.c
Normal file
31
rosapps/tests/threadwait/threadwait.c
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Author: Skywing (skywing@valhallalegends.com)
|
||||||
|
* Date: 09/09/2003
|
||||||
|
* Purpose: Probe for PsUnblockThread crash due to double-acquire spin lock.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
DWORD __stdcall threadfunc(void* UNREFERENCED)
|
||||||
|
{
|
||||||
|
printf("Thread: Initialized\n");
|
||||||
|
Sleep(2500);
|
||||||
|
printf("Thread: Terminating...\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int ac, char **av)
|
||||||
|
{
|
||||||
|
DWORD id;
|
||||||
|
HANDLE Thread;
|
||||||
|
|
||||||
|
Thread = CreateThread(0, 0, threadfunc, 0, 0, &id);
|
||||||
|
printf("Main: ThreadId for new thread is %08lx\n", id);
|
||||||
|
printf("Main: Waiting on thread...\n");
|
||||||
|
WaitForSingleObject(Thread, INFINITE);
|
||||||
|
printf("Main: OK, somebody fixed the PsUnblockThread spinlock double-acquire crash\n");
|
||||||
|
NtClose(Thread);
|
||||||
|
printf("Main: Terminating...\n");
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/tmrqueue/.cvsignore
Normal file
7
rosapps/tests/tmrqueue/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/tmrqueue/makefile
Normal file
23
rosapps/tests/tmrqueue/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:45 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = tmrqueue
|
||||||
|
|
||||||
|
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
|
365
rosapps/tests/tmrqueue/tmrqueue.c
Normal file
365
rosapps/tests/tmrqueue/tmrqueue.c
Normal file
|
@ -0,0 +1,365 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
|
||||||
|
#define N_TIMEOUT 3
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct _TEST *PTEST;
|
||||||
|
|
||||||
|
typedef VOID (*PFNTEST)(PTEST Test, HANDLE hEvent);
|
||||||
|
|
||||||
|
typedef struct _TEST
|
||||||
|
{
|
||||||
|
TCHAR *description;
|
||||||
|
BOOL Result;
|
||||||
|
PFNTEST Routine;
|
||||||
|
int id;
|
||||||
|
} TEST;
|
||||||
|
|
||||||
|
static TEST Tests[3];
|
||||||
|
|
||||||
|
VOID RunTests(VOID)
|
||||||
|
{
|
||||||
|
int i, nTests;
|
||||||
|
static HANDLE hEvent;
|
||||||
|
|
||||||
|
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if(hEvent == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Unable to create event!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nTests = sizeof(Tests) / sizeof(TEST);
|
||||||
|
|
||||||
|
for(i = 0; i < nTests; i++)
|
||||||
|
{
|
||||||
|
Tests[i].id = i + 1;
|
||||||
|
|
||||||
|
if(Tests[i].Routine == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("+++ TEST %d: %s\n"), Tests[i].id, Tests[i].description);
|
||||||
|
|
||||||
|
Tests[i].Routine(&Tests[i], hEvent);
|
||||||
|
|
||||||
|
WaitForSingleObject(hEvent, INFINITE);
|
||||||
|
|
||||||
|
_tprintf(_T("\n\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(hEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID PrintTestResults(VOID)
|
||||||
|
{
|
||||||
|
int i, nTests, nsuccess = 0, nfailed = 0;
|
||||||
|
TCHAR *status;
|
||||||
|
|
||||||
|
nTests = sizeof(Tests) / sizeof(TEST);
|
||||||
|
|
||||||
|
for(i = 0; i < nTests; i++)
|
||||||
|
{
|
||||||
|
if(Tests[i].Routine == NULL)
|
||||||
|
{
|
||||||
|
status = _T("SKIPPED");
|
||||||
|
}
|
||||||
|
else if(Tests[i].Result == TRUE)
|
||||||
|
{
|
||||||
|
status = _T("SUCCESS");
|
||||||
|
nsuccess++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = _T("FAILED ");
|
||||||
|
nfailed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("Test %d: %s %s\n"), i, status, Tests[i].description);
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("\nTests succeeded: %d, failed: %d\n"), nsuccess, nfailed);
|
||||||
|
if(nfailed == 0)
|
||||||
|
{
|
||||||
|
_tprintf(_T(" ALL TESTS SUCCESSFUL!\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
typedef struct _TESTINFO
|
||||||
|
{
|
||||||
|
PTEST Test;
|
||||||
|
int secsleft;
|
||||||
|
HANDLE hTimer;
|
||||||
|
HANDLE hEvent;
|
||||||
|
/* additional stuff */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* nothing */
|
||||||
|
} Test1;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
HANDLE hWaitEvent;
|
||||||
|
} Test2;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
HANDLE hWaitEvent;
|
||||||
|
HANDLE hNotification;
|
||||||
|
} Test3;
|
||||||
|
};
|
||||||
|
} TESTINFO, *PTESTINFO;
|
||||||
|
|
||||||
|
VOID CALLBACK TimerCallback1(PVOID Param, BOOLEAN Fired)
|
||||||
|
{
|
||||||
|
PTESTINFO Info = (PTESTINFO)Param;
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]TimerCallback(0x%x, %d) called (%d)\n"), (int)Info->Test->id, (int)Info->hTimer, (int)Fired, --Info->secsleft);
|
||||||
|
|
||||||
|
if(Info->secsleft == 0)
|
||||||
|
{
|
||||||
|
BOOL stat;
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]Timout finished, delete timer queue..."), (int)Info->Test->id);
|
||||||
|
stat = DeleteTimerQueueTimer(NULL, Info->hTimer, NULL);
|
||||||
|
if(stat)
|
||||||
|
_tprintf(_T("returned OK -> test FAILED!\n"));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int error = GetLastError();
|
||||||
|
|
||||||
|
switch(error)
|
||||||
|
{
|
||||||
|
case ERROR_IO_PENDING:
|
||||||
|
_tprintf(_T("OK, Overlapped I/O operation in progress\n"));
|
||||||
|
/* this test is only successful in this case */
|
||||||
|
Info->Test->Result = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_tprintf(_T("Failed, LastError: %d\n"), (int)GetLastError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set the event to continue tests */
|
||||||
|
SetEvent(Info->hEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID Test1(PTEST Test, HANDLE hEvent)
|
||||||
|
{
|
||||||
|
static TESTINFO Info;
|
||||||
|
|
||||||
|
Info.Test = Test;
|
||||||
|
Info.hEvent = hEvent;
|
||||||
|
Info.secsleft = N_TIMEOUT;
|
||||||
|
|
||||||
|
if(!CreateTimerQueueTimer(&Info.hTimer, NULL, TimerCallback1, &Info, 1000, 1000, 0))
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() failed, LastError: %d!"), (int)Info.Test->id, (int)GetLastError());
|
||||||
|
/* we failed, set the event to continue tests */
|
||||||
|
SetEvent(hEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() created timer 0x%x, countdown (%d sec)...\n"), (int)Info.Test->id, (int)Info.hTimer, (int)Info.secsleft);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
VOID CALLBACK TimerCallback2(PVOID Param, BOOLEAN Fired)
|
||||||
|
{
|
||||||
|
PTESTINFO Info = (PTESTINFO)Param;
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]TimerCallback(0x%x, %d) called (%d)\n"), (int)Info->Test->id, (int)Info->hTimer, (int)Fired, --Info->secsleft);
|
||||||
|
|
||||||
|
if(Info->secsleft == 0)
|
||||||
|
{
|
||||||
|
/* set the event to continue tests */
|
||||||
|
SetEvent(Info->Test2.hWaitEvent);
|
||||||
|
|
||||||
|
/* sleep a bit */
|
||||||
|
Sleep(1500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID Test2(PTEST Test, HANDLE hEvent)
|
||||||
|
{
|
||||||
|
static TESTINFO Info;
|
||||||
|
BOOL stat;
|
||||||
|
|
||||||
|
Info.Test = Test;
|
||||||
|
Info.hEvent = hEvent;
|
||||||
|
Info.secsleft = N_TIMEOUT;
|
||||||
|
|
||||||
|
Info.Test2.hWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if(Info.Test2.hWaitEvent == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]Unable to create event!\n"), (int)Info.Test->id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!CreateTimerQueueTimer(&Info.hTimer, NULL, TimerCallback2, &Info, 1000, 1000, 0))
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() failed, LastError: %d!"), (int)Info.Test->id, (int)GetLastError());
|
||||||
|
|
||||||
|
CloseHandle(Info.Test2.hWaitEvent);
|
||||||
|
/* we failed, set the event to continue tests */
|
||||||
|
SetEvent(hEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() created timer 0x%x, countdown (%d sec)...\n"), (int)Test->id, (int)Info.hTimer, (int)Info.secsleft);
|
||||||
|
|
||||||
|
WaitForSingleObject(Info.Test2.hWaitEvent, INFINITE);
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]Timout finished, delete timer queue..."), (int)Test->id);
|
||||||
|
stat = DeleteTimerQueueTimer(NULL, Info.hTimer, INVALID_HANDLE_VALUE);
|
||||||
|
if(stat)
|
||||||
|
{
|
||||||
|
_tprintf(_T("OK\n"));
|
||||||
|
/* this test is only successful in this case */
|
||||||
|
Test->Result = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int error = GetLastError();
|
||||||
|
|
||||||
|
switch(error)
|
||||||
|
{
|
||||||
|
case ERROR_IO_PENDING:
|
||||||
|
_tprintf(_T("FAILED, Overlapped I/O operation in progress\n"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_tprintf(_T("Failed, LastError: %d\n"), (int)GetLastError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetEvent(Info.hEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
VOID CALLBACK TimerCallback3(PVOID Param, BOOLEAN Fired)
|
||||||
|
{
|
||||||
|
PTESTINFO Info = (PTESTINFO)Param;
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]TimerCallback(0x%x, %d) called (%d)\n"), (int)Info->Test->id, (int)Info->hTimer, (int)Fired, --Info->secsleft);
|
||||||
|
|
||||||
|
if(Info->secsleft == 0)
|
||||||
|
{
|
||||||
|
/* set the event to continue tests */
|
||||||
|
SetEvent(Info->Test3.hWaitEvent);
|
||||||
|
|
||||||
|
/* sleep a bit */
|
||||||
|
Sleep(1500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID Test3(PTEST Test, HANDLE hEvent)
|
||||||
|
{
|
||||||
|
static TESTINFO Info;
|
||||||
|
BOOL stat;
|
||||||
|
|
||||||
|
Info.Test = Test;
|
||||||
|
Info.hEvent = hEvent;
|
||||||
|
Info.secsleft = N_TIMEOUT;
|
||||||
|
|
||||||
|
Info.Test3.hWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if(Info.Test3.hWaitEvent == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]Unable to create event!\n"), (int)Info.Test->id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Info.Test3.hNotification = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if(Info.Test3.hNotification == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]Unable to create notification event!\n"), (int)Info.Test->id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!CreateTimerQueueTimer(&Info.hTimer, NULL, TimerCallback3, &Info, 1000, 1000, 0))
|
||||||
|
{
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() failed, LastError: %d!"), (int)Info.Test->id, (int)GetLastError());
|
||||||
|
|
||||||
|
CloseHandle(Info.Test3.hWaitEvent);
|
||||||
|
CloseHandle(Info.Test3.hNotification);
|
||||||
|
/* we failed, set the event to continue tests */
|
||||||
|
SetEvent(hEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]CreateTimerQueueTimer() created timer 0x%x, countdown (%d sec)...\n"), (int)Test->id, (int)Info.hTimer, (int)Info.secsleft);
|
||||||
|
|
||||||
|
WaitForSingleObject(Info.Test3.hWaitEvent, INFINITE);
|
||||||
|
|
||||||
|
_tprintf(_T("[%d]Timout finished, delete timer queue..."), (int)Test->id);
|
||||||
|
stat = DeleteTimerQueueTimer(NULL, Info.hTimer, Info.Test3.hNotification);
|
||||||
|
if(stat)
|
||||||
|
{
|
||||||
|
_tprintf(_T("returned OK -> test FAILED!\n"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int error = GetLastError();
|
||||||
|
|
||||||
|
switch(error)
|
||||||
|
{
|
||||||
|
case ERROR_IO_PENDING:
|
||||||
|
_tprintf(_T("OK, Overlapped I/O operation in progress\n"));
|
||||||
|
/* this test is only successful in this case */
|
||||||
|
Test->Result = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_tprintf(_T("Failed, LastError: %d\n"), (int)GetLastError());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WaitForSingleObject(Info.Test3.hNotification, INFINITE);
|
||||||
|
|
||||||
|
CloseHandle(Info.Test3.hWaitEvent);
|
||||||
|
CloseHandle(Info.Test3.hNotification);
|
||||||
|
|
||||||
|
SetEvent(Info.hEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
InitTests(VOID)
|
||||||
|
{
|
||||||
|
ZeroMemory(Tests, sizeof(Tests));
|
||||||
|
|
||||||
|
Tests[0].description = _T("non-blocking DeleteTimerQueueTimer() call from callback");
|
||||||
|
Tests[0].Routine = Test1;
|
||||||
|
|
||||||
|
Tests[1].description = _T("blocking DeleteTimerQueueTimer() call");
|
||||||
|
Tests[1].Routine = Test2;
|
||||||
|
|
||||||
|
Tests[2].description = _T("blocking DeleteTimerQueueTimer() call with specified event");
|
||||||
|
Tests[2].Routine = Test3;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
_tprintf(_T("+++ TimerQueue test running +++\n\n"));
|
||||||
|
|
||||||
|
InitTests();
|
||||||
|
|
||||||
|
RunTests();
|
||||||
|
|
||||||
|
_tprintf(_T("\n+++ RESULTS +++\n"));
|
||||||
|
|
||||||
|
PrintTestResults();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/tokentest/.cvsignore
Normal file
7
rosapps/tests/tokentest/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/tokentest/makefile
Normal file
23
rosapps/tests/tokentest/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:46 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = tokentst
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = tokentest.o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror -Wno-format
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
529
rosapps/tests/tokentest/tokentest.c
Normal file
529
rosapps/tests/tokentest/tokentest.c
Normal file
|
@ -0,0 +1,529 @@
|
||||||
|
#define UNICODE
|
||||||
|
#define _UNICODE
|
||||||
|
|
||||||
|
#define ANONYMOUSUNIONS
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define INCLUDE_THE_DDK_HEADERS
|
||||||
|
#ifdef INCLUDE_THE_DDK_HEADERS
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
#define ROS_ACE_HEADER ACE_HEADER
|
||||||
|
#define ROS_ACE ACE
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allocate the System Luid. The first 1000 LUIDs are reserved.
|
||||||
|
// Use #999 here (0x3E7 = 999)
|
||||||
|
//
|
||||||
|
|
||||||
|
#define SYSTEM_LUID { 0x3E7, 0x0 }
|
||||||
|
#define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 }
|
||||||
|
#define LOCALSERVICE_LUID { 0x3e5, 0x0 }
|
||||||
|
#define NETWORKSERVICE_LUID { 0x3e4, 0x0 }
|
||||||
|
|
||||||
|
#else
|
||||||
|
typedef LONG NTSTATUS, *PNTSTATUS;
|
||||||
|
|
||||||
|
typedef struct _UNICODE_STRING
|
||||||
|
{
|
||||||
|
USHORT Length;
|
||||||
|
USHORT MaximumLength;
|
||||||
|
PWSTR Buffer;
|
||||||
|
} UNICODE_STRING, *PUNICODE_STRING;
|
||||||
|
|
||||||
|
typedef struct _OBJECT_ATTRIBUTES {
|
||||||
|
ULONG Length;
|
||||||
|
HANDLE RootDirectory;
|
||||||
|
PUNICODE_STRING ObjectName;
|
||||||
|
ULONG Attributes;
|
||||||
|
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR
|
||||||
|
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE
|
||||||
|
} OBJECT_ATTRIBUTES;
|
||||||
|
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
|
||||||
|
|
||||||
|
typedef struct _ROS_ACE_HEADER
|
||||||
|
{
|
||||||
|
CHAR AceType;
|
||||||
|
CHAR AceFlags;
|
||||||
|
USHORT AceSize;
|
||||||
|
} ROS_ACE_HEADER, *PROS_ACE_HEADER;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK AccessMask;
|
||||||
|
} ROS_ACE, *PROS_ACE;
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlConvertSidToUnicodeString (
|
||||||
|
IN OUT PUNICODE_STRING String,
|
||||||
|
IN PSID Sid,
|
||||||
|
IN BOOLEAN AllocateString
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlCreateAcl(
|
||||||
|
PACL Acl,
|
||||||
|
ULONG AclSize,
|
||||||
|
ULONG AclRevision);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlAddAccessAllowedAce (
|
||||||
|
PACL Acl,
|
||||||
|
ULONG Revision,
|
||||||
|
ACCESS_MASK AccessMask,
|
||||||
|
PSID Sid
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlGetAce (
|
||||||
|
PACL Acl,
|
||||||
|
ULONG AceIndex,
|
||||||
|
PROS_ACE *Ace
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ZwAllocateLocallyUniqueId(
|
||||||
|
OUT PLUID Luid
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSYSAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ZwCreateToken(
|
||||||
|
OUT PHANDLE TokenHandle,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
|
IN TOKEN_TYPE TokenType,
|
||||||
|
IN PLUID AuthenticationId,
|
||||||
|
IN PLARGE_INTEGER ExpirationTime,
|
||||||
|
IN PTOKEN_USER TokenUser,
|
||||||
|
IN PTOKEN_GROUPS TokenGroups,
|
||||||
|
IN PTOKEN_PRIVILEGES TokenPrivileges,
|
||||||
|
IN PTOKEN_OWNER TokenOwner,
|
||||||
|
IN PTOKEN_PRIMARY_GROUP TokenPrimaryGroup,
|
||||||
|
IN PTOKEN_DEFAULT_DACL TokenDefaultDacl,
|
||||||
|
IN PTOKEN_SOURCE TokenSource
|
||||||
|
);
|
||||||
|
#define NT_SUCCESS(StatCode) ((NTSTATUS)(StatCode) >= 0)
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define INITIAL_PRIV_ENABLED SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED
|
||||||
|
#define INITIAL_PRIV_DISABLED 0
|
||||||
|
LUID_AND_ATTRIBUTES InitialPrivilegeSet[] =
|
||||||
|
{
|
||||||
|
{ { 0x00000007, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeTcbPrivilege
|
||||||
|
{ { 0x00000002, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeCreateTokenPrivilege
|
||||||
|
{ { 0x00000009, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeTakeOwnershipPrivilege
|
||||||
|
{ { 0x0000000f, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeCreatePagefilePrivilege
|
||||||
|
{ { 0x00000004, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeLockMemoryPrivilege
|
||||||
|
{ { 0x00000003, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeAssignPrimaryTokenPrivilege
|
||||||
|
{ { 0x00000005, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeIncreaseQuotaPrivilege
|
||||||
|
{ { 0x0000000e, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeIncreaseBasePriorityPrivilege
|
||||||
|
{ { 0x00000010, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeCreatePermanentPrivilege
|
||||||
|
{ { 0x00000014, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeDebugPrivilege
|
||||||
|
{ { 0x00000015, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeAuditPrivilege
|
||||||
|
{ { 0x00000008, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeSecurityPrivilege
|
||||||
|
{ { 0x00000016, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeSystemEnvironmentPrivilege
|
||||||
|
{ { 0x00000017, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeChangeNotifyPrivilege
|
||||||
|
{ { 0x00000011, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeBackupPrivilege
|
||||||
|
{ { 0x00000012, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeRestorePrivilege
|
||||||
|
{ { 0x00000013, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeShutdownPrivilege
|
||||||
|
{ { 0x0000000a, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeLoadDriverPrivilege
|
||||||
|
{ { 0x0000000d, 0x00000000 }, INITIAL_PRIV_ENABLED }, // SeProfileSingleProcessPrivilege
|
||||||
|
{ { 0x0000000c, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeSystemtimePrivilege
|
||||||
|
{ { 0x00000019, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeUndockPrivilege
|
||||||
|
{ { 0x0000001c, 0x00000000 }, INITIAL_PRIV_DISABLED }, // SeManageVolumePrivilege
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _SID_2
|
||||||
|
{
|
||||||
|
UCHAR Revision;
|
||||||
|
UCHAR SubAuthorityCount;
|
||||||
|
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||||
|
ULONG SubAuthority[2];
|
||||||
|
} SID_2;
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
void
|
||||||
|
PrintSid(SID_AND_ATTRIBUTES* pSid, TOKEN_OWNER* pOwner, TOKEN_PRIMARY_GROUP* pPrimary)
|
||||||
|
{
|
||||||
|
UNICODE_STRING scSid;
|
||||||
|
|
||||||
|
RtlConvertSidToUnicodeString(&scSid, pSid->Sid, TRUE);
|
||||||
|
printf("%wZ [", &scSid);
|
||||||
|
LocalFree(scSid.Buffer);
|
||||||
|
|
||||||
|
if ( EqualSid(pSid->Sid, pOwner->Owner) )
|
||||||
|
printf("owner,");
|
||||||
|
|
||||||
|
if ( EqualSid(pSid->Sid, pPrimary->PrimaryGroup) )
|
||||||
|
printf("primary,");
|
||||||
|
|
||||||
|
if ( pSid->Attributes & SE_GROUP_ENABLED )
|
||||||
|
{
|
||||||
|
if ( pSid->Attributes & SE_GROUP_ENABLED_BY_DEFAULT )
|
||||||
|
printf("enabled-default,");
|
||||||
|
else
|
||||||
|
printf("enabled,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( pSid->Attributes & SE_GROUP_LOGON_ID )
|
||||||
|
printf("logon,");
|
||||||
|
|
||||||
|
|
||||||
|
if ( pSid->Attributes & SE_GROUP_MANDATORY )
|
||||||
|
printf("mandatory,");
|
||||||
|
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
void
|
||||||
|
DisplayTokenSids(TOKEN_USER* pUser,
|
||||||
|
TOKEN_GROUPS* pGroups,
|
||||||
|
TOKEN_OWNER* pOwner,
|
||||||
|
TOKEN_PRIMARY_GROUP* pPrimary)
|
||||||
|
{
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
printf("\nSids:\n");
|
||||||
|
PrintSid(&pUser->User, pOwner, pPrimary);
|
||||||
|
printf("\nGroups:\n");
|
||||||
|
for (i = 0; i < pGroups->GroupCount; i++)
|
||||||
|
PrintSid(&pGroups->Groups[i], pOwner, pPrimary);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
void
|
||||||
|
DisplayTokenPrivileges(TOKEN_PRIVILEGES* pPriv)
|
||||||
|
{
|
||||||
|
WCHAR buffer[256];
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
printf("\nprivileges:\n");
|
||||||
|
for (i = 0; i < pPriv->PrivilegeCount; i++)
|
||||||
|
{
|
||||||
|
DWORD cbName = sizeof(buffer) / sizeof(buffer[0]);
|
||||||
|
LookupPrivilegeName(0, &pPriv->Privileges[i].Luid, buffer, &cbName);
|
||||||
|
|
||||||
|
printf("%S{0x%08x, 0x%08x} [", buffer, pPriv->Privileges[i].Luid.HighPart, pPriv->Privileges[i].Luid.LowPart);
|
||||||
|
|
||||||
|
if ( pPriv->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED )
|
||||||
|
printf("enabled,");
|
||||||
|
if ( pPriv->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED_BY_DEFAULT )
|
||||||
|
printf("default,");
|
||||||
|
if ( pPriv->Privileges[i].Attributes & SE_PRIVILEGE_USED_FOR_ACCESS )
|
||||||
|
printf("used");
|
||||||
|
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
void
|
||||||
|
DisplayDacl(PACL pAcl)
|
||||||
|
{
|
||||||
|
DWORD i;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
if ( ! pAcl )
|
||||||
|
{
|
||||||
|
printf("\nNo Default Dacl.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nDacl:\n");
|
||||||
|
for (i = 0; i < pAcl->AceCount; i++)
|
||||||
|
{
|
||||||
|
UNICODE_STRING scSid;
|
||||||
|
ROS_ACE* pAce;
|
||||||
|
LPWSTR wszType = 0;
|
||||||
|
PSID pSid;
|
||||||
|
|
||||||
|
status = RtlGetAce(pAcl, i, (ROS_ACE**) &pAce);
|
||||||
|
if ( ! NT_SUCCESS(status) )
|
||||||
|
{
|
||||||
|
printf("RtlGetAce(): status = 0x%08x\n", status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSid = (PSID) (pAce + 1);
|
||||||
|
if ( pAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE )
|
||||||
|
wszType = L"allow";
|
||||||
|
if ( pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE )
|
||||||
|
wszType = L"deny ";
|
||||||
|
|
||||||
|
status = RtlConvertSidToUnicodeString(&scSid, pSid, TRUE);
|
||||||
|
if ( ! NT_SUCCESS(status) )
|
||||||
|
{
|
||||||
|
printf("RtlConvertSidToUnicodeString(): status = 0x%08x\n", status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%d.) %S %wZ 0x%08x\n", i, wszType, &scSid, pAce->AccessMask);
|
||||||
|
LocalFree(scSid.Buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
PVOID
|
||||||
|
GetFromToken(HANDLE hToken, TOKEN_INFORMATION_CLASS tic)
|
||||||
|
{
|
||||||
|
BOOL bResult;
|
||||||
|
DWORD n;
|
||||||
|
PBYTE p = 0;
|
||||||
|
|
||||||
|
bResult = GetTokenInformation(hToken, tic, 0, 0, &n);
|
||||||
|
if ( ! bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
p = (PBYTE) malloc(n);
|
||||||
|
if ( ! GetTokenInformation(hToken, tic, p, n, &n) )
|
||||||
|
{
|
||||||
|
printf("GetFromToken() failed for TOKEN_INFORMATION_CLASS(%d): %d\n", tic, GetLastError());
|
||||||
|
free(p);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
void
|
||||||
|
DisplayToken(HANDLE hTokenSource)
|
||||||
|
{
|
||||||
|
TOKEN_USER* pTokenUser = (PTOKEN_USER) GetFromToken(hTokenSource, TokenUser);
|
||||||
|
TOKEN_GROUPS* pTokenGroups = (PTOKEN_GROUPS) GetFromToken(hTokenSource, TokenGroups);
|
||||||
|
TOKEN_OWNER* pTokenOwner = (PTOKEN_OWNER) GetFromToken(hTokenSource, TokenOwner);
|
||||||
|
TOKEN_PRIMARY_GROUP* pTokenPrimaryGroup = (PTOKEN_PRIMARY_GROUP) GetFromToken(hTokenSource, TokenPrimaryGroup);
|
||||||
|
TOKEN_PRIVILEGES* pTokenPrivileges = (PTOKEN_PRIVILEGES) GetFromToken(hTokenSource, TokenPrivileges);
|
||||||
|
TOKEN_DEFAULT_DACL* pTokenDefaultDacl = (PTOKEN_DEFAULT_DACL) GetFromToken(hTokenSource, TokenDefaultDacl);
|
||||||
|
|
||||||
|
DisplayTokenSids(pTokenUser, pTokenGroups, pTokenOwner, pTokenPrimaryGroup);
|
||||||
|
// DisplayTokenPrivileges(pTokenPrivileges);
|
||||||
|
DisplayDacl(pTokenDefaultDacl->DefaultDacl);
|
||||||
|
|
||||||
|
free(pTokenUser);
|
||||||
|
free(pTokenGroups);
|
||||||
|
free(pTokenOwner);
|
||||||
|
free(pTokenPrimaryGroup);
|
||||||
|
free(pTokenPrivileges);
|
||||||
|
free(pTokenDefaultDacl);
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
BOOL
|
||||||
|
EnablePrivilege(LPWSTR wszName)
|
||||||
|
{
|
||||||
|
HANDLE hToken;
|
||||||
|
TOKEN_PRIVILEGES priv = {1, {{{0, 0}, SE_PRIVILEGE_ENABLED}}};
|
||||||
|
BOOL bResult;
|
||||||
|
|
||||||
|
LookupPrivilegeValue(0, wszName, &priv.Privileges[0].Luid);
|
||||||
|
|
||||||
|
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
|
||||||
|
|
||||||
|
AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);
|
||||||
|
bResult = GetLastError() == ERROR_SUCCESS;
|
||||||
|
|
||||||
|
CloseHandle(hToken);
|
||||||
|
return bResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
NTSTATUS
|
||||||
|
CreateInitialSystemToken(HANDLE* phSystemToken)
|
||||||
|
{
|
||||||
|
static SID sidSystem = { 1, 1, {SECURITY_NT_AUTHORITY}, {SECURITY_LOCAL_SYSTEM_RID} };
|
||||||
|
static SID sidEveryone = { 1, 1, {SECURITY_WORLD_SID_AUTHORITY}, {SECURITY_WORLD_RID} };
|
||||||
|
static SID sidAuthenticatedUser = { 1, 1, {SECURITY_NT_AUTHORITY}, {SECURITY_AUTHENTICATED_USER_RID} };
|
||||||
|
static SID_2 sidAdministrators = { 1, 2, {SECURITY_NT_AUTHORITY}, {SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS} };
|
||||||
|
static const int nGroupCount = 3;
|
||||||
|
|
||||||
|
NTSTATUS status;
|
||||||
|
ULONG uSize;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
TOKEN_USER tkUser;
|
||||||
|
TOKEN_OWNER tkDefaultOwner;
|
||||||
|
TOKEN_PRIMARY_GROUP tkPrimaryGroup;
|
||||||
|
|
||||||
|
TOKEN_GROUPS* ptkGroups = 0;
|
||||||
|
TOKEN_PRIVILEGES* ptkPrivileges = 0;
|
||||||
|
TOKEN_DEFAULT_DACL tkDefaultDacl = { 0 };
|
||||||
|
|
||||||
|
LARGE_INTEGER tkExpiration;
|
||||||
|
|
||||||
|
LUID authId = SYSTEM_LUID;
|
||||||
|
|
||||||
|
TOKEN_SOURCE source =
|
||||||
|
{
|
||||||
|
{ '*', '*', 'A', 'N', 'O', 'N', '*', '*' },
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
SECURITY_QUALITY_OF_SERVICE sqos =
|
||||||
|
{
|
||||||
|
sizeof(sqos),
|
||||||
|
SecurityAnonymous,
|
||||||
|
SECURITY_STATIC_TRACKING,
|
||||||
|
FALSE
|
||||||
|
};
|
||||||
|
|
||||||
|
OBJECT_ATTRIBUTES oa =
|
||||||
|
{
|
||||||
|
sizeof(oa),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&sqos
|
||||||
|
};
|
||||||
|
|
||||||
|
tkExpiration.QuadPart = -1;
|
||||||
|
status = ZwAllocateLocallyUniqueId(&source.SourceIdentifier);
|
||||||
|
if ( status != 0 )
|
||||||
|
return status;
|
||||||
|
|
||||||
|
tkUser.User.Sid = &sidSystem;
|
||||||
|
tkUser.User.Attributes = 0;
|
||||||
|
|
||||||
|
// Under WinXP (the only MS OS I've tested) ZwCreateToken()
|
||||||
|
// squawks if we use sidAdministrators here -- though running
|
||||||
|
// a progrem under AT and using the DisplayToken() function
|
||||||
|
// shows that the system token does default ownership to
|
||||||
|
// Administrator.
|
||||||
|
|
||||||
|
// For now, default ownership to system, since that works
|
||||||
|
tkDefaultOwner.Owner = &sidSystem;
|
||||||
|
tkPrimaryGroup.PrimaryGroup = &sidSystem;
|
||||||
|
|
||||||
|
uSize = sizeof(TOKEN_GROUPS) - sizeof(ptkGroups->Groups);
|
||||||
|
uSize += sizeof(SID_AND_ATTRIBUTES) * nGroupCount;
|
||||||
|
|
||||||
|
ptkGroups = (TOKEN_GROUPS*) malloc(uSize);
|
||||||
|
ptkGroups->GroupCount = nGroupCount;
|
||||||
|
|
||||||
|
ptkGroups->Groups[0].Sid = (SID*) &sidAdministrators;
|
||||||
|
ptkGroups->Groups[0].Attributes = SE_GROUP_ENABLED;
|
||||||
|
|
||||||
|
ptkGroups->Groups[1].Sid = &sidEveryone;
|
||||||
|
ptkGroups->Groups[1].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY;
|
||||||
|
|
||||||
|
ptkGroups->Groups[2].Sid = &sidAuthenticatedUser;
|
||||||
|
ptkGroups->Groups[2].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY;
|
||||||
|
|
||||||
|
uSize = sizeof(TOKEN_PRIVILEGES) - sizeof(ptkPrivileges->Privileges);
|
||||||
|
uSize += sizeof(LUID_AND_ATTRIBUTES) * sizeof(InitialPrivilegeSet) / sizeof(InitialPrivilegeSet[0]);
|
||||||
|
ptkPrivileges = (TOKEN_PRIVILEGES*) malloc(uSize);
|
||||||
|
ptkPrivileges->PrivilegeCount = sizeof(InitialPrivilegeSet) / sizeof(InitialPrivilegeSet[0]);
|
||||||
|
for (i = 0; i < ptkPrivileges->PrivilegeCount; i++)
|
||||||
|
{
|
||||||
|
ptkPrivileges->Privileges[i].Luid.HighPart = InitialPrivilegeSet[i].Luid.HighPart;
|
||||||
|
ptkPrivileges->Privileges[i].Luid.LowPart = InitialPrivilegeSet[i].Luid.LowPart;
|
||||||
|
ptkPrivileges->Privileges[i].Attributes = InitialPrivilegeSet[i].Attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the length needed for the ACL
|
||||||
|
uSize = sizeof(ACL);
|
||||||
|
uSize += sizeof(ACE) + sizeof(sidSystem);
|
||||||
|
uSize += sizeof(ACE) + sizeof(sidAdministrators);
|
||||||
|
uSize = (uSize & (~3)) + 8;
|
||||||
|
tkDefaultDacl.DefaultDacl = (PACL) malloc(uSize);
|
||||||
|
|
||||||
|
status = RtlCreateAcl(tkDefaultDacl.DefaultDacl, uSize, ACL_REVISION);
|
||||||
|
if ( ! NT_SUCCESS(status) )
|
||||||
|
printf("RtlCreateAcl() failed: 0x%08x\n", status);
|
||||||
|
|
||||||
|
status = RtlAddAccessAllowedAce(tkDefaultDacl.DefaultDacl, ACL_REVISION, GENERIC_ALL, &sidSystem);
|
||||||
|
if ( ! NT_SUCCESS(status) )
|
||||||
|
printf("RtlAddAccessAllowedAce() failed: 0x%08x\n", status);
|
||||||
|
|
||||||
|
status = RtlAddAccessAllowedAce(tkDefaultDacl.DefaultDacl, ACL_REVISION, GENERIC_READ|GENERIC_EXECUTE|READ_CONTROL, (PSID) &sidAdministrators);
|
||||||
|
if ( ! NT_SUCCESS(status) )
|
||||||
|
printf("RtlAddAccessAllowedAce() failed: 0x%08x\n", status);
|
||||||
|
|
||||||
|
printf("Parameters being passed into ZwCreateToken:\n\n");
|
||||||
|
DisplayTokenSids(&tkUser, ptkGroups, &tkDefaultOwner, &tkPrimaryGroup);
|
||||||
|
DisplayDacl(tkDefaultDacl.DefaultDacl);
|
||||||
|
|
||||||
|
printf("Calling ZwCreateToken()...\n");
|
||||||
|
status = ZwCreateToken(phSystemToken,
|
||||||
|
TOKEN_ALL_ACCESS,
|
||||||
|
&oa,
|
||||||
|
TokenPrimary,
|
||||||
|
&authId,
|
||||||
|
&tkExpiration,
|
||||||
|
&tkUser,
|
||||||
|
ptkGroups,
|
||||||
|
ptkPrivileges,
|
||||||
|
&tkDefaultOwner,
|
||||||
|
&tkPrimaryGroup,
|
||||||
|
&tkDefaultDacl,
|
||||||
|
&source);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
free(ptkGroups);
|
||||||
|
free(ptkPrivileges);
|
||||||
|
free(tkDefaultDacl.DefaultDacl);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
int
|
||||||
|
main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
HANDLE hSystemToken;
|
||||||
|
CHAR buffer[512];
|
||||||
|
HANDLE hOurToken;
|
||||||
|
|
||||||
|
printf("Current process Token:\n");
|
||||||
|
|
||||||
|
Status=ZwOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_QUERY_SOURCE, &hOurToken);
|
||||||
|
if ( NT_SUCCESS(Status) )
|
||||||
|
{
|
||||||
|
DisplayToken(hOurToken);
|
||||||
|
CloseHandle(hOurToken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("ZwOpenProcessToken() failed: 0x%08x\n", Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define ENABLE_PRIVILEGE
|
||||||
|
#ifdef ENABLE_PRIVILEGE
|
||||||
|
EnablePrivilege(SE_CREATE_TOKEN_NAME);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Now do the other one
|
||||||
|
Status = CreateInitialSystemToken(&hSystemToken);
|
||||||
|
if ( NT_SUCCESS(Status) )
|
||||||
|
{
|
||||||
|
printf("System Token: 0x%08x\n", hSystemToken);
|
||||||
|
DisplayToken(hSystemToken);
|
||||||
|
CloseHandle(hSystemToken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("CreateInitialSystemToken() return: 0x%08x\n", Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("press return");
|
||||||
|
gets(buffer);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/txtscale/.cvsignore
Normal file
7
rosapps/tests/txtscale/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
33
rosapps/tests/txtscale/Makefile
Normal file
33
rosapps/tests/txtscale/Makefile
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = txtscale
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_CPPFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501 -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = \
|
||||||
|
kernel32.a \
|
||||||
|
user32.a \
|
||||||
|
gdi32.a \
|
||||||
|
comctl32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = \
|
||||||
|
txtscale.o \
|
||||||
|
mk_font.o
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# overide LD_CC to use g++ for linking of the executable
|
||||||
|
LD_CC = $(CXX)
|
||||||
|
|
||||||
|
# EOF
|
69
rosapps/tests/txtscale/mk_font.cpp
Normal file
69
rosapps/tests/txtscale/mk_font.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 4 - Utility functions
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "mk_font.h"
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
namespace font {
|
||||||
|
|
||||||
|
// creates a logical font
|
||||||
|
HFONT MakeFont(
|
||||||
|
IN HDC hDestDC, // handle to target DC
|
||||||
|
IN LPCSTR typeface_name, // font's typeface name
|
||||||
|
IN int point_size, // font's point size
|
||||||
|
IN const BYTE charset, // font's character set
|
||||||
|
IN const DWORD style // font's styles
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// NOTE: On Windows 9x/Me, GetWorldTransform is not
|
||||||
|
// supported. For compatibility with these platforms you
|
||||||
|
// should initialize the XFORM::eM22 data member to 1.0.
|
||||||
|
//
|
||||||
|
XFORM xf = {0, 0, 0, 1.0, 0, 0};
|
||||||
|
GetWorldTransform(hDestDC, &xf);
|
||||||
|
int pixels_per_inch = GetDeviceCaps(hDestDC, LOGPIXELSY);
|
||||||
|
|
||||||
|
POINT PSize = {
|
||||||
|
0,
|
||||||
|
-MulDiv(static_cast<int>(xf.eM22 * point_size + 0.5),
|
||||||
|
pixels_per_inch, 72)
|
||||||
|
};
|
||||||
|
|
||||||
|
HFONT hResult = NULL;
|
||||||
|
if (DPtoLP(hDestDC, &PSize, 1))
|
||||||
|
{
|
||||||
|
LOGFONT lf;
|
||||||
|
memset(&lf, 0, sizeof(LOGFONT));
|
||||||
|
|
||||||
|
lf.lfHeight = PSize.y;
|
||||||
|
lf.lfCharSet = charset;
|
||||||
|
lstrcpyn(reinterpret_cast<LPTSTR>(&lf.lfFaceName),
|
||||||
|
typeface_name, LF_FACESIZE);
|
||||||
|
|
||||||
|
lf.lfWeight = (style & FS_BOLD) ? FW_BOLD : FW_DONTCARE;
|
||||||
|
lf.lfItalic = (style & FS_ITALIC) ? true : false;
|
||||||
|
lf.lfUnderline = (style & FS_UNDERLINE) ? true : false;
|
||||||
|
lf.lfStrikeOut = (style & FS_STRIKEOUT) ? true : false;
|
||||||
|
|
||||||
|
// create the logical font
|
||||||
|
hResult = CreateFontIndirect(&lf);
|
||||||
|
}
|
||||||
|
return hResult;
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // namespace font
|
39
rosapps/tests/txtscale/mk_font.h
Normal file
39
rosapps/tests/txtscale/mk_font.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 4 - Utility functions
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#ifndef CH4_UTILS_H
|
||||||
|
#define CH4_UTILS_H
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
// change namespace name appropriately to suit your needs
|
||||||
|
namespace font {
|
||||||
|
|
||||||
|
// font options
|
||||||
|
static const ULONG FS_NONE = 0x00000000;
|
||||||
|
static const ULONG FS_BOLD = 0x00000001;
|
||||||
|
static const ULONG FS_ITALIC = 0x00000002;
|
||||||
|
static const ULONG FS_UNDERLINE = 0x00000004;
|
||||||
|
static const ULONG FS_STRIKEOUT = 0x00000008;
|
||||||
|
|
||||||
|
// creates a logical font
|
||||||
|
HFONT MakeFont(IN HDC hDestDC, IN LPCSTR typeface_name,
|
||||||
|
IN int point_size, IN const BYTE charset = ANSI_CHARSET,
|
||||||
|
IN const DWORD style = FS_NONE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#endif // CH4_UTILS_H
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
266
rosapps/tests/txtscale/txtscale.cpp
Normal file
266
rosapps/tests/txtscale/txtscale.cpp
Normal file
|
@ -0,0 +1,266 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 8 - Listing 8.1 (Scaled Text Demo)
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
// for the MakeFont() function...
|
||||||
|
#include "mk_font.h"
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
|
||||||
|
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_HREDRAW | CS_VREDRAW;
|
||||||
|
wc.lpszClassName = WndClassName;
|
||||||
|
wc.lpfnWndProc = MainWndProc;
|
||||||
|
wc.hInstance = hInst;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
wc.hbrBackground = reinterpret_cast<HBRUSH>(
|
||||||
|
COLOR_BTNFACE + 1
|
||||||
|
);
|
||||||
|
|
||||||
|
if (RegisterClass(&wc))
|
||||||
|
{
|
||||||
|
HWND hWnd =
|
||||||
|
CreateWindow(
|
||||||
|
WndClassName, TEXT("Scaled Text Demo"),
|
||||||
|
WS_OVERLAPPEDWINDOW | WS_CAPTION |
|
||||||
|
WS_VISIBLE | WS_CLIPCHILDREN,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, 800, 300,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
HWND hTrackBar = NULL;
|
||||||
|
HFONT hTTFont = NULL;
|
||||||
|
double scale = 0.0;
|
||||||
|
LPCSTR pText = TEXT("The Scaled Text!");
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
{
|
||||||
|
INITCOMMONCONTROLSEX icx;
|
||||||
|
icx.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
||||||
|
icx.dwICC = ICC_BAR_CLASSES;
|
||||||
|
|
||||||
|
InitCommonControlsEx(&icx);
|
||||||
|
|
||||||
|
hTrackBar =
|
||||||
|
CreateWindow(
|
||||||
|
TRACKBAR_CLASS, "",
|
||||||
|
TBS_HORZ | TBS_BOTH | TBS_AUTOTICKS |
|
||||||
|
TBS_FIXEDLENGTH | TBS_ENABLESELRANGE |
|
||||||
|
WS_CHILD | WS_VISIBLE,
|
||||||
|
10, 260, 375, 40,
|
||||||
|
hWnd, NULL, hInst, NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(hTrackBar != NULL);
|
||||||
|
SNDMSG(hTrackBar, TBM_SETTHUMBLENGTH, 20, 0);
|
||||||
|
SNDMSG(hTrackBar, TBM_SETRANGEMAX, TRUE, 100);
|
||||||
|
|
||||||
|
// create the TrueType (scalable) font
|
||||||
|
HDC hDC = GetDC(hWnd);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// see Chapter 4 for the definition of MakeFont
|
||||||
|
hTTFont = font::MakeFont(hDC, "Impact", 72);
|
||||||
|
if (!hTTFont) throw;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
}
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_HSCROLL:
|
||||||
|
{
|
||||||
|
if (reinterpret_cast<HWND>(lParam) == hTrackBar)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// adjust the scaling factor according to
|
||||||
|
// the position of the trackbar's slider
|
||||||
|
//
|
||||||
|
scale = static_cast<double>(
|
||||||
|
(SNDMSG(hTrackBar, TBM_GETPOS, 0, 0) + 1) / 50.0
|
||||||
|
);
|
||||||
|
InvalidateRect(hWnd, NULL, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
{
|
||||||
|
LRESULT res = DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
|
||||||
|
HDC hDC = reinterpret_cast<HDC>(wParam);
|
||||||
|
HFONT hOldFont = static_cast<HFONT>(
|
||||||
|
SelectObject(hDC, hTTFont)
|
||||||
|
);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SetBkMode(hDC, TRANSPARENT);
|
||||||
|
|
||||||
|
// open a path bracket
|
||||||
|
if (!BeginPath(hDC)) throw;
|
||||||
|
|
||||||
|
// record the text to the path
|
||||||
|
TextOut(hDC, 10, 10, pText, lstrlen(pText));
|
||||||
|
|
||||||
|
// close the path bracket and
|
||||||
|
// select the path into hDC
|
||||||
|
EndPath(hDC);
|
||||||
|
|
||||||
|
// determine the number of endpoints in the path
|
||||||
|
const int num_points = GetPath(hDC, NULL, NULL, 0);
|
||||||
|
if (num_points > 0)
|
||||||
|
{
|
||||||
|
// make room for the POINTs and vertex types
|
||||||
|
POINT* pPEnds = new POINT[num_points];
|
||||||
|
unsigned char* pTypes = new unsigned char[num_points];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// get the path's description
|
||||||
|
int num_got = GetPath(hDC, pPEnds, pTypes, num_points);
|
||||||
|
if (num_got > 0)
|
||||||
|
{
|
||||||
|
// start a new path bracket
|
||||||
|
if (!BeginPath(hDC)) throw;
|
||||||
|
|
||||||
|
// scale each point in the description
|
||||||
|
int iPoint;
|
||||||
|
for (iPoint = 0; iPoint < num_got; ++iPoint)
|
||||||
|
{
|
||||||
|
pPEnds[iPoint].x = static_cast<LONG>(
|
||||||
|
scale * pPEnds[iPoint].x + 0.5
|
||||||
|
);
|
||||||
|
pPEnds[iPoint].y = static_cast<LONG>(
|
||||||
|
scale * pPEnds[iPoint].y + 0.5
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (iPoint = 0; iPoint < num_points; ++iPoint)
|
||||||
|
{
|
||||||
|
// handle the MoveToEx case
|
||||||
|
if (pTypes[iPoint] == PT_MOVETO)
|
||||||
|
{
|
||||||
|
MoveToEx(
|
||||||
|
hDC, pPEnds[iPoint].x, pPEnds[iPoint].y, NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// handle the LineTo case
|
||||||
|
else if (
|
||||||
|
pTypes[iPoint] == PT_LINETO ||
|
||||||
|
pTypes[iPoint] == (PT_LINETO | PT_CLOSEFIGURE)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LineTo(hDC, pPEnds[iPoint].x, pPEnds[iPoint].y);
|
||||||
|
}
|
||||||
|
// handle the PolyBezierTo case
|
||||||
|
else if (
|
||||||
|
pTypes[iPoint] == PT_BEZIERTO ||
|
||||||
|
pTypes[iPoint] == (PT_BEZIERTO | PT_CLOSEFIGURE)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PolyBezierTo(hDC, pPEnds + iPoint, 3);
|
||||||
|
iPoint += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close the new path bracket
|
||||||
|
EndPath(hDC);
|
||||||
|
|
||||||
|
// stroke and fill the new path
|
||||||
|
StrokeAndFillPath(hDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
// clean up
|
||||||
|
delete [] pTypes;
|
||||||
|
delete [] pPEnds;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
// clean up
|
||||||
|
delete [] pTypes;
|
||||||
|
delete [] pPEnds;
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
SelectObject(hDC, hOldFont);
|
||||||
|
}
|
||||||
|
SelectObject(hDC, hOldFont);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
case WM_SIZE:
|
||||||
|
{
|
||||||
|
MoveWindow(
|
||||||
|
hTrackBar,
|
||||||
|
0, HIWORD(lParam) - 40, LOWORD(lParam), 40,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
// clean up
|
||||||
|
DeleteObject(hTTFont);
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
7
rosapps/tests/vmtest/.cvsignore
Normal file
7
rosapps/tests/vmtest/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/vmtest/Makefile
Normal file
23
rosapps/tests/vmtest/Makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: Makefile,v 1.1 2004/10/21 04:48:46 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = vmtest
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a kernel32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
55
rosapps/tests/vmtest/vmtest.c
Normal file
55
rosapps/tests/vmtest/vmtest.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
PVOID Base;
|
||||||
|
PVOID Ret;
|
||||||
|
|
||||||
|
Base = VirtualAlloc(NULL,
|
||||||
|
1048576,
|
||||||
|
MEM_RESERVE,
|
||||||
|
PAGE_READWRITE);
|
||||||
|
if (Base == NULL)
|
||||||
|
{
|
||||||
|
printf("VirtualAlloc failed 1\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ret = VirtualAlloc(Base + 4096,
|
||||||
|
4096,
|
||||||
|
MEM_COMMIT,
|
||||||
|
PAGE_READWRITE);
|
||||||
|
if (Ret == NULL)
|
||||||
|
{
|
||||||
|
printf("VirtualAlloc failed 2\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ret = VirtualAlloc(Base + 12288,
|
||||||
|
4096,
|
||||||
|
MEM_COMMIT,
|
||||||
|
PAGE_READWRITE);
|
||||||
|
if (Ret == NULL)
|
||||||
|
{
|
||||||
|
printf("VirtualAlloc failed 3\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ret = VirtualAlloc(Base + 20480,
|
||||||
|
4096,
|
||||||
|
MEM_COMMIT,
|
||||||
|
PAGE_READWRITE);
|
||||||
|
if (Ret == NULL)
|
||||||
|
{
|
||||||
|
printf("VirtualAlloc failed 4\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ret = VirtualAlloc(Base + 4096,
|
||||||
|
28672,
|
||||||
|
MEM_RESERVE,
|
||||||
|
PAGE_READWRITE);
|
||||||
|
if (Ret == NULL)
|
||||||
|
{
|
||||||
|
printf("VirtualAlloc failed 5\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
7
rosapps/tests/winhello/.cvsignore
Normal file
7
rosapps/tests/winhello/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/winhello/makefile
Normal file
23
rosapps/tests/winhello/makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: makefile,v 1.1 2004/10/21 04:48:46 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = winhello
|
||||||
|
|
||||||
|
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
|
703
rosapps/tests/winhello/winhello.c
Normal file
703
rosapps/tests/winhello/winhello.c
Normal file
|
@ -0,0 +1,703 @@
|
||||||
|
/*
|
||||||
|
* ReactOS Winhello - Not So Simple Win32 Windowing test
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* What do we test with this app?
|
||||||
|
* - Windows and Class creation
|
||||||
|
* - A Simple Button
|
||||||
|
* - Some font rendering in the Window
|
||||||
|
* - Scrollbar support
|
||||||
|
* - Hotkeys
|
||||||
|
* - Messageboxes
|
||||||
|
* ????????
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
|
||||||
|
HFONT tf;
|
||||||
|
LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
BOOLEAN bolWM_CHAR;
|
||||||
|
BOOLEAN bolWM_KEYDOWN;
|
||||||
|
|
||||||
|
int WINAPI
|
||||||
|
WinMain(HINSTANCE hInstance,
|
||||||
|
HINSTANCE hPrevInstance,
|
||||||
|
LPSTR lpszCmdLine,
|
||||||
|
int nCmdShow)
|
||||||
|
{
|
||||||
|
WNDCLASS wc;
|
||||||
|
MSG msg;
|
||||||
|
HWND hWnd;
|
||||||
|
bolWM_CHAR = 0;
|
||||||
|
bolWM_KEYDOWN = 0;
|
||||||
|
|
||||||
|
wc.lpszClassName = "HelloClass";
|
||||||
|
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("HelloClass",
|
||||||
|
"Hello World",
|
||||||
|
WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
|
||||||
|
0, //Position; you can use CW_USEDEFAULT, too
|
||||||
|
0,
|
||||||
|
600, //height
|
||||||
|
400,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CTRLC 1 /* Define our HotKeys */
|
||||||
|
#define ALTF1 2 /* Define our HotKeys */
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps; /* Also used during window drawing */
|
||||||
|
HDC hDC; /* A device context used for drawing */
|
||||||
|
RECT rc, clr, wir; /* A rectangle used during drawing */
|
||||||
|
char spr[100], sir[100];
|
||||||
|
static HBRUSH hbrWhite=NULL, hbrGray=NULL, hbrBlack=NULL, hbrRed=NULL, hbrBlue=NULL, hbrYellow=NULL;
|
||||||
|
|
||||||
|
/* The window handle for the "Click Me" button. */
|
||||||
|
static HWND hwndButton = 0;
|
||||||
|
static int cx, cy; /* Height and width of our button. */
|
||||||
|
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
case WM_CHAR:
|
||||||
|
{
|
||||||
|
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
TCHAR text[2];
|
||||||
|
text[0] = (TCHAR)wParam;
|
||||||
|
text[1] = _T('\0');
|
||||||
|
|
||||||
|
//Write in window
|
||||||
|
if( bolWM_KEYDOWN )
|
||||||
|
{
|
||||||
|
TextOut(hDC, 400, 10, "WM CHAR:", strlen("WM CHAR:"));
|
||||||
|
bolWM_KEYDOWN = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TextOut(hDC, 400, 10, "WM_CHAR:", strlen("WM_CHAR:"));
|
||||||
|
bolWM_KEYDOWN = 1;
|
||||||
|
}
|
||||||
|
TextOut(hDC, 530, 10, text, strlen(text));
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// Make a line depending on the typed key
|
||||||
|
Rect.left = 10;
|
||||||
|
Rect.top = 75;
|
||||||
|
Rect.right = 610;
|
||||||
|
Rect.bottom = 85;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
|
||||||
|
Rect.left=308;
|
||||||
|
Rect.right=312;
|
||||||
|
FillRect(hDC, &Rect, hbrRed);
|
||||||
|
|
||||||
|
Rect.left = 310;
|
||||||
|
Rect.top = 75;
|
||||||
|
Rect.right = 310 +text[0]*2;
|
||||||
|
Rect.bottom = 85;
|
||||||
|
HBRUSH hbrCustom = CreateSolidBrush ( RGB(text[0], text[0], text[0]));
|
||||||
|
FillRect(hDC, &Rect, hbrCustom);
|
||||||
|
DeleteObject ( hbrCustom );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
{
|
||||||
|
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
RECT Rect;
|
||||||
|
TCHAR text[2];
|
||||||
|
text[0] = (TCHAR)wParam;
|
||||||
|
text[1] = _T('\0');
|
||||||
|
|
||||||
|
|
||||||
|
/* Write in window */
|
||||||
|
Rect.left = 400;
|
||||||
|
Rect.top = 50;
|
||||||
|
Rect.right = 550;
|
||||||
|
Rect.bottom = 70;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
if( bolWM_CHAR )
|
||||||
|
{
|
||||||
|
TextOut(hDC, 400, 30, "WM KEYDOWN:", strlen("WM KEYDOWN:"));
|
||||||
|
bolWM_CHAR = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TextOut(hDC, 400, 30, "WM_KEYDOWN:", strlen("WM_KEYDOWN:"));
|
||||||
|
bolWM_CHAR = 1;
|
||||||
|
}
|
||||||
|
TextOut(hDC, 530, 30, text, strlen(text));
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_KEYUP:
|
||||||
|
{
|
||||||
|
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
RECT Rect;
|
||||||
|
TCHAR text[2];
|
||||||
|
text[0] = (TCHAR)wParam;
|
||||||
|
text[1] = _T('\0');
|
||||||
|
|
||||||
|
|
||||||
|
/* Write in window */
|
||||||
|
Rect.left = 400;
|
||||||
|
Rect.top = 10;
|
||||||
|
Rect.right = 550;
|
||||||
|
Rect.bottom = 70;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
TextOut(hDC, 400, 50, "WM_KEYUP:", strlen("WM_KEYUP:"));
|
||||||
|
TextOut(hDC, 530, 50, text, strlen(text));
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrRed);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrBlack);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrRed);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrGray);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_MBUTTONDOWN:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrBlue);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrBlack);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_MBUTTONUP:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrBlue);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrGray);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrYellow);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrBlack);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
{
|
||||||
|
ULONG x, y;
|
||||||
|
RECT Rect;
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
x = LOWORD(lParam);
|
||||||
|
y = HIWORD(lParam);
|
||||||
|
|
||||||
|
Rect.left = x - 5;
|
||||||
|
Rect.top = y - 5;
|
||||||
|
Rect.right = x + 5;
|
||||||
|
Rect.bottom = y + 5;
|
||||||
|
FillRect(hDC, &Rect, hbrYellow);
|
||||||
|
|
||||||
|
Rect.left = x - 3;
|
||||||
|
Rect.top = y - 3;
|
||||||
|
Rect.right = x + 3;
|
||||||
|
Rect.bottom = y + 3;
|
||||||
|
FillRect(hDC, &Rect, hbrGray);
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
{
|
||||||
|
int fwKeys;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
RECT Rect;
|
||||||
|
int temp;
|
||||||
|
TCHAR text[256];
|
||||||
|
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
fwKeys = wParam; // key flags
|
||||||
|
x = LOWORD(lParam); // horizontal position of cursor
|
||||||
|
y = HIWORD(lParam); // vertical position of cursor
|
||||||
|
|
||||||
|
Rect.left = 10;
|
||||||
|
Rect.top = 100;
|
||||||
|
Rect.right = 160;
|
||||||
|
Rect.bottom = 300;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
|
||||||
|
temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("x: %d"), x );
|
||||||
|
TextOut(hDC,10,100,text,strlen(text));
|
||||||
|
temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("y: %d"), y );
|
||||||
|
TextOut(hDC,10,120,text,strlen(text));
|
||||||
|
|
||||||
|
Rect.left = x - 2;
|
||||||
|
Rect.top = y - 2;
|
||||||
|
Rect.right = x + 2;
|
||||||
|
Rect.bottom = y + 2;
|
||||||
|
|
||||||
|
switch ( fwKeys )
|
||||||
|
{
|
||||||
|
case MK_CONTROL:
|
||||||
|
TextOut(hDC,10,140,"Control",strlen("Control"));
|
||||||
|
break;
|
||||||
|
case MK_SHIFT:
|
||||||
|
TextOut(hDC,10,160,"Shift",strlen("Shift"));
|
||||||
|
break;
|
||||||
|
case MK_LBUTTON:
|
||||||
|
TextOut(hDC,10,180,"Left",strlen("Left"));
|
||||||
|
FillRect(hDC, &Rect, hbrRed);
|
||||||
|
break;
|
||||||
|
case MK_MBUTTON:
|
||||||
|
TextOut(hDC,10,200,"Middle",strlen("Middle"));
|
||||||
|
FillRect(hDC, &Rect, hbrBlue);
|
||||||
|
break;
|
||||||
|
case MK_RBUTTON:
|
||||||
|
TextOut(hDC,10,220,"Right",strlen("Right"));
|
||||||
|
FillRect(hDC, &Rect, hbrYellow);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_HSCROLL:
|
||||||
|
{
|
||||||
|
int nPos;
|
||||||
|
int temp;
|
||||||
|
RECT Rect;
|
||||||
|
int nScrollCode;
|
||||||
|
HWND hwndScrollBar;
|
||||||
|
TCHAR text[256];
|
||||||
|
SCROLLINFO Scrollparameter;
|
||||||
|
nScrollCode = (int) LOWORD(wParam); // scroll bar value
|
||||||
|
nPos = (short int) HIWORD(wParam); // scroll box position
|
||||||
|
hwndScrollBar = (HWND) lParam; // handle to scroll bar
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
|
||||||
|
Scrollparameter.cbSize = sizeof(Scrollparameter);
|
||||||
|
Scrollparameter.fMask = SIF_ALL;
|
||||||
|
GetScrollInfo ( hWnd, SB_HORZ, &Scrollparameter );
|
||||||
|
|
||||||
|
Rect.left = 200;
|
||||||
|
Rect.top = 100;
|
||||||
|
Rect.right = 350;
|
||||||
|
Rect.bottom = 300;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
|
||||||
|
switch ( nScrollCode )
|
||||||
|
{
|
||||||
|
case SB_ENDSCROLL: //Ends scroll.
|
||||||
|
TextOut(hDC,200,120,"SB_ENDSCROLL ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nPos;
|
||||||
|
break;
|
||||||
|
case SB_LEFT: //Scrolls to the upper left.
|
||||||
|
TextOut(hDC,200,140,"SB_LEFT ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nMin;
|
||||||
|
break;
|
||||||
|
case SB_RIGHT: //Scrolls to the lower right.
|
||||||
|
TextOut(hDC,200,160,"SB_RIGHT ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nMax;
|
||||||
|
break;
|
||||||
|
case SB_LINELEFT: //Scrolls left by one unit.
|
||||||
|
TextOut(hDC,200,180,"SB_LINELEFT ",16);
|
||||||
|
Scrollparameter.nPos--;
|
||||||
|
break;
|
||||||
|
case SB_LINERIGHT: //Scrolls right by one unit.
|
||||||
|
TextOut(hDC,200,200,"SB_LINERIGHT ",16);
|
||||||
|
Scrollparameter.nPos++;
|
||||||
|
break;
|
||||||
|
case SB_PAGELEFT: //Scrolls left by the width of the window.
|
||||||
|
TextOut(hDC,200,220,"SB_PAGELEFT ",16);
|
||||||
|
Scrollparameter.nPos -= Scrollparameter.nPage;
|
||||||
|
break;
|
||||||
|
case SB_PAGERIGHT: //Scrolls right by the width of the window.
|
||||||
|
TextOut(hDC,200,240,"PAGERIGHT ",16);
|
||||||
|
Scrollparameter.nPos += Scrollparameter.nPage;
|
||||||
|
break;
|
||||||
|
case SB_THUMBPOSITION: //The user has dragged the scroll box (thumb) and released the mouse button. The nPos parameter indicates the position of the scroll box at the end of the drag operation.
|
||||||
|
TextOut(hDC,200,260,"SB_THUMBPOSITION",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nTrackPos;
|
||||||
|
break;
|
||||||
|
case SB_THUMBTRACK: //
|
||||||
|
TextOut(hDC,200,280,"SB_THUMBTRACK ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nTrackPos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetScrollInfo(
|
||||||
|
hWnd, // handle to window with scroll bar
|
||||||
|
SB_HORZ, // scroll bar flag
|
||||||
|
&Scrollparameter, // pointer to structure with scroll parameters
|
||||||
|
1 // redraw flag
|
||||||
|
);
|
||||||
|
temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Horizontal: %d"), Scrollparameter.nPos );
|
||||||
|
TextOut(hDC,200,100,text,strlen(text));
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_VSCROLL:
|
||||||
|
{
|
||||||
|
int nPos;
|
||||||
|
int temp;
|
||||||
|
RECT Rect;
|
||||||
|
int nScrollCode;
|
||||||
|
HWND hwndScrollBar;
|
||||||
|
TCHAR text[256];
|
||||||
|
SCROLLINFO Scrollparameter;
|
||||||
|
nScrollCode = (int) LOWORD(wParam); // scroll bar value
|
||||||
|
nPos = (short int) HIWORD(wParam); // scroll box position
|
||||||
|
hwndScrollBar = (HWND) lParam; // handle to scroll bar
|
||||||
|
hDC = GetDC(hWnd);
|
||||||
|
|
||||||
|
Scrollparameter.cbSize = sizeof(Scrollparameter);
|
||||||
|
Scrollparameter.fMask = SIF_ALL;
|
||||||
|
GetScrollInfo ( hWnd, SB_VERT, &Scrollparameter );
|
||||||
|
|
||||||
|
Rect.left = 400;
|
||||||
|
Rect.top = 100;
|
||||||
|
Rect.right = 550;
|
||||||
|
Rect.bottom = 300;
|
||||||
|
FillRect(hDC, &Rect, hbrWhite);
|
||||||
|
|
||||||
|
switch ( nScrollCode )
|
||||||
|
{
|
||||||
|
case SB_ENDSCROLL: //Ends scroll.
|
||||||
|
TextOut(hDC,400,120,"SB_ENDSCROLL ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nPos;
|
||||||
|
break;
|
||||||
|
case SB_LEFT: //Scrolls to the upper left.
|
||||||
|
TextOut(hDC,400,140,"SB_LEFT ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nMin;
|
||||||
|
break;
|
||||||
|
case SB_RIGHT: //Scrolls to the lower right.
|
||||||
|
TextOut(hDC,400,160,"SB_RIGHT ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nMax;
|
||||||
|
break;
|
||||||
|
case SB_LINELEFT: //Scrolls left by one unit.
|
||||||
|
TextOut(hDC,400,180,"SB_LINELEFT ",16);
|
||||||
|
Scrollparameter.nPos--;
|
||||||
|
break;
|
||||||
|
case SB_LINERIGHT: //Scrolls right by one unit.
|
||||||
|
TextOut(hDC,400,200,"SB_LINERIGHT ",16);
|
||||||
|
Scrollparameter.nPos++;
|
||||||
|
break;
|
||||||
|
case SB_PAGELEFT: //Scrolls left by the width of the window.
|
||||||
|
TextOut(hDC,400,220,"SB_PAGELEFT ",16);
|
||||||
|
Scrollparameter.nPos -= Scrollparameter.nPage;
|
||||||
|
break;
|
||||||
|
case SB_PAGERIGHT: //Scrolls right by the width of the window.
|
||||||
|
TextOut(hDC,400,240,"PAGERIGHT ",16);
|
||||||
|
Scrollparameter.nPos += Scrollparameter.nPage;
|
||||||
|
break;
|
||||||
|
case SB_THUMBPOSITION: //The user has dragged the scroll box (thumb) and released the mouse button. The nPos parameter indicates the position of the scroll box at the end of the drag operation.
|
||||||
|
TextOut(hDC,400,260,"SB_THUMBPOSITION",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nTrackPos;
|
||||||
|
break;
|
||||||
|
case SB_THUMBTRACK: //
|
||||||
|
TextOut(hDC,400,280,"SB_THUMBTRACK ",16);
|
||||||
|
Scrollparameter.nPos = Scrollparameter.nTrackPos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetScrollInfo(
|
||||||
|
hWnd, // handle to window with scroll bar
|
||||||
|
SB_VERT, // scroll bar flag
|
||||||
|
&Scrollparameter, // pointer to structure with scroll parameters
|
||||||
|
1 // redraw flag
|
||||||
|
);
|
||||||
|
temp = _sntprintf ( text, sizeof(text)/sizeof(*text), _T("Vertical: %d"), Scrollparameter.nPos );
|
||||||
|
TextOut(hDC,400,100,text,strlen(text));
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_HOTKEY:
|
||||||
|
switch(wParam)
|
||||||
|
{
|
||||||
|
case CTRLC:
|
||||||
|
MessageBox(hWnd, "You just pressed Ctrl+C", "Hotkey", MB_OK | MB_ICONINFORMATION);
|
||||||
|
break;
|
||||||
|
case ALTF1:
|
||||||
|
MessageBox(hWnd, "You just pressed Ctrl+Alt+F1", "Hotkey", MB_OK | MB_ICONINFORMATION);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
UnregisterHotKey(hWnd, CTRLC);
|
||||||
|
UnregisterHotKey(hWnd, ALTF1);
|
||||||
|
PostQuitMessage(0);
|
||||||
|
DeleteObject ( hbrWhite );
|
||||||
|
DeleteObject ( hbrGray );
|
||||||
|
DeleteObject ( hbrBlack );
|
||||||
|
DeleteObject ( hbrRed );
|
||||||
|
DeleteObject ( hbrBlue );
|
||||||
|
DeleteObject ( hbrYellow );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_CREATE:
|
||||||
|
{
|
||||||
|
/* Register a Ctrl+Alt+C hotkey*/
|
||||||
|
RegisterHotKey(hWnd, CTRLC, MOD_CONTROL, VK_C);
|
||||||
|
RegisterHotKey(hWnd, ALTF1, MOD_CONTROL | MOD_ALT, VK_F1);
|
||||||
|
|
||||||
|
hbrWhite = CreateSolidBrush ( RGB(0xFF, 0xFF, 0xFF));
|
||||||
|
hbrGray = CreateSolidBrush ( RGB(0xAF, 0xAF, 0xAF));
|
||||||
|
hbrBlack = CreateSolidBrush ( RGB(0x00, 0x00, 0x00));
|
||||||
|
hbrRed = CreateSolidBrush ( RGB(0xFF, 0x00, 0x00));
|
||||||
|
hbrBlue = CreateSolidBrush ( RGB(0x00, 0x00, 0xFF));
|
||||||
|
hbrYellow = CreateSolidBrush ( RGB(0xFF, 0xFF, 0x00));
|
||||||
|
|
||||||
|
SCROLLINFO si;
|
||||||
|
si.cbSize = sizeof(si);
|
||||||
|
si.fMask = SIF_ALL;
|
||||||
|
si.nMin = 0;
|
||||||
|
si.nMax = 100;
|
||||||
|
si.nPage = 5;
|
||||||
|
si.nPos = 0;
|
||||||
|
|
||||||
|
SetScrollInfo ( hWnd, SB_HORZ, &si, FALSE );
|
||||||
|
SetScrollInfo ( hWnd, SB_VERT, &si, FALSE );
|
||||||
|
|
||||||
|
|
||||||
|
/* The window is being created. Create our button
|
||||||
|
* window now. */
|
||||||
|
TEXTMETRIC tm;
|
||||||
|
|
||||||
|
/* First we use the system fixed font size to choose
|
||||||
|
* a nice button size. */
|
||||||
|
hDC = GetDC (hWnd);
|
||||||
|
SelectObject (hDC, GetStockObject (SYSTEM_FIXED_FONT));
|
||||||
|
GetTextMetrics (hDC, &tm);
|
||||||
|
cx = tm.tmAveCharWidth * 30;
|
||||||
|
cy = (tm.tmHeight + tm.tmExternalLeading) * 2;
|
||||||
|
ReleaseDC (hWnd, hDC);
|
||||||
|
|
||||||
|
/* Now create the button */
|
||||||
|
hwndButton = CreateWindow (
|
||||||
|
"button", /* Builtin button class */
|
||||||
|
"Click Here",
|
||||||
|
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
|
||||||
|
0, 0, cx, cy,
|
||||||
|
hWnd, /* Parent is this window. */
|
||||||
|
(HMENU) 1, /* Control ID: 1 */
|
||||||
|
((LPCREATESTRUCT) lParam)->hInstance,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_PAINT:
|
||||||
|
hDC = BeginPaint(hWnd, &ps);
|
||||||
|
TextOut(hDC, 10, 10, "Hello World from ReactOS!",
|
||||||
|
strlen("Hello World from ReactOS!"));
|
||||||
|
TextOut(hDC, 10, 80, "Press Ctrl+C or Ctrl+Alt+F1 to test Hotkey support.",
|
||||||
|
strlen("Press Ctrl+C or Ctrl+Alt+F1 to test Hotkey support."));
|
||||||
|
GetClientRect(hWnd, &clr);
|
||||||
|
GetWindowRect(hWnd, &wir);
|
||||||
|
sprintf(spr, "%lu,%lu,%lu,%lu ", clr.left, clr.top, clr.right, clr.bottom);
|
||||||
|
sprintf(sir, "%lu,%lu,%lu,%lu ", wir.left, wir.top, wir.right, wir.bottom);
|
||||||
|
TextOut(hDC, 10, 30, spr, 20);
|
||||||
|
TextOut(hDC, 10, 50, sir, 20);
|
||||||
|
|
||||||
|
/* Draw "Hello, World" in the middle of the upper
|
||||||
|
* half of the window. */
|
||||||
|
rc.bottom = rc.bottom / 2;
|
||||||
|
DrawText (hDC, "Hello, World", -1, &rc,
|
||||||
|
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
|
||||||
|
|
||||||
|
EndPaint (hWnd, &ps);
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SIZE:
|
||||||
|
/* The window size is changing. If the button exists
|
||||||
|
* then place it in the center of the bottom half of
|
||||||
|
* the window. */
|
||||||
|
if (hwndButton &&
|
||||||
|
(wParam == SIZEFULLSCREEN ||
|
||||||
|
wParam == SIZENORMAL)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rc.left = (LOWORD(lParam) - cx) / 2;
|
||||||
|
rc.top = HIWORD(lParam) * 3 / 4 - cy / 2;
|
||||||
|
MoveWindow (
|
||||||
|
hwndButton,
|
||||||
|
rc.left, rc.top, cx, cy, TRUE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_COMMAND:
|
||||||
|
/* Check the control ID, notification code and
|
||||||
|
* control handle to see if this is a button click
|
||||||
|
* message from our child button. */
|
||||||
|
if (LOWORD(wParam) == 1 &&
|
||||||
|
HIWORD(wParam) == BN_CLICKED &&
|
||||||
|
(HWND) lParam == hwndButton)
|
||||||
|
{
|
||||||
|
/* Our button was clicked. Close the window. */
|
||||||
|
DestroyWindow (hWnd);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
7
rosapps/tests/wm_erasebkgnd/.cvsignore
Normal file
7
rosapps/tests/wm_erasebkgnd/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
BIN
rosapps/tests/wm_erasebkgnd/BACKBITMAP.BMP
Normal file
BIN
rosapps/tests/wm_erasebkgnd/BACKBITMAP.BMP
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
31
rosapps/tests/wm_erasebkgnd/makefile
Normal file
31
rosapps/tests/wm_erasebkgnd/makefile
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = wm_erasebkgnd
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_CPPFLAGS = -fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W -D__USE_W32API -Wall -Werror
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = \
|
||||||
|
kernel32.a \
|
||||||
|
user32.a \
|
||||||
|
gdi32.a
|
||||||
|
|
||||||
|
TARGET_OBJECTS = \
|
||||||
|
wm_erasebkgnd.o
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# overide LD_CC to use g++ for linking of the executable
|
||||||
|
LD_CC = $(CXX)
|
||||||
|
|
||||||
|
# EOF
|
179
rosapps/tests/wm_erasebkgnd/wm_erasebkgnd.cpp
Normal file
179
rosapps/tests/wm_erasebkgnd/wm_erasebkgnd.cpp
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 2 - CD-ROM (WM_ERASEBKGND Demo)
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
//*********************************************************//
|
||||||
|
// //
|
||||||
|
// SYNOPSIS: //
|
||||||
|
// This sample project demonstrates how to render //
|
||||||
|
// a background image in response to the WM_ERASEBKGND //
|
||||||
|
// message. It also shows how to create a transparent //
|
||||||
|
// static (text) control by handling the //
|
||||||
|
// WM_CTLCOLORSTATIC message. //
|
||||||
|
// //
|
||||||
|
//*********************************************************//
|
||||||
|
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#include <windows.h>
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
|
||||||
|
HINSTANCE HInst;
|
||||||
|
HINSTANCE HPrevInst;
|
||||||
|
TCHAR *cmdline;
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
HInst = HInstance;
|
||||||
|
HPrevInst = HPrevInstance;
|
||||||
|
cmdline = lpCmdLine;
|
||||||
|
|
||||||
|
WNDCLASS wc;
|
||||||
|
memset(&wc, 0, sizeof(WNDCLASS));
|
||||||
|
|
||||||
|
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
|
||||||
|
wc.lpfnWndProc = MainWndProc;
|
||||||
|
wc.hInstance = HInstance;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
wc.hbrBackground =
|
||||||
|
reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1);
|
||||||
|
wc.lpszClassName = WndClassName;
|
||||||
|
|
||||||
|
if (RegisterClass(&wc))
|
||||||
|
{
|
||||||
|
HWND HWnd =
|
||||||
|
CreateWindow(WndClassName,
|
||||||
|
TEXT("WM_ERASEBKGND Demo"),
|
||||||
|
WS_OVERLAPPEDWINDOW | WS_CAPTION |
|
||||||
|
WS_VISIBLE | WS_CLIPSIBLINGS,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, 205, 85,
|
||||||
|
NULL, NULL, HInstance, NULL);
|
||||||
|
|
||||||
|
if (HWnd)
|
||||||
|
{
|
||||||
|
ShowWindow(HWnd, nCmdShow);
|
||||||
|
UpdateWindow(HWnd);
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// static text and bitmap-related variables
|
||||||
|
HWND HStatic;
|
||||||
|
HDC HMemDC;
|
||||||
|
HBITMAP HBmp, HOldBmp;
|
||||||
|
const char* filename = "BACKBITMAP.BMP";
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
|
||||||
|
LPARAM LParam)
|
||||||
|
{
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_CREATE:
|
||||||
|
{
|
||||||
|
HStatic =
|
||||||
|
CreateWindow(TEXT("STATIC"), TEXT("Static Text"),
|
||||||
|
WS_CHILD | WS_VISIBLE | SS_CENTER,
|
||||||
|
10, 20, 175, 30,
|
||||||
|
HWnd, NULL, HInst, NULL);
|
||||||
|
|
||||||
|
// create a memory DC compatible with the screen
|
||||||
|
HMemDC = CreateCompatibleDC(NULL);
|
||||||
|
if (HMemDC)
|
||||||
|
{
|
||||||
|
// load a DDB from file
|
||||||
|
HBmp = static_cast<HBITMAP>(
|
||||||
|
LoadImage(HInst, filename, IMAGE_BITMAP,
|
||||||
|
0, 0, LR_LOADFROMFILE)
|
||||||
|
);
|
||||||
|
if (HBmp)
|
||||||
|
{
|
||||||
|
// associate the DDB with the memory DC
|
||||||
|
HOldBmp = static_cast<HBITMAP>(
|
||||||
|
SelectObject(HMemDC, HBmp)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case WM_CTLCOLORSTATIC:
|
||||||
|
{
|
||||||
|
if (reinterpret_cast<HWND>(LParam) == HStatic)
|
||||||
|
{
|
||||||
|
HDC HStaticDC = reinterpret_cast<HDC>(WParam);
|
||||||
|
SetBkMode(HStaticDC, TRANSPARENT);
|
||||||
|
|
||||||
|
return reinterpret_cast<LRESULT>(
|
||||||
|
GetStockObject(NULL_BRUSH)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
{
|
||||||
|
BITMAP bmp;
|
||||||
|
if (GetObject(HBmp, sizeof(BITMAP), &bmp))
|
||||||
|
{
|
||||||
|
RECT RClient;
|
||||||
|
GetClientRect(HWnd, &RClient);
|
||||||
|
|
||||||
|
HDC Hdc = reinterpret_cast<HDC>(WParam);
|
||||||
|
SetStretchBltMode(Hdc, COLORONCOLOR);
|
||||||
|
|
||||||
|
//
|
||||||
|
// TODO: add palette handling code for
|
||||||
|
// palettized displays (see Chapter 9)...
|
||||||
|
//
|
||||||
|
|
||||||
|
// render the background image
|
||||||
|
StretchBlt(Hdc, 0, 0,
|
||||||
|
RClient.right - RClient.left,
|
||||||
|
RClient.bottom - RClient.top,
|
||||||
|
HMemDC, 0, 0, bmp.bmWidth, bmp.bmHeight,
|
||||||
|
SRCCOPY);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
if (HBmp)
|
||||||
|
{
|
||||||
|
// free the bitmap
|
||||||
|
DeleteObject(SelectObject(HMemDC, HOldBmp));
|
||||||
|
}
|
||||||
|
// free the memory DC
|
||||||
|
DeleteDC(HMemDC);
|
||||||
|
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(HWnd, Msg, WParam, LParam);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
7
rosapps/tests/wm_paint/.cvsignore
Normal file
7
rosapps/tests/wm_paint/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
22
rosapps/tests/wm_paint/makefile
Normal file
22
rosapps/tests/wm_paint/makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = windows
|
||||||
|
|
||||||
|
TARGET_NAME = wm_paint
|
||||||
|
|
||||||
|
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
|
131
rosapps/tests/wm_paint/wm_paint.c
Normal file
131
rosapps/tests/wm_paint/wm_paint.c
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Windows 2000 Graphics API Black Book
|
||||||
|
// Chapter 1 - Listing 1.1 (WM_PAINT Demo)
|
||||||
|
//
|
||||||
|
// Created by Damon Chandler <dmc27@ee.cornell.edu>
|
||||||
|
// Updates can be downloaded at: <www.coriolis.com>
|
||||||
|
//
|
||||||
|
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
|
||||||
|
// if you have any questions about this code.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <string.h>
|
||||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
MSG msg;
|
||||||
|
WNDCLASS wc;
|
||||||
|
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 = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||||
|
wc.lpszClassName = WndClassName;
|
||||||
|
|
||||||
|
if (RegisterClass(&wc))
|
||||||
|
{
|
||||||
|
HWND HWnd =
|
||||||
|
CreateWindow(WndClassName, TEXT("WM_PAINT Demo"),
|
||||||
|
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_VISIBLE,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, 200, 150,
|
||||||
|
NULL, NULL, HInstance, NULL);
|
||||||
|
|
||||||
|
if (HWnd)
|
||||||
|
{
|
||||||
|
ShowWindow(HWnd, nCmdShow);
|
||||||
|
UpdateWindow(HWnd);
|
||||||
|
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
|
||||||
|
LPARAM LParam)
|
||||||
|
{
|
||||||
|
const char* text = "Persistent Text";
|
||||||
|
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
// determine the invalidated area of the window
|
||||||
|
RECT RUpdate;
|
||||||
|
HDC Hdc;
|
||||||
|
GetUpdateRect(HWnd, &RUpdate, FALSE);
|
||||||
|
|
||||||
|
// grab a handle to our window's
|
||||||
|
// common display device context
|
||||||
|
Hdc = GetDC(HWnd);
|
||||||
|
#if 0
|
||||||
|
try
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
RECT RClient;
|
||||||
|
GetClientRect(HWnd, &RClient);
|
||||||
|
|
||||||
|
// set the clipping region
|
||||||
|
IntersectClipRect(Hdc, RUpdate.left, RUpdate.top,
|
||||||
|
RUpdate.right, RUpdate.bottom);
|
||||||
|
|
||||||
|
// fill the client area with the background brush
|
||||||
|
//HBRUSH HBrush =
|
||||||
|
//reinterpret_cast<HBRUSH>
|
||||||
|
(HBRUSH)(GetClassLong(HWnd, GCL_HBRBACKGROUND)
|
||||||
|
);
|
||||||
|
FillRect(Hdc, &RClient, NULL);
|
||||||
|
|
||||||
|
// render the persistent text
|
||||||
|
SetTextColor(Hdc, PALETTERGB(0, 0, 255));
|
||||||
|
DrawText(Hdc, text, strlen(text), &RClient,
|
||||||
|
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
catch (...)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// release the device context
|
||||||
|
ReleaseDC(HWnd, Hdc);
|
||||||
|
|
||||||
|
// validate the update area
|
||||||
|
ValidateRect(HWnd, &RUpdate);
|
||||||
|
}
|
||||||
|
// release the device context
|
||||||
|
ReleaseDC(HWnd, Hdc);
|
||||||
|
|
||||||
|
// validate the update area
|
||||||
|
ValidateRect(HWnd, &RUpdate);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DefWindowProc(HWnd, Msg, WParam, LParam);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
7
rosapps/tests/zwcontinue/.cvsignore
Normal file
7
rosapps/tests/zwcontinue/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
23
rosapps/tests/zwcontinue/Makefile
Normal file
23
rosapps/tests/zwcontinue/Makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# $Id: Makefile,v 1.1 2004/10/21 04:48:46 sedwards Exp $
|
||||||
|
|
||||||
|
PATH_TO_TOP = ../../../reactos
|
||||||
|
|
||||||
|
TARGET_NORC = yes
|
||||||
|
|
||||||
|
TARGET_TYPE = program
|
||||||
|
|
||||||
|
TARGET_APPTYPE = console
|
||||||
|
|
||||||
|
TARGET_NAME = zwcontinue
|
||||||
|
|
||||||
|
TARGET_OBJECTS = $(TARGET_NAME).o i386/$(TARGET_NAME).o
|
||||||
|
|
||||||
|
TARGET_CFLAGS = -Wall -Werror -D__USE_W32API
|
||||||
|
|
||||||
|
TARGET_SDKLIBS = ntdll.a
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
||||||
|
# EOF
|
7
rosapps/tests/zwcontinue/i386/.cvsignore
Normal file
7
rosapps/tests/zwcontinue/i386/.cvsignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.a
|
||||||
|
*.exe
|
||||||
|
*.coff
|
||||||
|
*.sym
|
||||||
|
*.map
|
48
rosapps/tests/zwcontinue/i386/zwcontinue.asm
Normal file
48
rosapps/tests/zwcontinue/i386/zwcontinue.asm
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
cpu 486
|
||||||
|
segment .text use32
|
||||||
|
|
||||||
|
extern _check
|
||||||
|
|
||||||
|
global _continuePoint
|
||||||
|
_continuePoint:
|
||||||
|
push ss
|
||||||
|
push dword 0
|
||||||
|
pushfd
|
||||||
|
push cs
|
||||||
|
push _continuePoint
|
||||||
|
push ebp
|
||||||
|
|
||||||
|
push eax
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
push ebx
|
||||||
|
push esi
|
||||||
|
push edi
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push es
|
||||||
|
push fs
|
||||||
|
push gs
|
||||||
|
|
||||||
|
; TODO: floating point state
|
||||||
|
sub esp, 70h
|
||||||
|
|
||||||
|
; Debug registers
|
||||||
|
sub esp, 18h
|
||||||
|
|
||||||
|
push dword 00010007h
|
||||||
|
|
||||||
|
; Fill the Esp field
|
||||||
|
lea eax, [esp+0CCh]
|
||||||
|
lea ecx, [esp+0C4h]
|
||||||
|
mov [ecx], eax
|
||||||
|
|
||||||
|
; Call the function that will compare the current context with the expected one
|
||||||
|
cld
|
||||||
|
push esp
|
||||||
|
call _check
|
||||||
|
|
||||||
|
; check() must not return
|
||||||
|
int 3
|
||||||
|
|
||||||
|
; EOF
|
185
rosapps/tests/zwcontinue/zwcontinue.c
Normal file
185
rosapps/tests/zwcontinue/zwcontinue.c
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define STRICT
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
static unsigned int nRandBytes;
|
||||||
|
|
||||||
|
static int initrand(void)
|
||||||
|
{
|
||||||
|
unsigned int nRandMax;
|
||||||
|
unsigned int nRandMaxBits;
|
||||||
|
time_t tLoc;
|
||||||
|
|
||||||
|
nRandMax = RAND_MAX;
|
||||||
|
|
||||||
|
for(nRandMaxBits = 0; nRandMax != 0; nRandMax >>= 1, ++ nRandMaxBits);
|
||||||
|
|
||||||
|
nRandBytes = nRandMaxBits / CHAR_BIT;
|
||||||
|
|
||||||
|
assert(nRandBytes != 0);
|
||||||
|
|
||||||
|
srand((unsigned)(time(&tLoc) & UINT_MAX));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void randbytes(void * p, size_t n)
|
||||||
|
{
|
||||||
|
unsigned char * b;
|
||||||
|
size_t i;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
b = (unsigned char *)p;
|
||||||
|
|
||||||
|
for(i = 0; i < n; ++ i)
|
||||||
|
{
|
||||||
|
if(i % nRandBytes == 0)
|
||||||
|
r = rand();
|
||||||
|
|
||||||
|
b[i] = (unsigned char)(r & UCHAR_MAX);
|
||||||
|
r >>= CHAR_BIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG randULONG(void)
|
||||||
|
{
|
||||||
|
ULONG n;
|
||||||
|
randbytes(&n, sizeof(n));
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _M_IX86
|
||||||
|
#define ZWC_SEGMENT_BITS (0xFFFF)
|
||||||
|
#define ZWC_EFLAGS_BITS (0x3C0CD5)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static jmp_buf jmpbuf;
|
||||||
|
static CONTEXT continueContext;
|
||||||
|
|
||||||
|
extern void continuePoint(void);
|
||||||
|
extern void check(CONTEXT *);
|
||||||
|
extern LONG NTAPI ZwContinue(IN CONTEXT *, IN BOOLEAN);
|
||||||
|
|
||||||
|
void check(CONTEXT * actualContext)
|
||||||
|
{
|
||||||
|
#ifdef _M_IX86
|
||||||
|
assert(actualContext->ContextFlags == CONTEXT_FULL);
|
||||||
|
|
||||||
|
/* Random data segments */
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegGs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegGs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegFs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegFs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegEs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegEs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegDs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegDs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Integer registers */
|
||||||
|
assert(actualContext->Edi == continueContext.Edi);
|
||||||
|
assert(actualContext->Esi == continueContext.Esi);
|
||||||
|
assert(actualContext->Ebx == continueContext.Ebx);
|
||||||
|
printf("%s %lX : %lX\n", "Edx", actualContext->Edx, continueContext.Edx);
|
||||||
|
//assert(actualContext->Edx == continueContext.Edx);
|
||||||
|
assert(actualContext->Ecx == continueContext.Ecx);
|
||||||
|
assert(actualContext->Eax == continueContext.Eax);
|
||||||
|
|
||||||
|
/* Control registers and segments */
|
||||||
|
assert(actualContext->Ebp == continueContext.Ebp);
|
||||||
|
assert(actualContext->Eip == continueContext.Eip);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegCs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegCs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->EFlags & ZWC_EFLAGS_BITS) ==
|
||||||
|
(continueContext.EFlags & ZWC_EFLAGS_BITS)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert(actualContext->Esp == continueContext.Esp);
|
||||||
|
|
||||||
|
assert
|
||||||
|
(
|
||||||
|
(actualContext->SegSs & ZWC_SEGMENT_BITS) ==
|
||||||
|
(continueContext.SegSs & ZWC_SEGMENT_BITS)
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
initrand();
|
||||||
|
|
||||||
|
/* First time */
|
||||||
|
if(setjmp(jmpbuf) == 0)
|
||||||
|
{
|
||||||
|
CONTEXT bogus;
|
||||||
|
|
||||||
|
continueContext.ContextFlags = CONTEXT_FULL;
|
||||||
|
GetThreadContext(GetCurrentThread(), &continueContext);
|
||||||
|
|
||||||
|
#ifdef _M_IX86
|
||||||
|
continueContext.ContextFlags = CONTEXT_FULL;
|
||||||
|
|
||||||
|
/* Fill the integer registers with random values */
|
||||||
|
continueContext.Edi = randULONG();
|
||||||
|
continueContext.Esi = randULONG();
|
||||||
|
continueContext.Ebx = randULONG();
|
||||||
|
continueContext.Edx = randULONG();
|
||||||
|
continueContext.Ecx = randULONG();
|
||||||
|
continueContext.Eax = randULONG();
|
||||||
|
continueContext.Ebp = randULONG();
|
||||||
|
|
||||||
|
/* Randomize all the allowed flags (determined experimentally with WinDbg) */
|
||||||
|
continueContext.EFlags = randULONG() & 0x3C0CD5;
|
||||||
|
|
||||||
|
/* Randomize the stack pointer as much as possible */
|
||||||
|
continueContext.Esp =
|
||||||
|
(ULONG)(((ULONG_PTR)&bogus) & 0xFFFFFFFF) +
|
||||||
|
sizeof(bogus) -
|
||||||
|
(randULONG() & 0xF) * 4;
|
||||||
|
|
||||||
|
/* continuePoint() is implemented in assembler */
|
||||||
|
continueContext.Eip = (ULONG)((ULONG_PTR)continuePoint & 0xFFFFFFF);
|
||||||
|
|
||||||
|
/* Can't do a lot about segments */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ZwContinue(&continueContext, FALSE);
|
||||||
|
}
|
||||||
|
/* Second time */
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return 1;
|
||||||
|
}
|
Loading…
Reference in a new issue