Moving the tests

svn path=/trunk/; revision=11360
This commit is contained in:
Steven Edwards 2004-10-21 04:48:46 +00:00
parent 68d63b431f
commit dbf0e6e889
78 changed files with 5211 additions and 0 deletions

113
rosapps/tests/Makefile Normal file
View 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
View 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.

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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 */

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

94
rosapps/tests/apc/apc.c Normal file
View 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;
}

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

53
rosapps/tests/apc2/apc2.c Normal file
View 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;
}

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

39
rosapps/tests/args/args.c Normal file
View 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;
}

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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);
}

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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);
}
//------------------------------------------------------------------

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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);
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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 */
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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);
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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

View 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
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

View 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);
}
//-------------------------------------------------------------------------

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View 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

View 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);
}
//------------------------------------------------------------------

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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);
}
//------------------------------------------------------------------

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View file

@ -0,0 +1,7 @@
*.o
*.d
*.a
*.exe
*.coff
*.sym
*.map

View 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

View 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;
}